mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-24 01:41:42 +02:00
## Thinking Path > - Paperclip lets people manage AI agents and govern their access to outside services. > - Apps connections keep provider credentials in the instance vault and mediate every action through grants, policies, and audit. > - Agents currently have no Apps connection for reading or managing 1Password items with an operator-supplied service-account token. > - 1Password supports this through its official SDK; its documentation MCP server does not expose vault operations. > - This pull request adds a one-field service-account connection and registers eight reviewed SDK actions through the existing native-provider catalog. > - Operators can select vault permissions in 1Password and agent/action access in Paperclip without installing a CLI or handing durable credentials to agents. ## Linked Issues or Issue Description Related: #16144 adds 1Password as Paperclip's secret-storage backend. This PR adds the separate Apps/tool-access flow with a per-connection credential; it does not change secret providers or use a server-wide ambient token. **Subsystem affected** Apps catalog, native tool-provider registry, and shared connection setup. **Problem or motivation** People need to paste their own `OP_SERVICE_ACCOUNT_TOKEN`, find official service-account setup instructions, and authorize agents to use the selected vaults through ordinary Paperclip governance. **Proposed solution** Add `1password/service-account`, with a password field labeled **Paste your 1Password Service Account token** and a link to [1Password's creation instructions](https://www.1password.dev/service-accounts/get-started#create-a-service-account). Use the pinned official `@1password/sdk` 0.5.0 for vault/item listing, item and secret-reference reads, and item create/update/archive/delete. **Alternatives considered** A remote MCP card would not provide vault access. A local CLI or a third-party MCP package adds installation and credential surfaces that the official SDK avoids. ## What Changed - Added the source and generated catalog definition, permission review, official light/dark artwork, documentation, and capability-map references. - Added a provider-owned SDK bridge with strict schemas, account-domain validation, contract hashes, fixed errors, bounded output, and disposable workers with cancellation/deadlines. - Registered the provider through master's native-provider catalog; existing setup, health, discovery, gateway, policy, and audit owners remain in place. - Labeled the single password field **Paste your 1Password Service Account token**. The shared formatter preserves explicit credential prompts; ordinary key labels retain their existing presentation. - Added credential-ownership, gateway read/write, policy/revocation, worker, setup UI, and interactive Storybook coverage. ## Verification - Final review follow-up: added two deterministic worker-entry tests for nested exact-token redaction and oversized-output rejection. Removing each guard caused exactly its regression test to fail. The focused provider suite passed **15 tests**, and the official server typecheck passed after rebuilding stale workspace SDK artifacts. Current head `569cb7f9bd57db791fb13a6034ce69bf50878cb1` passed the full [CI run](https://github.com/paperclipai/paperclip/actions/runs/40016166260), including typecheck, build, unit/integration tests, and all eight browser shards. The required `ci / verify` and `ci / e2e` gates passed. [Greptile](https://github.com/paperclipai/paperclip/pull/17249#issuecomment-6353731805) and [Paperclip Review](https://github.com/paperclipai/paperclip/pull/17249#issuecomment-6372165895) each rated this exact head **5/5**, with no open findings. Paperclip Review completed with a neutral check because its scoped reviewer could not inspect CI; the full CI result was verified separately. Other neutral checks and intentionally skipped Storybook jobs contain no actionable findings. - CI recovery on the same commit: the first attempt lost six jobs. Five logged simultaneous runner shutdowns at 18:49 UTC on 2026-10-23; the sixth stopped logging before a test result and its root cause was not established. No assertion failure appeared in the retrieved logs. All six jobs and the aggregate gates passed one failed-job retry. [CI run](https://github.com/paperclipai/paperclip/actions/runs/40005754936). - Copy follow-up: the catalog, provider, and setup UI suites passed **275 tests**. The governed gateway lifecycle passed **3 tests** (one live-only test skipped), including create, update, archive, and delete. UI token gates and map checks passed. The branch was rebased onto `9c442cf48e` to resolve additive catalog conflicts while retaining the Vercel and Supabase entries. The existing live write proof below remains applicable; this follow-up changes presentation only. - Five affected suites, including the existing Daytona consumer, passed **290 tests** (one opt-in live test skipped in fixture mode). Full `pnpm -r typecheck` and `pnpm build` passed. The local broad-suite attempt could not complete because PostgreSQL semaphore exhaustion prevented a competing integration suite from starting; the complete affected-file retry passed after disposable-process cleanup. The prior commit `f208a8aff6dc28859cc3f343497e18d85f124579` passed the complete CI matrix. All CI build, typecheck, test, and browser gates also passed on the earlier commit `9e2f3d3140368a08da43b004b2e8d3a0f4c0fa4d`. The separate Paperclip Review reported a worker-result regression-test gap on that head; the follow-up above addresses it. Its review thread is resolved, and both fresh current-head reviews are clean as recorded above. - Token gates, module boundaries, brand validation, map checks, and Storybook catalog checks passed. - Direct SDK create/archive/delete and rejected-call coverage passed (13 provider tests); the Storybook Permissions/Test play completed successfully in Chromium. Server and UI typechecks passed after those fixes. Greptile passed prior commit `9e2f3d3140368a08da43b004b2e8d3a0f4c0fa4d` at **5/5**. Both reviewers also passed the worker-test follow-up at **5/5** as recorded above. - Live 1Password proof on 2026-10-22: connect, eight-action discovery, vault listing through an actual run-scoped gateway, refresh, reconnect preserving identity, another read, removal, and denial through the retained session passed. Credential absence was asserted in responses/audit; an exact-token scan of inspected logs and changed files passed. - Real browser: Connectors → 1Password → token entry → personal access limited to one disposable agent → completion → Permissions → Test `onepassword_list_vaults` succeeded. The disposable connection was removed afterward. - Compiled-worker smoke initially exposed inherited Node launch flags. Workers now use explicit empty `execArgv`; the compiled worker then authenticated successfully and listed one vault. - Live write proof on **2026-10-23**: the replacement Keychain token passed all eight actions through the actual run-scoped gateway for both personal and shared credentials. The test created, listed, read, updated, resolved a secret from, archived, and deleted two synthetic items. Both were absent from subsequent item lists. Refresh/reconnect, identity preservation, removal, retained-session denial, and credential absence passed. The live suite passed **3 tests** (one fixture-only test skipped) in 116.65 seconds. The expanded fixture suite passed **3 tests** (one live-only test skipped); the 13 provider tests and server typecheck passed. An exact-token scan passed over 64 source/log files. - Failure history: the original token denied creation on 2026-10-22 and created no item. The first 2026-10-23 attempt stopped before provider calls because host PostgreSQL semaphore limits prevented test-database startup. A temporary ten-connection test profile allowed the complete retry to pass without changing shared services or host limits. A new delete-result assertion also exposed an outdated fixture response (`success` instead of `deleted`); the fixture was corrected and the complete fixture suite passed. Official contract sources: [service accounts](https://www.1password.dev/service-accounts/get-started), [SDKs](https://www.1password.dev/sdks), [item management](https://www.1password.dev/sdks/manage-items), [official JavaScript SDK](https://github.com/1Password/onepassword-sdk-js). ## Risks - Authorized item/secret reads intentionally return secret values to the agent and ordinary tool-result history. Select trusted agents and use restricted service-account vaults; the connection token itself is redacted. - New connections retain existing Paperclip action defaults, including Allowed writes/destructive actions for selected agents. 1Password still enforces the token's permissions. - Service-account access cannot be changed in place. Create a replacement account and reconnect to change vault permissions; read-only keys can connect but cannot write. - SDK authentication happens per action in a disposable worker. Calls have a 30-second maximum; cancellation stops local work, while a mutation already accepted by 1Password can still finish. Writes are never automatically retried. - Additive dependency and catalog change; no database migration. Disable/remove the connection to withdraw access, or remove the provider from catalog visibility for rollback. ## Model Used OpenAI Codex, based on GPT-6, with code editing, shell/browser tools, and live provider verification. A more specific runtime model ID and context-window limit were not exposed in this session. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip <noreply@paperclip.ing>
199 lines
6.8 KiB
JSON
199 lines
6.8 KiB
JSON
{
|
|
"name": "@paperclipai/server",
|
|
"version": "0.3.1",
|
|
"license": "MIT",
|
|
"homepage": "https://github.com/paperclipai/paperclip",
|
|
"bugs": {
|
|
"url": "https://github.com/paperclipai/paperclip/issues"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "https://github.com/paperclipai/paperclip",
|
|
"directory": "server"
|
|
},
|
|
"type": "module",
|
|
"exports": {
|
|
".": "./src/index.ts"
|
|
},
|
|
"publishConfig": {
|
|
"access": "public",
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"import": "./dist/index.js"
|
|
}
|
|
},
|
|
"main": "./dist/index.js",
|
|
"types": "./dist/index.d.ts"
|
|
},
|
|
"files": [
|
|
"dist",
|
|
"ui-dist",
|
|
"skills",
|
|
"scripts/install-copilot-assets.mjs"
|
|
],
|
|
"scripts": {
|
|
"dev": "tsx src/index.ts",
|
|
"dev:watch": "cross-env PAPERCLIP_MIGRATION_PROMPT=never PAPERCLIP_MIGRATION_AUTO_APPLY=true tsx ./scripts/dev-watch.ts",
|
|
"prepare:ui-dist": "bash ../scripts/prepare-server-ui-dist.sh",
|
|
"build": "pnpm run prepare:runner-vendor && node scripts/verify-runner-vendor-dependencies.mjs && tsc && mkdir -p dist/onboarding-assets dist/built-ins dist/services/scripts dist/vendor/paperclip-runner && cp -R src/onboarding-assets/. dist/onboarding-assets/ && cp -R src/built-ins/. dist/built-ins/ && cp -R src/services/scripts/. dist/services/scripts/ && cp -Rf ../packages/paperclip-runner/dist/. dist/vendor/paperclip-runner/ && cp ../packages/paperclip-runner/scripts/install-copilot-assets.mjs ../packages/paperclip-runner/scripts/materialize-copilot-binary.mjs ../packages/paperclip-runner/scripts/copilot-inner-distribution.mjs dist/ && node dist/install-copilot-assets.mjs && node scripts/write-build-stamp.mjs",
|
|
"prepack": "pnpm run prepare:ui-dist && pnpm run build",
|
|
"postpack": "rm -rf ui-dist",
|
|
"clean": "rm -rf dist",
|
|
"build:runtime": "node scripts/bundle-runtime.mjs",
|
|
"start": "node dist/index.js",
|
|
"prepare:runner-vendor": "node scripts/prepare-runner-vendor.mjs",
|
|
"typecheck": "pnpm run prepare:runner-vendor && pnpm --filter @paperclipai/plugin-sdk ensure-build-deps && tsc --noEmit",
|
|
"postinstall": "node scripts/install-copilot-assets.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@1password/sdk": "0.5.0",
|
|
"@agentclientprotocol/claude-agent-acp": "0.73.0",
|
|
"@agentclientprotocol/codex-acp": "1.6.2",
|
|
"@ai-sdk/amazon-bedrock": "5.0.113",
|
|
"@ai-sdk/anthropic": "4.0.78",
|
|
"@ai-sdk/google": "4.0.93",
|
|
"@ai-sdk/openai": "4.0.86",
|
|
"@ai-sdk/xai": "5.0.20",
|
|
"@aws-sdk/client-s3": "^3.1141.0",
|
|
"@chat-adapter/discord": "4.39.0",
|
|
"@chat-adapter/github": "4.39.0",
|
|
"@chat-adapter/slack": "4.39.0",
|
|
"@chat-adapter/teams": "4.39.0",
|
|
"@chat-adapter/telegram": "4.39.0",
|
|
"@discordjs/ws": "1.2.3",
|
|
"@grpc/grpc-js": "1.14.5",
|
|
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
"@openrouter/ai-sdk-provider": "3.1.0",
|
|
"@opentelemetry/api": "^1.9.0",
|
|
"@opentelemetry/otlp-transformer": "0.221.0",
|
|
"@paperclipai/adapter-claude-local": "workspace:*",
|
|
"@paperclipai/adapter-codex-local": "workspace:*",
|
|
"@paperclipai/adapter-cursor-cloud": "workspace:*",
|
|
"@paperclipai/adapter-cursor-local": "workspace:*",
|
|
"@paperclipai/adapter-gemini-local": "workspace:*",
|
|
"@paperclipai/adapter-grok-local": "workspace:*",
|
|
"@paperclipai/adapter-kimi-local": "workspace:*",
|
|
"@paperclipai/adapter-openclaw-gateway": "workspace:*",
|
|
"@paperclipai/adapter-opencode-local": "workspace:*",
|
|
"@paperclipai/adapter-pi-local": "workspace:*",
|
|
"@paperclipai/adapter-utils": "workspace:*",
|
|
"@paperclipai/db": "workspace:*",
|
|
"@paperclipai/hermes-paperclip-adapter": "workspace:*",
|
|
"@paperclipai/plugin-sdk": "workspace:*",
|
|
"@paperclipai/shared": "workspace:*",
|
|
"@paperclipai/skills-catalog": "workspace:*",
|
|
"@photon-ai/advanced-imessage": "2.1.0",
|
|
"@vercel/connect": "2.3.3",
|
|
"acorn": "8.18.0",
|
|
"acpx": "0.13.1",
|
|
"ai": "7.0.130",
|
|
"ajv": "^8.20.0",
|
|
"ajv-formats": "^3.0.1",
|
|
"better-auth": "1.7.2",
|
|
"chat": "4.39.0",
|
|
"chokidar": "^5.0.0",
|
|
"compression": "^1.8.2",
|
|
"detect-port": "^2.1.0",
|
|
"dompurify": "^3.4.16",
|
|
"dotenv": "^17.4.2",
|
|
"drizzle-orm": "^0.45.2",
|
|
"embedded-postgres": "^18.1.0-beta.16",
|
|
"express": "^5.1.0",
|
|
"heif2jpeg": "0.1.6",
|
|
"jsdom": "^30.0.1",
|
|
"light-my-request": "^6.6.0",
|
|
"multer": "^2.4.0",
|
|
"nice-grpc": "2.1.17",
|
|
"nice-grpc-common": "2.0.4",
|
|
"open": "^11.0.4",
|
|
"opencode-ai": "1.18.34",
|
|
"pino": "^10.0.0",
|
|
"pino-http": "^11.0.0",
|
|
"pino-pretty": "^13.1.3",
|
|
"sharp": "^0.35.4",
|
|
"smol-toml": "^1.9.1",
|
|
"ssh2": "^1.17.0",
|
|
"svix": "1.76.1",
|
|
"ws": "^8.22.0",
|
|
"zod": "^4.4.3",
|
|
"@opentelemetry/resources": "2.10.0"
|
|
},
|
|
"bundleDependencies": [
|
|
"@agentclientprotocol/claude-agent-acp",
|
|
"@agentclientprotocol/codex-acp",
|
|
"@chat-adapter/discord",
|
|
"@chat-adapter/github",
|
|
"@chat-adapter/slack",
|
|
"@chat-adapter/teams",
|
|
"@chat-adapter/telegram",
|
|
"@discordjs/ws",
|
|
"acpx"
|
|
],
|
|
"devDependencies": {
|
|
"@opentelemetry/context-async-hooks": "2.10.0",
|
|
"@opentelemetry/sdk-trace": "2.10.0",
|
|
"@paperclipai/paperclip-runner": "workspace:*",
|
|
"@types/compression": "^1.8.1",
|
|
"@types/express": "^5.0.0",
|
|
"@types/express-serve-static-core": "^5.1.3",
|
|
"@types/jsdom": "^30.0.0",
|
|
"@types/multer": "^2.2.0",
|
|
"@types/node": "^24.0.0",
|
|
"@types/sharp": "^0.32.0",
|
|
"@types/supertest": "^7.2.1",
|
|
"@types/ws": "^8.18.2",
|
|
"cross-env": "^10.1.0",
|
|
"supertest": "^7.0.0",
|
|
"tsx": "^4.23.15",
|
|
"typescript": "^7.0.2",
|
|
"vite": "^8.2.2",
|
|
"vitest": "^5.0.3",
|
|
"protobufjs": "7.6.6"
|
|
},
|
|
"peerDependencies": {
|
|
"@opentelemetry/auto-instrumentations-node": "0.79.0",
|
|
"@opentelemetry/exporter-trace-otlp-grpc": "0.221.0",
|
|
"@opentelemetry/exporter-trace-otlp-http": "0.221.0",
|
|
"@opentelemetry/exporter-trace-otlp-proto": "0.221.0",
|
|
"@opentelemetry/resources": "2.10.0",
|
|
"@opentelemetry/sdk-node": "0.221.0",
|
|
"@opentelemetry/semantic-conventions": "1.43.0",
|
|
"@sentry/node": "10.71.0"
|
|
},
|
|
"peerDependenciesMeta": {
|
|
"@opentelemetry/auto-instrumentations-node": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/exporter-trace-otlp-grpc": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/exporter-trace-otlp-http": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/exporter-trace-otlp-proto": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/resources": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/sdk-node": {
|
|
"optional": true
|
|
},
|
|
"@opentelemetry/semantic-conventions": {
|
|
"optional": true
|
|
},
|
|
"@sentry/node": {
|
|
"optional": true
|
|
}
|
|
},
|
|
"engines": {
|
|
"node": ">=24.11.0"
|
|
},
|
|
"optionalDependencies": {
|
|
"@github/copilot-darwin-arm64": "1.0.88",
|
|
"@github/copilot-darwin-x64": "1.0.88",
|
|
"@github/copilot-linux-x64": "1.0.88"
|
|
}
|
|
}
|