Files
PaperClipAI/packages/shared/src/app-definitions.generated.ts
T
DottaandPaperclip 4d90634f74 feat(connections): add 1Password service-account connector (#17249)
## 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>
2026-10-23 13:27:33 -07:00

113 lines
8.4 KiB
TypeScript

import a0 from "./app-definitions/agentmail.json" with { type: "json" };
import a1 from "./app-definitions/zapier.json" with { type: "json" };
import a2 from "./app-definitions/arcade.json" with { type: "json" };
import a3 from "./app-definitions/executor.json" with { type: "json" };
import a4 from "./app-definitions/railway.json" with { type: "json" };
import a5 from "./app-definitions/github.json" with { type: "json" };
import a6 from "./app-definitions/github-code-review-bot.json" with { type: "json" };
import a7 from "./app-definitions/slack.json" with { type: "json" };
import a8 from "./app-definitions/microsoft-teams.json" with { type: "json" };
import a9 from "./app-definitions/imessage-photon.json" with { type: "json" };
import a10 from "./app-definitions/telegram.json" with { type: "json" };
import a11 from "./app-definitions/discord.json" with { type: "json" };
import a12 from "./app-definitions/notion.json" with { type: "json" };
import a13 from "./app-definitions/posthog.json" with { type: "json" };
import a14 from "./app-definitions/linear.json" with { type: "json" };
import a15 from "./app-definitions/context7.json" with { type: "json" };
import a16 from "./app-definitions/shopify.json" with { type: "json" };
import a17 from "./app-definitions/composio.json" with { type: "json" };
import a18 from "./app-definitions/oauth-generic.json" with { type: "json" };
import a19 from "./app-definitions/api-key-generic.json" with { type: "json" };
import a20 from "./app-definitions/sentry.json" with { type: "json" };
import a21 from "./app-definitions/vercel.json" with { type: "json" };
import a22 from "./app-definitions/enterpret.json" with { type: "json" };
import a23 from "./app-definitions/anthropic.json" with { type: "json" };
import a24 from "./app-definitions/browser-use-cloud.json" with { type: "json" };
import a25 from "./app-definitions/cognee.json" with { type: "json" };
import a26 from "./app-definitions/jira.json" with { type: "json" };
import a27 from "./app-definitions/airtable.json" with { type: "json" };
import a28 from "./app-definitions/beehiiv.json" with { type: "json" };
import a29 from "./app-definitions/bitly.json" with { type: "json" };
import a30 from "./app-definitions/candid.json" with { type: "json" };
import a31 from "./app-definitions/cloudflare.json" with { type: "json" };
import a32 from "./app-definitions/cloudinary.json" with { type: "json" };
import a33 from "./app-definitions/coda.json" with { type: "json" };
import a34 from "./app-definitions/hugging-face.json" with { type: "json" };
import a35 from "./app-definitions/kernel.json" with { type: "json" };
import a36 from "./app-definitions/local-falcon.json" with { type: "json" };
import a37 from "./app-definitions/make.json" with { type: "json" };
import a38 from "./app-definitions/manufact.json" with { type: "json" };
import a39 from "./app-definitions/miro.json" with { type: "json" };
import a40 from "./app-definitions/netlify.json" with { type: "json" };
import a41 from "./app-definitions/oreilly.json" with { type: "json" };
import a42 from "./app-definitions/planetscale.json" with { type: "json" };
import a43 from "./app-definitions/resend.json" with { type: "json" };
import a44 from "./app-definitions/ticktick.json" with { type: "json" };
import a45 from "./app-definitions/todoist.json" with { type: "json" };
import a46 from "./app-definitions/webflow.json" with { type: "json" };
import a47 from "./app-definitions/wix.json" with { type: "json" };
import a48 from "./app-definitions/brex.json" with { type: "json" };
import a49 from "./app-definitions/clickhouse.json" with { type: "json" };
import a50 from "./app-definitions/egnyte.json" with { type: "json" };
import a51 from "./app-definitions/embat.json" with { type: "json" };
import a52 from "./app-definitions/mixpanel.json" with { type: "json" };
import a53 from "./app-definitions/postman.json" with { type: "json" };
import a54 from "./app-definitions/razorpay.json" with { type: "json" };
import a55 from "./app-definitions/sanity.json" with { type: "json" };
import a56 from "./app-definitions/stripe.json" with { type: "json" };
import a57 from "./app-definitions/supabase.json" with { type: "json" };
import a58 from "./app-definitions/ticket-tailor.json" with { type: "json" };
import a59 from "./app-definitions/asana.json" with { type: "json" };
import a60 from "./app-definitions/box.json" with { type: "json" };
import a61 from "./app-definitions/mem0.json" with { type: "json" };
import a62 from "./app-definitions/pagerduty.json" with { type: "json" };
import a63 from "./app-definitions/similarweb.json" with { type: "json" };
import a64 from "./app-definitions/xero.json" with { type: "json" };
import a65 from "./app-definitions/youcom.json" with { type: "json" };
import a66 from "./app-definitions/fireflies.json" with { type: "json" };
import a67 from "./app-definitions/zep.json" with { type: "json" };
import a68 from "./app-definitions/supermemory.json" with { type: "json" };
import a69 from "./app-definitions/honcho.json" with { type: "json" };
import a70 from "./app-definitions/neon.json" with { type: "json" };
import a71 from "./app-definitions/superagent.json" with { type: "json" };
import a72 from "./app-definitions/telem.json" with { type: "json" };
import a73 from "./app-definitions/gauge.json" with { type: "json" };
import a74 from "./app-definitions/tavily.json" with { type: "json" };
import a75 from "./app-definitions/calendly.json" with { type: "json" };
import a76 from "./app-definitions/exa.json" with { type: "json" };
import a77 from "./app-definitions/firecrawl.json" with { type: "json" };
import a78 from "./app-definitions/parallel-search.json" with { type: "json" };
import a79 from "./app-definitions/windsor-ai.json" with { type: "json" };
import a80 from "./app-definitions/gsc-wizard.json" with { type: "json" };
import a81 from "./app-definitions/clickup.json" with { type: "json" };
import a82 from "./app-definitions/klaviyo.json" with { type: "json" };
import a83 from "./app-definitions/ditto.json" with { type: "json" };
import a84 from "./app-definitions/braintrust.json" with { type: "json" };
import a85 from "./app-definitions/google-workspace.json" with { type: "json" };
import a86 from "./app-definitions/gmail.json" with { type: "json" };
import a87 from "./app-definitions/google-drive.json" with { type: "json" };
import a88 from "./app-definitions/google-docs.json" with { type: "json" };
import a89 from "./app-definitions/google-sheets.json" with { type: "json" };
import a90 from "./app-definitions/google-slides.json" with { type: "json" };
import a91 from "./app-definitions/google-calendar.json" with { type: "json" };
import a92 from "./app-definitions/google-chat.json" with { type: "json" };
import a93 from "./app-definitions/google-people.json" with { type: "json" };
import a94 from "./app-definitions/google-workspace-search.json" with { type: "json" };
import a95 from "./app-definitions/openai.json" with { type: "json" };
import a96 from "./app-definitions/openrouter.json" with { type: "json" };
import a97 from "./app-definitions/xai.json" with { type: "json" };
import a98 from "./app-definitions/google.json" with { type: "json" };
import a99 from "./app-definitions/bedrock.json" with { type: "json" };
import a100 from "./app-definitions/responses-api.json" with { type: "json" };
import a101 from "./app-definitions/messages-api.json" with { type: "json" };
import a102 from "./app-definitions/chat-completions-api.json" with { type: "json" };
import a103 from "./app-definitions/local.json" with { type: "json" };
import a104 from "./app-definitions/1password.json" with { type: "json" };
import a105 from "./app-definitions/daytona.json" with { type: "json" };
import a106 from "./app-definitions/monday.json" with { type: "json" };
import a107 from "./app-definitions/paperclip-notebook.json" with { type: "json" };
import a108 from "./app-definitions/unikraft.json" with { type: "json" };
import a109 from "./app-definitions/speko.json" with { type: "json" };
import type { AppDefinition } from "./types/app-definition.js";
export const APP_DEFINITIONS=[a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100,a101,a102,a103,a104,a105,a106,a107,a108,a109] as AppDefinition[];