diff --git a/.sync-state.json b/.sync-state.json index 9e318e1..a319f76 100644 --- a/.sync-state.json +++ b/.sync-state.json @@ -1,9 +1,9 @@ { "branch_mode": "release", - "base_release_tag": "v2026.1005.0", - "base_release_sha": "467125fafb47a8520856504fecc48d6e32055db1", - "last_seen_parent_sha": "799e4d556f5c1bc17b398147c7e0abff91446de0", - "last_applied_manifest_hash": "dcc9b36d01834b5906dc1ceb60266817d401d2e7e77d60f270a54b2c3f274775", - "last_run_at": "2026-10-07T05:58:51.000Z", + "base_release_tag": "v2026.1012.0", + "base_release_sha": "bba6a45f0d364cfd962ac59b3bdf2426a8222adb", + "last_seen_parent_sha": "4a641d0980fdaffc4c4e805f6f0a8809eb5702f2", + "last_applied_manifest_hash": "81e8b8018dc26d17ba227763b6a6c58b4e3958902042e5d575f27457b5ac65f8", + "last_run_at": "2026-10-13T08:44:17.000Z", "last_run_outcome": "applied" } diff --git a/SCREENSHOTS_PENDING.md b/SCREENSHOTS_PENDING.md index e7dd62d..0b34849 100644 --- a/SCREENSHOTS_PENDING.md +++ b/SCREENSHOTS_PENDING.md @@ -1,8 +1,8 @@ # Screenshots Pending -Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent paths changed in the release window (base release tag `v2026.1001.0` (`8f8a0ab7`) -> release tag `v2026.1005.0` (`467125fa`), 179 commits). +Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent paths changed in the release window: base release tag `v2026.1005.0` (`467125fa`) -> release tag `v2026.1012.0` (`bba6a45f`), 132 commits, 1,242 files. -**180 of 350 screenshots are stale** across 41 routes. Not recaptured in this release PR; run `npm run screenshots:refresh` on the release branch and review the PNGs in a separate PR. They are never auto-pushed. +**126 of 350 screenshots are stale** across 26 routes. None were recaptured in this release; refresh separately with `npm run screenshots:refresh`. PNGs go to a PR for human review and are never auto-pushed. | Screenshot | Route | Theme | Changed dependency paths | |---|---|---|---| @@ -21,16 +21,13 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `dark/agents/http-adapter-config.png` | `/ACME/agents/{httpAgentId}/configuration` | dark | ui/src/components/AgentConfigForm.tsx | | `dark/agents/instructions.png` | `/ACME/agents/{agentId}/instructions` | dark | ui/src/pages/AgentDetail.tsx | | `dark/agents/run-history-in-progress.png` | `/ACME/agents/{longRunnerAgentId}/runs` | dark | ui/src/pages/AgentDetail.tsx | -| `dark/agents/run-transcript-view.png` | `/ACME/agents/{runnerAgentId}/runs/{runnerRunId}` | dark | ui/src/components/transcript/RunTranscriptView.tsx, ui/src/pages/AgentDetail.tsx | +| `dark/agents/run-transcript-view.png` | `/ACME/agents/{runnerAgentId}/runs/{runnerRunId}` | dark | ui/src/pages/AgentDetail.tsx | | `dark/agents/runs.png` | `/ACME/agents/{agentId}/runs` | dark | ui/src/pages/AgentDetail.tsx | | `dark/agents/skills.png` | `/ACME/agents/{agentId}/skills` | dark | ui/src/pages/AgentDetail.tsx | | `dark/agents/test-environment-fail.png` | `/ACME/agents/new` | dark | ui/src/components/AgentConfigForm.tsx | | `dark/agents/test-environment-success.png` | `/ACME/agents/{runnerAgentId}/configuration` | dark | ui/src/components/AgentConfigForm.tsx | -| `dark/company/access.png` | `/ACME/company/settings/access` | dark | ui/src/pages/CompanyAccess.tsx | | `dark/company/company-budget-setting.png` | `/ACME/agents/{agentId}/configuration` | dark | ui/src/components/AgentConfigForm.tsx | -| `dark/company/company-saved.png` | `/ACME/company/settings` | dark | ui/src/pages/CompanySettings.tsx | | `dark/company/join-requests.png` | `/ACME/inbox/requests` | dark | ui/src/pages/Inbox.tsx | -| `dark/company/settings.png` | `/ACME/company/settings` | dark | ui/src/pages/CompanySettings.tsx | | `dark/costs/agent-budget-field.png` | `/ACME/agents/{agentId}/budget` | dark | ui/src/pages/AgentDetail.tsx | | `dark/dashboard/activity-feed.png` | `/ACME/dashboard` | dark | ui/src/pages/Dashboard.tsx | | `dark/dashboard/agent-status-panel.png` | `/ACME/dashboard` | dark | ui/src/pages/Dashboard.tsx | @@ -38,11 +35,10 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `dark/dashboard/dashboard-overview.png` | `/ACME/dashboard` | dark | ui/src/pages/Dashboard.tsx | | `dark/dashboard/task-breakdown-panel.png` | `/ACME/dashboard` | dark | ui/src/pages/Dashboard.tsx | | `dark/experimental/recovery-preview.png` | `/ACME/company/settings/instance/experimental` | dark | ui/src/pages/InstanceExperimentalSettings.tsx | -| `dark/experimental/server-info.png` | `/ACME/dashboard` | dark | ui/src/components/SidebarAccountMenu.tsx | -| `dark/github-review/connect.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `dark/github-review/identity.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `dark/github-review/prompts.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `dark/github-review/repositories.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `dark/github-review/connect.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `dark/github-review/identity.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `dark/github-review/prompts.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `dark/github-review/repositories.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | dark | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | | `dark/interactions/checkbox-confirmation-card.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx, ui/src/components/IssueThreadInteractionCard.tsx | | `dark/issues/detail-activity.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx | | `dark/issues/detail-chat.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx | @@ -54,30 +50,11 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `dark/issues/my-issues.png` | `/ACME/inbox/mine` | dark | ui/src/pages/Inbox.tsx | | `dark/onboarding/budget-field.png` | `/ACME/agents/{agentId}/configuration` | dark | ui/src/components/AgentConfigForm.tsx | | `dark/onboarding/empty-dashboard.png` | `/{emptyPrefix}/dashboard` | dark | ui/src/pages/Dashboard.tsx | -| `dark/onboarding/sidebar-new-company-button.png` | `/ACME/dashboard` | dark | ui/src/components/SidebarCompanyMenu.tsx | | `dark/org/reassign.png` | `/ACME/agents/{agentId}/configuration` | dark | ui/src/components/AgentConfigForm.tsx | -| `dark/org/skills-list.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/projects/budget.png` | `/ACME/projects/{projectId}/budget` | dark | ui/src/pages/ProjectDetail.tsx | -| `dark/projects/configuration.png` | `/ACME/projects/{projectId}/configuration` | dark | ui/src/pages/ProjectDetail.tsx | -| `dark/projects/issues.png` | `/ACME/projects/{projectId}/issues` | dark | ui/src/pages/ProjectDetail.tsx | -| `dark/projects/overview.png` | `/ACME/projects/{projectId}/overview` | dark | ui/src/pages/ProjectDetail.tsx | -| `dark/projects/workspaces.png` | `/ACME/projects/{projectId}/workspaces` | dark | ui/src/pages/ProjectDetail.tsx | +| `dark/secrets/dispatch-check.png` | `/ACME/company/settings/secrets` | dark | server/src/services/secrets.ts | | `dark/settings/experimental.png` | `/ACME/company/settings/instance/experimental` | dark | ui/src/pages/InstanceExperimentalSettings.tsx | -| `dark/settings/instance-general.png` | `/ACME/company/settings/instance/general` | dark | ui/src/pages/InstanceGeneralSettings.tsx | -| `dark/settings/profile.png` | `/ACME/company/settings/instance/profile` | dark | ui/src/pages/ProfileSettings.tsx | -| `dark/skills/add-skill-dialog-confirm.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/add-skill-dialog.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/assign-to-agent.png` | `/ACME/skills/{skillId}` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/file-inventory.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/list.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/skill-detail.png` | `/ACME/skills/{skillId}` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/skills/skills-list.png` | `/ACME/skills` | dark | ui/src/pages/CompanySkills.tsx | -| `dark/status-cards/detail-history.png` | `/ACME/status/{statusCardId}` | dark | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | -| `dark/status-cards/detail-summary.png` | `/ACME/status/{statusCardId}` | dark | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | -| `dark/status-cards/detail-watched-issues.png` | `/ACME/status/{statusCardId}` | dark | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | | `dark/task-chat/composer-modes.png` | `/ACME/issues/{issueId}` | dark | ui/src/components/task-chat/TaskChatComposer.tsx | -| `dark/task-chat/side-pane.png` | `/ACME/issues/{issueId}` | dark | ui/src/components/issue-properties/IssuePropertiesArtifactsTab.tsx | -| `dark/task-chat/thread.png` | `/ACME/issues/{issueId}` | dark | ui/src/components/TaskChatThread.tsx, ui/src/components/task-chat/TaskChatBubble.tsx | +| `dark/task-chat/thread.png` | `/ACME/issues/{issueId}` | dark | ui/src/components/TaskChatThread.tsx, ui/src/components/task-chat/TaskChatTurn.tsx | | `dark/tasks/comment-input-box.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx | | `dark/tasks/inbox-newly-created-tasks.png` | `/ACME/inbox/recent` | dark | ui/src/pages/Inbox.tsx | | `dark/tasks/inbox-view-with-filters.png` | `/ACME/inbox/all` | dark | ui/src/pages/Inbox.tsx | @@ -92,10 +69,6 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `dark/work-modes/plan-mode-plan.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx | | `dark/work-modes/standard-mode-run.png` | `/ACME/issues/{issueId}` | dark | ui/src/pages/IssueDetail.tsx, ui/src/components/IssueChatThread.tsx | | `dark/work-modes/work-mode-picker.png` | `/ACME/inbox/mine` | dark | ui/src/components/NewIssueDialog.tsx | -| `dark/workspaces/configuration.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/configuration` | dark | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `dark/workspaces/issues.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/issues` | dark | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `dark/workspaces/runtime-logs.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/runtime-logs` | dark | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `dark/workspaces/services.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/services` | dark | ui/src/pages/ExecutionWorkspaceDetail.tsx | | `light/agents/adapter-type-dropdown.png` | `/ACME/agents/new` | light | ui/src/components/AgentConfigForm.tsx | | `light/agents/agent-detail-idle.png` | `/ACME/agents/{agentId}` | light | ui/src/pages/AgentDetail.tsx | | `light/agents/agent-detail-run-history.png` | `/ACME/agents/{agentId}/runs` | light | ui/src/pages/AgentDetail.tsx | @@ -111,16 +84,13 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `light/agents/http-adapter-config.png` | `/ACME/agents/{httpAgentId}/configuration` | light | ui/src/components/AgentConfigForm.tsx | | `light/agents/instructions.png` | `/ACME/agents/{agentId}/instructions` | light | ui/src/pages/AgentDetail.tsx | | `light/agents/run-history-in-progress.png` | `/ACME/agents/{longRunnerAgentId}/runs` | light | ui/src/pages/AgentDetail.tsx | -| `light/agents/run-transcript-view.png` | `/ACME/agents/{runnerAgentId}/runs/{runnerRunId}` | light | ui/src/components/transcript/RunTranscriptView.tsx, ui/src/pages/AgentDetail.tsx | +| `light/agents/run-transcript-view.png` | `/ACME/agents/{runnerAgentId}/runs/{runnerRunId}` | light | ui/src/pages/AgentDetail.tsx | | `light/agents/runs.png` | `/ACME/agents/{agentId}/runs` | light | ui/src/pages/AgentDetail.tsx | | `light/agents/skills.png` | `/ACME/agents/{agentId}/skills` | light | ui/src/pages/AgentDetail.tsx | | `light/agents/test-environment-fail.png` | `/ACME/agents/new` | light | ui/src/components/AgentConfigForm.tsx | | `light/agents/test-environment-success.png` | `/ACME/agents/{runnerAgentId}/configuration` | light | ui/src/components/AgentConfigForm.tsx | -| `light/company/access.png` | `/ACME/company/settings/access` | light | ui/src/pages/CompanyAccess.tsx | | `light/company/company-budget-setting.png` | `/ACME/agents/{agentId}/configuration` | light | ui/src/components/AgentConfigForm.tsx | -| `light/company/company-saved.png` | `/ACME/company/settings` | light | ui/src/pages/CompanySettings.tsx | | `light/company/join-requests.png` | `/ACME/inbox/requests` | light | ui/src/pages/Inbox.tsx | -| `light/company/settings.png` | `/ACME/company/settings` | light | ui/src/pages/CompanySettings.tsx | | `light/costs/agent-budget-field.png` | `/ACME/agents/{agentId}/budget` | light | ui/src/pages/AgentDetail.tsx | | `light/dashboard/activity-feed.png` | `/ACME/dashboard` | light | ui/src/pages/Dashboard.tsx | | `light/dashboard/agent-status-panel.png` | `/ACME/dashboard` | light | ui/src/pages/Dashboard.tsx | @@ -128,11 +98,10 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `light/dashboard/dashboard-overview.png` | `/ACME/dashboard` | light | ui/src/pages/Dashboard.tsx | | `light/dashboard/task-breakdown-panel.png` | `/ACME/dashboard` | light | ui/src/pages/Dashboard.tsx | | `light/experimental/recovery-preview.png` | `/ACME/company/settings/instance/experimental` | light | ui/src/pages/InstanceExperimentalSettings.tsx | -| `light/experimental/server-info.png` | `/ACME/dashboard` | light | ui/src/components/SidebarAccountMenu.tsx | -| `light/github-review/connect.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `light/github-review/identity.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `light/github-review/prompts.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | -| `light/github-review/repositories.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubChatSetup.tsx, ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `light/github-review/connect.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `light/github-review/identity.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `light/github-review/prompts.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | +| `light/github-review/repositories.png` | `/ACME/apps/chat/connect?provider=github&resume=github-review-docs-demo` | light | ui/src/pages/apps/chat/GitHubSetupPrompt.tsx | | `light/interactions/checkbox-confirmation-card.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx, ui/src/components/IssueThreadInteractionCard.tsx | | `light/issues/detail-activity.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx | | `light/issues/detail-chat.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx | @@ -144,30 +113,11 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `light/issues/my-issues.png` | `/ACME/inbox/mine` | light | ui/src/pages/Inbox.tsx | | `light/onboarding/budget-field.png` | `/ACME/agents/{agentId}/configuration` | light | ui/src/components/AgentConfigForm.tsx | | `light/onboarding/empty-dashboard.png` | `/{emptyPrefix}/dashboard` | light | ui/src/pages/Dashboard.tsx | -| `light/onboarding/sidebar-new-company-button.png` | `/ACME/dashboard` | light | ui/src/components/SidebarCompanyMenu.tsx | | `light/org/reassign.png` | `/ACME/agents/{agentId}/configuration` | light | ui/src/components/AgentConfigForm.tsx | -| `light/org/skills-list.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/projects/budget.png` | `/ACME/projects/{projectId}/budget` | light | ui/src/pages/ProjectDetail.tsx | -| `light/projects/configuration.png` | `/ACME/projects/{projectId}/configuration` | light | ui/src/pages/ProjectDetail.tsx | -| `light/projects/issues.png` | `/ACME/projects/{projectId}/issues` | light | ui/src/pages/ProjectDetail.tsx | -| `light/projects/overview.png` | `/ACME/projects/{projectId}/overview` | light | ui/src/pages/ProjectDetail.tsx | -| `light/projects/workspaces.png` | `/ACME/projects/{projectId}/workspaces` | light | ui/src/pages/ProjectDetail.tsx | +| `light/secrets/dispatch-check.png` | `/ACME/company/settings/secrets` | light | server/src/services/secrets.ts | | `light/settings/experimental.png` | `/ACME/company/settings/instance/experimental` | light | ui/src/pages/InstanceExperimentalSettings.tsx | -| `light/settings/instance-general.png` | `/ACME/company/settings/instance/general` | light | ui/src/pages/InstanceGeneralSettings.tsx | -| `light/settings/profile.png` | `/ACME/company/settings/instance/profile` | light | ui/src/pages/ProfileSettings.tsx | -| `light/skills/add-skill-dialog-confirm.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/add-skill-dialog.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/assign-to-agent.png` | `/ACME/skills/{skillId}` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/file-inventory.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/list.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/skill-detail.png` | `/ACME/skills/{skillId}` | light | ui/src/pages/CompanySkills.tsx | -| `light/skills/skills-list.png` | `/ACME/skills` | light | ui/src/pages/CompanySkills.tsx | -| `light/status-cards/detail-history.png` | `/ACME/status/{statusCardId}` | light | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | -| `light/status-cards/detail-summary.png` | `/ACME/status/{statusCardId}` | light | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | -| `light/status-cards/detail-watched-issues.png` | `/ACME/status/{statusCardId}` | light | ui/src/pages/StatusCards/StatusCardDetailDrawer.tsx | | `light/task-chat/composer-modes.png` | `/ACME/issues/{issueId}` | light | ui/src/components/task-chat/TaskChatComposer.tsx | -| `light/task-chat/side-pane.png` | `/ACME/issues/{issueId}` | light | ui/src/components/issue-properties/IssuePropertiesArtifactsTab.tsx | -| `light/task-chat/thread.png` | `/ACME/issues/{issueId}` | light | ui/src/components/TaskChatThread.tsx, ui/src/components/task-chat/TaskChatBubble.tsx | +| `light/task-chat/thread.png` | `/ACME/issues/{issueId}` | light | ui/src/components/TaskChatThread.tsx, ui/src/components/task-chat/TaskChatTurn.tsx | | `light/tasks/comment-input-box.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx | | `light/tasks/inbox-newly-created-tasks.png` | `/ACME/inbox/recent` | light | ui/src/pages/Inbox.tsx | | `light/tasks/inbox-view-with-filters.png` | `/ACME/inbox/all` | light | ui/src/pages/Inbox.tsx | @@ -182,7 +132,3 @@ Regenerated by /sync-docs (release). Lists screenshots whose `depends_on` parent | `light/work-modes/plan-mode-plan.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx | | `light/work-modes/standard-mode-run.png` | `/ACME/issues/{issueId}` | light | ui/src/pages/IssueDetail.tsx, ui/src/components/IssueChatThread.tsx | | `light/work-modes/work-mode-picker.png` | `/ACME/inbox/mine` | light | ui/src/components/NewIssueDialog.tsx | -| `light/workspaces/configuration.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/configuration` | light | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `light/workspaces/issues.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/issues` | light | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `light/workspaces/runtime-logs.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/runtime-logs` | light | ui/src/pages/ExecutionWorkspaceDetail.tsx | -| `light/workspaces/services.png` | `/ACME/execution-workspaces/{executionWorkspaceId}/services` | light | ui/src/pages/ExecutionWorkspaceDetail.tsx | diff --git a/docs/administration/settings.md b/docs/administration/settings.md index d47502e..82d99dd 100644 --- a/docs/administration/settings.md +++ b/docs/administration/settings.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Settings: Profile and Instance seo_description: Two settings surfaces and why the difference matters. Covers your profile plus instance general, access, adapters, and experimental flags. --- @@ -222,8 +222,10 @@ Each flag has its own page in the [Experimental](../experimental/overview.md) se - **[Enable External Objects](../experimental/external-objects.md)** — detects external URLs in issues and shows live status for referenced pull requests and tickets. - **[Task Plan Decomposition Panel](../experimental/plan-decomposition-panel.md)** — accepted-plan decomposition history on task detail pages, for debugging sub-task creation. - **[Agent Chat](../experimental/agent-chat.md)** — one persistent conversation per agent, behind a **Chat** sidebar entry; agents hand work off to tasks and report back when they're done. +- **[Assistant connections (MCP)](../experimental/assistant-connections.md)** — lets external assistants sign in as a person to review work and delegate tasks. Experimental and off by default. - **[Memory connectors](../connectors/memory-connectors.md)** — exposes Mem0, Zep, Supermemory, Cognee, and Honcho setup. Experimental and off by default; hiding setup does not stop saved connections. - **[Paperclip Runner](../reference/adapters/paperclip-runner.md)** — enables explicitly configured native runs. Experimental; on by default on self-hosted instances and off by default on Cloud unless managed configuration changes it. Enabling the flag does not migrate existing agents. +- **[Combined Inbox + Task List](../experimental/task-chat.md#an-optional-combined-task-list)** — combines inbox and task views under **Tasks**. Experimental and off by default. - **[Task Watchdogs](../experimental/task-watchdogs.md)** — per-task watchdog agents that verify stopped task subtrees and restore live paths. - **[Cloud Sync](../experimental/cloud-sync.md)** — **retired.** Removed upstream together with its experimental toggle, so it no longer appears in this list on a current build. To move a company between instances, use [company Import/Export](../how-to/back-up-and-restore-a-company.md). - **[Server Info Debug View](../experimental/server-info-debug-view.md)** — a "Server" section in the account drawer with restart time, running commit, and checkout state. diff --git a/docs/administration/trust-and-low-trust-review.md b/docs/administration/trust-and-low-trust-review.md index 291225b..ef1d5b0 100644 --- a/docs/administration/trust-and-low-trust-review.md +++ b/docs/administration/trust-and-low-trust-review.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Trust and Low-Trust Review seo_description: Contain work born from input you cannot vouch for. How presets are chosen, what changes at runtime, and how to review and promote low-trust output. --- @@ -99,7 +99,7 @@ When a run resolves to `low_trust_review`, Paperclip refuses to start it unless - **Isolated workspaces are enabled** for the instance. Without them there is nowhere safe to contain the work. - **The execution workspace mode is `isolated_workspace`.** A shared or host-local workspace is not acceptable for low-trust work. -- **The issue being run is inside the resolved boundary** — either directly named, in an allowed project, or a descendant of the boundary's `rootIssueId` (ancestry is checked up to a bounded depth). An issue outside the boundary is rejected. +- **The issue being run is inside the resolved boundary** — either directly named, in an allowed project, or a descendant of the boundary's `rootIssueId` (ancestry is checked up to a bounded depth) — or it's the exact task a person directed the agent to (see [Work a person asks for directly](#work-a-person-asks-for-directly)). Any other issue outside the boundary is rejected. - **The environment uses the `sandbox` driver.** A host-local adapter process is not allowed for managed low-trust execution; you need a sandboxed environment instead. On top of that, two further constraints apply: @@ -115,6 +115,49 @@ If you have been doing untrusted-PR review by hand with a local Docker workflow, --- +## What a low-trust agent can still do + +Containment is about outside input, not about shutting out the people who run the agent. A few kinds of work stay open to a low-trust agent, each tied to a specific, recorded source of authority. + +### Work a person asks for directly + +You can talk to a low-trust agent in your own Agent Chat, or assign it a task that sits outside its normal boundary. Paperclip treats that as your direction and lets the agent work on it. + +The exception is narrow on purpose: + +- **It comes from real records.** Paperclip uses your chat conversation, or the signed-in person recorded on the run's wake request when you assigned the task. Nobody has to fill in a separate permission, and a client can't claim to be you. +- **Only a signed-in board user counts.** The agent's responsible user, a sender attributed by an outside connector, a plugin acting "for" a user, or a claim from another agent don't qualify. +- **It covers one task.** The agent can read, comment on, and update that exact task. It doesn't extend to other tasks, children, the whole project, configuration, instructions, secrets, or runtime management. Normal responsible-user checks still apply. +- **Reassigning cancels it.** When the task changes hands, earlier human requests are cancelled, and assigning it back doesn't revive them. Automatic retries of the same task carry the direction forward; a cancelled run can't authorize a retry. +- **The sandbox rules don't relax.** The run still needs the sandbox driver and an isolated workspace, and the exception is never written into the agent's inherited boundary. + +If you assign a task into the backlog, the assignment is remembered so the later launch is authorized, without starting work early. + +### Creating tasks inside the boundary + +Low trust doesn't stop an agent from organizing its own work. It can create tasks assigned to itself, and subtasks of its own tasks, as long as they stay inside its project or root-task scope: + +- Creating a task goes through the normal assignment permission checks — including any assignment restrictions and the responsible user's authority — even when the new task is unassigned. +- Assigning to another agent only works if that agent is explicitly allowed by the boundary. Assigning to a board user is refused. +- New tasks keep the creator's containment and its quarantined source attribution. +- An exact `issueIds` allow-list doesn't automatically cover new child tasks, and a permitted parent doesn't open up an unrelated project. A `rootIssueId` scope does include its descendants. + +### Instruction edits from your own chat + +Normally a low-trust agent can't change its own instructions. There's one exception: when you, in **your own** Agent Chat with that agent, ask it to update its instructions, it can save its own `AGENTS.md` — even under `low_trust_review`. + +What makes this safe enough: + +- **The chat turn is the permission.** It needs the agent's current identity and a recorded, signed-in message from you in that chat. Your name on a task, a message from a connector or plugin, an ordinary task or subtask, or a message from another user doesn't qualify. An earlier message from you can't authorize a later outside request, and content the agent reads during the chat isn't a request from you. +- **Your current permission is checked at every save.** If you can't edit that agent's instructions, the save fails — including when the agent's private folder is collected after a run that succeeded, failed, or timed out. Cancelling the run, resetting the chat, reassigning, deleting the message, or losing access ends the exception. +- **It stays small.** It only covers the agent's own instructions. It doesn't let the agent edit another agent's instructions, change general configuration, or reach other privileged APIs, and it's never written into the agent's trust policy. + +One honest caveat: Paperclip checks *who* sent the message, not what it means, and it doesn't ask you to approve each edit. If the agent reads something hostile during your chat, prompt injection is still possible, so keep an eye on what it changes. + +When a save is refused, the agent should tell you which action was blocked and why — for example, that the current run isn't your direct chat, or that you don't have edit permission. You can then ask in your own chat or make the edit yourself on the [Instructions tab](../guides/org/agents.md#instructions-tab). Creating another task doesn't authorize the change. + +--- + ## Reporting up to a parent issue Most real work is split into a parent issue and children. An agent working a child usually needs to tell the parent how things are going — "found the cause, still digging" or "this is blocked on a decision you need to make". That report has to cross from one issue to another, which is exactly the kind of move the trust boundary is suspicious of. So Paperclip grants one narrow, audited hop for it, and nothing more. diff --git a/docs/connectors.md b/docs/connectors.md index 8b54706..6a6fe0b 100644 --- a/docs/connectors.md +++ b/docs/connectors.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Paperclip Connectors seo_description: Every service Paperclip can connect, grouped by what it is for, with the access model, action permissions, and a setup guide behind each one. --- @@ -8,7 +8,7 @@ seo_description: Every service Paperclip can connect, grouped by what it is for, A **connector** is a saved connection to an outside service: a Gmail mailbox, a GitHub organization, a Notion workspace, a PostHog project. You set one up once, decide who and what it is for, and Paperclip carries that decision into every run. -> **Note:** These guides cover the connector model in Paperclip **v2026.1005.0**. Available methods depend on your installed version, instance configuration, and provider approval. A catalog listing does not by itself establish that provider sign-in is available. +> **Note:** These guides cover the connector model in Paperclip **v2026.1012.0**. Available methods depend on your installed version, instance configuration, and provider approval. A catalog listing does not by itself establish that provider sign-in is available. > **Warning:** **Google verification pending.** Paperclip has not yet completed Google app verification. You may see an unverified-app warning during authorization. If Google offers an **Advanced** option to continue to Paperclip, you can choose to proceed after reviewing the requested access. This option is not available for every account; Workspace administrator restrictions and other Google access requirements still apply. Contact [support@paperclip.ing](mailto:support@paperclip.ing) if you cannot connect. @@ -44,7 +44,7 @@ Every row in the catalog lists the methods that connector supports. The names me | Provider app registration | You create an app or bot in the provider's developer console, give it the documented permissions and events, and connect its credentials. Provider-specific channel guides describe exceptions, such as managed inboxes. | | No credential | Nothing to sign in to. You identify the target — a store domain, a generated URL, a shared file — and that is the whole setup. | -Which methods you actually see depends on your instance. **Connect with Paperclip** is hidden unless your instance is enrolled with Paperclip Cloud and Cloud advertises a profile for that connector. Every chat channel, and AgentMail's email inboxes with them, is behind the **Chat connectors** instance setting, which is off by default. The [memory providers](#memory-experimental) are behind a separate **Memory connectors** setting, also off by default. Each connector page lists its own prerequisites. +Which methods you actually see depends on your instance. **Connect with Paperclip** is hidden unless your instance is enrolled with Paperclip Cloud and Cloud advertises a profile for that connector. Every chat channel is behind the **Chat connectors** instance setting, which is off by default. AgentMail is not: its email inboxes are available on every instance. The [memory providers](#memory-experimental) are behind a separate **Memory connectors** setting, also off by default. Each connector page lists its own prerequisites. ### What setup looks like @@ -77,7 +77,7 @@ Find an app and open its setup guide. | Connector | What you can do | Connection methods | | --- | --- | --- | | [Arcade](connectors/arcade.md) | Tool gateway combining the tools you select from several servers behind one URL. Agents use the exposed tools; authentication follows your gateway settings. Setup is unverified. | Gateway URL · Browser sign-in or token/headers | -| [Asana](connectors/asana.md) | Work management for team projects, tasks, and goals. Agents work with the projects and tasks the authorizing Asana account can reach. | Your own OAuth app | +| [Asana](connectors/asana.md) | Work management for team projects, tasks, and goals. Agents work with the projects and tasks the authorizing Asana account can reach. | Connect with Paperclip · Your own OAuth app | | [Composio](connectors/composio.md) | App discovery and execution through Composio Connect or a configured session. Upstream app authorization happens in Composio; broad execution actions need separate review. Setup is unverified. | Composio Connect sign-in · Configured session URL and headers | | [Executor](connectors/executor.md) | One remote endpoint for configured integrations. Agents use its exposed actions within Executor's upstream policies. Setup is unverified. | Deployment URL · Browser sign-in or token/headers | | [Fireflies](connectors/fireflies.md) — **Live exception; not yet stable** | Meeting transcripts, summaries, and action items the connected account can access. Setup is unverified. | Sign in with Fireflies · API key | @@ -103,7 +103,7 @@ Services that connect to many apps for you and hand them to Paperclip through on | Connector | What you can do | Connection methods | | --- | --- | --- | -| [AgentMail](connectors/agentmail.md) — **Experimental** | Email inboxes built for software agents. Gives an agent its own inbox and turns each email conversation into a Paperclip task. Requires the **Chat connectors** experimental setting. | API key | +| [AgentMail](connectors/agentmail.md) | Email inboxes built for software agents. Gives an agent its own inbox and turns each email conversation into a Paperclip task. Available on every instance; no experimental setting needed. | API key | | [Resend](connectors/resend.md) | Transactional email delivery for developers. Agents work with the sending domains and delivery records your Resend account can reach. | Sign in with Resend | | [Slack](connectors/slack.md) | Team messaging. As an app integration, agents read and post within the authorizing account's access. Its separate **experimental** chat channel lets people work with one agent from Slack. | Agent-tool setup: see compatibility notice · Provider app registration for chat | @@ -127,6 +127,7 @@ Services that connect to many apps for you and hand them to Paperclip through on | [Airtable](connectors/airtable.md) | Spreadsheet-database hybrid for structured team data. Agents work with the bases your Airtable sign-in can reach. | Sign in with Airtable | | [ClickHouse](connectors/clickhouse.md) | Columnar database built for analytical queries over very large datasets. Agents query the ClickHouse Cloud service you name. | Sign in with ClickHouse | | [Mixpanel](connectors/mixpanel.md) | Product analytics for user and event behaviour. Agents work with the events and reports your Mixpanel account can reach. | Sign in with Mixpanel | +| [Neon](connectors/neon.md) | Serverless Postgres with branching. Agents manage projects and branches, run SQL, and inspect schemas, optionally pinned to one project. Use a development project. | Sign in with Neon · API key | | [PostHog](connectors/posthog.md) | Product analytics with session replay, feature flags, and experiments. Agents analyse product usage, errors, flags, and experiments. | Sign in with PostHog · API key | | [Supabase](connectors/supabase.md) | Hosted Postgres with authentication, storage, and edge functions. Agents work with the Supabase project you scope the connection to. Use a development project. | Sign in with Supabase · API key | @@ -184,6 +185,8 @@ These hold the credential Paperclip uses to run models. They publish no actions | [OpenRouter](connectors/openrouter.md) | Run models from many vendors through one credential and one bill. | API key | | [Grok](connectors/xai.md) | Run xAI's Grok models. | Grok subscription · API key | +[Check AI usage](connectors/ai-usage.md) explains provider-supported usage snapshots and reconnect messages. These credentials are separate from [assistant connections (MCP)](experimental/assistant-connections.md), which let an external assistant sign in as a person and work with Paperclip. + ### Chat channels — Experimental @@ -235,6 +238,7 @@ Use these guides for the controls your connector exposes. Action permissions and | [Reauthorize, revoke, or disconnect](connectors/reauthorize-and-disconnect.md) | Rotating a credential, removing one person's access, or deleting the connection. | | [Connect a custom MCP server](connectors/custom-mcp-servers.md) | The service is not in the catalog, or you have a URL or config to paste. | | [Connect apps through an MCP aggregator](connectors/mcp-aggregators.md) | The app has no native connector, or an agent asked you to pick an external provider. | +| [Connection instructions](connectors/connection-instructions.md) | Saving service-specific instructions an agent should receive with a connection. | ## Related diff --git a/docs/connectors/access-model.md b/docs/connectors/access-model.md index 2baa37d..bb17a12 100644 --- a/docs/connectors/access-model.md +++ b/docs/connectors/access-model.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: How Connector Access Works seo_description: Which access controls apply depends on the kind of connector. This explains the four gates on tool connections, and what governs channels and models. --- @@ -72,6 +72,8 @@ You do not have to answer this before you connect. Setup states the identity it Creating a personal connection is available to any active member. Creating an organization or dedicated-agent grant is a manager operation — Paperclip rejects the request with *"Only a connection manager can share this credential with the organization"* if you lack the permission, and it enforces that on the server rather than trusting the browser. +AgentMail is a setup exception: its new key defaults to everyone in the company and only the selected inbox owner. Reusing a key retains its existing grants. + An organization grant has its own human audience, set on the connector's identity card: **Any human in the company**, or **Humans I pick** with a named member list. That audience governs which people's runs the shared credential will back. [Use separate accounts for people and agents](separate-accounts.md) walks through choosing between them. @@ -87,6 +89,12 @@ New tool connections normally default to `all_agents`; setup for a requesting ag For a dedicated agent identity the question narrows to *"Which agent owns this GitHub account?"* — the identity and the agent are the same decision. +## Saved connection guidance + +Some connections also contribute editable instructions to an eligible agent's task context. The five experimental memory providers include defaults; saved instructions can be used with other connections too. + +Guidance never grants access or removes an approval requirement. Turning it off retains tool access, and a connection must still have an accessible tool and current grant before its enabled guidance is delivered. See [Saved connection instructions](connection-instructions.md). + ## Action permission: which calls are allowed Once connected, Paperclip reads the service's action list and gives each entry one of three states: @@ -137,6 +145,8 @@ This is not a general sandbox claim, and it is not a claim in the other directio Access decisions resolve at call time, not at setup time. The tool gateway holds the effective policy for an agent — the connection's own settings, plus any tool profiles and company tool policies that apply — and decides allow, ask, or deny before the request reaches the provider. Changing a permission takes effect on the next call; it does not require reconnecting. +> **Note:** Custom `tools:use` permission grants — the stored per-agent or per-person kind, not the connection identities described above — are enforced exactly as written. A grant whose `scope.allow` list names a different tool, connection, or application doesn't cover the call, and a grant with an unrecognised selector or a malformed restriction covers nothing. Review custom grants after upgrading: if an agent loses a tool it used before, check its grant first. The [Tool Gateway reference](../reference/api/tool-gateway.md#explicit-tool-grants) lists the matching rules. + ## Related - [Connectors](../connectors.md) @@ -147,5 +157,5 @@ Access decisions resolve at call time, not at setup time. The tool gateway holds ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/action-permissions.md b/docs/connectors/action-permissions.md index b008ae4..30df315 100644 --- a/docs/connectors/action-permissions.md +++ b/docs/connectors/action-permissions.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Set Connector Action Permissions seo_description: Switch each connector action to Allowed, Ask first, or Off, refresh the action list when a provider changes it, and see how new actions are handled. --- @@ -89,6 +89,12 @@ For the ordinary case, the wizard projects the app's action defaults into polici Two details worth knowing wherever held-back review does apply: an action you had already set to **Off** stays off rather than reappearing for review, and a connection configured for safe defaults exempts actions classified **read**, holding back only writes and destructive actions. +## Instructions do not change permissions + +The **Agent instructions** toggle controls guidance in the agent's prompt, not its access to tools. Switching it off does not switch actions off, and switching it on does not make an **Off** action available. See [Saved connection instructions](connection-instructions.md). + +For aggregator accounts, the action list belongs to the saved gateway. An imported app card does not create a separate policy for that upstream app. + ## Limits you cannot lift A permission switch cannot grant something the connector was never allowed to do. @@ -112,5 +118,5 @@ When you change a permission on a GitHub connection bound to an agent identity, ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/agentmail.md b/docs/connectors/agentmail.md index 8cf6b71..7ce0c45 100644 --- a/docs/connectors/agentmail.md +++ b/docs/connectors/agentmail.md @@ -1,4 +1,5 @@ --- +paperclip_version: v2026.1012.0 seo_title: AgentMail Connector seo_description: Give a Paperclip agent its own email inbox with AgentMail. Each conversation becomes a task. Setup, routing, sender limits, and troubleshooting. --- @@ -13,29 +14,60 @@ This is a conversation channel, not a set of tools an agent calls against your o ## Before you connect -- **Chat connectors** must be switched on for the instance. It is an experimental setting and it is off by default; an instance administrator enables it under experimental settings. Without it, email and chat setup is hidden. -- An AgentMail account and an API key from the [AgentMail console](https://console.agentmail.to). +- An AgentMail account and an API key from [AgentMail's API-key page](https://console.agentmail.to/dashboard/api-keys). An organization or pod key can create new addresses; a key limited to one inbox can only connect that inbox. - The agent that will own the inbox. One inbox belongs to one agent. -- To use your own domain, verify it in AgentMail first. Inboxes on `agentmail.to` need no verification. +- To use your own domain, verify it in AgentMail first. Inboxes on `agentmail.to` need no verification. Paperclip does not register domains or manage DNS; see AgentMail's [custom domains guide](https://docs.agentmail.to/custom-domains). + +AgentMail is available on every instance. You do not need to turn on any experimental setting. ## Connect AgentMail -1. Open **Connectors** and select **AgentMail**. -2. On the **Access** step, choose the identity and which agents may use the connection, then select **Save and continue**. -3. Paste your **AgentMail API key**. Paperclip stores it as a secret. -4. Create a new inbox or select an existing one. If you create one, choose the address and, for a custom domain, pick a domain you have already verified. -5. Choose how Paperclip receives mail: - - **Live connection** — Paperclip holds an outbound connection to AgentMail and reconnects on its own. No public URL is needed. This is the simpler choice and works behind a firewall. - - **Webhook** — AgentMail posts to Paperclip. Your API key must have webhook create, read, and delete permission for the inbox, or setup fails with a message telling you to fix the key or use **Live connection**. -6. Assign the inbox to its agent and finish. +Setup is two short steps: pick the agent, then pick its address. -> **Note:** If the owning agent runs at low trust, it needs an active sandbox environment before its inbox can be connected. +1. Open **Connectors**, find **AgentMail**, and select **Add connection**. The screen reads **Give an agent an email address**. +2. On the **Agent** step, choose the agent under **Agent**. +3. Supply the API key. If you or your team already saved an AgentMail key you can use, Paperclip offers it in the list; otherwise choose **Enter a new API key** and paste one. Paperclip stores it as a secret and never shows it to agents. Select **Continue**. +4. On the **Email address** step, type the name and pick the domain from the dropdown beside it. The domain starts on your first verified custom domain, or `agentmail.to` if you have none. Paperclip checks the address as you type: + - *"This email address is already in use. Choose a different address."* means someone already has it. Pick one of the suggestions after **Try:**, or type another. + - *"AgentMail confirms availability when you create the address."* means Paperclip could not tell yet. You can still go ahead; AgentMail has the final say when the address is created. +5. To use an inbox that already exists in your AgentMail account instead, select **Use an existing inbox** and pick it from the list. Inboxes already assigned to another agent are marked **already assigned**. +6. Select **Create email address** (or **Connect email address** for an existing inbox). + +When the screen reads **Your agent’s email is ready**, the agent can receive mail at that address. Select **Done** to go back to **Connectors**, or **Email settings** to open the inbox's settings. + +A new key starts out usable by every person in the company and by the selected agent only. If you reuse a saved key, its existing access is kept as it was. You can adjust access later on the inbox's **Access** tab. Those saved-account changes apply to every inbox that uses the same key. + +### Advanced options + +**Advanced options** on the email step holds the settings most people can leave alone: + +- **Set up a custom domain ↗** links to AgentMail's domain guide. +- **Receiving** chooses how Paperclip gets new mail: + - **Live connection** (the default) — Paperclip holds an outbound connection to AgentMail and reconnects on its own. No public URL is needed, so it works behind a firewall. + - **Webhook** — AgentMail posts to Paperclip. Your API key must have webhook create, read, and delete permission for the inbox, or setup fails with a message telling you to fix the key or use **Live connection**. +- A reminder that an unrestricted inbox can receive mail from anyone, and **Review trust settings** to check which tasks and tools this agent can reach. + +> **Note:** If the owning agent runs at low trust, it needs a work boundary and an active sandbox environment before its inbox can be connected. On the **Agent** step, Paperclip says *"This agent needs a work boundary before it can receive email."* — select **Configure work boundary** to set it. + +### If setup is interrupted + +You can leave and come back. A browser refresh keeps what you typed, except the API key, which is never saved in the browser. An unfinished inbox shows on **Connectors** with **Finish setup**, which picks up exactly where you stopped, including an address that was already created before something went wrong. + +If an address was created but the connection did not finish, the email step shows the address with **Finish connecting**. To use another address instead, select **Choose a different address**. The first inbox stays in your AgentMail account; Paperclip never silently creates a replacement. + +To remove an unfinished or finished inbox from Paperclip, use **Remove connection** on **Connectors**. The inbox and its mail stay in AgentMail, and task history stays in Paperclip. + +## When an agent asks for an email address + +You do not have to set the inbox up in advance. When an agent working on a task needs its own email address, it asks you with a card on the task rather than a setup link or a request to paste a key in chat. + +The card asks only for the API key. Choose a saved key or enter a new one, then select **Connect AgentMail**. Paperclip saves the key, creates an address for that agent (or connects the one inbox an inbox-limited key allows), and lets the agent carry on only once the inbox is actually usable. The new key is usable by everyone in the company and by that one agent. If the key is wrong, **Change API key** lets you try another before any address is created; **Not now** declines. ## How email becomes work | Stage | What happens | | --- | --- | -| A message arrives | Paperclip creates a task for the owning agent, with the message as the opening context | +| A message arrives | A new thread creates a task for the owning agent; later messages on that thread continue the same task | | The agent works | Ordinary task work. Internal comments and the agent's final response stay in Paperclip and never send email | | The agent replies | Only an explicit send or reply leaves Paperclip. A reply continues the existing thread; a new message starts a separate child task | | Delivery | The agent can check delivery status for something it sent | @@ -73,16 +105,27 @@ That confirms the whole receiving path — credential, inbox assignment, and rou > **Note:** Procedure, not a recorded test result. It sends one message from your own account to your own inbox; nothing is delivered to a third party. +## Manage an inbox + +Open the inbox from **Connectors**. Each inbox has its own **Settings**, **Access**, **Conversations**, and **Activity** tabs. + +- **Settings** leads with the agent's address. Click it to copy it, or select **View inbox** to open the inbox in AgentMail's console. Below that, **Receiving email** shows the receiving mode and the **Last mail check**, with **Pause** and **Resume**. **Reconnect inbox** lets you paste a **New API key** or switch receiving mode, and **Disconnect inbox** stops receiving email in Paperclip while the inbox stays in AgentMail. +- **Access** holds the saved account's credential and agent controls. Changes there apply to every inbox that uses the same AgentMail account. +- **Conversations** links each email thread to its task. +- **Activity** shows deliveries and anything Paperclip published. + ## Troubleshooting and limitations | Problem | Likely cause | Fix | | --- | --- | --- | -| AgentMail does not appear in **Connectors** | **Chat connectors** is off for the instance | Ask an administrator to enable it in experimental settings | +| *"This email address is already in use."* | Someone else already has that address | Pick a suggestion after **Try:**, or type another name | +| The key only connects one inbox | It is an inbox-limited key | Choose a saved account key or enter one to create a new address, or select **Use the existing inbox instead** | | Setup fails asking about webhook permissions | The API key cannot manage webhooks for this inbox | Grant webhook create, read, and delete permission in AgentMail, or choose **Live connection** | | Mail arrives in AgentMail but no task appears | Receiving is not established, or the inbox is not assigned to an agent | Check the connection's health and that the inbox has an owning agent | | A custom-domain inbox cannot be created | The domain is not verified in AgentMail | Verify the domain in AgentMail, then retry | | The agent cannot read a thread you can see | The thread is on an inbox that is not assigned to that agent | Assign the inbox to that agent, or give the work to the agent that owns it | | The inbox was disconnected and will not come back | A disconnected inbox is not reusable | Create a new inbox connection | +| An address was created but setup stopped | A provider or network error after the address was allocated | Select **Finish setup** on **Connectors** to resume; nothing is duplicated | Limitations: one inbox, one owning agent. Paperclip does not enforce who may write to the inbox. Attachments and thread history come from AgentMail, so what an agent can see is what AgentMail retains. @@ -92,3 +135,8 @@ Limitations: one inbox, one owning agent. Paperclip does not enforce who may wri - [Verify a connector and fix a broken one](verify-and-troubleshoot.md) - [Gmail](gmail.md) — read your own mailbox instead of giving an agent its own. - [AgentMail inbox documentation](https://docs.agentmail.to/inboxes) + +## Sources + +- [AgentMail setup and inline flow](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/AgentMailIntentSetup.tsx) — default access and saved-key setup for the requesting agent. +- [Email connection service](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/email-channels.ts) — inbox ownership and conversation lifecycle. diff --git a/docs/connectors/ai-usage.md b/docs/connectors/ai-usage.md new file mode 100644 index 0000000..7685c3a --- /dev/null +++ b/docs/connectors/ai-usage.md @@ -0,0 +1,73 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Check AI Account Usage and Limits +seo_description: Read provider-reported allowances for Claude, OpenAI, Grok, and OpenRouter accounts, understand missing values, and repair sign-in from a task. +--- + +# Check AI account usage + +Before giving an agent a long task, check the allowance on the account it will use. Paperclip shows what the provider reports when you ask; it does not estimate a subscription balance from your task costs. + +Usage checks and AI connection setup do not require an experimental setting. + +## Check a saved account + +1. Open **Connectors** and the saved AI account. +2. Find **Usage** and select **Check usage**. +3. Read the returned limits and reset times. Select **Refresh** when you need another observation. + +| Account | Supported check | +| --- | --- | +| Anthropic subscription | Provider-reported Claude usage windows and overage when available | +| OpenAI subscription | Provider-reported allowance windows, reset times, and overage when available | +| Grok subscription | Provider-reported subscription limits and overage when available | +| OpenRouter API key | Key credit limits, reset cadence, and free-model limits when available | +| Other API-key methods | **Unavailable for this sign-in method.** | + +The check uses the stored connection you selected. It does not probe an ambient CLI login. Opening an account page does not trigger the check automatically. + +## Read the result + +A limit may show a percentage, a used amount and cap, or a remaining allowance. **Limit reached** means the provider reports the limit is exhausted. **Blocked** means it explicitly reports usage is not allowed. Reset time or cadence appears when supplied. + +Missing fields show **Not reported**, never zero. Grok may omit included-plan usage, and some Claude credentials can run models without permission to read usage. **Usage access denied.** does not mean your allowance is exhausted. + +**Overage** describes the provider's extra-usage state. **On · Availability unknown** means enabling overage alone has not established a funded usable balance. The observation timestamp tells you when the response was read. + +Checking usage does not refresh your credential, buy credit, change the account selected for a task, or stop an active run. It is a provider observation, separate from Paperclip budgets and per-run cost accounting. + +## Repair sign-in from a task + +When a task cannot start because its AI credential is missing or expired, it shows an authentication connection card. Open that card and connect your account or reconnect the existing one. After the card finishes successfully, the task resumes automatically through normal admission. + +Only the account owner can reconnect it. If the task uses someone else's account, the card explains who must restore it. If that account is no longer available to you, ask its owner to restore access or choose another available connection in the agent's settings. + +A reconnect retains the existing account's audience, agent access, and default selection. It does not broaden sharing. In agent settings, **Reconnect account** repairs your unavailable personal default; **Connect another account** lets you establish another account. + +## Troubleshooting + +| Message | What to do | +| --- | --- | +| **Sign in again to check usage.** | Reconnect the stored account. | +| **Usage access denied.** | The provider denied usage-read access for this credential. Check usage at the provider if necessary. | +| **Too many checks. Try again later.** | Wait before another usage check. This does not consume your model allowance. | +| **Reconnect to check usage.** | Restore the connection before checking again. | +| **Provider unavailable. Try again.** | Retry later; the provider did not supply a usable response. | +| **Couldn’t read usage. Try again.** | The response could not be read. Missing data is not treated as zero. | + +## API equivalent + +Board-authenticated users with company access can request the same observation: + +```http +GET /api/companies/{companyId}/ai-connections/{connectionId}/usage +``` + +Pass `?grantId={grantId}` when the connection has multiple eligible credential grants. The response includes `checkedAt`, `status`, provider-reported `limits` and `overage`, and an `errorCode` when unavailable. You can only read a credential you are allowed to use. + +## Related guides + +- [Anthropic](anthropic.md) +- [OpenAI](openai.md) +- [Grok](xai.md) +- [OpenRouter](openrouter.md) diff --git a/docs/connectors/anthropic.md b/docs/connectors/anthropic.md index fcbd2c0..bccdca2 100644 --- a/docs/connectors/anthropic.md +++ b/docs/connectors/anthropic.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Anthropic Connector seo_description: Give agents Claude model access with a subscription or an Anthropic API key. Runtime requirements, credential assignment, a test run, and fixes. --- @@ -89,10 +89,38 @@ The practical consequence: **a binding cannot substitute for a responsible user. A **Personal** connection stays yours; **Company shared** makes one account available to eligible agents on runs whose responsible person is in its human audience. The model itself is chosen in the agent's configuration, not here. +### Connect from an agent's settings + +You can also connect an account without leaving the agent. In the agent's **AI connection** field: + +- **Reconnect account** appears when your current personal default needs attention. It signs you in again and repairs that same account, so its default and its agent access stay as they were. +- **Connect another account** opens **Connect account**, which tells you up front that the new account *"will become your default for this provider."* Your tasks use it; other people keep their own defaults. + +When you connect a brand-new account this way, you also see **Allow all agents in this company to use this account for my tasks**. It starts ticked if you can manage connections. Clear it to keep the account to this agent only. Either way, the account backs only tasks you are responsible for, and a reconnect never widens access an account already has. If sign-in succeeds but the default cannot be saved, **Retry default selection** tries again without another sign-in. + ### Reconnect from a task If a task shows an authentication card, select **Fix connection** to repair the selected account without leaving the task. The account owner signs in again; the card explains when another owner must do it. After setup completes, the task resumes through normal admission. Reconnecting preserves the account's audience and agent access. +## Check your usage limits + +Before you hand an agent a long task, you can see how much of the provider's allowance is left. Open the saved account and find **Usage**, then select **Check usage**. This works for an Anthropic subscription. An API-key account shows *"Unavailable for this sign-in method."* instead of the button, because the provider has no single-key allowance to read. + +Paperclip reads the limits only when you ask. Opening the account, listing connections, and starting a run never trigger a check. Each limit window shows how much is used and when it resets, and is marked **Limit reached** or **Blocked** when the provider says so. **Overage** shows whether extra paid usage is available. Anything the provider leaves out shows as **Not reported**, never as zero. After a successful check, the button becomes **Refresh**. + +Some Claude subscription credentials are allowed to run models but not to read usage. In that case you see *"Usage access denied."* That is a limit of the stored sign-in, not a sign that your plan is exhausted, and signing in again for model access alone does not change it. + +Checking is read-only. It does not move work to another account, stop runs at a limit, refresh the credential, or buy credit. + +| Message | What it means | +| --- | --- | +| *"Sign in again to check usage."* | The stored credential has expired. Reconnect the account | +| *"Usage access denied."* | The provider refused to share usage for this credential | +| *"Too many checks. Try again later."* | The provider rate-limited the check itself. Your allowance is not affected | +| *"Reconnect to check usage."* | The account is not usable right now. Reconnect it first | + +Board users can run the same check over the API with `GET /api/companies/{companyId}/ai-connections/{connectionId}/usage`. + ## Try it Before you run anything, read the agent's configuration and note which AI connection it is set to use — the responsible user's default, or a specific shared connection. That setting, not the run output, is where the intended credential is visible. @@ -124,7 +152,7 @@ Watch the run rather than a status badge: a connection can show as connected and | The sign-in command does nothing | The `claude` CLI is not installed on the host you ran it on, or you ran it on the wrong machine | Install the CLI and run the command on the Paperclip server host. This branch also requires that you are operating Paperclip locally rather than over a remote board session | | *"Another sign-in is still open"* | A previous attempt has not expired | Finish or wait out the open attempt, then retry | | Status **expired** or **needs attention** | A subscription credential rotated, or the API key was revoked | Reconnect the account | -| Runs fail with a provider quota error | Anthropic's plan or key limits, not a Paperclip limit | Check usage with Anthropic | +| Runs fail with a provider quota error | Anthropic's plan or key limits, not a Paperclip limit | On a subscription, select **Check usage** on the saved account to see which window is exhausted and when it resets. Otherwise check usage with Anthropic | Limitations: one connection is one provider account. This connector grants no tool access of any kind. Model choice and the agent's runtime are configured on the agent, not on the connection. @@ -133,5 +161,6 @@ Limitations: one connection is one provider account. This connector grants no to - [Connector overview](https://paperclip.ing/product/connectors/anthropic/) - [OpenAI](openai.md), [OpenRouter](openrouter.md), [Grok](xai.md) — the other model providers. +- [Check AI account usage](ai-usage.md) - [How connector access works](access-model.md) - [Anthropic API documentation](https://docs.anthropic.com/) diff --git a/docs/connectors/arcade.md b/docs/connectors/arcade.md index 0c8a19a..2d391de 100644 --- a/docs/connectors/arcade.md +++ b/docs/connectors/arcade.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Arcade Connector seo_description: Connect tools selected in an Arcade gateway, choose agent access, and check authentication and action permissions. Setup is unverified. --- @@ -33,6 +33,16 @@ Tools come from your Arcade account and appear in Paperclip when you connect. Ar Every tool starts as **Allowed**. Set actions to **Ask first** or **Off** on **Permissions** where needed. Review the list after **Refresh actions** and after changing the gateway's tool selection. +## See connected app accounts + +Open the saved gateway's **Permissions** page to see **Connected apps** and **Refresh Arcade**, when account discovery is available. The list is limited to the configured Arcade user and the tools this gateway exposes. + +If sync needs separate credentials, use **Set up account sync** in the gateway's menu. Enter a **Project API key** for the same Arcade project and its **Arcade user ID**, then select **Save and sync**. That key is stored separately and used only for account sync; your gateway can work without it. + +Accounts appear under their app cards in **Connectors**, labelled **Managed by Arcade**. Use **Open in Arcade** to manage them upstream. Paperclip access stays on the saved gateway and covers its exposed apps. + +A successful gateway setup is not proof that a particular app is authorized. The agent checks app access when it first uses it and may still need your help with provider authorization. + ## Try it Ask an eligible agent to perform one read-only lookup that your gateway exposes. Compare the result with the source app and inspect the connector call in Paperclip. @@ -60,4 +70,6 @@ The available tools depend on the gateway. A successful connection does not prov ## Sources -- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/arcade.json#L16) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/arcade.json#L16) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Catalog and account grouping](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/Browse.tsx) — filters, grouped account rows, and gateway menus. +- [Connected app list](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/app-detail/ConnectedAggregatorApps.tsx) — refresh controls and verification states. diff --git a/docs/connectors/asana.md b/docs/connectors/asana.md index 8946e14..4dd4b8d 100644 --- a/docs/connectors/asana.md +++ b/docs/connectors/asana.md @@ -1,7 +1,7 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Asana Connector -seo_description: Let agents read and update Asana tasks. Registering the required OAuth app, workspace and project reach, a read test, and troubleshooting. +seo_description: Let agents read and update Asana tasks. Sign in with Paperclip's Asana app or your own, workspace and project reach, a read test, and fixes. --- # Asana @@ -11,35 +11,50 @@ Agents can work with Asana tasks — finding them, reading details, and updating ## Before you connect - An Asana account with access to the workspace and projects you want agents to use. -- You must register your own Asana OAuth app. Asana does not support automatic client registration for this server, so there is no path that skips the developer console. Add Paperclip's callback URI to the app; Paperclip shows the exact URI during setup. -- Some Asana organizations restrict who may create or authorize apps. If you are not an administrator, check before you start rather than after. +- Some Asana organizations restrict who may authorize or create apps. If you are not an administrator, check before you start rather than after. -## Connect Asana +There are two ways to connect: + +| Method | What you need | When it is offered | +| --- | --- | --- | +| **Sign in with Asana** | Nothing to register. You sign in through Paperclip's own Asana app | When your instance is enrolled with Paperclip Cloud and Cloud offers the Asana profile | +| **Use your own Asana OAuth app** | An Asana MCP app you register yourself | Always, including on instances that are not enrolled | + +## Connect with Paperclip's Asana app + +1. Open **Connectors** and select **Asana**. +2. Read the access line above the main button. This method connects as you or as a dedicated agent account, never as a shared organization identity. To change that or narrow the agents, select **Change**. +3. Select **Continue to sign in**. Paperclip shows *"Sign in with Asana to choose your workspace and connect it to Paperclip."* +4. In Asana, choose the workspace and approve access. Paperclip keeps the connection signed in from then on. + +## Connect with your own Asana OAuth app The callback URI comes from Paperclip and the client credentials come from Asana, so the two consoles interleave. Open Paperclip's setup first to read the URI, then register the app, then come back. ### 1. Read Paperclip's callback URI 1. Open **Connectors** and select **Asana**. -2. Read the access line above the main button. It says who the connection signs in as and which agents can use it. To pick a different identity or narrow the agents, select **Change**. -3. Select **Use your own OAuth app**. Paperclip displays the exact callback URI — copy it. It is the `/api/tools/oauth/callback` route on your instance's origin. Leave this screen open. +2. Read the access line above the main button, and select **Change** if you want a different identity or fewer agents. +3. Select **Use your own Asana OAuth app**. On an instance without Paperclip Cloud this is the only method, and the screen opens on **Your OAuth app**. Paperclip displays the exact callback URI — copy it. It is the `/api/tools/oauth/callback` route on your instance's origin. Leave this screen open. + +> **Note:** For local development Paperclip uses `localhost` in the callback, even if you opened Paperclip at `127.0.0.1`. Public deployments should use their canonical HTTPS address. ### 2. Create the Asana MCP app In Asana's developer console at [app.asana.com/0/my-apps](https://app.asana.com/0/my-apps): 1. Select **Create new app** and enter a name. -2. **Set the app type to "MCP app".** This is the step that catches people out — a standard API app will not work here, because Asana keeps MCP tokens separate. +2. **Set the app type to "MCP app".** This is the step that catches people out — a standard API app or a personal access token will not work here, because Asana keeps MCP tokens separate. 3. Select **Create app**. 4. In the **OAuth** section of the sidebar, add the callback URI from step 1 as the **Redirect URL**. -5. Under **Manage distribution**, choose the specific workspaces the app may be used in, or allow any workspace. +5. Under **Manage distribution**, choose the specific workspaces the app may be used in, or allow any workspace, and save. 6. Copy the **client ID** and **client secret**. -> **Note:** Asana MCP apps have no scopes to choose. Asana's guidance is to use `default` or omit the parameter entirely — so if you are looking for a permissions checklist here, there is not one. Reach comes from the authorizing account instead. +> **Note:** Asana MCP apps have no scopes to choose. Asana grants one fixed `default` scope — so if you are looking for a permissions checklist here, there is not one. Reach comes from the authorizing account instead, and Paperclip's action permissions decide which tools an agent may use. ### 3. Finish in Paperclip -Return to the setup screen, supply the client ID and secret, then authorize in Asana as the account whose access you want the connection to have. +Return to the setup screen, supply the client ID and secret, then authorize in Asana as the account whose access you want the connection to have. Paperclip stores the secret encrypted. If you come back to an unfinished setup with the same client ID, you do not need to paste the secret again; changing the client ID needs its matching secret. Asana's own reference is [Integrating with Asana's MCP server](https://developers.asana.com/docs/integrating-with-asanas-mcp-server). @@ -67,7 +82,8 @@ Compare against the task in Asana. A lookup of a task you can already see confir | Problem | Likely cause | Fix | | --- | --- | --- | -| Setup asks for a client ID and secret | Expected — Asana requires your own OAuth app | Register one in Asana's developer console | +| Setup asks for a client ID and secret | The instance is not enrolled with Paperclip Cloud, or you chose your own app | Register an Asana MCP app, or enroll the instance to use **Sign in with Asana** | +| Authorization fails with an API app | The Asana app is not an MCP app | Create a new app with the type set to MCP app | | Authorization fails with a redirect or URI error | The callback URI on the Asana app does not match the one Paperclip shows | Copy the URI exactly and retry | | You cannot create the app | The Asana organization restricts app creation | Ask an Asana administrator | | A project's tasks are invisible | The authorizing account is not a member of that project | Add it to the project in Asana; no reconnect needed | diff --git a/docs/connectors/cognee.md b/docs/connectors/cognee.md index 67840de..977e8e9 100644 --- a/docs/connectors/cognee.md +++ b/docs/connectors/cognee.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Cognee Cloud Memory Connector seo_description: Connect an active Cognee Cloud workspace with its tenant URL and API key, then choose how agents recall, save, or forget memory through Paperclip. --- @@ -21,7 +21,7 @@ You do not need to install a local MCP runtime for this connection. The bundled 1. Open **Connectors** and select **Cognee**. 2. Read the access line above the main button. Select **Change** to choose a personal credential or narrow the agents that may use it. 3. Enter **API Base URL** and **Cognee API key**, then complete setup. -4. Review the actions on **Permissions**. +4. Review **Permissions** and **Agent instructions**. Use the HTTPS tenant origin in the form `https://your-tenant.aws.cognee.ai`, without an API path, query, or custom port. Paperclip validates the origin and saves both values securely. Setup checks Cloud access before completing. @@ -37,6 +37,8 @@ Active actions start as **Allowed**. Use **Ask first** for saved memories and ** The Cloud key determines the reachable data. A dataset or session name is context for the call, not a new isolation boundary enforced by Paperclip. Use provider permissions or separate credentials when work must stay separate. +You can edit or disable the guidance that accompanies this connection under **Agent instructions**. See [Saved connection instructions](connection-instructions.md). + ## Try it Ask an eligible agent to use `recall` for a known, harmless fact in a named dataset, without calling `remember` or `forget`. Compare the answer with that dataset in Cognee. @@ -63,5 +65,5 @@ Turning off the experimental setting leaves saved connections running and allows ## Sources -- [Cognee definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/cognee.json) — credential fields. -- [Bundled Cloud client](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/cognee-connection.ts) and [tool connection service](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/tool-access.ts) — reviewed tools and setup behavior. +- [Cognee definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/cognee.json) — credential fields and default instructions. +- [Bundled Cloud client](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/cognee-connection.ts) and [tool connection service](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/tool-access.ts) — reviewed tools and setup behavior. diff --git a/docs/connectors/composio.md b/docs/connectors/composio.md index b9e0b73..538abd9 100644 --- a/docs/connectors/composio.md +++ b/docs/connectors/composio.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Composio Connector seo_description: Connect Composio Connect or a configured session URL. Understand app authorization, aggregator permissions, and unverified setup steps. --- @@ -21,7 +21,7 @@ Composio is available on every instance; no experimental setting is required. 1. **Unverified:** Open **Connectors** and select **Composio**. 2. **Unverified:** Read the access line above the main button. Select **Change** to choose the identity or narrow the agents that may use it. -3. **Unverified:** Select **Connect Composio** to use the prefilled `https://connect.composio.dev/mcp` endpoint and complete browser sign-in. For an externally configured session, replace the **MCP server URL** with its URL, then select **Change** and add its required headers under **Authentication**. +3. **Unverified:** Select **Connect Composio** to use the default `https://connect.composio.dev/mcp` endpoint and complete browser sign-in. For an externally configured session, open **Reuse an existing session** and supply its URL and required headers under **Change**. 4. **Unverified:** Finish the connection check and inspect the exposed actions in Paperclip. 5. **Unverified:** When Composio requests authorization for an upstream app, inspect the app and requested access before completing that separate browser flow. @@ -33,6 +33,22 @@ Tools come from your Composio account and appear in Paperclip when you connect. Every tool starts as **Allowed**. Review broad execution and connection-management actions on **Permissions** and choose **Ask first** or **Off** as appropriate. Restrict upstream app authorizations in Composio too. +## Connect an app through a saved account + +For an app without native setup, select **Connect** on its catalog card and choose Composio if more than one provider is offered. Pick a saved **Composio account** and select **Continue**. To save another gateway, choose **Connect a new account…** and select **Connect new account**. + +Paperclip checks whether that app is already active. If it needs authorization, use **Connect {app} in Composio**, finish the hosted sign-in, return, and select **I’ve connected it**. Paperclip checks the account again before reporting it connected. This flow creates no task and starts no agent run. + +An expired or uncertain handoff is not retried silently. **Get a new link** lets you explicitly request another. Reusing a saved gateway keeps its access and action settings; it does not add new agent grants or create isolated permissions for this one app. + +## See and refresh app accounts + +The gateway's **Permissions** page lists **Connected apps** and starts a check on first load. **Refresh Composio** refreshes that saved gateway. The same action is in its menu on **Connectors**; browsing also checks the supported public Composio catalog in the background. + +Imported accounts appear under their app cards, labelled **Managed by Composio** with the saved gateway name. Failed checks preserve last-known accounts as **Not verified**; expired accounts show **Needs sign-in**. These are observations of Composio authorization, not new Paperclip connections or grants. + +Use **Open in Composio** to manage an imported account. It opens Composio Connect's app area, which is separate from Platform developer projects. Removing the saved gateway from Paperclip does not delete its app accounts in Composio. + ## Try it Ask an eligible agent to discover a read-only lookup in an app you have authorized. Approve only a lookup, compare its result with the app, and inspect the connector call. @@ -62,4 +78,6 @@ The connector's reach depends on upstream accounts and the selected endpoint. Re ## Sources -- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/composio.json#L20) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/composio.json#L20) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Catalog and account grouping](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/Browse.tsx) — filters, grouped account rows, and gateway menus. +- [Connected app list](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/app-detail/ConnectedAggregatorApps.tsx) — refresh controls and verification states. diff --git a/docs/connectors/connection-instructions.md b/docs/connectors/connection-instructions.md new file mode 100644 index 0000000..c77d2cd --- /dev/null +++ b/docs/connectors/connection-instructions.md @@ -0,0 +1,76 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Saved Connection Instructions +seo_description: Give agents guidance from a saved connection, edit or disable provider defaults, and see when the instructions apply without changing tool permissions. +--- + +# Saved connection instructions + +You can attach guidance to a saved connection so eligible agents know when and how to use it. For example, a memory connection can tell agents to recall earlier decisions before work and save useful facts afterwards. + +Instructions guide behavior. The connection's access rules and action permissions still decide what agents may do. + +## Review or edit the guidance + +The five [memory connectors](memory-connectors.md) include reviewed defaults. When a connector declares a template, its setup shows **Agent instructions** on the existing screen; there is no extra setup step. + +To change a saved connection: + +1. Open its **Permissions** page and find **Agent instructions**, between agent access and the action list. +2. Leave **Tell agents to use {provider}** on to include the guidance when this connection is available for a task. +3. Select **Edit instructions**, write your guidance, then select **Save instructions**. Text can contain up to 2,000 characters. +4. To adopt the provider's current template again, select **Reset to default** and save. Resetting preserves the toggle's state. + +Turning the toggle off keeps your text and tool access. The notice makes that explicit: agents can still use the tools, but do not receive these instructions. A failed save keeps your draft so you can retry. + +Reconnects, sign-in returns, and action refreshes keep your saved choices. A newer catalog template does not overwrite custom text or turn an opted-out connection back on. + +## See what an agent receives + +Open the agent's instructions and look for **From connections**. This read-only section shows saved guidance with links back to its source connections, including a notice for disabled instructions. + +The actual guidance depends on the task. The connection must be available to that agent and responsible person, with a current credential grant and at least one accessible tool. A tool requiring approval can still make the guidance available. Revoked access, disabled tools, or missing required connection configuration can withhold it. + +Edits apply to subsequent turns. A turn already running keeps the guidance it started with; Paperclip replaces an incompatible session when the saved guidance changes. + +## Write useful instructions + +Keep the text specific to how you want the connection used. Name the intended memory context or workflow, describe when to use it, and ask for evidence when a save or retrieval fails. + +```txt +Recall relevant project decisions before planning work. +Save concise facts that will help the next task, and cite what was saved. +Treat older memories as background context when the current task differs. +``` + +Do not put API keys or passwords in instruction text. Do not tell an agent that guidance grants access or overrides an approval requirement. + +## Use instructions beyond memory + +Saved instructions are a general connection capability. Custom and non-memory connections can store the same `agentInstructions` setting through the connection API, even without a template: + +```json +{ + "agentInstructions": { + "enabled": true, + "text": "Read the release handbook before changing a deployment. Cite the checklist." + } +} +``` + +The current editor appears only for connections with explicit template metadata. It is not a universal text box on every custom server. Paperclip does not automatically trust a remote MCP server's initialization prose as connection instructions. + +For a custom HTTP or process adapter, deliver the server-provided instruction snapshot alongside the agent's normal prompt and treat a changed snapshot as a session change. The [HTTP adapter](../reference/adapters/http.md#connection-instructions) and [Process adapter](../reference/adapters/process.md#connection-instructions) references describe exactly how the snapshot arrives. + +## Related guides + +- [Memory connectors](memory-connectors.md) +- [How connector access works](access-model.md) +- [Set action permissions](action-permissions.md) +- [Connect a custom MCP server](custom-mcp-servers.md) + +## Sources + +- [Settings contract](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/connection-instructions.ts) — fields, text limit, defaults, and public configuration. +- [Editor and agent view](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionInstructions.tsx) — labels, saving, reset, and notices. +- [Authorized delivery](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/connection-instructions.ts) — task-dependent availability and instruction snapshots. diff --git a/docs/connectors/custom-mcp-servers.md b/docs/connectors/custom-mcp-servers.md index 6acfba2..a9257d5 100644 --- a/docs/connectors/custom-mcp-servers.md +++ b/docs/connectors/custom-mcp-servers.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Connect a Custom MCP Server seo_description: Add an MCP server that is not in the Paperclip catalog by URL, by pasting a config, or with a provider-generated URL, and govern it like any connector. --- @@ -20,6 +20,12 @@ What happens next depends on the server: - **It wants a key.** Paperclip asks for it, and states where it goes: *"Paperclip sends your key as an Authorization header."* Custom headers are available for servers that expect something else. - **It wants nothing.** Paperclip says so plainly: *"The server is open to anyone with the address."* Treat that address as the credential. +### Staying signed in after the access token expires + +Many OAuth servers hand out short-lived access tokens. To keep a custom server connected past that, Paperclip also asks for `offline_access` when the server's authorization server lists it as supported and does not rule out refresh tokens, even if the MCP server itself only mentions its tool scopes. When the provider issues a refresh token, Paperclip renews access in the background and agents keep working without another sign-in. + +The provider still decides whether to issue one. If it does not, the connection needs a fresh sign-in each time the access token expires. An older custom connection made before this change picks up refresh support the next time you select **Reconnect**. + A server outside the reviewed catalog is labelled **Unverified server**. That label is a statement about review, not about whether the connection works. ## Paste a config @@ -56,6 +62,12 @@ Because the server has not been reviewed, two habits are worth keeping: - Start with every write **Off** and promote deliberately. A name-based classification is the fallback when a server publishes no annotations, and an unfamiliar naming scheme can under-classify. - Re-run **Refresh actions** after you change the server, then review the list. On a pasted-URL connection a newly discovered action becomes active under the policies already in force — it is not held back for approval — so a refresh can widen what agents can call. +## Add saved guidance + +A custom connection can store optional `agentInstructions` through the connection API. The guidance is included only for authorized runs that can use at least one of its tools, and it never grants additional access. + +The current **Agent instructions** editor appears only when a connector declares a template; it is not shown on every custom server. Paperclip does not automatically adopt the server's initialization prose as trusted instructions. See [Saved connection instructions](connection-instructions.md) for the setting and its behavior. + ## Not the same as an adapter MCP server Attaching an MCP server to an agent's *runtime* — through the adapter's own configuration — is a different mechanism with different governance. Paperclip's action permissions and review queue do not sit in front of it. See [Add an MCP server to an agent](../how-to/add-mcp-server-to-agent.md) for that path, and pick it deliberately rather than by accident. @@ -71,5 +83,5 @@ Attaching an MCP server to an agent's *runtime* — through the adapter's own co ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/executor.md b/docs/connectors/executor.md index 44701f8..ff4c331 100644 --- a/docs/connectors/executor.md +++ b/docs/connectors/executor.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Executor Connector seo_description: Connect a hosted Executor endpoint and govern its exposed actions. Includes upstream policy boundaries and explicitly unverified setup. --- @@ -35,6 +35,16 @@ Tools come from your Executor account and appear in Paperclip when you connect. Every tool starts as **Allowed**. Set exposed actions to **Ask first** or **Off** on **Permissions** as needed. Executor's upstream policies are another layer; a Paperclip approval does not override an Executor denial. If an exposed action bundles several upstream operations, Paperclip governs that call rather than each internal operation. +## See connected app accounts + +When your deployment exposes supported account inventory, its **Permissions** page lists **Connected apps** and offers **Refresh Executor**. Paperclip reads the deployment's connection and integration inventory; it does not execute generated code to guess what is connected. + +Accounts appear under their app cards, labelled **Managed by Executor**. Unknown integrations keep their own identities rather than receiving guessed branding. If discovery is unavailable, Paperclip says so; successful tool access alone does not verify an account's authorization. + +An optional **Console URL** tells Paperclip where **Open in Executor** should send you. Use your trusted HTTPS integrations page, including its workspace or self-hosted path. You can set it during setup or from the saved gateway's **Console URL** menu item. + +Executor remains available in **Connectors** even though its catalog filter is temporarily hidden. Gateway permissions still govern calls across its integrations, and account management stays in Executor. + ## Try it Ask an eligible agent to perform one read-only lookup from an integration you configured. Compare the result with the source system and inspect the connector call. @@ -63,4 +73,6 @@ Executor deployment versions can expose different interfaces. This page does not ## Sources -- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/executor.json#L16) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Paperclip connector definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/executor.json#L16) — method names, authentication, endpoints, and connector-specific limits at the pinned product version. Provider setup documentation is linked above. +- [Catalog and account grouping](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/Browse.tsx) — filters, grouped account rows, and gateway menus. +- [Connected app list](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/app-detail/ConnectedAggregatorApps.tsx) — refresh controls and verification states. diff --git a/docs/connectors/first-connector.md b/docs/connectors/first-connector.md index 4249514..7a43688 100644 --- a/docs/connectors/first-connector.md +++ b/docs/connectors/first-connector.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Connect Your First Connector seo_description: Connect one read-only service to Paperclip and give an agent a task that uses it, without granting write access to anything. --- @@ -22,7 +22,7 @@ The worked example is **Hugging Face**, chosen because it offers a simple setup: In the left sidebar, select **Connectors**. -The page lists every connector Paperclip can set up. Use **Search connectors** to find **Hugging Face**, then select **Connect**. +The catalog starts on **Paperclip**. Use **Search connectors** to find **Hugging Face**, then select **Connect**. **Installed** shows saved accounts; **All** also includes apps offered through external providers. Native and imported accounts are grouped under the app they belong to. ## 2. Check who it is for @@ -83,5 +83,5 @@ One connection, scoped to you, usable by one agent, restricted to reads. That is ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/honcho.md b/docs/connectors/honcho.md index 80d1ebc..cf9b720 100644 --- a/docs/connectors/honcho.md +++ b/docs/connectors/honcho.md @@ -1,34 +1,38 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Honcho Memory Connector -seo_description: Connect Honcho with an API key, give selected agents access, and keep workspace, peer, and session context clear when they recall or save memory. +seo_description: Connect Honcho with an API key and workspace, give selected agents access, and keep peer and session context clear when they recall or save memory. --- # Honcho -You can let agents recall and save conversation context in Honcho. Agents choose the workspace and peer identifiers when they call Honcho's tools, so name the workspace, peer, or session in the task when that context matters. +You can let agents recall and save conversation context in Honcho. Choose the workspace in Paperclip, then identify the peer or session in the task when that context matters. ## Before you connect - Enable **Memory connectors** under **Settings → Experimental**. It is off by default; see [Memory connectors](memory-connectors.md). -- An API key from the [Honcho dashboard](https://app.honcho.dev) for the account agents should use. -- The workspace and peer identifiers you want agents to use. +- An organization and API key from the [Honcho dashboard](https://app.honcho.dev). +- The workspace ID that agents should use. ## Connect Honcho 1. Open **Connectors** and select **Honcho**. 2. Read the access line above the main button. Select **Change** to choose a personal credential or narrow which agents can use it. -3. Paste the **Honcho API key**, then complete setup. Paperclip stores it as a secret. -4. Open **Permissions** and review the exposed actions. +3. Enter the **Honcho API key** and required **Honcho workspace**, then complete setup. +4. Open **Permissions** and review the exposed actions and **Agent instructions**. -Paperclip connects to `https://mcp.honcho.dev`. Memory is stored in your Honcho account. +Paperclip connects to `https://mcp.honcho.dev`. For tools that declare a `workspace_id` argument, Paperclip supplies your configured workspace rather than letting the agent replace it. ## Choose access -Honcho's API key and provider access rules determine what data can be reached. A workspace or peer identifier an agent passes is call context, not an isolation boundary enforced by Paperclip. Use separate keys when work must stay separate. +Honcho's API key and provider access rules determine what data can be reached. The saved workspace provides the call context; it is not a claim that the key itself cannot reach other workspaces. Active actions start as **Allowed**, including writes and deletion-capable tools. Set writes to **Ask first** and unwanted actions to **Off** on **Permissions**. +Default instructions tell agents to use the configured workspace and the task's peer or session, and to clarify a missing memory target before saving. You can edit or disable that guidance; see [Saved connection instructions](connection-instructions.md). + +An older connection without a saved workspace keeps its tools and manual workspace arguments. It receives no standing connection guidance until you complete **Honcho workspace**. Changing the saved workspace also invalidates an approval waiting on arguments from the previous workspace. + ## Try it Give an eligible agent the workspace's intended peer and session context, and ask it to retrieve a known, harmless message without creating or changing anything. Compare the result with Honcho and inspect the connector call. @@ -40,8 +44,9 @@ Give an eligible agent the workspace's intended peer and session context, and as | Problem | Check | | --- | --- | | Honcho is absent from the catalog | Enable **Memory connectors**. | -| New setup will not finish | Check that the key is valid; Paperclip reports when the provider rejects it. | -| Retrieval returns the wrong context | Check the workspace, peer, or session named in the task. | +| New setup will not finish | Enter the required **Honcho workspace** as well as the key. | +| An older connection has tools but no instructions | Complete its saved workspace configuration. | +| Retrieval returns the wrong context | Check the configured workspace and the peer or session named in the task. | | Calls fail | Check the key and its provider-side access. | Turning off the experimental setting leaves saved connections running and allows reconnecting. Paperclip does not create an automatic memory scope from an agent's identity or upload conversations in the background. @@ -54,5 +59,5 @@ Turning off the experimental setting leaves saved connections running and allows ## Sources -- [Honcho definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/honcho.json) — API-key setup and endpoint. -- [Feature defaults](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/feature-catalog.ts) — experimental availability. +- [Honcho definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/honcho.json) — key, workspace field, endpoint, and default instructions. +- [Connection instruction context](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/connection-instructions.ts) and [managed workspace arguments](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/honcho-connection.ts) — required configuration and managed workspace arguments. diff --git a/docs/connectors/mcp-aggregators.md b/docs/connectors/mcp-aggregators.md index bb85583..756c0e9 100644 --- a/docs/connectors/mcp-aggregators.md +++ b/docs/connectors/mcp-aggregators.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Connect Apps Through an MCP Aggregator seo_description: Reach apps that have no native Paperclip connector through Arcade, Composio, Executor, or Zapier, and pick the provider when an agent asks you to. --- @@ -29,7 +29,7 @@ Each provider has its own catalog entry and its own connection. The setup screen 1. In the left sidebar, select **Connectors**, find the provider, and select it. 2. Read the access summary above the main button. New gateway setup normally starts with everyone in your organization and all agents; select **Change** to narrow either audience. [Share a connector with people and agents](share-access.md) explains the choices. -3. Paste the address into **MCP server URL** and select **Connect {provider}**, such as **Connect Arcade**. Paperclip shows *"Connecting and discovering tools…"* while it reaches the server and reads its tool list. +3. Paste the address into **MCP server URL** and select **Connect {provider}**, such as **Connect Arcade**. Composio uses its prefilled URL unless you open **Reuse an existing session**. Paperclip shows *"Connecting and discovering tools…"* while it reaches the server and reads its tool list. 4. If the provider needs a sign-in, a provider window opens. Finish there and come back; Paperclip waits for confirmation. 5. Review **Permissions** and set each tool to **Allowed**, **Ask first**, or **Off**, as on any connector — see [Set action permissions](action-permissions.md). @@ -71,7 +71,23 @@ Paperclip controls access to the tools it lists for the connection. App and acti So set up both layers deliberately: - In the provider, connect only the apps you need and expose only the actions you need. -- In Paperclip, active actions start as **Allowed**, including writes. Set writes to **Off** or **Ask first** if you want narrower access, and run **Refresh tools** after changing the provider's tool selection. Review what appeared. +- In Paperclip, active actions start as **Allowed**, including writes. Set writes to **Off** or **Ask first** if you want narrower access, and run **Refresh actions** after changing the provider's tool selection. Review what appeared. + +## Find and manage app accounts + +The catalog starts on **Paperclip**. Use **Composio**, **Arcade**, **Installed**, or **All** to change the view. Search matches app names, aliases, providers, and saved accounts. The uninstalled catalog has pages of 50 entries; matching installed apps stay above it. + +An app without native setup can appear as one card with the logos of its available providers. **Connect** opens a provider choice when more than one supports it. A native connector keeps its own setup, even when the same app also appears in an external provider's catalog. + +Saved native and imported accounts are grouped under their app card. An imported row says **Managed by {provider}** and links to the saved gateway that supplies it. A provider filter includes a native app card when it has an account managed by that provider, not merely because the provider's public catalog lists that app. + +Composio, Arcade, and Executor gateways can show **Connected apps** on **Permissions**. Where discovery is available, Paperclip refreshes the list on first load. Use **Refresh Composio**, **Refresh Arcade**, or **Refresh Executor** there, or in the saved gateway's menu, to check that gateway again. Executor is still available as a connection; its catalog filter is temporarily hidden. + +A failed or incomplete check keeps last-known accounts marked **Not verified**. An account whose sign-in was started but not finished shows **Waiting for sign-in**, and an expired account shows **Needs sign-in**. Replacing a credential hides observations from the previous credential until the new one is checked. Discovery reports accounts; it does not grant access or authorize an app. + +Imported account menus open the upstream provider. Rename, removal, and app authorization happen there. Paperclip's access and action settings stay on the parent gateway and apply across its apps; grouped cards do not create separate app-level access boundaries. Removing a saved gateway from Paperclip leaves the provider's accounts intact. + +For provider-specific setup and discovery, see [Composio](composio.md), [Arcade](arcade.md), and [Executor](executor.md). ## Old Composio connections @@ -85,3 +101,8 @@ Composio connections made through Paperclip's earlier Composio integration no lo - [How connector access works](access-model.md) - [Set action permissions](action-permissions.md) - [Tool Gateway](../reference/api/tool-gateway.md) + +## Sources + +- [Catalog and account grouping](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/Browse.tsx) — filters, grouped account rows, and gateway menus. +- [Connected app list](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/apps/app-detail/ConnectedAggregatorApps.tsx) — refresh controls and verification states. diff --git a/docs/connectors/mem0.md b/docs/connectors/mem0.md index b969ff1..31358be 100644 --- a/docs/connectors/mem0.md +++ b/docs/connectors/mem0.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Mem0 Connector seo_description: Give agents a persistent memory store with Mem0. Whose memory is being read, how namespacing works, a scoped read test, and troubleshooting. --- @@ -37,6 +37,8 @@ Memory writes are easy to make and accumulate. An agent that writes on every run Deletions remove memory; set them to **Off** if agents should not forget stored information. +The connection includes editable recall and save guidance under **Agent instructions**. You can turn it off without removing the tools, or edit it to describe your memory context. See [Saved connection instructions](connection-instructions.md). + ## Try it Use a namespace that already contains a known memory. Replace the example identifier with the one you use in Mem0: @@ -73,5 +75,5 @@ Limitations: one Mem0 project per connection, and the key reaches all of it. Nam ## Sources -- [Mem0 definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/mem0.json) — API-key setup. -- [Feature defaults](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/feature-catalog.ts) — off-by-default experimental setup. +- [Mem0 definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/mem0.json) — API-key setup and default guidance. +- [Feature defaults](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/feature-catalog.ts) — off-by-default experimental setup. diff --git a/docs/connectors/memory-connectors.md b/docs/connectors/memory-connectors.md index 2977e77..5f0d917 100644 --- a/docs/connectors/memory-connectors.md +++ b/docs/connectors/memory-connectors.md @@ -1,7 +1,7 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Memory Connectors in Paperclip -seo_description: Choose an experimental memory provider, enable its setup, and help agents recall context while you keep access and action permissions under control. +seo_description: Choose an experimental memory provider, enable its setup, and help agents recall useful context while keeping access and saved guidance under your control. --- # Memory connectors @@ -20,7 +20,7 @@ Turning the setting off hides catalog setup and prevents new curated connections | [Zep](zep.md) | Browser sign-in | A configured Memory MCP project, an assigned seat, and the work identity authorized by its administrator. | | [Supermemory](supermemory.md) | Browser sign-in | The workspace and optional tags to authorize during consent. | | [Cognee](cognee.md) | Cloud API Base URL and key | An active Cloud workspace and its tenant URL. | -| [Honcho](honcho.md) | API key | A key for the Honcho account agents should use, plus the workspace and peer identifiers to name in tasks. | +| [Honcho](honcho.md) | API key and workspace | An organization key and the workspace agents should use. | You manage every connection on its ordinary **Permissions** page. There is no separate memory page, automatic conversation upload, or background memory sync: an agent saves and retrieves context by calling the provider's tools. @@ -32,6 +32,12 @@ Paperclip classifies retrieval as read, storage and updates as write, and deleti The provider's credential, consent, and access rules decide which data the connection can reach. A user identifier, dataset name, workspace argument, or tag is not by itself a new isolation boundary enforced by Paperclip. Use separate credentials or provider access controls when work must stay separate. +## Tell agents when to remember + +All five providers include editable guidance under **Agent instructions**. It encourages relevant recall and concise, durable memories, without copying entire conversations or storing credentials. + +You can edit the text or turn off **Tell agents to use {provider}**. Turning it off preserves tool access and your saved text. [Saved connection instructions](connection-instructions.md) explains when the guidance reaches an agent and how to restore the default. + ## Check a connection Start with one known, harmless memory in the intended provider context. Ask an eligible agent to retrieve it without saving or deleting anything, then compare the result with the provider. @@ -44,9 +50,10 @@ An empty result may mean the wrong context, an empty store, or indexing that has - [How connector access works](access-model.md) - [Set action permissions](action-permissions.md) +- [Saved connection instructions](connection-instructions.md) - [Experimental features](../experimental/overview.md) ## Sources -- [Feature defaults](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/feature-catalog.ts) and [connection setup service](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/tool-access.ts) — the off-by-default setting and new-setup gate. -- [Memory tool classification](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/tool-access.ts) — reviewed action risks. +- [Feature defaults](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/feature-catalog.ts) and [connection setup service](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/tool-access.ts) — the off-by-default setting and new-setup gate. +- [Memory tool classification](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/tool-access.ts) — reviewed action risks. diff --git a/docs/connectors/neon.md b/docs/connectors/neon.md new file mode 100644 index 0000000..a121a31 --- /dev/null +++ b/docs/connectors/neon.md @@ -0,0 +1,103 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Neon Connector +seo_description: Let agents manage Neon Postgres projects, branches, and SQL. Sign in or use an API key, pin one project, turn on read-only mode, and test safely. +--- + +# Neon + +Agents can work with your Neon serverless Postgres — managing projects and branches, running SQL, and inspecting schemas. + +> **Warning:** Use a development project. Neon's hosted server grants broad project and database management, and Neon itself recommends it for development and testing. Review write and destructive actions before you connect anything holding production data. + +Write tools start enabled on this connector. They are governed by Paperclip's action settings, but the default is not read-only — you have to choose that. + +## Before you connect + +- A Neon account with access to the project you want agents to use. +- For the key method: a **Neon API key**, created in the Neon Console under [Settings → API keys](https://console.neon.tech/app/settings/api-keys). See below for which kind to pick. +- Optionally, the **project ID** of the one project you want this connection limited to. You'll find it in the Neon Console under **Project settings → General**. +- A decision about read-only mode, made before you connect rather than after. + +There are two ways to connect: + +| Method | What you need | When to use it | +| --- | --- | --- | +| **Sign in with Neon** | Nothing to create. You approve access in the browser | The recommended route for most people | +| **Use an API key** | A Neon API key you create yourself | When browser sign-in isn't suitable | + +Paperclip never falls back from one method to the other on its own. The method you pick is saved on the connection and reused whenever you reconnect. + +### Which key the API-key method wants + +The **Neon API key** field accepts keys starting `napi_...` or `neon_project_key_...`. Neon offers a few kinds, and their reach differs: + +| Kind | What it reaches | +| --- | --- | +| **Project-scoped key** | One project, with Editor rights | +| **Personal or organization key** | Every project that account or organization can access | + +Prefer a project-scoped key for one development project. Paperclip can't increase what an existing key is allowed to do — it only ever narrows. + +## Connect Neon + +1. Open **Connectors** and select **Neon**. +2. Read the access line above the main button. It says who the connection signs in as and which agents can use it. To pick a different identity, narrow the agents, or use another sign-in method, select **Change**. +3. Check how you'll authenticate. Setup starts on **Sign in with Neon**. To paste an API key instead, select **Change** and choose **Use an API key**. +4. Optionally select **Change** to reveal **Pin to project ID** and **Read-only mode**, then fill in either one. Neither is required — you can continue straight away with Neon's defaults. +5. Finish setup. For browser sign-in, approve access in Neon; for the key method, paste the key and continue. + +Paperclip needs a public HTTPS origin, or a loopback HTTP origin such as `http://localhost:3100`, to complete browser sign-in. A plain HTTP tailnet hostname doesn't count as loopback — switch to HTTPS before you connect. + +## Scope the connection + +| Control | Recommendation | +| --- | --- | +| **Pin to project ID** | Pin the connection to one development project. Lowercase letters, numbers, and hyphens, up to 64 characters | +| **Read-only mode** | Turn it on unless an agent genuinely needs to change something. It limits SQL to `SELECT` queries and schema inspection | + +An invalid project ID is rejected before Paperclip ever contacts Neon, so a typo shows up right away. + +> **Note:** The project pin and read-only mode are passed to Neon's MCP server as request parameters — Neon enforces them, not Paperclip. The practical effect you'll see is a narrower set of projects or tools, but the enforcement boundary is the provider's. Paperclip's own control over what runs is the action settings. + +## Choose access + +Project reach is whatever the Neon sign-in or key carries, narrowed by the project pin if you set one. Account, organization, and project permissions are Neon's, not Paperclip's. + +Write access here covers a lot of ground: creating and deleting projects and branches, managing roles, databases and computes, restoring snapshots, applying schema changes, and running SQL. Those changes aren't reversible from Paperclip. + +Every discovered action starts **Allowed**, including writes and destructive ones. After connecting, open the connection's **Permissions** screen and set deletion, branch reset, and compute changes to **Ask first** at minimum. See [Set action permissions](action-permissions.md). + +## Try it + +Use a metadata read, not a query against real data: + +```txt +List the Neon projects this connection can reach and the branches in each. Do not run any SQL or change anything. +``` + +Expect a project and branch list matching your Neon Console. That confirms the credential and the project scope without touching row data. + +Don't verify with a migration, a branch reset, or a write query. + +> **Note:** Illustrative task, not a recorded test result. + +## Troubleshooting and limitations + +| Problem | Likely cause | Fix | +| --- | --- | --- | +| Setup rejects the project ID | It contains characters other than lowercase letters, numbers, and hyphens, or is longer than 64 characters | Copy the project ID from **Project settings → General** in the Neon Console | +| Browser sign-in won't complete | Paperclip is served over plain HTTP on a non-loopback hostname | Use HTTPS, or a loopback origin such as `http://localhost:3100` | +| The key works but a project isn't reachable | A project-scoped key covers a different project, or the account has no access | Use a key for the right project, or grant access in Neon | +| Write tools are missing or SQL writes fail | **Read-only mode** is on, and Neon is honouring it | That's the recommended posture; turn it off only deliberately | +| A change succeeded that you didn't expect | Write tools start enabled and the action was allowed | Turn on read-only mode, or set those actions to **Ask first** or **Off** | +| **Needs attention** | The key was revoked or the sign-in expired | Select **Reconnect** | + +Limitations: the project pin and read-only mode are requests Neon honours, not Paperclip guarantees, and neither replaces using a development project. Paperclip can't roll back a database change — recovery is Neon's branches and snapshots. + +## Related guides + +- [Supabase](supabase.md) — another hosted Postgres connector. +- [Set action permissions](action-permissions.md) +- [How connector access works](access-model.md) +- [Neon MCP server documentation](https://neon.com/docs/ai/neon-mcp-server) diff --git a/docs/connectors/openai.md b/docs/connectors/openai.md index cdcef3a..da4b761 100644 --- a/docs/connectors/openai.md +++ b/docs/connectors/openai.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: OpenAI Connector seo_description: Give agents OpenAI model access with a Codex subscription sign-in or an API key. Runtime requirements, assignment, a test run, and fixes. --- @@ -44,7 +44,7 @@ Sign-in runs in a **sign-in environment**, and there are two kinds. Which ones y | Sign-in environment | What it needs | How you sign in | | --- | --- | --- | -| **The Paperclip server host** | The `codex` CLI installed on that host, shell access to it, and an active local environment. You must be operating Paperclip locally — a remote board session cannot start this attempt | Paperclip shows a command to paste into a terminal on that host | +| **The Paperclip server host** | The `codex` CLI installed on that host, shell access to it, and an active local environment | Paperclip shows a command to paste into a terminal on that host (**Copy sign-in command**) | | **A sandbox environment** | A sandbox whose provider supports interactive sign-in, configured by an administrator | Sign-in happens in the environment Paperclip provides; no terminal on the server host is required | When both are available Paperclip shows a **Sign-in environment** selector. The environment used to sign in may differ from where the agent later runs; picking one here does not change agent routing. @@ -52,8 +52,10 @@ When both are available Paperclip shows a **Sign-in environment** selector. The **On the Paperclip server host:** 1. Select **Sign in**. Paperclip shows a command that sets `CODEX_HOME` to a directory for this attempt and runs `codex login --device-auth` with file-based credential storage. -2. Run it in a terminal on that host and complete OpenAI's device sign-in. -3. Paperclip detects the credential and finishes the connection. The attempt stays open for 30 minutes before it expires. +2. Run it in a terminal on that host and complete OpenAI's device sign-in. Paperclip checks automatically when you return. +3. When Paperclip says *"Codex CLI is signed in. Click Connect to use this account."*, select **Connect**. The attempt stays open for 30 minutes before it expires. + +If you want a different OpenAI account before connecting, select **Use a different account**. If the attempt expires or fails, select **Start sign-in again**. > **Note:** The sign-in uses its own `CODEX_HOME`, so it neither reads nor disturbs your personal `codex` login on that machine. @@ -87,10 +89,36 @@ So **a binding cannot substitute for a responsible user**: with no responsible p **Personal** keeps the credential yours; **Company shared** makes one account available to eligible agents on runs whose responsible person is in its human audience. The model is chosen in the agent's configuration, not here. +### Connect from an agent's settings + +You can also connect an account without leaving the agent. In the agent's **AI connection** field: + +- **Reconnect account** appears when your current personal default needs attention. It signs you in again and repairs that same account, so its default and its agent access stay as they were. +- **Connect another account** opens **Connect account**, which tells you up front that the new account *"will become your default for this provider."* Your tasks use it; other people keep their own defaults. + +When you connect a brand-new account this way, you also see **Allow all agents in this company to use this account for my tasks**. It starts ticked if you can manage connections. Clear it to keep the account to this agent only. Either way, the account backs only tasks you are responsible for, and a reconnect never widens access an account already has. If sign-in succeeds but the default cannot be saved, **Retry default selection** tries again without another sign-in. + ### Reconnect from a task If a task shows an authentication card, select **Fix connection** to repair the selected account without leaving the task. The account owner signs in again; the card explains when another owner must do it. After setup completes, the task resumes through normal admission. Reconnecting preserves the account's audience and agent access. +## Check your usage limits + +Before you hand an agent a long task, you can see how much of the provider's allowance is left. Open the saved account and find **Usage**, then select **Check usage**. This works for an OpenAI subscription. An API-key account shows *"Unavailable for this sign-in method."* instead of the button, because the provider has no single-key allowance to read. + +Paperclip reads the limits only when you ask. Opening the account, listing connections, and starting a run never trigger a check. Each limit window shows how much is used and when it resets, and is marked **Limit reached** or **Blocked** when the provider says so. **Overage** shows whether extra paid usage is available. Anything the provider leaves out shows as **Not reported**, never as zero. After a successful check, the button becomes **Refresh**. + +Checking is read-only. It does not move work to another account, stop runs at a limit, refresh the credential, or buy credit. + +| Message | What it means | +| --- | --- | +| *"Sign in again to check usage."* | The stored credential has expired. Reconnect the account | +| *"Usage access denied."* | The provider refused to share usage for this credential | +| *"Too many checks. Try again later."* | The provider rate-limited the check itself. Your allowance is not affected | +| *"Reconnect to check usage."* | The account is not usable right now. Reconnect it first | + +Board users can run the same check over the API with `GET /api/companies/{companyId}/ai-connections/{connectionId}/usage`. + ## Try it First read the agent's configuration and note which AI connection it is set to use. That setting, not the run output, is where the intended credential is visible. Then: @@ -118,9 +146,9 @@ Watch the run itself — a connection can look healthy and still fail at run tim | *"This connection is not permitted for this agent"* | The connection is not installed for that agent or company-wide | Install it for the agent on the connection's access settings | | A subscription connection made during the preview stops working | Preview-era subscription credentials are not reusable and must be re-established | Reconnect the account | | **Sign in** is unavailable | No sign-in environment is offered on this deployment | Ask an administrator whether a sandbox sign-in environment can be enabled; otherwise use an API key | -| The sign-in command does nothing | The `codex` CLI is missing on the host you ran it on, or you ran it on the wrong machine | Install the CLI and run the command on the Paperclip server host. This branch also requires operating Paperclip locally rather than over a remote board session | +| The sign-in command does nothing | The `codex` CLI is missing on the host you ran it on, or you ran it on the wrong machine | Install the CLI and run the command in a terminal on the Paperclip server host itself | | Status **expired** or **needs attention** | The credential rotated or the key was revoked | Reconnect the account | -| Runs fail with a quota error | OpenAI's plan or key limits, not a Paperclip limit | Check usage with OpenAI | +| Runs fail with a quota error | OpenAI's plan or key limits, not a Paperclip limit | On a subscription, select **Check usage** on the saved account to see which window is exhausted and when it resets. Otherwise check usage with OpenAI | Limitations: one connection is one provider account, and it grants no tool access. The subscription path is tied to the Codex CLI rather than being a general OpenAI API credential. @@ -129,5 +157,6 @@ Limitations: one connection is one provider account, and it grants no tool acces - [Connector overview](https://paperclip.ing/product/connectors/openai/) - [Anthropic](anthropic.md), [OpenRouter](openrouter.md), [Grok](xai.md) — the other model providers. +- [Check AI account usage](ai-usage.md) - [How connector access works](access-model.md) - [OpenAI platform documentation](https://platform.openai.com/docs) diff --git a/docs/connectors/openrouter.md b/docs/connectors/openrouter.md index 5c4b3bf..0c79ddd 100644 --- a/docs/connectors/openrouter.md +++ b/docs/connectors/openrouter.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: OpenRouter Connector seo_description: Give agents model access through OpenRouter with an API key. Runtime and model-prefix requirements, assignment, a bounded test, and fixes. --- @@ -42,6 +42,27 @@ Then set the agent's model to an `openrouter/`-prefixed id, for example `openrou > **Warning:** Authenticating successfully does not mean a particular model is available to you. OpenRouter decides which upstream models your account can route to, based on its own availability, your credit, and any provider-specific requirements. A key that works for one model can be refused for another. +### Reconnect from a task + +If a task shows an authentication card, use **Fix connection** to replace the stored key. Only the account owner can reconnect. The existing sharing stays in place, and the task resumes after successful setup. + +## Check your usage limits + +Before you hand an agent a long task, you can see how much of the provider's allowance is left. Open the saved account and find **Usage**, then select **Check usage**. For an OpenRouter key, Paperclip asks OpenRouter for the key's credit cap, how often it resets, and any daily cap on free models, when OpenRouter returns them. + +Paperclip reads the limits only when you ask. Opening the account, listing connections, and starting a run never trigger a check. Each limit window shows how much is used and when it resets, and is marked **Limit reached** or **Blocked** when the provider says so. **Overage** shows whether extra paid usage is available. Anything the provider leaves out shows as **Not reported**, never as zero. After a successful check, the button becomes **Refresh**. + +Checking is read-only. It does not move work to another account, stop runs at a limit, refresh the credential, or buy credit. + +| Message | What it means | +| --- | --- | +| *"Sign in again to check usage."* | The stored credential has expired. Reconnect the account | +| *"Usage access denied."* | The provider refused to share usage for this credential | +| *"Too many checks. Try again later."* | The provider rate-limited the check itself. Your allowance is not affected | +| *"Reconnect to check usage."* | The account is not usable right now. Reconnect it first | + +Board users can run the same check over the API with `GET /api/companies/{companyId}/ai-connections/{connectionId}/usage`. + ## Try it ```txt @@ -65,7 +86,7 @@ If it fails, change only one thing at a time — the model id is the most common | *"Connect an account and choose your personal default"* | The agent uses the responsible user's connection and that person has no default | Connect an account and mark it as your default | | *"This run needs a responsible user to select an AI connection"* | The run has no responsible person to evaluate the credential checks against | Give the work an eligible responsible user. Binding a shared connection does **not** work around this | | The key works but one model is refused | OpenRouter is not routing that model for your account | Choose another model, or check the model's requirements with OpenRouter | -| Runs fail once usage rises | OpenRouter credit is exhausted or a rate limit applied | Top up or check limits in your OpenRouter account | +| Runs fail once usage rises | OpenRouter credit is exhausted or a rate limit applied | Select **Check usage** on the saved account to see the key's credit cap, then top up or raise limits in OpenRouter | | Status **needs attention** | The key was revoked or rotated | Reconnect with a current key | Limitations: one connection is one OpenRouter account, and it grants no tool access. Only `openrouter/`-prefixed models are usable with it. Which upstream models are reachable is OpenRouter's decision, not Paperclip's. @@ -75,5 +96,6 @@ Limitations: one connection is one OpenRouter account, and it grants no tool acc - [Connector overview](https://paperclip.ing/product/connectors/openrouter/) - [Anthropic](anthropic.md), [OpenAI](openai.md), [Grok](xai.md) — the other model providers. +- [Check AI account usage](ai-usage.md) - [How connector access works](access-model.md) - [OpenRouter documentation](https://openrouter.ai/docs) diff --git a/docs/connectors/share-access.md b/docs/connectors/share-access.md index 26fe692..eebf7bd 100644 --- a/docs/connectors/share-access.md +++ b/docs/connectors/share-access.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Share a Connector seo_description: Choose which people a connector credential covers and which agents may use it, and understand why the two lists are governed separately in Paperclip. --- @@ -12,7 +12,7 @@ For credentialed app-tool connections, there are two separate audiences: the peo A new tool connection normally starts with everyone in your organization and all agents. Setup states the resolved identity and agent audience above the main button; select **Change** to narrow them on that same screen. -Methods limited to personal sign-in use your identity. A connection requested for an agent from a task normally starts with you and that agent. Reusing a saved connection keeps its existing access. +Methods limited to personal sign-in use your identity. A connection requested for an agent from a task normally starts with you and that agent; AgentMail instead uses company-wide human access and the selected inbox owner. Reusing a saved connection keeps its existing access. ## Choose the human audience @@ -56,6 +56,8 @@ They come apart constantly in practice. A finance connector might be shared with The connector list shows the current state per connection. For a connection whose identity is mixed across installations, the card reads *"Mixed access; scope varies by installation"* rather than flattening it into a single claim. +Accounts imported from Composio, Arcade, or Executor are shown under their app cards. Their access is managed on the saved provider gateway and applies across the gateway's apps. Refreshing that account inventory never broadens the human or agent audience. + ## Related - [How connector access works](access-model.md) @@ -65,5 +67,5 @@ The connector list shows the current state per connection. For a connection whos ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/supermemory.md b/docs/connectors/supermemory.md index 258559f..d1bc943 100644 --- a/docs/connectors/supermemory.md +++ b/docs/connectors/supermemory.md @@ -1,7 +1,7 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Supermemory Connector -seo_description: Connect Supermemory through browser sign-in, select the workspace and tags it may reach, and review which memory actions agents can run in Paperclip. +seo_description: Connect Supermemory through browser sign-in, select the workspace and tags it may reach, and review memory actions and saved agent guidance in Paperclip. --- # Supermemory @@ -21,7 +21,7 @@ The hosted MCP connection uses browser sign-in. A developer API key is a separat 1. Open **Connectors** and select **Supermemory**. 2. Read the access summary. This method uses your personal sign-in; select **Change** to narrow which agents may use it. 3. Complete **Sign in with Supermemory** and review the workspace, read or write access, and optional tags offered by the provider. -4. Open **Permissions** and review the actions. +4. Open **Permissions** and review the actions and **Agent instructions**. Paperclip connects to `https://mcp.supermemory.ai/mcp`. You do not need to register a separate OAuth app for this flow. @@ -31,6 +31,8 @@ Supermemory's consent controls the data this connection can reach. Paperclip's a Active actions start as **Allowed**, including writes and deletion-capable actions. The `add_memory` action can save or forget information, so Paperclip classifies it as destructive. Set it to **Ask first** or **Off** if you want to review or prevent those changes. +The default guidance tells agents to recall and save within the authorized workspace and tags. You can edit or disable it under **Agent instructions**; see [Saved connection instructions](connection-instructions.md). + ## Try it Ask an eligible agent to search for a known, harmless memory inside the consented workspace and tags, without saving or forgetting anything. Compare the result with Supermemory and inspect the connector call. @@ -56,5 +58,5 @@ Turning off the experimental setting leaves saved connections running and allows ## Sources -- [Supermemory definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/supermemory.json) — personal OAuth sign-in, endpoint, and consent guidance. -- [Feature defaults](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/feature-catalog.ts) — experimental availability. +- [Supermemory definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/supermemory.json) — personal OAuth sign-in, endpoint, consent guidance, and default instructions. +- [Feature defaults](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/feature-catalog.ts) — experimental availability. diff --git a/docs/connectors/verify-and-troubleshoot.md b/docs/connectors/verify-and-troubleshoot.md index 3a12974..42c264f 100644 --- a/docs/connectors/verify-and-troubleshoot.md +++ b/docs/connectors/verify-and-troubleshoot.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Verify and Fix a Connector seo_description: Confirm a new connector works using a read-only test call, read the status words in the connector list, and fix the common failure modes. --- @@ -17,6 +17,7 @@ The read-test procedure below is for **app tool** connections. The other shapes | **App tools** — Notion, Jira, Stripe, and most of the catalog | The read test below | | **Messaging channels** — Slack chat, Discord, Telegram, Teams, iMessage Photon, GitHub Code Review Bot, AgentMail | Send a real message from the provider and wait for the agent's reply. There is no action list to test against, and setup is not complete until a reply is delivered. The connector's own page has the sequence | | **Model providers** — Anthropic, OpenAI, OpenRouter, Grok | Run a short task on an agent whose runtime matches, and watch the run. A connected badge says nothing about runtime compatibility. See [Anthropic](anthropic.md) | +| **Assistant Connection (MCP)** | Call `paperclip_connection` from the external assistant and verify the consenting person and organization. List agents or tasks before creating work. See [Assistant connections](../experimental/assistant-connections.md) | [How connector access works](access-model.md) explains why the controls differ. @@ -28,7 +29,7 @@ Always start with a read. 2. Confirm the action list loaded. For an app-tool connection, an empty list can mean discovery is incomplete or the provider returned no tools for this credential. Select **Refresh actions** and inspect any error; model credentials and chat channels do not have an action catalog. 3. Confirm every write and destructive action is **Off** or **Ask first** while you are testing. 4. Run one read action as a specific agent using the connector's built-in test call. Paperclip asks **Choose which agent to test as**, because the answer depends on the agent's effective policy, not just on the connection. -5. Read the result. **Worked** means the call succeeded; **Worked. No data to show.** means it succeeded and returned nothing. **Show raw response** gives you the provider's actual payload. +5. Read the result. Paperclip lays out what came back as readable fields, a table, or cards when it can, so you can check it without reading JSON. A summary line tells you how it went — for example **Worked. 3 rows came back.**, or **Worked. No data to show.** when the call succeeded and returned nothing. **Show raw response** gives you the provider's actual payload; it opens on its own when the result cannot be laid out safely. The API equivalents: @@ -94,10 +95,16 @@ The sign-in or key does not cover what the action needs. Reconnect and approve t *"The app returned an error result."* with a code such as `UNAUTHORIZED`, `FORBIDDEN`, `NOT_FOUND`, `INVALID_ARGUMENT`, `RATE_LIMIT`, or `RESOURCE_EXHAUSTED`. These come from the service. `RATE_LIMIT` and `RESOURCE_EXHAUSTED` are the provider throttling you; the rest point at the account's own permissions or at the arguments. +### Tool discovery is busy + +*"Tool discovery is busy. Retry shortly."* with the code `tool_discovery_busy` means the server is already listing tools for as many callers as it allows at once. Nothing is wrong with the connection or its credential. Wait a moment and list the tools again. See the [Tool Gateway reference](../reference/api/tool-gateway.md) for the API shape. + ### A task needs an AI credential Open the task's authentication card and select **Fix connection** or the displayed provider connection action. Connect your account or reconnect the existing one; successful setup resumes the task. If another person owns the credential, that person must repair it. Selecting a shared account does not bypass the responsible user's access check. +For a quota error, use **Check usage** on the saved AI account where supported. Missing usage fields mean **Not reported**, not zero. See [Check AI account usage](ai-usage.md). + ### The managed sign-in option is missing **Connect with Paperclip** appears only when your instance is enrolled with Paperclip Cloud and Cloud advertises that connector profile. If it is absent, the connector list offers **Enable Paperclip-managed sign-in** or **Continue enrollment**, and the customer-owned OAuth path stays available in the meantime. diff --git a/docs/connectors/xai.md b/docs/connectors/xai.md index 19823f1..b56266d 100644 --- a/docs/connectors/xai.md +++ b/docs/connectors/xai.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Grok Connector seo_description: Give agents xAI Grok model access with a subscription or an API key. Which agents can use it, credential assignment, a test run, and fixes. --- @@ -42,7 +42,7 @@ Sign-in runs in a **sign-in environment**, and there are two kinds. Which ones y | Sign-in environment | What it needs | How you sign in | | --- | --- | --- | -| **The Paperclip server host** | The `grok` CLI installed on that host, shell access to it, and an active local environment. You must be operating Paperclip locally — a remote board session cannot start this attempt | Paperclip shows a command to paste into a terminal on that host | +| **The Paperclip server host** | The `grok` CLI installed on that host, shell access to it, and an active local environment | Paperclip shows a command to paste into a terminal on that host (**Copy sign-in command**) | | **A sandbox environment** | A sandbox whose provider supports interactive sign-in, configured by an administrator | Sign-in happens in the environment Paperclip provides | When both exist Paperclip shows a **Sign-in environment** selector. The sign-in environment may differ from where the agent later runs. @@ -85,10 +85,38 @@ A binding therefore **cannot substitute for a responsible user**. **Personal** keeps the credential yours; **Company shared** makes one account available to eligible agents on runs whose responsible person is in its human audience. The model is chosen in the agent's configuration. +### Connect from an agent's settings + +You can also connect an account without leaving the agent. In the agent's **AI connection** field: + +- **Reconnect account** appears when your current personal default needs attention. It signs you in again and repairs that same account, so its default and its agent access stay as they were. +- **Connect another account** opens **Connect account**, which tells you up front that the new account *"will become your default for this provider."* Your tasks use it; other people keep their own defaults. + +When you connect a brand-new account this way, you also see **Allow all agents in this company to use this account for my tasks**. It starts ticked if you can manage connections. Clear it to keep the account to this agent only. Either way, the account backs only tasks you are responsible for, and a reconnect never widens access an account already has. If sign-in succeeds but the default cannot be saved, **Retry default selection** tries again without another sign-in. + ### Reconnect from a task If a task shows an authentication card, select **Fix connection** to repair the selected account without leaving the task. The account owner signs in again; the card explains when another owner must do it. After setup completes, the task resumes through normal admission. Reconnecting preserves the account's audience and agent access. +## Check your usage limits + +Before you hand an agent a long task, you can see how much of the provider's allowance is left. Open the saved account and find **Usage**, then select **Check usage**. This works for a Grok subscription. An API-key account shows *"Unavailable for this sign-in method."* instead of the button, because the provider has no single-key allowance to read. + +Paperclip reads the limits only when you ask. Opening the account, listing connections, and starting a run never trigger a check. Each limit window shows how much is used and when it resets, and is marked **Limit reached** or **Blocked** when the provider says so. **Overage** shows whether extra paid usage is available. Anything the provider leaves out shows as **Not reported**, never as zero. After a successful check, the button becomes **Refresh**. + +Grok does not always report how much of the included plan you have used. When it leaves that out, Paperclip shows **Not reported** rather than guessing. + +Checking is read-only. It does not move work to another account, stop runs at a limit, refresh the credential, or buy credit. + +| Message | What it means | +| --- | --- | +| *"Sign in again to check usage."* | The stored credential has expired. Reconnect the account | +| *"Usage access denied."* | The provider refused to share usage for this credential | +| *"Too many checks. Try again later."* | The provider rate-limited the check itself. Your allowance is not affected | +| *"Reconnect to check usage."* | The account is not usable right now. Reconnect it first | + +Board users can run the same check over the API with `GET /api/companies/{companyId}/ai-connections/{connectionId}/usage`. + ## Try it Check the agent's adapter is Grok and note which AI connection it is configured to use. Then: @@ -113,9 +141,9 @@ If the run reports an incompatible connection, check the adapter before anything | *"This credential is not shared with the responsible user"* | The connection is shared with named people and the responsible user is not among them | Add that person to the connection's audience | | A subscription connection made during the preview stops working | Preview-era subscription credentials are not reusable and must be re-established | Reconnect the account | | **Sign in** is unavailable | No sign-in environment is offered on this deployment | Ask an administrator whether a sandbox sign-in environment can be enabled; otherwise use an API key | -| The sign-in command does nothing | The `grok` CLI is missing on the host you ran it on, or you ran it on the wrong machine | Install the CLI and run the command on the Paperclip server host, operating Paperclip locally | +| The sign-in command does nothing | The `grok` CLI is missing on the host you ran it on, or you ran it on the wrong machine | Install the CLI and run the command in a terminal on the Paperclip server host itself | | Status **expired** or **needs attention** | The credential rotated or the key was revoked | Reconnect the account | -| Runs fail with a quota error | xAI's plan or key limits, not a Paperclip limit | Check usage with xAI | +| Runs fail with a quota error | xAI's plan or key limits, not a Paperclip limit | On a subscription, select **Check usage** on the saved account to see which window is exhausted and when it resets. Otherwise check usage with xAI | Limitations: one connection is one xAI account, and it grants no tool access. The Grok adapter requirement is narrower than the other model providers — confirm it before planning work around this connector. @@ -124,5 +152,6 @@ Limitations: one connection is one xAI account, and it grants no tool access. Th - [Connector overview](https://paperclip.ing/product/connectors/xai/) - [Anthropic](anthropic.md), [OpenAI](openai.md), [OpenRouter](openrouter.md) — the other model providers. +- [Check AI account usage](ai-usage.md) - [How connector access works](access-model.md) - [xAI documentation](https://docs.x.ai/) diff --git a/docs/connectors/zapier.md b/docs/connectors/zapier.md index 24153d6..10f5fa5 100644 --- a/docs/connectors/zapier.md +++ b/docs/connectors/zapier.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Zapier Connector seo_description: Reach thousands of apps through a Zapier MCP server. The generated URL is a credential — how to set it up safely, choose exposed actions, and troubleshoot. --- @@ -82,5 +82,5 @@ Limitations: the action surface is whatever the Zapier server exposes, and Paper ## Sources -- [Connection setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. -- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. +- [Connection setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/ConnectionSetupFlow.tsx) — one-screen access choices and setup behavior. +- [Remote MCP setup](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/features/connections/remote-mcp/RemoteMcpConnectionSetup.tsx) — provider-specific connection controls. diff --git a/docs/connectors/zep.md b/docs/connectors/zep.md index 0143c6d..14c1d1b 100644 --- a/docs/connectors/zep.md +++ b/docs/connectors/zep.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Zep Memory Connector seo_description: Connect Zep Memory MCP with your work identity, choose agent access, and use personal memory or shared graphs authorized by your Zep administrator. --- @@ -21,7 +21,7 @@ A Zep project API key does not authenticate this hosted Memory MCP endpoint. 1. Open **Connectors** and select **Zep**. 2. Read the access summary. This method uses your personal sign-in; select **Change** to narrow which agents may use it. 3. Complete **Sign in with Zep** using the assigned work identity. -4. Review the actions on **Permissions**. +4. Review **Permissions** and the provider's **Agent instructions**. Paperclip uses the hosted MCP endpoint `https://api.getzep.com/mcp`. You do not need to register a separate OAuth app for this flow. @@ -31,6 +31,8 @@ Zep controls the identity's memory and shared-graph access. Paperclip controls w Active actions start as **Allowed**. Choose **Ask first** for writes if you want to review saved memories. Do not use another graph or identity as a workaround for missing access; authorize the needed context in Zep instead. +You can edit or disable the connection's recall and save guidance without removing its tools. See [Saved connection instructions](connection-instructions.md). + ## Try it Ask an eligible agent to find one known decision in the connected identity's memory or a specifically authorized shared graph. Ask it to return the source context without adding or changing memories, then compare the result with Zep. @@ -56,5 +58,5 @@ Turning off the experimental setting leaves saved connections running and allows ## Sources -- [Zep definition](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/app-definitions/zep.json) — personal OAuth sign-in, prerequisites, and endpoint. -- [Feature defaults](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/shared/src/feature-catalog.ts) — experimental availability. +- [Zep definition](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/app-definitions/zep.json) — personal OAuth sign-in, prerequisites, endpoint, and default guidance. +- [Feature defaults](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/shared/src/feature-catalog.ts) — experimental availability. diff --git a/docs/experimental/agent-chat.md b/docs/experimental/agent-chat.md index 9fea6b3..a093cdb 100644 --- a/docs/experimental/agent-chat.md +++ b/docs/experimental/agent-chat.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Agent Chat (Experimental) seo_description: Keep one ongoing conversation with each agent, talk a goal through, and let the agent hand the real work off to tasks and report back when they're done. --- @@ -19,9 +19,9 @@ Like every flag on that page, it's instance-wide. On Paperclip Cloud this one ma ## Opening a chat -Once it's on, **Chat** appears in the sidebar just below **Inbox**. Your agents live in a separate rail beside the conversation, so you can switch chats without leaving the page. +Once it's on, **Chat** leads the **Work** group in the streamlined sidebar. Your agents live in a separate rail beside the conversation, so you can switch chats without leaving the page. The older sidebar places Chat below Inbox instead. -Click it and you land on a page asking *"Who would you like to talk to?"*, with a few of your agents to pick from and a **Browse all agents** link for the rest. +Click it and Paperclip takes you back to the last agent chat you had open in this company. If you haven't chatted with anyone yet, you land on a page asking *"Who would you like to talk to?"*, with a few of your agents to pick from and a **Browse all agents** link for the rest. The chat area has its own sidebar, headed **Chat**, beside the conversation: @@ -38,6 +38,10 @@ You get exactly one conversation with each agent. Adding a chat with an agent yo A conversation is a task behind the scenes, so it uses the same composer, transcript, attachments, and documents as the ordinary task page. See [Chat-Style Tasks](task-chat.md) for those controls. +The right side panel starts on **Tasks**, showing tasks this agent has worked on across the company, rather than just tasks created in this chat. Search, filter, or sort the cards, then open one to read the work in a new browser tab. **Artifacts** shows files the agent produced, with a link back to the task for each one. The panel shows up to 200 recent tasks and 500 recent artifacts and tells you when it reaches that limit; use the company Tasks or Artifacts page for the wider view. + +You can open **Artifacts** or **Properties** from the panel's **+** menu. The conversation stays alongside them while you review the result. + Conversations follow your company's normal task visibility. Teammates can read your conversation with an agent, but only you can send messages in it. Each person has their own conversation with each agent. ## Talking it through, then handing off @@ -72,7 +76,7 @@ Turning **Agent Chat** off removes the **Chat** entry and stops new messages, bu - How well an agent breaks a conversation into tasks depends on the agent and its model. Read the tasks it creates before relying on them. - Results come back only for tasks a chat hands off after your instance is on a release with this behaviour. Tasks handed off earlier aren’t reported retroactively. -Implementation reference: [session reset and handoff instructions](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/agent-conversations.ts), [completion reports](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/chat-completion-delivery.ts), [Chat navigation](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/Sidebar.tsx), and [agent rail](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/AgentConversationsSidebar.tsx). +Implementation reference: [session reset and handoff instructions](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/agent-conversations.ts), [completion reports](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/chat-completion-delivery.ts), [Chat navigation](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/Sidebar.tsx), [agent rail](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/AgentConversationsSidebar.tsx), and [agent task and artifact panels](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/chat/AgentWorkPanels.tsx). ## Where to go next diff --git a/docs/experimental/assistant-connections.md b/docs/experimental/assistant-connections.md new file mode 100644 index 0000000..dc58e73 --- /dev/null +++ b/docs/experimental/assistant-connections.md @@ -0,0 +1,91 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Connect an Assistant to Paperclip +seo_description: Connect Codex, Claude, or another assistant to your organization. Review consent, delegate tasks, retrieve results, and revoke access when needed. +--- + +# Assistant connections (MCP) + +Use your everyday assistant to review your Paperclip organization, delegate a task, and come back for the result in another conversation. The connection acts as your human account, with access to one organization you approve. + +This feature is experimental. **Assistant connections (MCP)** (`enablePublicMcp`) is off by default on self-hosted and Cloud instances. + +## Turn it on + +1. Open **Settings → Instance settings → Experimental** as an instance administrator. +2. Turn on **Assistant connections (MCP)**. +3. Return to **Connectors → Assistant Connection (MCP)**. + +Your instance needs authenticated user accounts and a canonical URL reachable by the assistant. Public connections need HTTPS; loopback HTTP is supported for local development. A self-hosted private endpoint must be reachable directly from your client. See the [Assistant MCP reference](../reference/api/assistant-mcp.md#instance-requirements) for operator setup. + +## Invite your assistant + +1. Select the organization you want to connect. +2. Open **Connectors → Assistant Connection (MCP) → Set up** (it reads **Manage** once an assistant is connected). +3. Select **Copy invitation** and paste the message into your assistant. +4. Follow the approval link the assistant gives you. Sign in to Paperclip, check the client and organization, and select **Connect organization**. +5. Ask the assistant to call `paperclip_connection` and confirm your account, organization, and permissions. + +The invitation links to public setup instructions. It contains no credential and grants no access on its own. Some assistants need you to add a connector in their settings; reading the invitation in chat does not install it. A new conversation or client restart may be needed to load tools. + +### Set up manually + +Open **Set up manually** for the instructions generated by your instance. For a direct Codex connection, replace the host below with your instance's host: + +```sh +codex mcp add paperclip --url https://YOUR-PAPERCLIP-HOST/mcp/paperclip +codex mcp login paperclip --scopes paperclip:read,paperclip:write,offline_access +``` + +For Claude Code: + +```sh +claude mcp add --transport http paperclip https://YOUR-PAPERCLIP-HOST/mcp/paperclip +``` + +Open `/mcp` in Claude Code and authenticate the Paperclip server. OpenCode, browser assistants, and other clients have their own tabs in the setup page. Preserve existing client settings; if `paperclip` already points to another instance, choose a different name and use it consistently. + +Keep the authorization command running while you approve. If it expires or stops, start a new request before using another approval link. For a client without a browser callback listener, use [device login and the stdio bridge](../reference/cli/mcp.md). Device sign-ins send you to `/mcp-device` on your instance: check that the code shown there matches the one in your assistant (or type it under **Enter the code shown by your assistant**), then approve as usual. + +## Choose access + +Consent shows the client and the organization. Review the identifying domain as well as the name; client names alone are not proof of identity. + +| Permission | What it allows on a direct instance connection | +| --- | --- | +| `paperclip:read` | Read agents, projects, tasks, documents, deliverables, and pending approvals. Required for every connection. | +| `paperclip:write` | Create tasks and add comments as you. | +| `offline_access` | Keep access through a rotating refresh token instead of signing in for every session. | + +Consent always includes *Read all of your Paperclip data*. When the assistant requests write access, the **Allow write access and creating tasks as me** checkbox appears. It starts checked when your role permits writing; clear it for read-only access. Your current organization permissions still apply to every call, and expanding scopes requires a new consent flow. + +## Review, delegate, and follow up + +First ask your assistant to identify the connected organization and list agents and open tasks. These reads verify access without starting work. + +When you are ready, ask it to create a task for an available agent. Keep the returned task link. In a later conversation, ask it to find that task, read progress, and retrieve its saved report or attachments. Feedback comments can wake the assigned agent or queue more work. + +Agent execution uses the credentials, environment, budgets, and approvals configured in Paperclip. Your assistant subscription does not provide execution capacity. The assistant can list pending approvals and link you to Paperclip, where you make the decision. + +Direct connections expose work-oriented tools for identifying the connection, listing agents and projects, finding and reading tasks, creating tasks, adding comments, reading documents and deliverables, and listing pending approvals. Events-capable clients can subscribe to task status, comments, and document updates. Monitoring needs an explicit subscription; connecting alone does not start it. See the [protocol and tool reference](../reference/api/assistant-mcp.md). + +## Direct connections and hosted distribution + +The direct instance endpoint exposes 10 tools. You can configure a direct client without a store listing. Hosted broker deployment, browser-client compatibility, and public store or directory availability have separate release requirements. This guide does not establish that a listing is available for your assistant account. + +## Revoke or disable access + +Return to **Assistant Connection (MCP)** to review and revoke your connections for the selected organization. `/assistant-connections` also provides account-wide management. + +Each connection is listed by its assistant client name, followed by its access (for example *Connected as you · Read and write*). Select **Revoke** to end it; the row then shows **Revoked**. + +Revocation blocks future calls. Work you already delegated continues, and an in-flight change may already have completed. Manage that task or run in Paperclip if you need to stop it. + +Turning off the experimental setting blocks discovery, new sign-ins, tool calls, and event delivery immediately. Connection management remains available, and delegated work continues. Turning it back on lets unexpired connections resume. + +## Related guides + +- [Assistant MCP API reference](../reference/api/assistant-mcp.md) +- [MCP CLI commands](../reference/cli/mcp.md) +- [Custom MCP servers](../connectors/custom-mcp-servers.md) — give Paperclip agents access to external tools. +- [Experimental features overview](overview.md) diff --git a/docs/experimental/connections-apps.md b/docs/experimental/connections-apps.md index 5bccba3..e45ece2 100644 --- a/docs/experimental/connections-apps.md +++ b/docs/experimental/connections-apps.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Connections v3 Foundation seo_description: The rebuilt connection storage and authorization layer under Paperclip Connectors: stable identities, subject-aware grants, and the mcp_remote rename. --- @@ -19,7 +19,7 @@ seo_description: The rebuilt connection storage and authorization layer under Pa | A Wave 1 catalog, described as plumbing rather than a store. | A full catalog with setup flows, per-action permissions, and a review queue. See [Connectors](../connectors.md). | | "Setup flows are partial." | Setup flows are the product surface. Each provider page documents the exact paths Paperclip supports for it. | -Two experimental flags in this area are still real and still off by default. The first is **Chat connectors**, described as *"Show experimental chat connector setup and Board surfaces. Existing connections keep running when hidden; GitHub and other tool connectors are unaffected."* That flag governs the [chat channels](../connectors.md#chat-channels) — Slack, Discord, Microsoft Teams, Telegram, iMessage, and the GitHub Code Review Bot — and AgentMail's email inboxes with them. It does not govern app integrations, so the Slack and GitHub agent tools are unaffected even when their chat halves are hidden. +Two experimental flags in this area are still real and still off by default. The first is **Chat connectors**, described as *"Show experimental chat connector setup and Board surfaces. Existing connections keep running when hidden; AgentMail, GitHub tools, and other tool connectors are unaffected."* That flag governs the [chat channels](../connectors.md#chat-channels) — Slack, Discord, Microsoft Teams, Telegram, iMessage, and the GitHub Code Review Bot. It does not govern app integrations, so the Slack and GitHub agent tools are unaffected even when their chat halves are hidden. AgentMail used to sit behind this flag too; it is now a default connection, available on every instance. The second is **Memory connectors**: *"Show experimental Mem0, Zep, Supermemory, Cognee, and Honcho setup. Existing connections keep running when hidden."* It hides or shows setup for those [memory providers](../connectors.md#memory-experimental). Turning it off hides setup only; existing connections keep running. diff --git a/docs/experimental/overview.md b/docs/experimental/overview.md index 7e7eb30..ac1585a 100644 --- a/docs/experimental/overview.md +++ b/docs/experimental/overview.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Experimental Features seo_description: Real, working features shipped behind opt-in flags while they are evaluated against live usage. What lives here, and what turning one on commits you to. --- @@ -58,8 +58,11 @@ Only some features are managed this way. Anything without the badge is still you | [Task Plan Decomposition Panel](plan-decomposition-panel.md) | Shows accepted-plan decomposition history on task detail pages. | | [Chat-Style Tasks](task-chat.md) | **Now the default.** The task detail page as a live conversation: chat bubbles, streaming activity that folds into a one-line summary, a three-mode composer, and a resizable Properties · Plan · Artifacts pane. The old page is behind the **Classic Task Interface** toggle under **Legacy**. | | [Agent Chat](agent-chat.md) | One ongoing conversation per agent, reached from a **Chat** entry in the sidebar. Agents clarify your goal, hand real work off to tasks, and report back in the chat when those tasks are done. | +| [Assistant connections (MCP)](assistant-connections.md) | **Experimental; off by default.** Connect an external assistant as your user through OAuth, with separate read, write, and configuration scopes. | +| [Task-pinned AI routing](task-pinned-ai-routing.md) | **Experimental; off by default.** Rotate new tasks across a pool of saved AI accounts while each task keeps its account. Needs a router plugin, and the `enableAiConnectionRouters` flag has no toggle on the Experimental page. | | [Memory connectors](../connectors/memory-connectors.md) | **Experimental; off by default.** Set up Mem0, Zep, Supermemory, Cognee, or Honcho for agents. Existing connections keep running when setup is hidden. | | [Paperclip Runner](../reference/adapters/paperclip-runner.md) | **Experimental.** Native agent execution, enabled by default for self-hosted instances and disabled by default on Cloud. Agents must be explicitly configured to use it. | +| [Combined Inbox + Task List](task-chat.md#an-optional-combined-task-list) | **Experimental; off by default.** Reach inbox and task views from one **Tasks** navigation entry. | | [Task Watchdogs](task-watchdogs.md) | Watchdog agents that verify stopped task subtrees and restore live paths when work should continue. | | [Status Cards](status-cards.md) | A shared board of living summaries: one message per card, compiled into a watch query and kept current by the Summarizer. | | [Cloud Sync](cloud-sync.md) | **Retired.** Host-to-host Cloud Sync has been removed upstream, toggle included — you won't find it on the Experimental page any more. Use [company Import/Export](../how-to/back-up-and-restore-a-company.md) to move a company between instances. | diff --git a/docs/experimental/task-chat.md b/docs/experimental/task-chat.md index a2b8353..4bc39e4 100644 --- a/docs/experimental/task-chat.md +++ b/docs/experimental/task-chat.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Chat-Style Tasks seo_description: Read what an agent said and what it actually did in one stream — thinking, commands, and diffs inline, instead of a comment thread beside a transcript. --- @@ -16,6 +16,14 @@ Chat-Style Tasks started life as an experimental toggle. It's now simply how the If you'd rather have the old page back, go to **Settings → Instance settings → Experimental** and, under **Legacy** (*"These features are going to be removed."*), turn on **Classic Task Interface**. It restores the previous task detail page — the page-level header, the plain comment thread, and the fixed Properties sidebar — and the chat-only features described below aren't available there. The card notes that *"Switching takes effect immediately. No task data is affected."* Like every flag on that page, it's instance-wide. +## An optional combined task list + +The task conversation described here is standard behavior. **Combined Inbox + Task List** (setting key `enableCombinedInboxTasks`) is a separate experimental option, off by default, under **Settings → Instance settings → Experimental**. It only takes effect while **Streamlined UI** is on; if your instance has switched **Streamlined UI** off, turning this on changes nothing and the separate **Inbox** row stays. + +With that option on in the streamlined interface, **Tasks** carries the unread and failed-run badge, and the separate **Inbox** sidebar row disappears. Open **Views** on Tasks to switch between **Mine**, **Unread**, **Blocked**, **Recent**, and **Everything**, or the organization views **All tasks**, **Active**, **Backlog**, and **Done**. Your inbox actions and task filters still belong to their respective views. Existing inbox links take you to the corresponding task view. + +You can enable it independently of [Agent Chat](agent-chat.md). See the [view registry](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/lib/task-views.ts) and [sidebar behavior](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/Sidebar.tsx) for the current mapping. + ## What changes on the task page The thread *is* the page. Open any task and you'll notice: @@ -110,9 +118,16 @@ The placeholder text follows your choice, so you can tell at a glance what will The effort slider includes **Default** as well as the supported levels. **Reset to agent default** puts the model, effort, and Fast mode back to how the agent is configured. Agents that don't let Paperclip pick a model — ones that run a command, call an HTTP endpoint, or route through a gateway — say so in the picker instead of showing a model list. On a phone, the picker opens full-screen. -**Questions wait above the composer.** When an agent asks a question, wants a confirmation, or has something for you to review, its card appears above the text box. If several need a response, the **pending** control lets you move between them. Dismissing the card folds it into a pending-input row you can reopen; it doesn't answer or reject it. The composer stays usable underneath. Sending an ordinary message doesn't throw the card away: it stays pending until you answer it, unless the agent set it up to be replaced by your next reply. +**Questions wait above the composer.** When an agent asks a question, wants a confirmation, or has something for you to review, its card appears above the text box. If several need a response, the **pending** control lets you move between them. The composer stays usable underneath. -**Queued messages.** A message you send while the agent is mid-run waits in the queue above the composer. **Steer** pushes it into the run that's going now, and **Interrupt** stops that run and starts a fresh one with your message. +Questions and other cards behave a little differently when you'd rather not deal with them right now: + +- **A question you dismiss moves into the conversation.** It stays where it was asked as a compact **Unanswered question** entry, and its form and pending badge leave the composer. The same happens when you just send a newer message instead of answering. Either way the question isn't answered or rejected — open the entry whenever you're ready, and the original form comes back with any answer you'd started. Your dismissal is remembered for you on that task, so reloading the page doesn't bring the form back. A new question from the agent still opens its own form. +- **Confirmations and reviews keep a pending row.** Dismissing one folds it into a pending-input row you can reopen; it doesn't answer or reject it. Sending an ordinary message doesn't throw it away either: it stays pending until you answer it, unless the agent set it up to be replaced by your next reply. + +**Queued messages.** A message you send while the agent is mid-run waits in the queue above the composer. **Steer** pushes it into the run that's going now, and **Interrupt** stops that run and starts a fresh one with your message. Either way your message shows up in the conversation straight away. If it can't be delivered, it goes back into the queue with an error explaining why, so nothing you typed is lost. And if a run was stopped before it really got going, the conversation offers **Retry**, or you can just send a new message to start a fresh turn. + +**Choose a project when you create the task.** **New Task** uses the same composer, with a **Project** picker above the text box. Search by project name or choose a recent project. Model and effort are part of the task's initial run settings; the project is a property of the task, not a per-message override. **Send with ⌘+Enter** (or Ctrl+Enter). Plain **Enter** inserts a newline. @@ -128,11 +143,13 @@ Resume releases the hold. You can optionally wake eligible agents, but a task wi ### When a run needs attention -When a run needs inspecting before it can safely continue, the notice reads **Recovery needed.** and points you to **Inspect run**. When a failed run can simply be retried, the notice offers **Retry** instead. Pasting an exact model ID into the picker doesn't guarantee provider access. +**Recovery needed.** points you to **Inspect run** and offers **Continue** or **Retry** only when that action is available. Saved follow-up messages remain attached to the task while recovery is pending. A model rejected by the provider reads **Model unavailable.**: choose a supported model or clear the task's model override, then retry. Pasting an exact model ID into the picker doesn't guarantee provider access. + +**Model at capacity** is different: the model exists and you can use it, it's just too busy right now. When a native Codex turn fails because the selected model is at capacity, the task doesn't drop into recovery. Instead a **Retry scheduled** card shows the reason **Model at capacity** and *"Last attempt failed: Selected model is at capacity. Please try a different model. Paperclip will retry automatically."* Paperclip retries after one minute, and if that fails too, after two more minutes, keeping the same model and the task's history. Click **Retry now** if you don't want to wait. If both automatic retries hit the same wall, the task is blocked with *"Automatic retries exhausted; retry later or choose a different model."* — retry later, or pick another model. If the run needs provider sign-in, complete the connection or authentication request shown in the thread before retrying. A missing secret or configuration binding is a setup problem to fix, not a reason to keep sending the same request. See [Recovery actions](../guides/day-to-day/issues.md#recovery-actions) for the wider task recovery flow. -Implementation reference: [composer](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/task-chat/TaskChatComposer.tsx), [model and effort picker](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/task-chat/ComposerRunSettingsPicker.tsx), [pause release](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/routes/issue-tree-control.ts), [recovery notice](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/ExecutionBlockerNotice.tsx), and [authentication repair classification](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/ai-auth-failure.ts). +Implementation reference: [composer](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/task-chat/TaskChatComposer.tsx), [new-task project picker](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/NewIssueDialog.tsx), [model and effort picker](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/task-chat/ComposerRunSettingsPicker.tsx), [pause release](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/routes/issue-tree-control.ts), [recovery notice](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/ExecutionBlockerNotice.tsx), and [authentication repair classification](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/ai-auth-failure.ts). ## The side pane diff --git a/docs/experimental/task-pinned-ai-routing.md b/docs/experimental/task-pinned-ai-routing.md new file mode 100644 index 0000000..14008aa --- /dev/null +++ b/docs/experimental/task-pinned-ai-routing.md @@ -0,0 +1,97 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Task-Pinned AI Connection Pools +seo_description: Rotate new tasks across a pool of AI accounts while each task keeps its account. Turn on the router, build a pool, and assign it to your agents. +--- + +# Task-pinned AI routing (connection pools) + +Spread your agents' work across several AI accounts without a conversation switching accounts halfway through. You group accounts you've already connected into a **connection pool** and point agents at it. Each new task gets the next account in line, and that task keeps the same account, harness, and session for as long as it lives. + +This feature is experimental and off by default. It needs two things: the **AI connection routers** instance flag (`enableAiConnectionRouters`), and an installed plugin that does the actual routing. Installing the plugin doesn't turn routing on, and turning routing on doesn't enable any pool by itself. + +## Before you start + +- **A router plugin.** Pools are provided by a plugin that declares the `ai.connections.route` capability. Paperclip Cloud's connection-pool plugin is one example. Without one, there's no pool connector to add. If you're building your own, see [AI connection routers](../reference/plugins/sdk.md#ai-connection-routers) in the Plugin SDK reference. +- **The instance flag.** Unlike most experimental features, this one has **no toggle on the Experimental settings page**, even after it's turned on. On a self-hosted instance, an instance administrator sets it through the API: + + ```sh + curl -X PATCH https://YOUR-PAPERCLIP-HOST/api/instance/settings/experimental \ + -H "Content-Type: application/json" \ + -d '{"enableAiConnectionRouters": true}' + ``` + + Send the request with an instance administrator's credentials. On Paperclip Cloud, the value is managed for you; ask Paperclip if you need it changed. See [Instance admin API](../reference/api/instance-admin.md). +- **Saved AI accounts.** A pool only uses accounts that are already connected and that you're allowed to use in this company. Connect them first, for example [OpenAI](../connectors/openai.md), [Anthropic](../connectors/anthropic.md), [Grok](../connectors/xai.md), or [OpenRouter](../connectors/openrouter.md). +- **The Manage connections permission.** Only connection managers can create, edit, or remove pools. + +## Create a pool + +1. Open **Connectors** and find the pool connector your plugin adds (for example **AI connection pool**). Select **Add connection pool**. +2. On the **Connections** step, tick the accounts you want in the pool. You can search the list, and **Connect a new account** opens the catalog in a new tab so your draft isn't lost. Accounts marked **Needs attention** can't be added until they're repaired. Select **Continue**. +3. On the **Order** step, arrange the accounts. New tasks rotate through them in this order. +4. Select **Create pool**. The pool is *"Created paused. Enable it when you’re ready."* +5. Open the pool, tick **Enable this pool**, and select **Save changes**. + +Each account in a pool is tied to the harness that matches its provider: OpenAI accounts run through Codex, Anthropic accounts through Claude, Grok accounts through Grok, and OpenRouter accounts through OpenCode. You can mix providers in one pool. + +### Advanced options + +Open **Advanced** on the pool page to fine-tune it: + +- **Skip connections near their usage limit** makes the pool check each account's usage before handing out a new task, and skip accounts at or above the **Skip at … % usage** threshold (90% by default). Without it, the pool rotates in plain order and never checks usage. +- **Model** and **Effort (optional)** set the default model and reasoning effort for each account. + +The pool page also shows **Used by**: every agent in the company that's set to use this pool, including paused agents, with links to their profiles. + +## Point an agent at a pool + +1. Open the agent's settings and find the **AI connection** field. +2. Choose the pool. It's listed as *" · Experimental pool"*. **Individual account** goes back to a normal single connection. +3. If Paperclip asks *"Use ?"*, it is warning you that it will *"Reset existing sessions that use an account outside this pool."* Select **Use pool**, then save the agent. + +You'll see the reminder *"New tasks rotate. Existing tasks keep their account."* An agent can only use a pool that's enabled and that contains at least one account compatible with the agent's harness. Pools aren't offered while you're creating a brand-new agent; set the pool from the agent's settings once it exists. + +## How routing behaves + +- **One rotation per pool.** All agents that share a pool share the same place in its order, so work is spread across accounts rather than every agent starting at the first one. +- **Each task is pinned.** The first run of a task picks an account; every later run of that task, including after a session reset or compaction, uses the same account and harness. Editing or removing a pool member only affects tasks that haven't been pinned yet. +- **Model and effort can change, the account can't.** In the task composer you can still pick a different model or effort. If the pinned account doesn't support it, the run uses that account's default and records a note such as *"Model override is unavailable for this member; using its default."* +- **Waiting instead of failing.** If every account is over its limit, the task waits rather than failing. Its banner reads **Pool exhausted**, with the next usage recheck time and *"Tasks with a selected account keep it while waiting. Work resumes when usage permits."* This wait doesn't use up the task's normal retry budget. +- **You can see which account ran.** A run's details on the agent page show *"Task-pinned pool account · "*. + +If a pinned account needs to be reconnected, the task's normal connection card repairs that same account, and the agent stays on the pool. + +## Remove a pool + +On the pool page, open the **⋯** menu and select **Remove connection**, or remove it from **Connectors**. The confirmation reminds you that *"The connections in this pool are kept."* Removing a pool stops new allocations; tasks already running keep the account they were given. Removal still works if routing or the plugin has since been turned off. + +## API + +Board users with the Manage connections permission can manage pools directly: + +| Endpoint | Purpose | +| --- | --- | +| `GET /api/companies/{companyId}/ai-connection-pools` | List the company's pools with their `revision`. | +| `POST /api/companies/{companyId}/ai-connection-pools` | Create a pool, or update one by sending its `id` and current `expectedRevision`. The body also takes the owning `pluginKey` and a `config` with `name`, `enabled`, `mode` (`round_robin` or `usage_aware`), `thresholdPercent`, and `members`. | +| `GET /api/companies/{companyId}/ai-connection-pools/{poolId}/inspection` | Read the latest usage observations for each pool member. | +| `DELETE /api/companies/{companyId}/ai-connection-pools/{poolId}` | Remove a pool. The body must include the current `expectedRevision`. | + +A stale `expectedRevision` is rejected, so two people editing the same pool can't overwrite each other. The ordinary connection update and delete endpoints refuse pools. + +## Troubleshooting + +| What you see | What it means | +| --- | --- | +| *"Ask your instance operator to enable AI connection routing."* | `enableAiConnectionRouters` is off. An instance administrator needs to turn it on. | +| *"Enable the connection pool plugin in Plugins."* | The router plugin is installed but not running. Enable it in Plugins. | +| *"Pool unavailable — enable routing and the pool"* in an agent's **AI connection** field | The agent is set to a pool that is paused, removed, or blocked by the instance flag. Enable the pool, or choose **Individual account**. | +| *"A connection manager can edit this pool."* | You don't have the Manage connections permission. | +| **Pool exhausted** on a task | Every account is at its usage limit. The task resumes on its own when usage allows. | + +## Related guides + +- [Check AI account usage](../connectors/ai-usage.md) +- [How connector access works](../connectors/access-model.md) +- [Plugin SDK: AI connection routers](../reference/plugins/sdk.md#ai-connection-routers) +- [Experimental features overview](overview.md) diff --git a/docs/guides/day-to-day/artifacts.md b/docs/guides/day-to-day/artifacts.md index 3b9cf5c..295856b 100644 --- a/docs/guides/day-to-day/artifacts.md +++ b/docs/guides/day-to-day/artifacts.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Artifacts: Files Your Agents Produce seo_description: Documents, images, video, and exports from every task in one place. Filter by type, browse stacks by task, and read files in the in-app viewer. --- @@ -100,11 +100,12 @@ A few details worth knowing: - **Images and videos share a gallery.** Open an image or video card to review it in the task's media viewer. Use **Previous** and **Next**, or the left and right arrow keys, when more than one item is available. Videos have playback controls; the header offers download, and **Esc** closes the viewer. - **CSV previews are on request.** Click **Preview data** to load a table for files up to 1 MiB. The preview shows at most 200 data rows and accepts up to 50 columns. Larger or unsupported previews explain why they cannot load and leave download available; a failed fetch offers a retry. - **Text files open in a tab.** Markdown and plain-text attachments get an **Open in tab** button. It opens the file in a tab in the same side pane, so the conversation stays in view. Markdown files have **Rendered** and **Raw** buttons to switch between the formatted page and the source, and a download button gives you the original file. Clicking a text attachment in the conversation opens the same tab, and the tab is reused as you open the next file. +- **Branches without a link say so.** When an agent records a branch but no remote URL, the card reads **Branch · no remote link** rather than implying there's somewhere to click through to. Use **Show details** to see its provider, its status, and when it was last updated. If the agent saved a description, it's tucked under **Saved description**. - **Unhealthy outputs are flagged** with an **Unhealthy** badge, so a broken preview link doesn't pass for a working one. The tab is read-only — a quick answer to "what came out of this task?", not a place to upload or delete. -Implementation reference: [artifact cards](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/artifacts/IssueArtifactCard.tsx), [CSV preview limits](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/lib/artifact-card-data.ts), and [media gallery](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/ImageGalleryModal.tsx). +Implementation reference: [artifact cards](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/artifacts/IssueArtifactCard.tsx), [CSV preview limits](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/lib/artifact-card-data.ts), and [media gallery](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/ImageGalleryModal.tsx). > **Note:** if your instance has switched back to the old layout with **Classic Task Interface** (under **Legacy** in **Settings → Instance settings → Experimental**), there's no Artifacts tab — a task's attachments stay in the **Attachments** section on the task page. See [Experimental features](../../experimental/overview.md). diff --git a/docs/guides/day-to-day/command-palette.md b/docs/guides/day-to-day/command-palette.md index 9aa3543..0ee3f3b 100644 --- a/docs/guides/day-to-day/command-palette.md +++ b/docs/guides/day-to-day/command-palette.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: The Command Palette seo_description: Press Cmd+K or Ctrl+K to jump to any project, task, or page, start common actions, and search as you type without touching the sidebar. --- @@ -17,7 +17,7 @@ Think of it as the fast lane. Everything the palette does is reachable elsewhere - **Open:** press **⌘K** / **Ctrl+K** from any page. On a small screen the sidebar tucks away automatically so the palette has room. - **Close:** press **Esc**, or click outside the palette. -Keyboard shortcuts are always available; you do not enable an experimental toggle first. Press **?** outside a text field to see the shortcut list. **/** focuses the current page's search when it has one, and otherwise opens quick search. Single-key shortcuts pause while you are typing or a modal dialog is open. The [shortcut handler](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/hooks/useKeyboardShortcuts.ts) defines those boundaries. +Keyboard shortcuts are always available; you do not enable an experimental toggle first. Press **?** outside a text field to see the shortcut list. **/** focuses the current page's search when it has one, and otherwise opens quick search. Single-key shortcuts pause while you are typing or a modal dialog is open. The [shortcut handler](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/hooks/useKeyboardShortcuts.ts) defines those boundaries. The search box is focused the moment it opens, so you can start typing straight away. Its placeholder — *"Search tasks, agents, projects…"* — is a hint at what it can find. diff --git a/docs/guides/day-to-day/costs.md b/docs/guides/day-to-day/costs.md index 2fe905e..a9820f2 100644 --- a/docs/guides/day-to-day/costs.md +++ b/docs/guides/day-to-day/costs.md @@ -1,4 +1,5 @@ --- +paperclip_version: v2026.1012.0 seo_title: Costs: Budgets, Providers, and Spend seo_description: Set limits Paperclip enforces automatically. Five tabs cover overview, budgets, providers, billers, and finance, with headline spend metrics on top. --- @@ -41,7 +42,7 @@ Every tab on the Costs page shares the same header, so it's worth understanding The page title reads **Costs**, with a subtitle that reminds you what's tracked: inference spend, platform fees, credits, and live quota windows. -To the right of the title is a **date-range selector** — a row of preset buttons (Today, Week-to-date, Month-to-date, custom, and so on) that scopes every chart, table, and metric on the page. If you pick **custom**, two date inputs appear and you enter the start and end date manually. Until both custom dates are filled in, most of the tabs show a prompt to pick a range before loading data. +To the right of the title is a **date-range selector** — a row of preset buttons (**Month to Date**, **Last 7 Days**, **Last 30 Days**, **Year to Date**, **All Time**, and **Custom**) that scopes every chart, table, and metric on the page. If you pick **Custom**, two date inputs appear and you enter the start and end date manually. Until both custom dates are filled in, most of the tabs show a prompt to pick a range before loading data. Below the header is a strip of four **metric tiles** that summarise the current range: @@ -267,7 +268,7 @@ Selecting **All providers** renders a grid of provider cards (two per row on wid - **Per-model spend** — one row per model used in the range, with input tokens, cached-input tokens, output tokens, and dollar cost. This is where you confirm, for example, that most of your Anthropic spend is on Claude Sonnet and not a stray Opus call. - **Current-week spend** — a separate roll-up showing what the provider cost you this calendar week, independent of the main range selector. Useful for catching week-over-week surprises. -- **Share of budget** — the provider's share of the company monthly budget, with a deficit notch that lights up if the provider is projected to overshoot its fair share at the current burn rate (only shown when the date range is set to **Month-to-date**). +- **Share of budget** — the provider's share of the company monthly budget, with a deficit notch that lights up if the provider is projected to overshoot its fair share at the current burn rate (only shown when the date range is set to **Month to Date**). ### Quota windows diff --git a/docs/guides/day-to-day/issues.md b/docs/guides/day-to-day/issues.md index 64d4b2e..3cd96c0 100644 --- a/docs/guides/day-to-day/issues.md +++ b/docs/guides/day-to-day/issues.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Issues: Creating and Tracking Work seo_description: Each issue is one unit of work tied to your company goal. Create them yourself or let the CEO do it, then track progress, comment, and close them. --- @@ -64,88 +64,41 @@ Open **Tasks** to see the work across your company. The API calls these records Tasks with an agent actively running on them show a live-run indicator. Live updates keep that indicator current so you can see which tasks are being worked on without refreshing. -Implementation reference: [Tasks page and live updates](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/pages/Issues.tsx). +Implementation reference: [Tasks page and live updates](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/pages/Issues.tsx). --- ## Creating a New Issue -1. **Click "New Task"** +1. **Click New Task**, or press **C** while you aren't typing in a field. - The button appears in the sidebar and in the Tasks view. You can also press **C** while you aren't typing in a field. Either way opens the new-task form. + The new-task dialog uses the same composer as a task conversation. Start with a clear brief: what you want done, any constraints, and what a good result looks like. You can describe the task without filling in a separate title first. -2. **Write a clear title, or leave it blank** +2. **Choose a project.** - The title is optional. If you leave it blank, Paperclip uses the start of your description as a provisional title, and the assigned agent names the task. If you do write one, use an action verb followed by a specific outcome. The title is the first thing an agent reads — it should be unambiguous. + Click **Project** above the text box. Search for a project, choose a recent one, or select **No project**. The project sets where the task belongs; the model picker below controls how the agent answers. Paperclip remembers the last project you picked in this company and starts the next new task there. - | Instead of… | Write… | - |-------------|--------| - | Roadmap | Write the Q2 product roadmap | - | Bug fix | Fix the login redirect loop on mobile | - | Research | Research competitor pricing for the enterprise tier | +3. **Pick a work mode.** -3. **Write a detailed description** + Auto mode is the default. Use the **+** menu to choose **Plan mode** when you want a plan before implementation, or **Ask mode** when you want an answer without changes. The selected mode appears as a removable chip. See [Work Modes](./work-modes.md). - The description is the brief the agent works from. Agents read it completely before starting. The more precise your description, the better the output. +4. **Choose the assignee, model, and effort.** - Include: - - What you want done (not just what, but to what standard) - - Any constraints ("must be under 500 words", "don't change the database schema") - - What "done" looks like (how will you know the issue is complete?) - - Any examples, links, or reference materials the agent should know about + Click the agent name to choose who should handle the task. Click the model label beside it to choose a model and its supported effort level, or leave them on the agent's defaults. **Reset to agent default** clears your run-setting overrides. Model access is checked when the run starts, including for an exact ID you paste into the picker. - > **Tip:** The more specific your description, the better the output. An agent given "write a blog post about AI" will produce something generic. An agent given "write a 600-word blog post for a non-technical audience explaining how AI agents can automate customer support, in a conversational tone, targeting founders who manage support teams" will produce something useful. + You often won't need to change anything here: a new task starts with the last assignee you used, if they're still available (otherwise the CEO agent), and the effort level you last chose in this company. -4. **Choose a work mode** +5. **Add files or images if they help.** - The work mode tells the agent what kind of response you want. Click the mode chip in the issue form to cycle through the options: + Use **Files and images** in the **+** menu, paste, or drop files into the composer. Resolve an upload error before submitting so the agent receives the material you intended. - | Mode | Chip colour | What happens | - |------|-------------|--------------| - | **Auto mode** | Neutral | The agent picks up the issue, executes the work, and posts results. This is the default. | - | **Plan mode** | Amber | The agent produces a plan document first. You review the plan before implementation begins. | - | **Ask mode** | Sky blue | The agent answers your question in the issue thread — no implementation, no code changes. | +6. **Click Create task**, or press **⌘+Enter** (**Ctrl+Enter** on Windows and Linux). - Use **Ask mode** when you want a quick answer, a scope assessment, or a clarifying explanation rather than implementation work. Use **Plan mode** when you want to see a roadmap before the agent starts making changes. Use **Auto mode** (the default) for everything else. + The task opens after creation. Its **Properties** panel lets you adjust priority, status, parent, project, and the other task fields. Status, reviewers, approvers, and a [task watchdog](#task-watchdogs) aren't set in the new-task dialog — add them from **Properties** once the task exists. A paused assignee can receive the task, but won't start until you resume it. -5. **Set a priority** +When you create a subtask from an existing task, the dialog shows **Sub-task of** and uses **Create sub-task**. If the project supports isolated workspaces, the creation bar can also offer **Worktrees**: choose a new worktree or reuse an existing one. An unavailable selection produces an inline error so you can retry or choose another. See [Execution workspaces](../projects-workflow/workspaces.md). - Priority tells agents what to work on first when they have multiple issues assigned. Use it to signal urgency. - - | Priority | Use for… | - |----------|----------| - | **Critical** | Blocking work; must be done immediately | - | **High** | Important this week | - | **Medium** | Normal workload | - | **Low** | Nice to have; do when nothing else is waiting | - -6. **Assign it to an agent** - - Click the Assignee field and choose the agent that should do this work. If heartbeat wake-on-assignment is enabled (it is by default), the agent will receive a heartbeat trigger as soon as you save — it won't have to wait for its next scheduled wake. - - > **Note:** Only one agent can hold an issue "in progress" at a time. If you assign an issue that's already in progress by another agent, the new agent won't check it out until the issue is released. - -7. **Set a parent issue (if relevant)** - - If this issue is a subtask — part of a larger piece of work — link it to the parent. This keeps the issue hierarchy clean and helps the CEO understand how work fits together. - -8. **Choose where the work runs** *(when isolated workspaces are enabled)* - - If the project uses isolated execution workspaces, the form includes a workspace mode picker: - - | Mode | What happens | - |------|--------------| - | **Project default** | The run uses the project's configured workspace behaviour. | - | **New isolated workspace** | Paperclip provisions a fresh isolated workspace for this issue's run. | - | **Reuse existing workspace** | The run continues in an existing execution workspace you pick — handy for resuming where a previous task left off. | - - Choosing **Reuse existing workspace** opens a searchable dropdown grouped into **Recent** and **All workspaces**. Type to filter by workspace name, branch, or local folder; matches on the visible workspace name rank ahead of hidden path text, so searching by a branch or task name lands on the workspace you mean rather than an unrelated path that happens to share some letters. Each option shows the workspace's status next to its branch or folder. - - See [Execution workspaces](../projects-workflow/workspaces.md) for how Paperclip keeps reused workspaces consistent across runs. - -9. **Save the task** - - Click **Create Task**. The task appears in the list and the assigned agent is notified. +Implementation reference: [new-task dialog](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/NewIssueDialog.tsx) and [run settings picker](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/task-chat/ComposerRunSettingsPicker.tsx). --- @@ -230,6 +183,8 @@ The issue is no longer needed and won't be completed. This is also a terminal st ## The Inbox +The separate Inbox is the default navigation. The experimental **Combined Inbox + Task List** option is off by default. When you enable it in the streamlined interface, its views move into **Tasks → Views**, and the unread badge moves to Tasks. See [An optional combined task list](../../experimental/task-chat.md#an-optional-combined-task-list). + The **Inbox** is the human-facing triage view. Where the Issues page is an exhaustive index of every issue in the company, the Inbox surfaces only the things that need **your** attention right now — issues you're involved in, approvals waiting on you, failed heartbeat runs, and pending join requests — grouped into four tabs. ![Inbox](../../user-guides/screenshots/light/issues/inbox.png) @@ -373,7 +328,7 @@ Drag the panel's left edge to resize it, or use **Maximize panel** and **Restore [Agent Chat](../../experimental/agent-chat.md) uses this panel too, with **Tasks** and **Artifacts** scoped to the agent's work across the company. -Implementation reference: [side-panel tabs and launcher](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/task-side-panel/TaskSidePanel.tsx). +Implementation reference: [side-panel tabs and launcher](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/task-side-panel/TaskSidePanel.tsx). #### The Plan tab @@ -630,7 +585,7 @@ An empty composer shows **Stop** while the task is running and you can manage ta While paused, the composer says **Task is paused.** or **Subtree is paused.**, preserves your draft, and offers **Resume task** or **Resume subtree**. Resume releases the hold; waking agents is optional. If an interrupted run has uncertain outcomes, a resume that also tries to wake it is refused and the pause remains. Inspect the stopped run and follow its recovery instructions before continuing. See [Stop, pause, and resume](../../experimental/task-chat.md#stop-pause-and-resume) for the complete flow. -A provider sign-in request needs your authentication step before the run can continue. +**Model unavailable.** means the provider rejected the selected model: choose a supported model or clear the task override, then retry. A provider sign-in request needs your authentication step before the run can continue. Saved messages remain attached to the task while recovery is pending. ## Recovery actions diff --git a/docs/guides/day-to-day/work-modes.md b/docs/guides/day-to-day/work-modes.md index e27c231..4504629 100644 --- a/docs/guides/day-to-day/work-modes.md +++ b/docs/guides/day-to-day/work-modes.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Task Work Modes: Auto, Plan, and Ask seo_description: Choose Auto to do the work, Plan to review an approach first, or Ask for an answer. Pick a mode in the task composer before you send each message. --- @@ -26,7 +26,7 @@ Auto is the default. Plan focuses the agent on clarifying the goal and writing a ## How it behaves -In a task's composer, use the **+** menu to choose **Plan mode** or **Ask mode**. The selected mode appears beside the plus button. Click the chip to return to Auto, or choose the other mode to replace it. You can also cycle modes with **⌘+.** (**Ctrl+.** on Windows and Linux) or **Shift+Tab** while the text box is focused. On the new-task form, click the mode chip to pick a starting mode for the task. +Use the **+** menu in the new-task or task composer to choose **Plan mode** or **Ask mode**. The selected mode appears beside the plus button. Click the chip to return to Auto, or choose the other mode to replace it. You can also cycle modes with **⌘+.** (**Ctrl+.** on Windows and Linux) or **Shift+Tab** while the text box is focused. Choose the agent, model, and effort separately. Those settings determine who answers and how the model runs; the work mode determines the kind of result you requested. See [The composer](../../experimental/task-chat.md#the-composer) for the full control layout. @@ -34,7 +34,7 @@ Pending questions and confirmations remain visible above the composer until you Tasks keep their assignee, priority, project, thread, and status regardless of the mode. Budgets, approvals, and company boundaries still apply. The mode changes the agent's task instructions and available actions. -Implementation reference: [composer mode selection](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/components/task-chat/TaskChatComposer.tsx) and [mode labels](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/ui/src/lib/work-mode-meta.ts). +Implementation reference: [composer mode selection](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/components/task-chat/TaskChatComposer.tsx) and [mode labels](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/ui/src/lib/work-mode-meta.ts). ## Answer or artifact diff --git a/docs/guides/org/agent-adapters.md b/docs/guides/org/agent-adapters.md index 745aeed..518e156 100644 --- a/docs/guides/org/agent-adapters.md +++ b/docs/guides/org/agent-adapters.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Choosing an Agent Adapter seo_description: Compare the adapters that run your agents — Claude Code, Codex, OpenCode, HTTP webhook and more — and pick the right bridge for each role you hire. --- @@ -77,9 +77,9 @@ The folder on your Mac where the agent does its work — reads files, writes out **Model** Which Claude model to use. If you leave it blank, Paperclip uses `claude-opus-5`. Some common choices: - `claude-opus-5-5` or `claude-opus-5` — most capable, best reasoning, highest cost. Good for your CEO or complex strategic agents. -- `claude-sonnet-5` — fast, capable, lower cost. Good for worker agents doing routine tasks. +- `claude-sonnet-5-5` or `claude-sonnet-5` — fast, capable, lower cost. Good for worker agents doing routine tasks. Sonnet 5.5 needs Claude Code `2.1.284` or newer. -When in doubt, start with Sonnet for workers and Opus for the CEO. The **effort** options next to the model change with the model you pick — newer Opus, Sonnet 5, and Fable models add `xhigh` and `max`. See [Claude Code — Reasoning Effort](../../reference/adapters/claude-code.md#reasoning-effort). +When in doubt, start with Sonnet for workers and Opus for the CEO. The **effort** options next to the model change with the model you pick — newer Opus, Sonnet 5 and 5.5, and Fable models add `xhigh` and `max`. See [Claude Code — Reasoning Effort](../../reference/adapters/claude-code.md#reasoning-effort). **Environment variables** The agent form includes an **Environment variables** section. Add `ANTHROPIC_API_KEY` there, either as a plain value or as a secret reference. If you're not sure what key name to use, `ANTHROPIC_API_KEY` is the standard one. @@ -114,6 +114,7 @@ The fields are the same as `claude_local` — mainly model selection and environ **Model** examples for Codex: - `gpt-5.6-sol` — the default and the normal starting point +- `gpt-6.1-sol` — the newest Codex model, with reasoning effort up to `ultra` - `gpt-6-astra`, `gpt-6-sol`, or `gpt-6-luna` — the GPT-6 family, with extra reasoning-effort levels - `o4-mini` — fast and cost-effective for routine tasks diff --git a/docs/guides/org/agents.md b/docs/guides/org/agents.md index cad55fd..c1f63f6 100644 --- a/docs/guides/org/agents.md +++ b/docs/guides/org/agents.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Agents: Your AI Employees seo_description: Hire agents, browse the agent list, and work the detail page — dashboard, instructions, and references — for the AI employees doing your company's work. --- @@ -116,6 +116,27 @@ See [Skills](./skills.md) for how the library works and how to add skills to it. When *you* create an agent from this form, it's created immediately. When an *agent* creates one — by calling Paperclip's hire API — the request goes into the approval queue instead, and the new agent sits in `pending_approval` status until you decide. The proposal tells you the proposed agent's name and role, its capabilities, the adapter, the monthly budget it's asking for, and who it would report to. Review it like any other approval: Approve, Reject, or Request Revision. See [Approvals — Reviewing a Hire Request](../day-to-day/approvals.md#reviewing-a-hire-request) for details. +Agents that draft hires with the bundled `paperclip-create-agent` skill now write a short role description for the new agent — who it is and what it owns — instead of a long operating manual. Reporting line, capabilities, and skills go in their own fields of the request. Any company-specific instructions you asked for are kept. If you want more in the new agent's `AGENTS.md`, ask for it, or add it on the [Instructions tab](#instructions-tab) after the hire. + +### What a new agent can do out of the box + +A new agent can help set up its teammates straight away, without you adding grants by hand. When a standard agent is created — or when its hire is approved — Paperclip gives it these permission keys: + +- **Agents and skills:** `agents:configure`, `agents:suggest-changes`, `skills:create`, `skills:suggest-changes` +- **Tools:** `tools:manage_connections`, `tools:manage_profiles`, `tools:view_audit`, `tools:use`, `tools:manage_runtime` +- **Audit and inbox:** `audit:view_agent_actions`, `inbox:manage` (limited to the inbox of the user the agent is responsible for) +- **Tasks:** `tasks:assign`, `tasks:assign_scope` (limited to the agent's own reporting subtree), `tasks:manage_active_checkouts` + +It can also hire other agents, through its `canCreateAgents` setting rather than an `agents:create` grant. It does *not* get `environments:manage`, `tools:admin`, `users:invite`, `users:manage_permissions`, `pipelines:write`, or `joins:approve`. + +A few things keep this in check: + +- **Its responsible user still bounds it.** Grants don't let an agent do anything the person it acts for couldn't do, and approval gates and protected-change checks still apply. +- **Low-trust and built-in agents are left out.** Agents on the [low-trust review preset](../../administration/trust-and-low-trust-review.md) and Paperclip's managed built-in agents keep their narrower permissions. +- **Existing agents are unchanged.** The defaults apply to new agents only. Nothing is backfilled when you upgrade, and a grant you remove stays removed. + +See [Roles & Permissions](../../administration/roles-and-permissions.md#the-permission-keys) for what each key allows. + ### Create Click **Create agent**. On success Paperclip navigates you to the new agent's detail page, where you can refine everything that follows. @@ -253,37 +274,35 @@ Agents that existed before this change keep their files. Paperclip brings their Implementation reference: [runtime file instructions](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/agent-instruction-working-copies.ts) and [file storage limits and synchronization](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/agent-file-store.ts). -**Who can change the files.** An agent can edit its own folder, but only within what its responsible user is currently allowed to change. Reading or editing *another* agent's files needs permission to configure that agent; being in the same company isn't enough. A [low-trust](../../administration/trust-and-low-trust-review.md) agent can't change its own instructions. +**Who can change the files.** An agent can edit its own folder, but only within what its responsible user is currently allowed to change. Reading or editing *another* agent's files needs permission to configure that agent; being in the same company isn't enough. A [low-trust](../../administration/trust-and-low-trust-review.md) agent can't change its own instructions from ordinary work — the one exception is when its user asks it to, directly, in their own Agent Chat. See [Instruction edits from your own chat](../../administration/trust-and-low-trust-review.md#instruction-edits-from-your-own-chat). ### Recommended bundle structure: AGENTS / SOUL / HEARTBEAT / TOOLS -A single monolithic `AGENTS.md` works for simple roles, but as soon as an agent is doing non-trivial strategic or operational work you'll want to split instructions across multiple files and let the entry file reference them. Paperclip seeds the **CEO** role with this exact pattern out of the box, and it's the pattern we recommend for any senior or long-lived agent (CTO, CMO, UX lead, department heads). +Start small. Paperclip's runtime already tells every agent how to work inside Paperclip — checking out tasks, commenting, delegating, asking you questions — and installed skills and repository instructions carry the detailed procedures. So a new agent's `AGENTS.md` only needs to say who the agent is and what it's responsible for. Don't paste a generic Paperclip operating manual into it; that repeats what the agent already gets, and can contradict it. -The convention is four files: +As an agent takes on non-trivial strategic or operational work, you may want to split extra guidance across a few files and let the entry file point to them. A common convention is four files: | File | Purpose | Answers the question | |------|---------|----------------------| -| `AGENTS.md` | **What you do** — the operating manual. Responsibilities, delegation rules, what to do personally vs. delegate, escalation paths, safety rules. This is the entry file. | *"What's my job?"* | +| `AGENTS.md` | **What you do** — the role. Responsibilities, what the agent owns, and any company-specific rules it must follow. This is the entry file. | *"What's my job?"* | | `SOUL.md` | **Who you are** — the persona. Strategic posture, voice and tone, decision-making philosophy, what you care about. Durable character, not tasks. | *"How should I think and speak?"* | -| `HEARTBEAT.md` | **How you execute** — the per-heartbeat checklist. The concrete steps to run every time the agent wakes: check identity, read today's plan, pull assignments, delegate, extract facts, exit cleanly. | *"What do I do right now, in order?"* | +| `HEARTBEAT.md` | **How you execute** — a role-specific checklist for agents with a real recurring routine. | *"What do I do right now, in order?"* | | `TOOLS.md` | **What you can use** — notes on the tools, APIs, and skills the agent has access to. Often starts empty and grows as the agent learns. | *"What's in my toolbox?"* | -`AGENTS.md` ties the other three together at the bottom with a References section: +If you split the files, have `AGENTS.md` point to the others at the bottom: ```markdown ## References -These files are essential. Read them. - -- `./HEARTBEAT.md` — execution and extraction checklist. Run every heartbeat. -- `./SOUL.md` — who you are and how you should act. -- `./TOOLS.md` — tools you have access to. +- `./HEARTBEAT.md` — my recurring checklist. +- `./SOUL.md` — who I am and how I act. +- `./TOOLS.md` — notes on my tools. ``` Why split it up? -- **Each file has one reason to change.** You tweak persona in `SOUL.md` without touching the operating procedure in `AGENTS.md`. You update the heartbeat flow without rewriting the persona. -- **The model reads what matters most first.** `AGENTS.md` is short and action-oriented; the agent pulls in `SOUL.md` or `HEARTBEAT.md` as it needs them. This keeps the entry-file context lean. +- **Each file has one reason to change.** You tweak persona in `SOUL.md` without touching the role in `AGENTS.md`. You update a routine without rewriting the persona. +- **The entry file stays short.** `AGENTS.md` stays focused; the agent pulls in `SOUL.md` or `HEARTBEAT.md` as it needs them. - **It mirrors how humans think about roles.** Job description, personality, daily routine, tools — four separate things, badly confused when you mash them into one file. #### Writing `SOUL.md` @@ -299,42 +318,39 @@ Good lines look like: Bad lines look like: - *"Be helpful and professional."* (too generic — no useful constraint) -- *"When handling a P0 incident, first check the dashboard, then…"* (that's a procedure, it belongs in `HEARTBEAT.md` or `AGENTS.md`) +- *"When handling a P0 incident, first check the dashboard, then…"* (that's a procedure, it belongs in `HEARTBEAT.md` or a skill) Think: *if we hired a new human into this role, what would we want them to internalize about how this role thinks?* That's `SOUL.md`. #### Writing `HEARTBEAT.md` -`HEARTBEAT.md` is a numbered checklist the agent runs top-to-bottom every time it wakes. It should be boringly mechanical — "read this, call that, check this env var, comment, exit." The CEO's default heartbeat covers: +`HEARTBEAT.md` is a short checklist for agents that do the same thing every time they wake — a weekly metrics digest, a content-calendar check, a review of the open PR queue. Keep it to the steps that are specific to this role. You don't need to restate how to check out a task, comment, or wrap up a run; Paperclip supplies that guidance on every run. -1. Identity and context (check `PAPERCLIP_TASK_ID`, `PAPERCLIP_WAKE_REASON`, etc.) -2. Local planning check (read today's plan from memory) -3. Approval follow-up (if `PAPERCLIP_APPROVAL_ID` is set) -4. Get assignments (GET issues filtered by assignee + status) -5. Checkout and work -6. Delegation (create subtasks with `parentId` and `goalId`) -7. Fact extraction (extract durable facts to memory) -8. Exit cleanly - -Tailor these steps to the role. A CTO's heartbeat might swap "fact extraction" for "review open PRs in the eng queue"; a CMO's might add "check content calendar." Keep each step short and include the exact API call or skill invocation the agent should make — this file is a script, not a philosophy. +If a procedure is useful to more than one agent, it probably belongs in a [skill](./skills.md) instead. #### Writing `TOOLS.md` -`TOOLS.md` often starts as a stub ("*Your tools will go here. Add notes about them as you acquire and use them.*") and grows organically. It's where you — or the agent itself — record quirks of specific tools, adapter-specific gotchas, or custom APIs the agent is expected to call. Because the agent's folder persists across tasks, notes the agent writes here are still there next time. Don't worry about filling it in up front; treat it as a living notebook the agent maintains. +`TOOLS.md` often starts as a stub and grows organically. It's where you — or the agent itself — record quirks of specific tools, adapter-specific gotchas, or custom APIs the agent is expected to call. Because the agent's folder persists across tasks, notes the agent writes here are still there next time. Don't worry about filling it in up front; treat it as a living notebook. #### When the simple pattern is fine -Not every agent needs four files. A narrow-purpose worker — "summarize incoming support tickets," "post the weekly metrics digest" — can live happily in a single `AGENTS.md`. Use the multi-file pattern when any of these are true: +Most agents need only a single `AGENTS.md` with a short role description. Reach for the extra files when any of these are true: - The agent has a distinct personality or voice that matters (customer-facing roles, executives). -- The agent runs on a timer and does something on *every* heartbeat (anyone with a repeating checklist). -- The instructions are starting to exceed one screen and blending responsibilities, persona, and procedure. +- The agent has a genuine role-specific routine it repeats every time it wakes. +- The role description is starting to exceed one screen and blending responsibilities, persona, and procedure. You can always start with a single file and split later — moving sections out of `AGENTS.md` into `SOUL.md` or `HEARTBEAT.md` is a normal refactor. #### How Paperclip seeds these files -When you create a new agent with the **CEO** role, Paperclip pre-populates the bundle with the full four-file template (you'll see all four files appear in the file tree on the Instructions tab). Agents created with any other role are seeded with a single `AGENTS.md`. You can always add `SOUL.md`, `HEARTBEAT.md`, or `TOOLS.md` to any agent manually with the **+** button in the file list — there's nothing special about those filenames beyond the convention, and the entry file is whatever you've set it to. +Every new agent starts with a single, short `AGENTS.md`: + +- An agent with the **CEO** role gets a one-line role description: it leads company strategy, priorities, resource allocation, and coordination across the team. +- Every other role gets a one-line placeholder saying it's an agent in a Paperclip company. Replace it with a sentence or two about the role. +- Agents installed from the [Team Catalog](./team-catalog.md), and agents drafted by the `paperclip-create-agent` skill, also start with a short role description rather than a long operating manual. + +Existing agents keep whatever files they already have — Paperclip doesn't rewrite them. You can add `SOUL.md`, `HEARTBEAT.md`, `TOOLS.md`, or anything else with the **+** button in the file list; there's nothing special about those filenames beyond the convention, and the entry file is whatever you've set it to. ### Editing files diff --git a/docs/guides/org/delegation.md b/docs/guides/org/delegation.md index f73a239..cfa91e2 100644 --- a/docs/guides/org/delegation.md +++ b/docs/guides/org/delegation.md @@ -1,4 +1,5 @@ --- +paperclip_version: v2026.1012.0 seo_title: Delegation: How Work Reaches Agents seo_description: Set a goal, approve a plan, and the CEO breaks it into tasks and assigns them. What you own, what the CEO handles, and the agent-to-agent guardrails. --- @@ -76,6 +77,8 @@ Review each hire request on its merits: - Is the proposed budget reasonable for that agent's workload? - Does the agent report to the right manager? +Don't be surprised if the proposed instructions are only a sentence or two. Hire drafts now describe the role — who the agent is and what it owns — and leave the how-to-work-in-Paperclip procedures to the runtime and installed skills. If the new agent needs company-specific rules, ask for them in a revision or add them on its [Instructions tab](./agents.md#instructions-tab) after you approve. + If anything looks off, request a revision. If it looks good, approve. Once you approve, Paperclip creates the agent and queues it to wake automatically. > **Warning:** Approving a hire creates a new agent and starts spending budget. Only approve hire requests when you're ready for the agent to start working. @@ -195,6 +198,8 @@ If you've set a goal but nothing seems to be happening, work through these commo This is expected behaviour when you have no other active reports. Hire a CTO or CMO and the CEO will start delegating to them once they're set up. +A new CEO starts with a one-line role description rather than a built-in routing playbook. If you want work routed a particular way — engineering to the CTO, marketing to the CMO — say so in the CEO's `AGENTS.md` on its [Instructions tab](./agents.md#instructions-tab). + ### Strategy was approved but nothing happened After you approve a strategy, Paperclip queues the CEO to wake automatically so follow-up work usually starts shortly after approval. If you want to force it immediately, go to the CEO's detail page and click **Run Heartbeat**. diff --git a/docs/guides/org/members-and-access.md b/docs/guides/org/members-and-access.md index 941947e..61ae38a 100644 --- a/docs/guides/org/members-and-access.md +++ b/docs/guides/org/members-and-access.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Members and Access: People in a Company seo_description: How humans fit alongside agents: one membership model, roles versus grants, instance admin, member profiles, and why leaving a project keeps access. --- @@ -38,7 +38,7 @@ Access comes in two layers, and it helps to hold them separately in your head: The two combine additively: role bundle **plus** any explicit grants. Explicit grants are stored on the member independently, so they outlive role changes — promote-then-demote someone and the boxes you checked by hand are still checked. The precise bundles and the full key list live in [Roles & Permissions](../../administration/roles-and-permissions.md); the thing to internalize here is just *bundle + extras, extras persist*. -The four roles, briefly: **Owner** (runs the company), **Admin** (onboards people and agents but can't re-permission others), **Operator** (assigns work), **Viewer** (reads). Reach for the smallest one that does the job — you can always add a grant later. +The four roles, briefly: **Owner** (runs the company), **Admin** (onboards people and agents but can't re-permission others), **Operator** (assigns work), **Viewer** (reads). New invites default to Operator. Reach for the smallest one that does the job — you can always add a grant later. --- diff --git a/docs/guides/org/skills.md b/docs/guides/org/skills.md index addb5e1..4c7ff5e 100644 --- a/docs/guides/org/skills.md +++ b/docs/guides/org/skills.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Skills: Reusable Agent Procedures seo_description: Package a checklist, runbook, or template once and share it across agents. Covers adding skills, folders, Skill Studio, and the cost and performance payoff. --- @@ -75,7 +75,7 @@ Gists work through the same source field. Paste the gist URL and Paperclip treat You can also paste a local path (Linux, WSL, or Windows) into the source field. Paperclip walks the folder, finds any `SKILL.md` files, and imports them. This is the right choice when you already keep skills in a project workspace on disk — the scan button (circular arrow next to the plus icon) re-runs the local import across every project workspace in the company so newly added `SKILL.md` folders show up automatically. -For safety, a local path has to sit inside a folder Paperclip already knows about: your company's managed skills folder or one of your project workspaces. A path anywhere else is refused with *"Local skill source is outside approved company workspace roots"* — add the folder as a project workspace first, or copy the skill somewhere Paperclip manages. +For safety, a local path has to sit inside a folder Paperclip already knows about: your company's managed skills folder, one of your project workspaces, or the folder Paperclip cloned a project into for you (a managed checkout). That last one means a project Paperclip checks out on your behalf can import its own skills in place, even if it has no workspace registered. A path anywhere else is refused with *"Local skill source is outside approved company workspace roots"* — add the folder as a project workspace first, or copy the skill somewhere Paperclip manages. ### 4. Import from the skills.sh marketplace @@ -266,6 +266,21 @@ When a skill is created, a **Skill created** card appears in the task's thread w The creation is also logged as `company.skill_created`, and it shows up in the task's own history as well as the company activity log. +### Letting an agent improve an existing skill + +Skills get better with use, and often the agent that just followed one is the best placed to fix it — "the checklist missed the changelog step; add it." The native runner also gives agents an **Update skill** tool for exactly that. It rewrites a skill's whole `SKILL.md` in one go, the same way a save in Skill Studio does. + +The tool is named `update_skill`. The agent reads the skill and its `currentVersionId`, then sends the complete primary file with `expectedVersionId` and an `idempotencyKey` — not just the lines it wants to change. + +It's built so an agent can't trample anyone's work: + +- **Same modes, same rules.** Like **Create skill**, it's only offered in Auto mode and skill test runs, and it obeys your skill policy — here the `skills.edit` rule. If an agent may not edit that skill, it's refused. It can only change skills you could edit in Studio, so read-only skills (the built-in catalog, GitHub sources, skills.sh) are off limits. +- **No overwriting newer edits.** The agent has to say which version of the skill it read. If someone saved a change in the meantime, the update is refused with *"Skill version changed. Read the current version before retrying."* — the agent rereads the skill and tries again on top of the latest version instead of silently undoing it. +- **Retries don't double up.** If the request is interrupted and retried, the agent gets back the original result instead of creating a second version. +- **Everything is recorded.** Each changed update becomes a new version in the skill's history, so you can compare or restore it in Studio, and it's logged as `company.skill_file_updated` against the task that made it. + +After a version conflict, the agent rereads the skill and uses a new retry key for its revised request. The [Skills reference](../../reference/skills.md#native-runner-skill-tools) shows the input shape. Implementation reference: [tool contract](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/paperclip-runner/src/protocol-actions/update-skill.ts) and [file API binding](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/skill-tools.ts). + --- ## Renaming a skill diff --git a/docs/guides/org/team-catalog.md b/docs/guides/org/team-catalog.md index 56e5e33..d9e3335 100644 --- a/docs/guides/org/team-catalog.md +++ b/docs/guides/org/team-catalog.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.609.0 +paperclip_version: v2026.1012.0 seo_title: Team Catalog: Ready-Made Starter Teams seo_description: Skip the blank page. Install a working team — agents, reporting lines, projects, routines, and skills — from the app or the terminal in one step. --- @@ -52,7 +52,7 @@ A few choices happen at install time: Installing a team is a single action that builds out several things at once: -- **Agents** — every agent the team defines, with its role, prompt, and place in the reporting hierarchy. The team's root agents either stand on their own or report to the manager you picked. +- **Agents** — every agent the team defines, with its role, a short role description as its `AGENTS.md`, and its place in the reporting hierarchy. You can expand the description on each agent's [Instructions tab](./agents.md#instructions-tab). The team's root agents either stand on their own or report to the manager you picked. - **Projects** — the workspaces the team operates in, so its agents have somewhere to do the work. - **Tasks** — including any recurring routines the team ships, such as a CEO heartbeat or a weekly sync, imported the same careful way Paperclip imports any routine. - **Skills** — the team's required skills are prepared in the company library: catalog skills are installed for you, and external-source skills are imported once you've allowed their sources. diff --git a/docs/guides/projects-workflow/task-watchdogs.md b/docs/guides/projects-workflow/task-watchdogs.md index 1cb6338..16edc12 100644 --- a/docs/guides/projects-workflow/task-watchdogs.md +++ b/docs/guides/projects-workflow/task-watchdogs.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.831.1 +paperclip_version: v2026.1012.0 seo_title: Task Watchdogs: Catching Stalled Work seo_description: When an agent misreads a blocker or calls a task done without proof, a watchdog wakes. Set one up, write good instructions, and know its limits. --- @@ -21,7 +21,7 @@ Think of it as a second pass on stopped work, without re-running the original as The word shows up in a few places in Paperclip. Keep them straight: - **Task watchdog** (this page) — an agent *you* assign to a specific issue. Fires only when the whole watched subtree has stopped. Configurable. -- **Silent active-run watchdog** — automatic monitoring of a single *running* agent for output silence. No configuration, nothing to set up. Silence surfaces as a **suspicious** or **critical** level on the active-run summary in the UI, but it takes no action on its own — it no longer creates evaluation issues, recovery actions, comments, or wake requests. (See your adapter's inactivity settings, e.g. codex-local's `outputInactivityTimeoutMs`.) +- **Silent active-run watchdog** — automatic monitoring of a single *running* agent for output silence. No configuration, nothing to set up. Silence surfaces as a **suspicious** level after 5 minutes without output and **critical** after 15 minutes on the active-run summary in the UI, but it takes no action on its own and never cancels the run automatically — it no longer creates evaluation issues, recovery actions, comments, or wake requests. (See your adapter's inactivity settings, e.g. codex-local's `outputInactivityTimeoutMs`.) - **Liveness recovery** — automatic restart of stalled agent-owned issues. Only the first one is something you turn on by hand. diff --git a/docs/how-to/connect-agent-to-github.md b/docs/how-to/connect-agent-to-github.md index 4136ee4..afb7182 100644 --- a/docs/how-to/connect-agent-to-github.md +++ b/docs/how-to/connect-agent-to-github.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.916.0 +paperclip_version: v2026.1012.0 seo_title: Connect an Agent to GitHub and Open PRs seo_description: Wire a coding agent to a real repo so every issue you assign produces a branch, a working commit, and a pull request visible from both sides. --- @@ -191,7 +191,7 @@ This means a task worded like *"Fix the null org id crash, then open a pull requ ## 4. The agent instructions: PR-driven work -The agent's `AGENTS.md` is what turns "do the task" into "do the task on a branch and open a PR". You don't need a special template — you need three rules in the entry file that the agent reads on every heartbeat. See [Agents → Recommended bundle structure](../guides/org/agents.md#recommended-bundle-structure-agents--soul--heartbeat--tools) for the full bundle layout; this snippet drops into the working-rules section of `AGENTS.md` for any coder role. +The agent's `AGENTS.md` is what turns "do the task" into "do the task on a branch and open a PR". You don't need a special template — you need three rules in the entry file that the agent reads on every heartbeat. See [Agents → Recommended bundle structure](../guides/org/agents.md#recommended-bundle-structure-agents-soul-heartbeat-tools) for the full bundle layout; this snippet drops into the working-rules section of `AGENTS.md` for any coder role. ```md ## Working rules: PR-driven @@ -296,7 +296,7 @@ For deeper heartbeat-level debugging — the agent isn't waking, the heartbeat f ## See also - [Workspaces](../guides/projects-workflow/workspaces.md) — full reference for `cwd`, `repoUrl`, `branchName`, and worktree lifecycle. -- [Agents → Recommended bundle structure](../guides/org/agents.md#recommended-bundle-structure-agents--soul--heartbeat--tools) — how `AGENTS.md` works alongside `SOUL.md`, `HEARTBEAT.md`, and `TOOLS.md`. +- [Agents → Recommended bundle structure](../guides/org/agents.md#recommended-bundle-structure-agents-soul-heartbeat-tools) — how `AGENTS.md` works alongside `SOUL.md`, `HEARTBEAT.md`, and `TOOLS.md`. - [Claude Code](../reference/adapters/claude-code.md) — adapter fields, env vars, and session persistence. - [Codex](../reference/adapters/codex.md) — same recipe, OpenAI's Codex CLI instead. - [Execution Policy](../guides/power/execution-policy.md) — staged review with named participants. diff --git a/docs/how-to/update-paperclip.md b/docs/how-to/update-paperclip.md index d87e8de..9cdc25c 100644 --- a/docs/how-to/update-paperclip.md +++ b/docs/how-to/update-paperclip.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.824.0 +paperclip_version: v2026.1012.0 seo_title: Update Paperclip to the Latest Version seo_description: Move an existing install to a new release without losing data — what to check first, how to run the update, and how to confirm it actually took. --- @@ -53,6 +53,36 @@ paperclipai update --dry-run --- +## Upgrading to v2026.1012.0 or later: stop everything first + +> **Warning:** This one release needs a full stop, not a hot restart. Workspace restore and agent-file collection used to lock each target directory with a `.lock/` folder. They now use OS-backed SQLite file locks under `/locks/directory-merge/`, which the operating system releases if a process crashes. Old processes don't take part in the new locks, so an old and a new version writing to the same instance root at the same time can corrupt each other's work. + +Your instance root is `~/.paperclip/instances/default` unless you've set `PAPERCLIP_HOME` or `PAPERCLIP_INSTANCE_ID`. If you're coming from an earlier version, do this instead of a plain `paperclipai update`: + +1. **Take a backup while the server is still up.** `paperclipai update` needs a reachable database to take its own snapshot, and you're about to stop it, so take one now: + + ```bash + paperclipai db:backup + ``` + +2. **Drain and stop every old process that can write to the instance root.** Let active agent runs finish, then stop the server (`paperclipai service stop`, or Ctrl+C on `paperclipai run`). Don't forget workers on other hosts or in other containers that share the same instance root. +3. **Move leftover legacy lock folders aside.** With everything stopped, move any `.lock/` directories out of `/locks/directory-merge/` into a scratch directory of your own. Keep them if you might need evidence from an unfinished run. Never delete or move the `.lock.sqlite` files — they're permanent, and the locking depends on them staying put. +4. **Update and start the new version.** + + ```bash + paperclipai update --no-backup # you took the backup in step 1 + paperclipai service start # or: paperclipai run + ``` + + Start every other worker on the new version too. +5. **Confirm a run saves its files.** Let one agent run finish and check that its file changes landed in the workspace, not just that the model replied. A successful reply on its own doesn't prove the files were collected. + +Rolling back across this release needs the same full stop: drain and stop every new process before starting an old one. The `.lock.sqlite` files can stay on disk — older versions simply ignore them. + +> **Tip:** This upgrade also runs a batch of database migrations. They're all additive, and only one, `0298`, touches existing rows: it adds default usage instructions to any Honcho, Mem0, Zep, Supermemory, and Cognee connections you already have. You can edit or turn those off afterwards — see [Saved connection instructions](../connectors/connection-instructions.md). + +--- + ## Apply the update ```bash @@ -142,6 +172,8 @@ It restarts an active service as part of the rollback, so you're back on the old `--rollback` is only available for managed installs. Other install types have no retained payload to flip back to. +> **Warning:** Rolling back from v2026.1012.0 or later to an earlier version? Don't let `--rollback` hot-restart over running work. Drain and stop every server and worker that writes to the instance root first, then roll back and start the old version — see [Upgrading to v2026.1012.0 or later](#upgrading-to-v202610120-or-later-stop-everything-first). Leave the `.lock.sqlite` files where they are. + --- ## About the pre-update backup diff --git a/docs/how-to/write-a-company-skill.md b/docs/how-to/write-a-company-skill.md index 781a542..559281b 100644 --- a/docs/how-to/write-a-company-skill.md +++ b/docs/how-to/write-a-company-skill.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Write a Company Skill seo_description: Author a small Markdown bundle, install it into your company skill library, and attach it to just the agents that should load it. About 15 minutes. --- @@ -95,11 +95,11 @@ Then drop a reference example next to it at `references/example.md` so the agent --- -### Let an agent save the procedure +### Let an agent save or improve the procedure If the agent is using Paperclip's native Runner, you can ask it to save a procedure it just learned: “Turn the release-note review you just did into a company skill.” In Auto mode, its `create_skill` tool saves a complete single-file `SKILL.md` to the library. You still assign the new skill to the agents that should use it. -Ask and Plan modes don't expose this tool. +For an existing editable skill, ask for the improvement directly: “Add a step checking the changelog to our release-review skill.” The agent reads the current version, then uses `update_skill` to replace the complete primary file with a version guard. If someone else saves first, the agent must reread and reapply its edit; retries with the same inputs do not create duplicate versions. Ask and pre-acceptance Plan modes do not expose these write tools. You can review the new skill from its **Skill created** card in the task, then use **Open in Skill Studio** to edit the live library copy. For the exact inputs and retry rules, see [Native Runner skill tools](../reference/skills.md#native-runner-skill-tools). Implementation reference: [tool validation and API binding](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/skill-tools.ts). @@ -113,7 +113,7 @@ You can review the new skill from its **Skill created** card in the task, then u The fastest path while you're iterating. Point the API at the parent folder that contains the skill folder you just wrote (`~/skills` in this example), so supporting files under `release-note-writer/references/` are included in the inventory. -The folder has to live somewhere Paperclip already trusts: inside one of your project workspaces, or in the company's managed skills folder. In practice, keep `~/skills` inside a project workspace — a path outside those roots is refused with `skill_workspace_boundary_denied`. +The folder has to live somewhere Paperclip already trusts: inside one of your project workspaces, inside a project's managed checkout (the folder Paperclip cloned for you), or in the company's managed skills folder. In practice, keep `~/skills` inside a project workspace — a path outside those roots is refused with `skill_workspace_boundary_denied`. ```bash curl -X POST "$PAPERCLIP_API_URL/api/companies/$COMPANY_ID/skills/import" \ @@ -294,6 +294,8 @@ Behaviour depends on where the skill came from. | **URL / raw file** | No | Re-import the URL to refresh. | | **Bundled with Paperclip** | Pinned to the Paperclip release | Upgrade Paperclip itself; bundled skills can't be edited. | +Your agents can help keep a Paperclip-managed skill current, too: on the native runner, an agent in Auto mode can rewrite the skill's `SKILL.md` with its **Update skill** tool, guarded so it never overwrites a newer save — see [Letting an agent improve an existing skill](../guides/org/skills.md#letting-an-agent-improve-an-existing-skill). + Promote a skill to a GitHub source as soon as you want to share it across multiple agents or companies — that's the path that gives you reviewable diffs, a stable canonical key, and update-status tracking. The `id` doesn't change when you `install-update`, so anything that referenced the skill by `id` keeps working without re-syncing. To check for updates on a GitHub-sourced skill: @@ -343,7 +345,7 @@ The full set of rules — required vs. optional, bundled-required, materialisati The route requires `agents:create` capability. Run the call as the board user, the CEO agent, or an agent with `permissions.canCreateAgents=true`. The same gate applies to import, scan, sync, and the per-skill detail/files routes. **`Local skill source is outside approved company workspace roots`.** -The local path isn't inside a project workspace or the company's managed skills folder (code `skill_workspace_boundary_denied`). Move the skill folder into a project workspace — or register its folder as one — and import again. +The local path isn't inside a project workspace, a project's managed checkout, or the company's managed skills folder (code `skill_workspace_boundary_denied`). Move the skill folder into a project workspace — or register its folder as one — and import again. **`Invalid company skill selection (ambiguous references: ; …)`.** Two installed skills share the same slug. Switch the call to use the canonical `key` — list `/companies/{id}/skills`, find the row, copy the `key` field, send that. diff --git a/docs/reference/adapters/claude-code.md b/docs/reference/adapters/claude-code.md index 7e4dcb7..66c2179 100644 --- a/docs/reference/adapters/claude-code.md +++ b/docs/reference/adapters/claude-code.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Claude Code Adapter seo_description: Run Anthropic's Claude Code CLI on the Paperclip host, with session persistence, skills injection, and configuration managed from your agent. --- @@ -31,7 +31,7 @@ seo_description: Run Anthropic's Claude Code CLI on the Paperclip host, with ses |---|---:|---| | `cwd` | no | Absolute working directory for the agent. Recommended in practice. If omitted, the adapter falls back to the current process working directory. Paperclip creates the path when permissions allow. | | `engine` | no | How Claude Code is run: `auto` (the default — runs ACP), `acp` (always the Agent Client Protocol), or `cli` (always the classic Claude CLI). See [ACP Engine](#acp-engine). | -| `model` | no | Claude model id. Common choices include `claude-opus-5-5`, `claude-opus-4-8`, `claude-sonnet-5`, and `claude-fable-5-1`. | +| `model` | no | Claude model id. Common choices include `claude-opus-5-5`, `claude-sonnet-5-5`, `claude-opus-4-8`, `claude-sonnet-5`, and `claude-fable-5-1`. | | `promptTemplate` | no | Prompt template used for the run. | | `env` | no | Environment variables passed to Claude Code. Secret refs are supported. | | `command` | no | Defaults to `claude`. Override only if you need a different executable path. | @@ -70,7 +70,7 @@ The `effort` choices in the agent form follow the model you pick: | Model | Effort levels | |---|---| -| `claude-opus-5-5`, `claude-opus-5`, `claude-opus-4-8`, `claude-opus-4-7`, `claude-sonnet-5`, `claude-fable-5-1`, `claude-fable-5` | `low`, `medium`, `high`, `xhigh`, `max` | +| `claude-opus-5-5`, `claude-opus-5`, `claude-opus-4-8`, `claude-opus-4-7`, `claude-sonnet-5-5`, `claude-sonnet-5`, `claude-fable-5-1`, `claude-fable-5` | `low`, `medium`, `high`, `xhigh`, `max` | | `claude-opus-4-6`, `claude-sonnet-4-6` | `low`, `medium`, `high`, `max` | | `claude-haiku-4-5` | No effort control | | Other models | `low`, `medium`, `high` | @@ -116,9 +116,11 @@ When you pick a model in the agent config form, Claude Code fills the model drop Here's how the list is built: - **With an API key.** If `ANTHROPIC_API_KEY` is set, the adapter calls the Anthropic models endpoint (`/v1/models`) — at `ANTHROPIC_BASE_URL` if you've set one, otherwise `https://api.anthropic.com` — and offers everything it returns. The live results are merged with Paperclip's built-in list and de-duplicated, so you always see at least the known-good models, plus anything new from your account. -- **On Bedrock.** If the adapter detects AWS Bedrock (for example `CLAUDE_CODE_USE_BEDROCK=1`), it offers the region-qualified Bedrock model IDs instead, such as `us.anthropic.claude-opus-5-5`, `us.anthropic.claude-sonnet-5`, and `us.anthropic.claude-fable-5-1`. +- **On Bedrock.** If the adapter detects AWS Bedrock (for example `CLAUDE_CODE_USE_BEDROCK=1`), it offers the region-qualified Bedrock model IDs instead, such as `us.anthropic.claude-opus-5-5`, `us.anthropic.claude-sonnet-5-5`, `us.anthropic.claude-sonnet-5`, and `us.anthropic.claude-fable-5-1`. - **No key, or the lookup fails.** If there's no API key, or the request times out or comes back empty, you simply get Paperclip's built-in fallback list. Discovery never blocks you from saving an adapter. +Whichever way the list is built, the dropdown shows it in the same order the Claude app uses, so you find the model you expect where you expect it. The newest release of each family comes first, from most to least capable — Fable, Mythos, Opus, Sonnet, then Haiku — followed by older releases grouped by family with the newest versions first. A model alias sorts ahead of its dated snapshots, and any id that doesn't look like a Claude model keeps its place at the end of the list. + Discovered models are cached for about a minute (keyed to the API key and base URL in use), so reopening the form is instant. When you want the freshest list — say you've just been granted access to a new model — use the model field's **refresh** control to force a new lookup that bypasses the cache. > **Tip:** The `model` field still accepts any model id you type in. Discovery is there to save you from remembering exact identifiers, not to restrict you to the listed choices. @@ -126,6 +128,7 @@ Discovered models are cached for about a minute (keyed to the API key and base U > **Heads-up:** Some newer models need a minimum Claude Code version on the CLI lane: > > - Claude Opus 5.5 (`claude-opus-5-5`, or `us.anthropic.claude-opus-5-5` on Bedrock) needs Claude Code `2.1.280` or newer. +> - Claude Sonnet 5.5 (`claude-sonnet-5-5`, or `us.anthropic.claude-sonnet-5-5` on Bedrock) needs Claude Code `2.1.284` or newer. > - Claude Fable 5.1 (`claude-fable-5-1`, or `us.anthropic.claude-fable-5-1` on Bedrock) needs Claude Code `2.1.251` or newer. > > If the installed CLI is older, the environment test and the run both fail fast with `claude_cli_version_incompatible` instead of launching against an unsupported binary — upgrade Claude Code on the target host to use the model. diff --git a/docs/reference/adapters/codex.md b/docs/reference/adapters/codex.md index 921f9c6..42b80d9 100644 --- a/docs/reference/adapters/codex.md +++ b/docs/reference/adapters/codex.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Codex Adapter seo_description: Run OpenAI's Codex CLI on the Paperclip host as a local coding agent, with persistent session state and a managed CODEX_HOME per agent. --- @@ -36,7 +36,7 @@ seo_description: Run OpenAI's Codex CLI on the Paperclip host as a local coding | `instructionsFilePath` | no | Markdown file prepended to the stdin prompt sent to `codex exec`. | | `modelReasoningEffort` | no | Reasoning effort override passed through Codex config. The choices depend on the model — see [Reasoning Effort](#reasoning-effort). | | `search` | no | Runs Codex with `--search`. | -| `fastMode` | no | Enables Codex Fast mode by setting `service_tier="fast"` and `features.fast_mode=true`. Supported on `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-5.5`, and `gpt-5.4`, and passed through for manual model ids. When the configured model can't use it, Paperclip ignores the setting and notes why. | +| `fastMode` | no | Enables Codex Fast mode by setting `service_tier="fast"` and `features.fast_mode=true`. Supported on `gpt-6.1-sol`, `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-5.5`, and `gpt-5.4`, and passed through for manual model ids. When the configured model can't use it, Paperclip ignores the setting and notes why. | | `dangerouslyBypassApprovalsAndSandbox` | no | Runs Codex with `--dangerously-bypass-approvals-and-sandbox` so unattended runs never stop for approval. Defaults to on when you leave it unset — see [Permissions](#permissions). | | `command` | no | Defaults to `codex`. | | `extraArgs` | no | Extra CLI arguments appended to the Codex invocation. | @@ -100,26 +100,27 @@ An environment that only runs one-shot commands cannot host an ACP session, so a ## Models -Pick any of the known Codex model ids in the `model` field. The current options are: +Pick any of the known Codex model ids in the `model` field. The picker lists them the way the ChatGPT app orders Codex models — newest model version first, most capable first within each version, and older models at the end: -- `gpt-5.6-sol` (the adapter default) +- `gpt-6.1-sol` - `gpt-6-astra` - `gpt-6-sol` - `gpt-6-luna` +- `gpt-5.6-sol` (the adapter default) - `gpt-5.6-terra` - `gpt-5.6-luna` - `gpt-5.5` - `gpt-5.4` - `gpt-5.4-mini` - `gpt-5` -- `o3` -- `o4-mini` - `gpt-5-mini` - `gpt-5-nano` +- `o3` +- `o4-mini` - `o3-mini` - `codex-mini-latest` -This is a curated list. Even when an OpenAI API key is available, the picker doesn't fill itself from OpenAI's model catalog, because that catalog also includes image, audio, and embedding models Codex can't run. If you need other models in the dropdown — say, ones served through your own gateway — declare the list you want with [`PAPERCLIP_ADAPTER_MODELS`](../deploy/environment-variables.md#adding-models-to-the-model-picker). +This is a curated list. Even when an OpenAI API key is available, the picker doesn't fill itself from OpenAI's model catalog, because that catalog also includes image, audio, and embedding models Codex can't run. If you need extra models in the dropdown — say, ones served through your own gateway — declare them with [`PAPERCLIP_ADAPTER_MODELS`](../deploy/environment-variables.md#adding-models-to-the-model-picker). You can also type a model id that is not in this list. Anything Paperclip does not recognize is treated as a manual model id and passed straight through to the Codex CLI. @@ -133,7 +134,7 @@ The `modelReasoningEffort` choices follow the model you pick: | Model | Effort levels | |---|---| -| `gpt-6-astra`, `gpt-6-sol`, `gpt-5.6-sol`, `gpt-5.6-terra` | `low`, `medium`, `high`, `xhigh`, `max`, `ultra` | +| `gpt-6.1-sol`, `gpt-6-astra`, `gpt-6-sol`, `gpt-5.6-sol`, `gpt-5.6-terra` | `low`, `medium`, `high`, `xhigh`, `max`, `ultra` | | `gpt-6-luna`, `gpt-5.6-luna` | `low`, `medium`, `high`, `xhigh`, `max` | | Other models | `minimal`, `low`, `medium`, `high`, `xhigh` | @@ -170,6 +171,15 @@ The session codec also preserves these location hints when present: If the working directory changes, the adapter starts a fresh session instead of reusing the old response chain. +### Native Codex on Paperclip Runner + +Codex can also run natively through [Paperclip Runner](paperclip-runner.md) (`paperclip_runner` with `provider: "codex"`) rather than through `codex_local`. A few behaviors are specific to that native path: + +- **Restarts don't cost you the conversation.** If a server restart kills a native Codex turn mid-flight, Paperclip first makes sure the old process is really gone. Then it resumes the request once, in the same conversation and workspace, and asks the agent to check any unfinished commands or outside actions before carrying on. It doesn't resend the task. The run log records the interrupted turn with `provider_turn_lost_on_restore`. Anything that can't be reconciled still stops for a person. +- **Codex keeps its own base prompt.** Paperclip sends its task context as additive `developerInstructions` when a thread starts or resumes, so Codex's stock base instructions stay in place. Conversations created before this change keep their saved prompt when resumed; reset those sessions if you want the stock base instructions back. +- **A model your ChatGPT account can't use says so.** When Codex rejects the selected model for a ChatGPT sign-in, the task shows **Model unavailable.** with *"The selected model is not supported by the current ChatGPT connection. Choose a supported model or a compatible AI connection."* Paperclip doesn't retry that request automatically. Choose a supported model or clear the task's model override, then retry. +- **A busy model retries on its own.** When the selected model is at capacity, Paperclip shows **Model at capacity** and retries after one minute, then after two. See [When a run needs attention](../../experimental/task-chat.md#when-a-run-needs-attention). + --- ## Skills Injection diff --git a/docs/reference/adapters/creating-an-adapter.md b/docs/reference/adapters/creating-an-adapter.md index a32b2a3..868d1c3 100644 --- a/docs/reference/adapters/creating-an-adapter.md +++ b/docs/reference/adapters/creating-an-adapter.md @@ -1,4 +1,5 @@ --- +paperclip_version: v2026.1012.0 seo_title: Creating a Custom Adapter seo_description: Build your own adapter when the built-in ones do not fit your runtime. Covers the code shape and the runtime contracts an adapter must satisfy. --- @@ -122,6 +123,12 @@ Key helpers you are likely to use: > **Note:** Treat adapter output as untrusted. Parse defensively and never execute its stdout blindly. +### Connection instructions + +Connections can carry usage instructions that every authorized agent turn should see. The server resolves them for each run and puts them on the execution context as `context.connectionInstructions` — a `{ text, digest }` object, or `null` when none apply. Append `text` to the model prompt; don't pass the object through. + +If you build your wake prompt by passing `context.paperclipWake` to `renderPaperclipWakePrompt()` from `@paperclipai/adapter-utils/server-utils`, the text is already appended for you. The built-in [HTTP](./http.md#connection-instructions) and [Process](./process.md#connection-instructions) adapters forward the same object to your service or script. + --- ## Environment Test diff --git a/docs/reference/adapters/grok-local.md b/docs/reference/adapters/grok-local.md index 3c1b2c0..fd9bfd3 100644 --- a/docs/reference/adapters/grok-local.md +++ b/docs/reference/adapters/grok-local.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Grok Local Adapter seo_description: Run xAI's Grok Build CLI on the Paperclip host as a local coding agent that resumes the same Grok session across every heartbeat. --- @@ -186,6 +186,12 @@ The runner's **ACPX permission mode** (`acpxPermissionMode`) defaults to **Full The stricter **Automatic Paperclip actions** (`approve-paperclip`) and **Allow Paperclip reads** (`approve-reads`) modes are kept if you choose them, but Grok can't auto-approve Paperclip tool calls under them — those calls stop and wait for approval. **Deny all** (`deny-all`) rejects Grok's permission requests outright. +### Native route limits + +Grok's native Runner usage accounting is not qualified. Missing token or dollar totals do not prove a run was free; the billing details above describe `grok_local` and the chosen authentication method. Native session load supports recovery, but live steering is unsupported and follow-ups use the controller queue. + +See [Paperclip Runner](paperclip-runner.md) for supported task modes and admission requirements. + --- ## Next Steps diff --git a/docs/reference/adapters/http.md b/docs/reference/adapters/http.md index 4689b71..cd16710 100644 --- a/docs/reference/adapters/http.md +++ b/docs/reference/adapters/http.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.916.0 +paperclip_version: v2026.1012.0 seo_title: HTTP Webhook Adapter seo_description: Send a JSON webhook to a service you control. Use it when the runtime is remote, long-lived, or already exposed as an API rather than a local CLI. --- @@ -47,6 +47,7 @@ Paperclip sends a JSON payload that always includes: - `runId` - `agentId` - `context` +- `connectionInstructions` (an object or `null` — see [Connection instructions](#connection-instructions)) Any `payloadTemplate` fields are merged in first, then Paperclip adds the standard fields above. If a key collides, the standard Paperclip field wins. @@ -69,6 +70,33 @@ Your service can use `PAPERCLIP_API_URL` and a Paperclip API key to call back in --- +## Connection instructions + +A connection can carry usage instructions for agents — for example, how to use a memory provider like Honcho or Mem0. When any of the agent's authorized connections have instructions turned on, Paperclip delivers them to your service so the model actually sees them. + +They arrive as a top-level `connectionInstructions` field in the request body: + +- an object `{ "text": "...", "digest": "..." }` when instructions apply, or +- `null` when none do. + +```json +{ + "runId": "run-123", + "agentId": "agent-123", + "context": { "taskId": "issue-123" }, + "connectionInstructions": { + "text": "## Connection instructions\n\n...", + "digest": "3f2a..." + } +} +``` + +`text` is ready-to-use Markdown. Append it to the prompt you send your model — don't pass the whole object through. `digest` is a SHA-256 hex hash of `text`, handy if you want to cache or detect when the instructions change between turns. + +Like the other standard fields, `connectionInstructions` overrides any key of the same name in `payloadTemplate`. See [Saved connection instructions](../../connectors/connection-instructions.md) for how people write and edit them. + +--- + ## Private vs public endpoints Every request the HTTP adapter sends is checked at the socket boundary before it connects, so you can't accidentally point a webhook at something inside your own network. Public origins are allowed by default. Origins that resolve to private, reserved, or loopback addresses — including `localhost`, `10.0.0.0/8`, `192.168.0.0/16`, and friends — are rejected. Link-local metadata endpoints (like a cloud provider's `169.254.x.x`) are always blocked and can't be opted back in. diff --git a/docs/reference/adapters/opencode.md b/docs/reference/adapters/opencode.md index b6e5da8..b195cfc 100644 --- a/docs/reference/adapters/opencode.md +++ b/docs/reference/adapters/opencode.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: OpenCode Adapter seo_description: Run OpenCode on the Paperclip host when you want provider and model routing in OpenCode's own format, plus session resume across heartbeats. --- @@ -110,6 +110,7 @@ OpenCode supports multiple providers. Common ids: |---|---| | `openai/gpt-5.2-codex` | OpenAI (default) | | `openai/gpt-6-astra` | OpenAI | +| `openai/gpt-6.1-sol` | OpenAI | | `openai/gpt-6-sol` | OpenAI | | `openai/gpt-6-luna` | OpenAI | | `openai/gpt-5.6-sol` | OpenAI | @@ -118,6 +119,7 @@ OpenCode supports multiple providers. Common ids: | `anthropic/claude-opus-5-5` | Anthropic | | `anthropic/claude-opus-5` | Anthropic | | `anthropic/claude-fable-5-1` | Anthropic | +| `anthropic/claude-sonnet-5-5` | Anthropic | | `anthropic/claude-sonnet-5` | Anthropic | | `google/gemini-3.8-flash` | Google | | `xai/grok-4.7` | xAI | diff --git a/docs/reference/adapters/overview.md b/docs/reference/adapters/overview.md index a5a379f..9e9937c 100644 --- a/docs/reference/adapters/overview.md +++ b/docs/reference/adapters/overview.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.831.1 +paperclip_version: v2026.1012.0 seo_title: Adapters Overview seo_description: Adapters connect Paperclip's control plane to the runtime that does the work. Start here to compare the options and pick one per agent you hire. --- @@ -67,6 +67,7 @@ These adapters ship with Paperclip and are always available in the host: | [Pi](./pi.md) | `pi_local` | Selectable | Pi CLI runs with its built-in tool set and provider/model routing. | | [Hermes](./hermes.md) | `hermes_local` | Selectable | Hermes Agent runs with persistent memory, 30+ tools, 80+ skills, and multi-provider routing. | | [Grok Local](./grok-local.md) | `grok_local` | Selectable | Grok Build CLI runs with `--resume` session continuity, streaming reasoning output, and skills staged into `.claude/skills`. | +| [Paperclip Runner](./paperclip-runner.md) | `paperclip_runner` | Experimental; instance setting applies | Native run lifecycle, durable session recovery, and qualified Codex, OpenCode, Claude, and Grok providers. | | [Kimi Code](./kimi-local.md) | `kimi_local` | Selectable | Kimi Code CLI runs on the shared ACP engine with headless-CLI fallback, session resume, and per-run skills injection. | | [OpenClaw Gateway](./openclaw-gateway.md) | `openclaw_gateway` | **Coming soon** (use OpenClaw invite flow) | Remote OpenClaw instances reached over the WebSocket gateway protocol. | | [Process](./process.md) | `process` | **Coming soon** (API / import only) | Shell commands, scripts, and custom local runtimes. | @@ -76,6 +77,14 @@ These adapters ship with Paperclip and are always available in the host: --- +## Native Paperclip Runner + +Choose **Paperclip Runner** when you want the native run lifecycle and built-in task tools. Then pick its **Provider** — for **ACP agents**, choose the **ACP agent** too. Existing direct adapters keep their own paths; enabling the feature does not migrate them. + +The `enableNativeRunner` default is on for self-hosted instances and off for Cloud-managed instances. Grok has a separately pinned native runtime. See [Paperclip Runner](paperclip-runner.md) and [Grok](grok-local.md#grok-build-on-paperclip-runner). + +--- + ## External Adapters External adapters are installed separately and loaded at startup from the adapter plugin store. They behave like built-ins once installed, but they live in their own package and can be versioned independently. @@ -115,6 +124,7 @@ Here are the rough tiers, richest first: - **ACP engine — full structured event stream.** When `claude_local`, `codex_local`, `gemini_local`, or `kimi_local` runs through the Agent Client Protocol — the default `engine: auto`, or a forced `engine: acp` — it emits a JSONL event for each meaningful moment: session identity, status (progress text plus context-window usage), assistant and thinking token deltas, tool-call title and status updates as calls progress, a result stop-reason summary, and errors. The transcript renders these as live-updating message, thinking, tool, and status blocks — and repeated tool-call status updates fold into a single tool card instead of stacking. - **CLI wrappers (`claude_local` / `codex_local` / `gemini_local` on `engine: cli`, plus `cursor`, `opencode_local`, …) — the CLI's own stream.** These parse each CLI's streaming JSON output: assistant text, tool calls and results, and a final usage/cost summary. You get as much detail as the CLI itself prints. +- **Paperclip Runner — native lifecycle and structured activity.** The native route renders provider activity and Paperclip tools through its own transcript path. Capability and accounting support vary by provider; native Grok does not supply authoritative per-run cost totals. - **Generic adapters (`process`, `http`) — plain output.** You see stdout and stderr lines with no structured transcript. If you're running sandbox workers, leave `engine` on `auto` so the adapter uses ACP when the sandbox provides Paperclip's bidirectional process session. A sandbox that only runs one-shot commands, and non-sandbox remote targets, fall back to the CLI lane. Sandbox run logs stream live either way, but the richer event stream makes the transcript and status line more useful while a remote run is in flight. @@ -123,6 +133,7 @@ If you're running sandbox workers, leave `engine` on `auto` so the adapter uses ## Next Steps +- [Paperclip Runner](./paperclip-runner.md) - [Claude Code](./claude-code.md) - [Codex](./codex.md) - [Gemini CLI](./gemini-cli.md) diff --git a/docs/reference/adapters/paperclip-runner.md b/docs/reference/adapters/paperclip-runner.md index d71f67c..441596c 100644 --- a/docs/reference/adapters/paperclip-runner.md +++ b/docs/reference/adapters/paperclip-runner.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Paperclip Runner Setup and Providers seo_description: Configure Paperclip Runner for native agent sessions. Choose a supported provider, set permissions and model access, and understand runtime limits. --- @@ -23,9 +23,9 @@ For source development, an enabled Runner requires a Rust toolchain or `PAPERCLI | Provider | Runtime and setup | | --- | --- | -| **Codex** (`codex`) | Native Codex app-server route. Configure an OpenAI connection. | -| **OpenCode** (`opencode`) | Native OpenCode server route, pinned to `1.18.32`. Use a model in `provider/model` form. | -| **ACP agents → Claude** (`acpx`, `claude`) | Qualified Claude ACP runtime. Configure a Claude-compatible AI connection. | +| **Codex** (`codex`) | Native Codex app-server route, pinned to Codex `0.160.0`. Configure an OpenAI connection. | +| **OpenCode** (`opencode`) | Native OpenCode server route, pinned to `1.18.34`. Use a model in `provider/model` form. | +| **ACP agents → Claude** (`acpx`, `claude`) | Qualified Claude ACP runtime — Claude Agent SDK `0.3.286`, which runs Claude Code `2.1.286`. Configure a Claude-compatible AI connection. | | **ACP agents → Grok Build** (`acpx`, `grok`) | Qualified Grok Build runtime. See [Grok setup](grok-local.md#grok-build-on-paperclip-runner). | | **Claude Managed** (`claude_managed`) | A company-qualified managed-agent profile, retention acknowledgement, and session spend ceiling. | | **AWS AgentCore** (`aws_agentcore`) | A company-qualified remote-agent profile, retention acknowledgement, and estimated session spend ceiling. | @@ -83,6 +83,19 @@ Existing `cursor`, `grok_local`, `claude_local`, `codex_local`, and `opencode_lo - Native session capabilities differ by provider. Session load does not imply native fork or resume methods are available. - Environment readiness and model access are separate. A successful installation check does not prove that the provider accepts a paid run. +## Sandbox images and runtime versions + +When native Codex runs in a remote sandbox, the Runner checks the Codex version installed there before it starts. Any stable release from `0.149.0` up to but excluding `0.161.0` is accepted, so an image doesn't have to match the `0.160.0` install pin exactly; a compatible version that differs from the pin is noted in the run log. A version outside that window, or a prerelease, stops the run with `runner_remote_provider_artifact_incompatible`. The message tells you to install a supported stable Codex release or set `PAPERCLIP_RUNNER_REMOTE_CODEX_NPM_SPEC` to the pinned package. + +If you build your own sandbox images, keep two things in mind when you upgrade: + +- **Deploy first, then promote the image.** Upgrade the Paperclip controller and Runner before you promote a sandbox image that carries the new runtime pins. Older controllers reject the new provider-pack pins. +- **Rebuild old Claude Code images for Sonnet 5.5.** An image built with Claude Code older than `2.1.284` must be rebuilt before Claude Sonnet 5.5 works on the CLI path. See the [Claude Code model requirements](claude-code.md#model-discovery). + +## Running several Runners on one machine + +When a sandbox provider starts the Runner daemon (`paperclip-runnerd`) in listener mode, it listens on port `43127` by default. If you run more than one listening Runner on the same machine, give each its own port with `--listen-port` — any value from `1` to `65535`. The Runner still binds to `0.0.0.0`, accepts connections only on its run-specific path, and keeps the same authentication. A warm Runner that's reattached keeps the port it started with; asking it to switch ports is rejected. + ## Next steps - [Grok Local and native Grok](grok-local.md) diff --git a/docs/reference/adapters/process.md b/docs/reference/adapters/process.md index 27b0f11..457acd8 100644 --- a/docs/reference/adapters/process.md +++ b/docs/reference/adapters/process.md @@ -1,4 +1,5 @@ --- +paperclip_version: v2026.1012.0 seo_title: Process Adapter seo_description: Run an arbitrary command on the Paperclip host. The right choice when your agent is really a script, a shell command, or a custom runtime. --- @@ -52,6 +53,34 @@ If the process exits non-zero, the run returns an error message and the raw outp --- +## Connection instructions + +A connection can carry usage instructions for agents — for example, how to use a memory provider like Honcho or Mem0. When any of the agent's authorized connections have instructions turned on, Paperclip hands them to your process so the model actually sees them. + +Your process gets them through the `PAPERCLIP_CONNECTION_INSTRUCTIONS_FILE` environment variable: + +- When instructions apply, it holds the path to a private JSON file (readable only by the process owner) containing `{ "text": "...", "digest": "..." }`. +- When none apply, it's set to an empty string — not a path. Paperclip always overwrites this variable, so a value inherited from the host or your `env` config never leaks through. + +`text` is ready-to-use Markdown. Read the file and append `text` to the prompt you send your model — don't pass the whole object through. `digest` is a SHA-256 hex hash of `text`, useful for spotting when the instructions change between runs. + +```python +import json, os + +path = os.environ.get("PAPERCLIP_CONNECTION_INSTRUCTIONS_FILE", "") +extra = "" +if path: + with open(path) as f: + extra = json.load(f)["text"] +prompt = base_prompt + ("\n\n" + extra if extra else "") +``` + +Read the file while your process is running. Paperclip creates it just before launch and removes it as soon as the process exits. + +See [Saved connection instructions](../../connectors/connection-instructions.md) for how people write and edit them. + +--- + ## Environment Test The `Test Environment` button checks: diff --git a/docs/reference/adapters/sandbox-providers.md b/docs/reference/adapters/sandbox-providers.md index 5e822be..7fe1faa 100644 --- a/docs/reference/adapters/sandbox-providers.md +++ b/docs/reference/adapters/sandbox-providers.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Sandbox Providers seo_description: Provider plugins that let Paperclip provision external compute as the execution environment for agent runs, instead of running them on the host. --- @@ -97,6 +97,7 @@ Beyond `reuseLease`, two fields control how the `paperclip_runner` process lives Daytona streams a command's output to Paperclip over a log socket, and occasionally that socket closes or simply goes quiet while the command is still running. The driver doesn't take a dropped stream as the end of the command, so you don't lose output or get a run marked finished too early: - **It waits for a real exit.** A command only counts as complete once Daytona records its exit. After a clean close, the driver reconnects the stream once, then checks the command's status and log snapshot at most once a second until the exit shows up. +- **Quiet sockets switch to polling sooner.** If the socket delivers no output for 15 seconds — even if it never finished connecting — the driver stops waiting on it and moves straight to polling. - **Nothing runs twice.** The command is never sent again, output you've already seen isn't repeated in the run log, and a final snapshot fills in anything written after the socket closed. - **A timeout stays honest.** If reading the logs times out, you keep the partial output, and the log says whether the command's exit is still unconfirmed. It isn't reported as a success. @@ -116,10 +117,22 @@ Configure from **Settings → Instance settings → Environments**. Put the exe. The provider provisions VMs through exe.dev's HTTPS API and runs commands through direct SSH to the created VM. You need: -- An exe.dev API token that allows the lifecycle commands `new`, `ls`, and `rm`. `whoami` and `help` are recommended for manual debugging. +- An exe.dev API token that allows the lifecycle commands `new`, `ls`, and `rm` — plus `cp` if you use a source VM (see below). exe.dev answers with a 403 when the token doesn't list a command the provider needs. `whoami` and `help` are recommended for manual debugging. - SSH access from the Paperclip host to the resulting `*.exe.xyz` VMs. - An SSH private key exe.dev recognises. You can either paste the private key into the environment config via `sshPrivateKey`, or point `sshIdentityFile` at an absolute host path. +### Start every run from a prepared VM + +By default, each run gets a brand-new VM from `exe.dev new`, so a large repository pays its full setup cost — toolchains, agent CLIs, package caches, test browsers — on every run. If you'd rather do that setup once, prepare a VM the way you like it and point the environment at it with **Source VM** (`sourceVm`, under the advanced **VM creation** settings). Each run then copies that VM with `exe.dev cp`, disk and config included, and starts from the copy. Leave the field blank to keep creating fresh VMs. + +A few things to know before you switch it on: + +- **Your token needs `cp`.** Add it to the API token's allowed commands, or every copy fails with a 403. +- **Only the size settings apply.** A copy accepts just the VM name plus `cpu`, `memory`, and `disk`. Clear `image`, `command`, `comment`, `env`, `integrations`, `tags`, `setupScript`, and `prompt` — the environment won't save while any of them is set alongside `sourceVm`. +- **The setup script doesn't run.** Prepare the source VM so it already has Node 24.11 or newer and accepts the SSH key the environment is configured with. +- **Keep secrets off the source VM.** Every copy inherits its disk. +- **Mind the 30-second limit.** The copy goes through exe.dev's `/exec` API, so a very large disk has to finish copying within that request timeout. + --- ## E2B (`provider: "e2b"`) diff --git a/docs/reference/api/agents.md b/docs/reference/api/agents.md index 6912b42..c84f67d 100644 --- a/docs/reference/api/agents.md +++ b/docs/reference/api/agents.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Agents API seo_description: Create agents, inspect and update configuration, manage lifecycle, rotate keys, sync skills, trigger runs, and register managed and remote agent profiles. --- @@ -39,7 +39,7 @@ The agent payload is a normal JSON object. These are the fields you will see mos | `runtimeConfig` | Runtime settings. `heartbeat.enabled` defaults to `false` when you create an agent. | | `budgetMonthlyCents` | Monthly budget in cents. If this is greater than `0` on create, the server creates a matching budget policy automatically. | | `status` | Lifecycle state. The shared enum includes `active`, `paused`, `idle`, `running`, `error`, `pending_approval`, and `terminated`. | -| `permissions` | Agent-level permissions, currently `canCreateAgents`. | +| `permissions` | Agent-level permissions: `canCreateAgents` and `canCreateSkills` (defaults to `true`). | --- @@ -309,7 +309,7 @@ Important behavior: - `adapterConfig.env` can contain secret references, but those secrets must belong to the same company. - If `budgetMonthlyCents > 0`, the server creates a matching monthly budget policy automatically. - If you omit `appearance`, the server picks a random character palette for the new agent and saves it, so the agent keeps the same look from then on. -- For adapters that support an instructions bundle, send the agent's instructions as `instructionsBundle.files` — for example `{"files": {"AGENTS.md": "You are the CTO. You own technical direction."}}`, with an optional `entryFile`. If you leave it out, the server seeds Paperclip's default instructions: `AGENTS.md`, `HEARTBEAT.md`, `SOUL.md`, and `TOOLS.md` for `role: "ceo"`, or a default `AGENTS.md` for every other role. Don't use `adapterConfig.promptTemplate` or `bootstrapPromptTemplate` for new agents. +- For adapters that support an instructions bundle, send the agent's instructions as `instructionsBundle.files` — for example `{"files": {"AGENTS.md": "You are the CTO. You own technical direction."}}`, with an optional `entryFile`. If you leave it out, the server seeds a short default `AGENTS.md`: a one-line role description for `role: "ceo"`, or a one-line generic placeholder for every other role. Keep it short — Paperclip's runtime and installed skills already supply the operating procedures. Don't use `adapterConfig.promptTemplate` or `bootstrapPromptTemplate` for new agents. - Certain adapters apply defaults on create. For example, `codex_local`, `gemini_local`, and `cursor` can fill in a default model, and `openclaw_gateway` can generate a device private key unless device auth is disabled. ### Example @@ -549,9 +549,9 @@ This is the only supported way to change permissions. The main `PATCH /api/agent Current permission fields: -- `canCreateAgents` -- The request body also accepts `canAssignTasks`, which the route applies as a principal permission grant on the agent (`tasks:assign`). -- The agent record itself only stores `canCreateAgents`. +- `canCreateAgents` (required) +- `canCreateSkills` (optional) +- `canAssignTasks` (required) — the route applies this as a principal permission grant on the agent (`tasks:assign`) rather than storing it on the agent record. Board sessions can call this route. Agent sessions can only call it when the caller is the company CEO agent. @@ -578,7 +578,9 @@ The `permissionKey` field on a grant is one of: | `users:manage_permissions` | Edit roles and grants for other members. | | `joins:approve` | Approve pending join requests. | -The CEO agent role gets `canCreateAgents` by default. Other roles get an empty `permissions` block. Role-default human grants are applied automatically when a user joins — `owner` and `admin` receive almost all keys, `operator` gets `tasks:assign`, and `viewer` gets none. +A new standard agent gets `canCreateAgents: true` and `canCreateSkills: true` when it is created; low-trust agents get `canCreateAgents: false`. Stored agents without an explicit `canCreateAgents` value are treated as `false`. An agent with the `ceo` role can always create agents, whatever its flag says. New standard agents also receive fourteen direct grants when they are created or their hire is approved: `agents:configure`, `agents:suggest-changes`, `skills:create`, `skills:suggest-changes`, `tools:manage_connections`, `tools:manage_profiles`, `tools:view_audit`, `audit:view_agent_actions`, `tools:use`, `tools:manage_runtime`, `inbox:manage` (scoped `{ "responsibleUserOnly": true }`), `tasks:assign`, `tasks:assign_scope` (scoped `{ "subtreeRootAgentId": "" }`), and `tasks:manage_active_checkouts`. Low-trust agents and managed built-in agents don't receive them, and existing agents aren't backfilled. + +Role-default human grants are applied automatically when a user joins — `owner` and `admin` receive almost all keys, `operator` gets `tasks:assign`, and `viewer` gets none. ### Grant scope @@ -1110,6 +1112,7 @@ Notes: - The target agent or an ancestor manager can manage the instructions path. - An agent can read and save its own files within what its responsible user is currently allowed to do. Reading or saving another agent's files needs permission to configure that agent. +- A [low-trust](../../administration/trust-and-low-trust-review.md) agent can't save its own instructions from ordinary work. The exception is an edit its user asks for directly in their own Agent Chat — see [Instruction edits from your own chat](../../administration/trust-and-low-trust-review.md#instruction-edits-from-your-own-chat). - Relative instructions paths require `adapterConfig.cwd`. - External bundles keep their existing behaviour; `download=true` and the `baseHash` rules above apply to managed bundles. diff --git a/docs/reference/api/assistant-mcp.md b/docs/reference/api/assistant-mcp.md new file mode 100644 index 0000000..50e5035 --- /dev/null +++ b/docs/reference/api/assistant-mcp.md @@ -0,0 +1,135 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: Assistant MCP Protocol and Tools +seo_description: Integrate an assistant as a consenting Paperclip user. Discover work tools, delegate and follow tasks, subscribe to events, and revoke access. +--- + +# Assistant MCP + +Connect an external assistant to one organization as a consenting human. Use the MCP tools to inspect work, delegate tasks, add feedback, and retrieve results. + +This interface is experimental and requires `enablePublicMcp`. For a guided setup, see [Assistant connections](../../experimental/assistant-connections.md). + +## Instance requirements + +Enable **Assistant connections (MCP)** in Experimental settings. The default is off on self-hosted and Cloud-managed instances. The instance also needs authenticated user accounts and organization memberships; implicit local operator access and agent API keys cannot approve human OAuth grants. + +Use the configured authentication public URL or set an origin explicitly: + +```sh +PAPERCLIP_PUBLIC_URL=https://YOUR-PAPERCLIP-HOST +``` + +The origin cannot contain a path, embedded credentials, query parameters, or a fragment. HTTP is allowed only for localhost or loopback development. Private self-hosted deployments need a client that can reach the endpoint directly. Configure trusted proxies correctly at your deployment edge. + +`enablePublicMcp` takes effect immediately. Turning it off blocks discovery, sign-in, tool calls, and event delivery. Existing connection management and revocation remain available, and delegated work continues. + +## Protocol and authorization + +The canonical resource is: + +```http +POST /mcp/paperclip +``` + +The endpoint uses stateless HTTP with JSON responses. It supports initialize-based MCP clients and MCP `2026-07-28` requests; it does not require GET/SSE sessions. Each call rechecks bearer authorization, current membership, and company availability. These OAuth tokens are not normal REST API credentials. + +| Endpoint | Purpose | +| --- | --- | +| `/.well-known/oauth-protected-resource/mcp/paperclip` | Discover the protected resource and scopes. | +| `/.well-known/oauth-authorization-server` | Discover OAuth capabilities and endpoints. | +| `/mcp/oauth/register` | Register a public OAuth client. | +| `/mcp/oauth/authorize` | Start browser authorization. | +| `/mcp/oauth/token` | Redeem a code or refresh access. | +| `/mcp/oauth/revoke` | Revoke a token. | +| `/mcp/oauth/device_authorization` | Start device authorization for a direct instance. | +| `/mcp/setup` and `/mcp/setup.md` | Read client setup instructions. | + +Browser authorization uses S256 PKCE and exact resource binding. Access tokens expire in fifteen minutes; `offline_access` enables rotating thirty-day refresh tokens. Replaying a consumed refresh token revokes its grant. + +Client ID Metadata Documents and dynamic registration are supported for public clients. The human still approves the identified client and one organization; registration alone grants no authority. + +### Scopes + +| Scope | Direct instance authority | +| --- | --- | +| `paperclip:read` | Required. Read the allowed work. | +| `paperclip:write` | Create tasks and add comments as the connected person. | +| `offline_access` | Refresh access without repeating browser consent for every session. | + +The consent page's **Allow write access and creating tasks as me** checkbox approves the requested write scope when the person's role permits it; viewers are read-only. A new consent flow is needed to expand scopes. Company permissions and domain rules can still refuse a call within a granted scope. + +## Discover the tools + +Call `paperclip_connection` first. Verify the person and organization, then use the returned `companyId` for company-scoped operations. Search for user-supplied task titles or identifiers with `paperclip_search_tasks`; use the returned task UUID in later calls. + +`tools/list` returns the current schemas. The direct instance catalog contains 10 tools: + +| Tools | Purpose and mutation scope | +| --- | --- | +| `paperclip_connection` | Connected person, organization, scopes, and management link. | +| `paperclip_list_agents`, `paperclip_list_projects`, `paperclip_search_tasks`, `paperclip_read_task` | Find agents, projects, and durable work. | +| `paperclip_create_task`, `paperclip_add_comment` | Delegate work or add feedback as the connected person. Write scope. | +| `paperclip_list_deliverables`, `paperclip_read_document` | Retrieve saved task documents and deliverable references. | +| `paperclip_pending_approvals` | Read pending approvals and their Paperclip decision links. | + +The tools don't change agent or project configuration, decide approvals, or fetch arbitrary URLs. Review and approval decisions remain in Paperclip. + +A hosted directory broker has its own work-oriented tool catalog. Do not treat direct-instance Events support as a broker capability. Hosted deployment and public store or directory availability require separate validation; direct client configuration does not depend on a listing. + +## Write and retry rules + +Use a new UUID `requestId` for each intended mutation. Reuse that ID with identical arguments when retrying. Durable receipts replay confirmed results and reject changed arguments, including after reconnecting as the same person. + +An `outcome: unknown` response means the action is in progress or its result is unconfirmed. Read the task and comments before acting again. A new request ID could duplicate the change. `outcome: rejected` records a known refusal; read its message and current state before submitting a revised action. + +Task assignment and feedback may schedule agent work and spend the company's configured budget. Task creation returns before execution finishes; it is not proof that the agent ran. Active execution ownership, review gates, dependencies, and normal approvals still apply. + +## Subscribe to task events + +Events-capable clients use `server/discover`, `events/list`, `events/subscribe`, and `events/unsubscribe` with MCP `2026-07-28`. Include matching `MCP-Protocol-Version` and `Mcp-Method` headers, per-request protocol metadata, and `Mcp-Name` for tool calls. + +| Event | Filters | Notification data | +| --- | --- | --- | +| `paperclip.task.status_changed` | `companyId`, `taskId`; optional `statuses` | Task status and link. | +| `paperclip.task.comment_created` | `companyId`, `taskId` | Comment ID and task link. | +| `paperclip.task.document_updated` | `companyId`, `taskId` | Document key, revision number, and task link. | + +Delivery is by verified webhook. Your client supplies the callback URL and, optionally, a signing secret, then manages refresh and unsubscribe. Connect only when the user asks to monitor that task. Read current work after receiving an event; notifications carry identifiers rather than document or comment bodies. + +Connecting alone does not subscribe. Clients without Events support, including the CLI stdio proxy, can poll the read tools. Disabling the feature or revoking access stops future delivery. + +## Manage and revoke connections + +Authenticated browser users manage their own grants through: + +```http +GET /api/mcp/setup +GET /api/mcp/connections +DELETE /api/mcp/connections/{id} +``` + +The setup response provides the live gate, canonical server URL, and non-secret invitation. It does not grant access. The delete operation requires the configured browser origin and the grant's owner. + +Each item in the connections list carries `id`, `companyId`, `clientName`, `companyName`, `scopes`, `createdAt`, and `revokedAt`. The list includes revoked grants, with `revokedAt` set. + +### Browser consent endpoints + +The consent pages in the Paperclip UI use these endpoints. They are listed so you can recognise them in logs; assistants don't call them. + +| Endpoint | Purpose | +| --- | --- | +| `GET /api/mcp/requests/{id}` | Describe a pending browser authorization request on the `/mcp-connect/{id}` page. | +| `POST /api/mcp/requests/{id}/consent` | Approve or decline that request. Requires a signed-in user and the Paperclip browser origin. | +| `GET /api/mcp/device?user_code=...` | Describe a pending device authorization on the `/mcp-device` page. | +| `POST /api/mcp/device/consent` | Approve or decline a device authorization by its user code. Requires a signed-in user and the Paperclip browser origin. | + +Device authorization returns `/mcp-device` as its `verification_uri` and expires after ten minutes. + +Use **Connectors → Assistant Connection (MCP)** for organization-specific management, or `/assistant-connections` for account-wide management. Revocation blocks future calls, without cancelling delegated tasks or undoing in-flight mutations. + +## Related guides + +- [Assistant connections](../../experimental/assistant-connections.md) +- [Device login and stdio proxy](../cli/mcp.md) +- [Authentication](authentication.md) diff --git a/docs/reference/api/company-skill-policy.md b/docs/reference/api/company-skill-policy.md index 5d74089..441b033 100644 --- a/docs/reference/api/company-skill-policy.md +++ b/docs/reference/api/company-skill-policy.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Company Skill Policy API seo_description: The guardrail on what agents may do to skills — create, import, install, edit, or remove — instead of leaving the whole library open to every agent. --- @@ -84,6 +84,8 @@ The `subject` object is a tagged union on `type`: **Skills an agent creates mid-task are checked as `skills.create`.** When an agent saves a new skill from inside a task (see [Skills your agents create during a task](../../guides/org/skills.md#skills-your-agents-create-during-a-task)), the request is evaluated exactly like a Skill Studio create: action `skills.create`, source type `generated`. To stop agents creating skills this way, deny `skills.create` for those agents. A rule on `sourceTypes: ["generated"]` alone won't single this path out — creating a skill from scratch in the UI carries the same source type, so it would block both. +**Skills an agent updates mid-task are checked as `skills.edit`.** The native runner's **Update skill** tool saves through the same file route as Skill Studio, so it's evaluated exactly like a Studio edit of that skill. The check runs on every attempt, including a retry of a request that already succeeded — revoking `skills.edit` takes effect immediately. See [Letting an agent improve an existing skill](../../guides/org/skills.md#letting-an-agent-improve-an-existing-skill). + **GitHub skill sources use source type `git`.** Scanning, previewing, and adding a repository under **Skills → Sources** check `skills.import`; a refresh checks `skills.update`; changing which skills are selected, or disconnecting the source, checks `skills.edit`. The locator is the repository URL, so a `sourceLocators` rule can allow or deny a single repository. See [Skills reference → GitHub skill sources](../skills.md#github-skill-sources). ### Resource selectors diff --git a/docs/reference/api/connection-intents.md b/docs/reference/api/connection-intents.md index 41bfe0f..4cda9fb 100644 --- a/docs/reference/api/connection-intents.md +++ b/docs/reference/api/connection-intents.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Connection Intents API seo_description: When an agent needs a service it cannot reach, it opens a connection intent so the responsible person can connect the app and unblock the task. --- @@ -31,7 +31,7 @@ GET /mcp/runtime-tools POST /mcp/runtime-tools ``` -The `GET` is a discovery response: `{ "name": "paperclip-runtime-tools", "protocolVersion": "2025-03-26" }`. The `POST` speaks JSON-RPC 2.0. +The endpoint speaks JSON-RPC 2.0 over `POST` only. A `GET` returns `405 Method Not Allowed` with an `Allow: POST` header, so an MCP client that tries to open a server-sent events stream learns straight away that this endpoint does not offer one. | Method | What happens | |---|---| @@ -78,7 +78,7 @@ POST /runtime-tools/connections/request } ``` -Each method can carry a `purpose` of `tool`, `channel`, or `ai`. Channel and AI methods also carry a company-scoped `setupPath` pointing at their own setup flow, which the agent shares with the user. Tool methods use `connection_request` instead. Chat channel methods appear only when the instance's **Chat connectors** setting is on. A search match is not proof that an account is authorized or that a tool is installed. +Each method can carry a `purpose` of `tool`, `channel`, or `ai`. Channel and AI methods also carry a company-scoped `setupPath` pointing at their own setup flow, which the agent shares with the user. Tool methods and AgentMail use `connection_request` instead. Chat channel methods appear only when the instance's **Chat connectors** setting is on; AgentMail always appears. A search match is not proof that an account is authorized or that a tool is installed. Each result's `state` is one of `ready` (a connection is connected and usable by this agent right now, with `connectionId` set), `needs_user_action` (a matching connection exists but isn't usable yet), `available` (the service can be connected but nothing exists), or `unavailable` (the service offers no connection methods). @@ -95,6 +95,8 @@ Each result's `state` is one of `ready` (a connection is connected and usable by } ``` +For `agentmail`, the card is an inline API-key card addressed to the responsible user. It shares the key with every person in the company, installs access for the requesting agent only, creates or connects an inbox, and completes only once the server confirms that inbox is usable. A saved key alone does not make the request ready. If setup stops partway, it resumes after a reload under the same request without duplicating the account or the inbox. Completing the card requires connection-management authority; without it, setup fails with `AgentMail inbox setup requires connection-management authority`. + If the service is already connected, `state` is `ready`, `connectionId` is set, `interactionId` is `null`, and the instruction says the service is available in this run. Requests are idempotent per run and service, so calling twice won't spawn two cards. --- @@ -109,7 +111,7 @@ These are mounted under `/api` and answer the connection card. Every one is a bo GET /api/connection-intents/{interactionId}/setup-options ``` -Returns what the person needs to answer the card: the interaction itself, the requested `service` (name, description, logo, and connection `methods`), any `existingConnections` for that service they're eligible to use, and the `requestedAgentId`. If the service is no longer offered, this responds `404` with `Connection service is no longer available`. +Returns what the person needs to answer the card: the interaction itself, the requested `service` (name, description, logo, and connection `methods`), any `existingConnections` for that service they're eligible to use, and the `requestedAgentId`. For an AgentMail card that was partly completed, it also returns `emailSetup` with the saved `credentialConnectionId` and `readyConnectionId`, so the card can resume. If the service is no longer offered, this responds `404` with `Connection service is no longer available`. ### Update the phase diff --git a/docs/reference/api/costs.md b/docs/reference/api/costs.md index 6c307ea..8ff5fe8 100644 --- a/docs/reference/api/costs.md +++ b/docs/reference/api/costs.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.720.0 +paperclip_version: v2026.1012.0 seo_title: Costs API seo_description: Company-scoped endpoints for the four spend questions: what was spent, by whom, against which budget, and how close the company is to its cap. --- @@ -257,7 +257,7 @@ The request body for both endpoints is the same: { "budgetMonthlyCents": 5000 } ``` -The budget window is calendar-month UTC for company and agent monthly budgets. +The budget window is calendar-month UTC for company and agent monthly budgets. Sending `0` turns the matching policy off rather than setting a zero-dollar cap. diff --git a/docs/reference/api/issues.md b/docs/reference/api/issues.md index d5ca988..6527f62 100644 --- a/docs/reference/api/issues.md +++ b/docs/reference/api/issues.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Issues API seo_description: The core work objects: hierarchy, blockers, approvals, agent checkout, comments, and keyed extensions. Endpoints for creating, reading, and moving issues. --- @@ -207,7 +207,7 @@ Create a new issue in a company. This endpoint accepts the full `createIssueSche Notable inputs: -- `title` is optional when you send a `description`. Send at least one of them, or the request fails validation. Without a title, the task starts with a provisional title taken from the start of the description (up to 120 characters, with whitespace collapsed). `titleNeedsGeneration` is `true`, and the assigned agent is asked to give it a proper name early — see [Set Task Title](#set-task-title). +- `title` is optional when you send a `description`. Send at least one of them, or the request fails validation. Without a title, the task starts with a provisional title taken from the start of the description (up to 120 characters). Markdown is stripped first, so the title reads as plain text: images are dropped, link labels and inline code keep their text, and a description that's only an image uses the image's alt text (or `Image`). `titleNeedsGeneration` is `true`, and the assigned agent is asked to give it a proper name early — see [Set Task Title](#set-task-title). - `status` defaults to `backlog`. - `priority` defaults to `medium`. - `projectId`, `goalId`, and `parentId` establish the issue's placement. diff --git a/docs/reference/api/overview.md b/docs/reference/api/overview.md index eb752d1..2b4eb66 100644 --- a/docs/reference/api/overview.md +++ b/docs/reference/api/overview.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: API Overview seo_description: The shared reference for Paperclip's JSON control-plane API — companies, agents, issues, approvals, costs, routines, secrets, activity, and dashboard state. --- @@ -42,6 +42,8 @@ Practical rules: > **Note:** The server also reads `X-Paperclip-Run-Id` on mutating requests during agent runs. That is mostly relevant for issue comments, checkout, and other run-linked actions. +External assistants can also connect as a human through the experimental [Assistant MCP API](assistant-mcp.md), using user OAuth and explicit read and write scopes. + diff --git a/docs/reference/api/tool-gateway.md b/docs/reference/api/tool-gateway.md index ff53cc7..6556d0e 100644 --- a/docs/reference/api/tool-gateway.md +++ b/docs/reference/api/tool-gateway.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1001.0 +paperclip_version: v2026.1012.0 seo_title: Tool Gateway API seo_description: Agents decide what to do; the tool gateway decides whether they may. It sits between every agent and every external tool you have connected. --- @@ -58,6 +58,19 @@ A `rate_limit` policy needs a positive `limit` and `windowSeconds` in its `confi Conditions come in named groups — `arguments`, `actor`, `context`, `risk`, `credentialScope`, `trustBoundary`, and `timeWindow` — and all of them must hold for the policy to apply. The `arguments` group supports `fieldEquals`, `fieldNotEquals`, `fieldIn`, `fieldMatches`, `fieldExists`, and `fieldAbsent`. A `fieldMatches` pattern that looks dangerous to evaluate is rejected up front with `Tool policy fieldMatches includes an unsafe regular expression`. +### Explicit tool grants + +Besides profiles and policies, an agent or a person can hold a stored `tools:use` permission grant. When no policy has already decided a call, Paperclip checks those grants before it looks at profiles, and a matching grant allows the call with reason `allow_explicit_grant`. + +A grant's `scope` decides what it covers, and it is enforced exactly as written: + +- A `null` or empty `{}` scope is a broad grant — it covers every tool. +- An `allow` value (a single string or a list) must name the tool being called. Each entry is `tool:` (the gateway name or the upstream tool name), `connection:`, or `application:`. If nothing in the list matches, the grant doesn't cover the call. An empty `allow` list, or one with a blank or non-string entry, covers nothing. +- Any other keys narrow the grant further, and every one of them must match. The understood keys are `actorType`, `agentId`, `projectId`, `routineId`, `issueId`, `gatewayId`, `applicationId`, `connectionId`, `catalogEntryId`, `applicationKey`, `providerType`, `toolName`, and `riskLevel`, each as a non-empty string, or its plural form (`agentIds`, `toolNames`, and so on) as a non-empty list of strings. +- A key Paperclip doesn't recognise, a value of the wrong type, or a scope that isn't an object makes the grant cover nothing. + +A grant that doesn't cover a call never widens into a broader allow. The call simply carries on to the profile check, and if no profile permits it either, it ends as `deny_default`. The same rules apply to discovery, so a tool outside the grant doesn't show up in the tool list. If an agent loses a tool it used before upgrading, check its grant's `scope` first. + ### What a decision looks like Every brokered call ends in one of five decisions: `allow`, `deny`, `require_approval`, `rate_limited`, or `defer_runtime`. Alongside the decision you get a `reasonCode` (`deny_disabled_connection`, `allow_trust_rule`, `deny_policy_block`, and friends), a human-readable `explanation`, the `effectiveProfileIds` that were in play, and the `matchedPolicyIds` that fired. @@ -154,15 +167,7 @@ GET /api/tool-gateway/gateways/{gatewayId}/mcp POST /api/tool-gateway/gateways/{gatewayId}/mcp ``` -The `GET` is a small discovery document telling a client how to connect: - -```json -{ - "transport": "streamable_http", - "endpoint": "/mcp/gateways/{gatewayPublicId}", - "authentication": "bearer" -} -``` +The gateway speaks MCP's streamable HTTP transport over `POST` only. A `GET` returns `405 Method Not Allowed` with an `Allow: POST` header, which tells an MCP client straight away that there is no server-sent events stream to open. The `POST` speaks JSON-RPC. Authenticate with `Authorization: Bearer `; without it you get `401 Unauthorized` and `{ "error": "Bearer token is required" }`. @@ -175,6 +180,8 @@ The `POST` speaks JSON-RPC. Authenticate with `Authorization: Bearer +Docs for v2026.1012.0 October 12, 2026 +
+ +This release lets outside assistants join your team. Claude Code, Codex, OpenCode and other MCP clients can now sign in to Paperclip as you, then read, create and delegate work. Connections can also carry instructions that reach your agents automatically. The release has two breaking changes that operators should read before upgrading: workspace restore locks now use a new protocol, and stored tool grants are enforced exactly as written. + +**New pages** + +- [Assistant connections (MCP)](../experimental/assistant-connections.md), with the [Assistant MCP API](api/assistant-mcp.md) and [MCP Commands](cli/mcp.md) references — connect Claude Code, Codex, OpenCode or any MCP client with browser or device-code consent, choose whether it can write, and revoke it later. +- [Saved connection instructions](../connectors/connection-instructions.md) — write usage notes on a connection once, and every agent allowed to use it receives them on each turn. +- [Check AI account usage](../connectors/ai-usage.md) — read the current provider limits for a saved OpenAI (Codex), Claude, Grok or OpenRouter account from the **Check usage** action. +- [Task-pinned AI routing](../experimental/task-pinned-ai-routing.md) — the experimental connection pools that rotate new tasks across saved AI accounts while each task stays on the account it started with. +- [Neon](../connectors/neon.md) — connect serverless Postgres with Neon sign-in or an API key, pin it to one project, and keep it read-only if you want. + +**Updated pages** + +- [Update Paperclip](../how-to/update-paperclip.md) — the restore-lock breaking change: stop every old server and worker before you upgrade or roll back, and clear away the legacy lock folders. Also: which migration in this release changes existing rows. +- [Tool Gateway API](api/tool-gateway.md) and [Access model](../connectors/access-model.md) — stored grants are now enforced as written, and a grant with an unknown selector denies access. Check your custom grants after upgrading. +- [HTTP adapter](adapters/http.md), [Process adapter](adapters/process.md) and [Creating an adapter](adapters/creating-an-adapter.md) — how custom adapters receive connection instructions, through `connectionInstructions` or `PAPERCLIP_CONNECTION_INSTRUCTIONS_FILE`. +- [Agents](../guides/org/agents.md), [Agents API](api/agents.md), [Delegation](../guides/org/delegation.md) and [Team catalog](../guides/org/team-catalog.md) — much shorter default instructions for new companies and hires, and the default configuration grants new agents now receive. +- [Skills](../guides/org/skills.md), [Skills Reference](skills.md) and [Write a company skill](../how-to/write-a-company-skill.md) — agents can update company skills with the `update_skill` tool, which uses version checks and safe retries. +- [MCP aggregators](../connectors/mcp-aggregators.md), [Composio](../connectors/composio.md), [Arcade](../connectors/arcade.md) and the [connector catalog](../connectors.md) — accounts you already connected upstream show up in one Apps catalog, grouped with your native accounts. AgentMail is now a default connection, and [Asana](../connectors/asana.md) signs in again. +- [Agent Chat](../experimental/agent-chat.md), [Chat-Style Tasks](../experimental/task-chat.md) and [Issues](../guides/day-to-day/issues.md) — Chat leads the navigation, an optional combined Inbox and task list, the rebuilt **New task** dialog, and the "Model at capacity" and "Model unavailable" recovery cards. +- [Claude Code](adapters/claude-code.md), [Codex](adapters/codex.md), [OpenCode](adapters/opencode.md), [Paperclip Runner](adapters/paperclip-runner.md) and [Agent adapters](../guides/org/agent-adapters.md) — Claude Sonnet 5.5, GPT-6.1 Sol, refreshed harness pins, the supported range for remote Codex, and Codex runs that survive server restarts. +- [Anthropic](../connectors/anthropic.md), [OpenAI](../connectors/openai.md), [xAI](../connectors/xai.md) and [OpenRouter](../connectors/openrouter.md) — reconnect an unavailable account in place from agent settings, and check usage. +- [Trust & Low-Trust Review](../administration/trust-and-low-trust-review.md) — low-trust agents can take self-assigned work inside their scope, accept work from a person who messages them or assigns them a task directly, and update their own `AGENTS.md` when you ask from their chat. +- Smaller updates: [Settings](../administration/settings.md), [Experimental overview](../experimental/overview.md), [Task watchdogs](../guides/projects-workflow/task-watchdogs.md) (the new 5- and 15-minute silence thresholds), [Docker](deploy/docker.md), [Sandbox Providers](adapters/sandbox-providers.md) (exe.dev **Source VM**), [Plugin SDK](plugins/sdk.md) (AI connection routers), [Artifacts](../guides/day-to-day/artifacts.md), [Work Modes](../guides/day-to-day/work-modes.md), the memory connector guides, and [Verify and troubleshoot](../connectors/verify-and-troubleshoot.md). + +
+ + +
Docs for v2026.1005.0 October 5, 2026
diff --git a/docs/reference/cli/connections.md b/docs/reference/cli/connections.md index 4dc3c29..0c6bf5b 100644 --- a/docs/reference/cli/connections.md +++ b/docs/reference/cli/connections.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: The connections Command seo_description: Search the connections catalog or request access to a service from inside an active heartbeat run, using the runtime tools the run provides. --- @@ -64,6 +64,8 @@ Like `search`, the response prints to stdout as JSON, pretty-printed when you pa The server double-checks both provider flags: the task, the requesting agent, the user's answer, and whether the route is still allowed. Neither flag grants any access the provider connection doesn't already have. +For `agentmail`, the request puts an API-key card on the task for the responsible user, instead of a setup link. The card creates an inbox for the requesting agent. Wait for the request to complete before you tell anyone the agent's email address. + > **Tip:** Search first, request second. Take the service slug from a `search` result and feed it straight into `request` so you are asking for a service the catalog actually knows about. --- diff --git a/docs/reference/cli/managed-agent.md b/docs/reference/cli/managed-agent.md index caf26fb..c5e5069 100644 --- a/docs/reference/cli/managed-agent.md +++ b/docs/reference/cli/managed-agent.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: The managed-agent Command seo_description: Provision and qualify a locked-down Anthropic managed agent and environment, then save the company profile Paperclip uses to run it. --- diff --git a/docs/reference/cli/mcp.md b/docs/reference/cli/mcp.md new file mode 100644 index 0000000..65774d3 --- /dev/null +++ b/docs/reference/cli/mcp.md @@ -0,0 +1,79 @@ +--- +paperclip_version: v2026.1012.0 +seo_title: MCP Device Login and Proxy Commands +seo_description: Authorize an assistant through browser device consent, then expose Paperclip tools over local stdio with the CLI's private credential store. +--- + +# MCP Commands + +Use `mcp` to connect an assistant as your human Paperclip account. Device login works without a local browser callback listener; the proxy gives a stdio-only MCP client access to the authorized remote tools. + +Assistant connections are experimental and off by default. These commands require an authenticated instance with [Assistant connections (MCP)](../../experimental/assistant-connections.md) enabled. + +```sh +paperclipai mcp login --device --url https://YOUR-PAPERCLIP-HOST/mcp/paperclip +paperclipai mcp proxy --url https://YOUR-PAPERCLIP-HOST/mcp/paperclip +``` + +## Authorize with device login + +```sh +paperclipai mcp login --device --url [--company ] +``` + +| Option | Use | +| --- | --- | +| `--device` | Required. Start browser approval without a callback listener. | +| `--url ` | Required. The exact canonical MCP URL shown by your instance. | +| `--company ` | Restrict consent to the specified organization UUID. | + +Keep the command running. It prints an approval URL and a human verification code, then waits. Open the URL, sign in, compare the code, review the organization and permissions, and approve or decline. Requests expire after ten minutes; start again if the command expires. + +The approval URL opens your instance's `/mcp-device` page with the code already filled in. If you open `/mcp-device` yourself, type the code under **Enter the code shown by your assistant**. When you approve, the command prints `Connected to` with the MCP URL and `Organization:` with the approved organization's ID. + +The CLI requests read, write, and refresh access. Consent and your organization role determine which scopes you actually receive. Login verifies the approved organization with `paperclip_connection` before saving credentials. + +Use an HTTPS URL ending in `/mcp/paperclip`, without credentials, query parameters, or a fragment. HTTP is accepted only for localhost or loopback. The setup-page URL `/mcp/setup` is not the MCP resource URL. + +## Run the stdio proxy + +```sh +paperclipai mcp proxy --url +``` + +Configure this command as a local stdio MCP server in your assistant. Use the exact URL from login. The proxy handles `initialize`, `ping`, `tools/list`, and `tools/call`; it does not provide the Events subscription interface. + +For example, a client that accepts command-and-arguments configuration can run: + +```json +{ + "command": "paperclipai", + "args": ["mcp", "proxy", "--url", "https://YOUR-PAPERCLIP-HOST/mcp/paperclip"] +} +``` + +Your client's surrounding configuration format may differ. Call `paperclip_connection` from the connected client before doing work. + +## Credential storage and revocation + +Credentials stay under `$PAPERCLIP_HOME/mcp`, or `~/.paperclip/mcp` by default. The CLI uses private directories and files, replaces credentials atomically, and serializes refresh across processes. Access is bound to the exact resource URL; redirects are rejected. + +When login replaces an existing credential for the same instance, the CLI attempts to revoke the old connection. If that fails, it tells you to revoke it in Paperclip. You can always revoke from **Connectors → Assistant Connection (MCP)** or `/assistant-connections`. + +Keep tokens and private device codes out of chat and project configuration. The displayed verification code is for the human to compare during consent. + +## Troubleshooting + +| Problem | Next step | +| --- | --- | +| The URL is rejected | Copy the canonical `/mcp/paperclip` URL from Paperclip and check the HTTPS or loopback requirements. | +| Device authorization expires | Start login again and approve while the command is still running. | +| The proxy says to connect first | Run device login for that exact URL under the same OS account. | +| Access was revoked or expired | Sign in again. Membership and consent are checked again. | +| A write reports a connection failure | Inspect the task before retrying. The change may already have completed; the proxy never retries it automatically. | + +## See also + +- [Connect an assistant](../../experimental/assistant-connections.md) +- [Assistant MCP reference](../api/assistant-mcp.md) +- [Authentication](authentication.md) — other CLI authentication paths. diff --git a/docs/reference/cli/test-drive.md b/docs/reference/cli/test-drive.md index 0e63a2d..426a2f3 100644 --- a/docs/reference/cli/test-drive.md +++ b/docs/reference/cli/test-drive.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: The test-drive Command seo_description: Spin up an isolated, self-initialized Paperclip instance with a ready-made company and CEO agent so you can try the product locally. --- diff --git a/docs/reference/deploy/docker.md b/docs/reference/deploy/docker.md index 388609c..eb3fca6 100644 --- a/docs/reference/deploy/docker.md +++ b/docs/reference/deploy/docker.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.609.0 +paperclip_version: v2026.1012.0 seo_title: Deploy Paperclip with Docker seo_description: Run a self-contained instance without installing Node or pnpm on the host. Covers the quickstart image, manual builds, and configuration. --- @@ -132,4 +132,16 @@ docker run --name paperclip \ Without those keys, the app still runs. The adapter environment test will simply report missing prerequisites for the relevant adapter. +### Remote runner provider pack + +The standard image also bundles the remote runner's provider pack at `/opt/paperclip-runner/provider-pack` and points `PAPERCLIP_RUNNER_REMOTE_PROVIDER_PACK_PATH` at it. Remote OpenCode and ACPX runs need that pack, so with it in place they no longer fail with `runner_remote_provider_artifact_incompatible`. + +If you build your own image on top of the standard one, you inherit the pack automatically. If you build from source, pass the full 40-character Git SHA as a build argument — the pack only builds when the commit is known, and a local build without it skips the pack with a log line: + +```sh +docker build --target production \ + --build-arg PAPERCLIP_BUILD_COMMIT="$(git rev-parse HEAD)" \ + -t paperclip-local . +``` + > **Tip:** If you are testing adapter behavior inside Docker, verify the bind mount first. Most surprising failures come from lost state, not the container image itself. diff --git a/docs/reference/plugins/sdk.md b/docs/reference/plugins/sdk.md index 7bf46e4..3cb04c8 100644 --- a/docs/reference/plugins/sdk.md +++ b/docs/reference/plugins/sdk.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Plugin SDK seo_description: The worker-side authoring kit for Paperclip plugins. Import it in your worker entrypoint to declare a plugin and subscribe to host events. --- @@ -226,6 +226,8 @@ A note on imports: the domain types these methods hand back — `IssueThreadInte Interactions are the decision cards an agent posts into an issue thread: suggested tasks, questions, confirmations. Your plugin could already create them; now it can read them back and resolve them. +When you create one with `ctx.issues.createInteraction`, the payload is typed as `CreateIssueThreadInteractionInput` (exported from the SDK); `ctx.issues.askUserQuestions` takes the same `ask_user_questions` shape without `kind`. It's the input shape the host validates, so you can leave out fields the host fills with defaults instead of building the fully stored form yourself. + | Method | Signature | Capability | |---|---|---| | `ctx.issues.listInteractions` | `listInteractions(issueId, companyId)` → `Promise` | `issue.interactions.read` | @@ -398,6 +400,48 @@ You implement the lifecycle as three optional hooks on your plugin definition. E If you implement only `onResolveExternalObject`, the host refreshes objects one at a time within the window set by your `refreshPolicy`; declaring `onRefreshExternalObjects` lets you collapse those into a single round trip. For a concrete reference implementation, see the parent `server/src/services/github-external-object-provider.ts`. +### AI connection routers + +A plugin can act as the routing brain behind [task-pinned AI routing](../../experimental/task-pinned-ai-routing.md): it decides which saved AI account in a connection pool takes the next task. Paperclip does everything else — authorization, pinning tasks to accounts, storing pools, and the setup and management screens — so a router plugin is a small amount of code. + +To declare one, add both of these to your manifest: + +```ts +capabilities: ["ai.connections.route"], +aiConnectionRouter: { + name: "AI connection pool", // 1–100 characters + description: "Use existing AI connections.", // 1–500 characters +}, +``` + +The manifest validator rejects `aiConnectionRouter` without the `ai.connections.route` capability. Paperclip adds your router to the **Connectors** catalog with an **Add connection pool** action; you don't need a plugin page or sidebar entry. It is only available while the instance's `enableAiConnectionRouters` experimental flag is on and your plugin is ready. + +Then implement `onRouteAiConnection` on your plugin definition. The host calls it (the `routeAiConnection` worker method) when a task without a pinned account needs one: + +```ts +export default definePlugin({ + async setup() {}, + async onRouteAiConnection(request) { + const next = request.candidates[0]; + return next + ? { kind: "selected", memberId: next.member.id } + : { kind: "unavailable", skipped: {} }; + }, +}); +``` + +The `AiConnectionRouterRequest` carries the `companyId`, the `pool` (an `AiConnectionPool`), `agentId`, `taskKey`, `lastMemberId`, `cursorVersion`, the pool's `memberOrder`, an optional `pinnedMemberId`, the `candidates` the host has already authorized for this agent (each with its `member`, `runtimeConfig`, `notes`, and optional `usage`), and `now`. It contains no credentials and no raw provider responses. + +Return an `AiConnectionRouterResult`: + +| `kind` | Meaning | +| --- | --- | +| `selected` | Use `memberId`. Optionally explain skipped members in `skipped`, a map of member ID to reason. | +| `exhausted` | Every candidate is over its limit. Paperclip defers the task until `retryAt` and shows **Pool exhausted**. Include `skipped`. | +| `unavailable` | No candidate can run this task. Include `skipped`. | + +Your result is only a proposal. The host rechecks authorization and can't be made to use an account the responsible person isn't allowed to use. The SDK re-exports the related types: `AiConnectionPool`, `AiConnectionPoolConfig`, `AiConnectionPoolMember`, `AiConnectionRouterRequest`, `AiConnectionRouterResult`, and `AiConnectionRouterSelection`. + ### JSON-RPC protocol The SDK speaks JSON-RPC 2.0 between host and worker. Most plugin authors never call these directly, but they are exported for advanced use (custom transports, tests, replay tools). @@ -619,6 +663,7 @@ The harness deliberately mirrors the host's own write bar rather than waving it - `NOOP_PLUGIN_TRACER`, `NOOP_PLUGIN_SPAN` — the default no-op tracer and span (values, not types). Handy as a stand-in when you want the do-nothing default explicitly, e.g. in tests. - Constants from `@paperclipai/shared`: `PLUGIN_API_VERSION`, `PLUGIN_STATUSES`, `PLUGIN_CATEGORIES`, `PLUGIN_CAPABILITIES`, `PLUGIN_UI_SLOT_TYPES`, `PLUGIN_UI_SLOT_ENTITY_TYPES`, `PLUGIN_RESERVED_COMPANY_SETTINGS_ROUTE_SEGMENTS`, `PLUGIN_STATE_SCOPE_KINDS`, `PLUGIN_JOB_STATUSES`, `PLUGIN_JOB_RUN_STATUSES`, `PLUGIN_JOB_RUN_TRIGGERS`, `PLUGIN_WEBHOOK_DELIVERY_STATUSES`, `PLUGIN_EVENT_TYPES`, `PLUGIN_BRIDGE_ERROR_CODES`. - Access and permission constant arrays from `@paperclipai/shared`, matching the domain types used by [`ctx.access` and `ctx.authorization`](#access-and-authorization): `PERMISSION_KEYS`, `HUMAN_COMPANY_MEMBERSHIP_ROLES`, `HUMAN_COMPANY_MEMBERSHIP_ROLE_LABELS`, `MEMBERSHIP_STATUSES`, `PRINCIPAL_TYPES`. +- AI connection router types re-exported from `@paperclipai/shared` for [router plugins](#ai-connection-routers): `AiConnectionPool`, `AiConnectionPoolConfig`, `AiConnectionPoolMember`, `AiConnectionRouterRequest`, `AiConnectionRouterResult`, `AiConnectionRouterSelection`. - Connection-provider shapes re-exported from `@paperclipai/shared` for plugins that back a connection intent: `ConnectionIntentInteraction`, `ConnectionIntentPayload`, `ConnectionIntentResult`, `ConnectionIntentSetupOptions`, `ConnectionRequestResult`, `ConnectionsSearchResult`. --- diff --git a/docs/reference/skills.md b/docs/reference/skills.md index 2a7d2bf..dd47234 100644 --- a/docs/reference/skills.md +++ b/docs/reference/skills.md @@ -1,5 +1,5 @@ --- -paperclip_version: v2026.1005.0 +paperclip_version: v2026.1012.0 seo_title: Skills Reference seo_description: The reference for company skills: file shape on disk, the install pipeline, attaching to agents, scoping rules, canonical keys, and versioning. --- @@ -159,7 +159,7 @@ Skills are installed at the **company** level. Once installed, any agent in that | List skills | `GET /api/companies/{companyId}/skills` | | Skill detail (with usage) | `GET /api/companies/{companyId}/skills/{skillId}` | | Read a file from a skill | `GET /api/companies/{companyId}/skills/{skillId}/files?path=SKILL.md` | -| Update a file (editable skills) | `PATCH /api/companies/{companyId}/skills/{skillId}/files` | +| Update a file (editable skills) | `PATCH /api/companies/{companyId}/skills/{skillId}/files` — see [Safe file updates](#safe-file-updates) | | Update status (GitHub-managed) | `GET /api/companies/{companyId}/skills/{skillId}/update-status` | | Pull latest commit | `POST /api/companies/{companyId}/skills/{skillId}/install-update` | | Delete | `DELETE /api/companies/{companyId}/skills/{skillId}` | @@ -169,13 +169,55 @@ Skills are installed at the **company** level. Once installed, any agent in that Mutating routes require either `agents:create` permission or `permissions.canCreateAgents=true` on the calling agent. +### Safe file updates + +`PATCH /api/companies/{companyId}/skills/{skillId}/files` writes one file in an editable skill. The body takes `path`, `content`, and optionally `encoding` (`utf8` or `base64`) and `executable`. Two more optional fields protect you from lost edits: + +| Field | What it does | +|---|---| +| `expectedVersionId` | The skill's `currentVersionId` as you last read it. If the skill has moved on since, the write is rejected with `409` and *"Skill version changed. Read the current version before retrying."* Reread the skill and apply your change to the latest version. | +| `idempotencyKey` | 1–240 characters. Makes the write safe to retry: repeat the exact same request with the same key and you get the original result back, with no second version and no second activity entry. Reusing a key with different inputs returns `409` with *"Skill file idempotency key was used with different inputs"*. | + +Without `idempotencyKey`, the route responds with the updated file, as before. With it, the response is a small receipt instead: + +```json +{ + "skillId": "…", + "path": "SKILL.md", + "versionId": "…", + "studioPath": "/skills/studio/…" +} +``` + +Either way the write is checked against the `skills.edit` policy action (even on an exact retry), recorded as a new version when the bytes or executable flag changed, and logged as `company.skill_file_updated`. This is the same route the native runner's **Update skill** tool calls when an agent edits a skill — see [Letting an agent improve an existing skill](../guides/org/skills.md#letting-an-agent-improve-an-existing-skill). + ### Native Runner skill tools -An agent using the native Runner can save a reusable procedure with the `create_skill` tool. It's available in Auto (`standard`) and skill-test work, not Ask or pre-acceptance Plan work. It uses the company skill API and its existing policy; creating a skill adds it to the library without assigning it to agents. +An agent using the native Runner can save a reusable procedure with `create_skill` or improve an existing editable skill with `update_skill`. These tools are available in Auto (`standard`) and skill-test work, not Ask or pre-acceptance Plan work. They use the company skill API and its existing policy; creating a skill adds it to the library without assigning it to agents. -`create_skill` takes `name`, `description`, `markdown`, and `idempotencyKey`, plus an optional `slug`. The name is lowercase and hyphenated; the complete file's name and description must match those inputs, and a supplied slug must equal the name. Company, agent, task, and run identity come from the authenticated run. Reuse the same `idempotencyKey` when you retry. A successful creation appears as a **Skill created** card in the task thread; see [Skills your agents create during a task](../guides/org/skills.md#skills-your-agents-create-during-a-task). +`update_skill` requires these inputs: -Implementation reference: [create tool contract](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/paperclip-runner/src/protocol-actions/create-skill.ts) and [tool validation and REST binding](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/skill-tools.ts). +| Field | What to send | +|---|---| +| `skillId` | UUID of the existing skill. | +| `markdown` | The complete primary `SKILL.md`, including valid name and description frontmatter and a nonempty body. | +| `expectedVersionId` | The `currentVersionId` you read before editing. | +| `idempotencyKey` | A 1–240 character retry key. | + +```json +{ + "skillId": "", + "expectedVersionId": "", + "markdown": "---\nname: release-review\ndescription: Review release notes.\n---\n\n# Review\nCheck each release note against its change.\n", + "idempotencyKey": "release-review-update-1" +} +``` + +After a lost response, retry with exactly the same inputs and key to receive the original receipt. After a version conflict, read the current skill, reapply the edit, and use a new key. A key reused with different inputs is a conflict. Policy is checked again on exact retries. + +`create_skill` takes `name`, `description`, `markdown`, and `idempotencyKey`, plus an optional `slug`. The name is lowercase and hyphenated; the complete file's name and description must match those inputs, and a supplied slug must equal the name. Company, agent, task, and run identity come from the authenticated run. A successful creation appears as a **Skill created** card in the task thread; see [Skills your agents create during a task](../guides/org/skills.md#skills-your-agents-create-during-a-task). + +Implementation reference: [update tool contract](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/paperclip-runner/src/protocol-actions/update-skill.ts) and [tool validation and REST binding](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/skill-tools.ts). ### Import: accepted sources @@ -659,6 +701,10 @@ Walk down this list in order. The first match is usually the problem. - The path you imported isn't inside the company's managed skills folder, a registered project workspace, or a project's server-managed checkout folder (code `skill_workspace_boundary_denied`). Register the folder as a project workspace, or move the skill into one, and import again. Symlinks are followed before the check, so a link that points elsewhere is refused too. +### "Skill version changed. Read the current version before retrying." + +- You sent `expectedVersionId` on a file update and someone saved the skill after you read it. Fetch the skill again, reapply your change to the current content, and retry with the new `currentVersionId` (and a new `idempotencyKey` if you use one). + ### "A GitHub-synced skill didn't pick up an upstream change" - Sources never refresh automatically. Use **Refresh** on **Skills → Sources**, or `POST /skill-sources/{sourceId}/refresh`. diff --git a/site/content.json b/site/content.json index 171174a..88b4f31 100644 --- a/site/content.json +++ b/site/content.json @@ -169,6 +169,10 @@ "title": "Action Permissions", "file": "../docs/connectors/action-permissions.md" }, + { + "title": "Connection Instructions", + "file": "../docs/connectors/connection-instructions.md" + }, { "title": "Review Requests", "file": "../docs/connectors/review-requests.md" @@ -193,6 +197,10 @@ "title": "Google Workspace Setup", "file": "../docs/connectors/google-setup.md" }, + { + "title": "Check AI Usage", + "file": "../docs/connectors/ai-usage.md" + }, { "title": "Memory Connectors (Experimental)", "file": "../docs/connectors/memory-connectors.md" @@ -367,6 +375,10 @@ "title": "Mixpanel", "file": "../docs/connectors/mixpanel.md" }, + { + "title": "Neon", + "file": "../docs/connectors/neon.md" + }, { "title": "Netlify", "file": "../docs/connectors/netlify.md" @@ -549,6 +561,14 @@ "title": "Agent Chat", "file": "../docs/experimental/agent-chat.md" }, + { + "title": "Assistant Connections (MCP)", + "file": "../docs/experimental/assistant-connections.md" + }, + { + "title": "Task-Pinned AI Routing", + "file": "../docs/experimental/task-pinned-ai-routing.md" + }, { "title": "Chat-Style Tasks", "file": "../docs/experimental/task-chat.md" @@ -755,6 +775,10 @@ "title": "Authentication", "file": "../docs/reference/api/authentication.md" }, + { + "title": "Assistant MCP", + "file": "../docs/reference/api/assistant-mcp.md" + }, { "title": "Companies", "file": "../docs/reference/api/companies.md" @@ -915,6 +939,10 @@ "title": "Connect", "file": "../docs/reference/cli/connect.md" }, + { + "title": "MCP", + "file": "../docs/reference/cli/mcp.md" + }, { "title": "Token", "file": "../docs/reference/cli/token.md"