@zackbart/connecta 0.33.0 → 0.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +100 -128
  3. package/SECURITY.md +1 -1
  4. package/bin/version.mjs +1 -1
  5. package/dist/activity.d.ts +3 -0
  6. package/dist/branding.d.ts +7 -0
  7. package/dist/branding.js +76 -9
  8. package/dist/catalog-drift.d.ts +30 -26
  9. package/dist/catalog-drift.js +169 -84
  10. package/dist/catalog-service.js +16 -2
  11. package/dist/config-value-sources.js +6 -1
  12. package/dist/config.d.ts +13 -2
  13. package/dist/config.js +36 -2
  14. package/dist/connector-caller.js +2 -1
  15. package/dist/connectors/api-connector.d.ts +3 -0
  16. package/dist/connectors/api-connector.js +5 -1
  17. package/dist/connectors/option-shapes.js +1 -1
  18. package/dist/connectors/remote-mcp.d.ts +2 -0
  19. package/dist/connectors/remote-mcp.js +5 -1
  20. package/dist/describe-config.d.ts +5 -1
  21. package/dist/describe-config.js +2 -0
  22. package/dist/execute.js +1 -11
  23. package/dist/fix-prompt.js +2 -2
  24. package/dist/index.js +1 -0
  25. package/dist/invocation.js +3 -2
  26. package/dist/membership.d.ts +2 -0
  27. package/dist/meta-tools.js +3 -2
  28. package/dist/oauth-callback-outcome.js +2 -2
  29. package/dist/operator-ui/agents.d.ts +1 -1
  30. package/dist/operator-ui/agents.js +16 -16
  31. package/dist/operator-ui/config-summary.js +565 -0
  32. package/dist/operator-ui/connection-map.js +376 -0
  33. package/dist/operator-ui/endpoints.js +45 -16
  34. package/dist/operator-ui/fix-prompts.js +1 -1
  35. package/dist/operator-ui/generated.js +4 -4
  36. package/dist/operator-ui/health.js +52 -0
  37. package/dist/operator-ui/member-page.js +13 -28
  38. package/dist/operator-ui/overview.js +123 -0
  39. package/dist/operator-ui/view.d.ts +26 -22
  40. package/dist/operator-ui/view.js +130 -96
  41. package/dist/page-styles.js +5 -3
  42. package/dist/provider.d.ts +6 -1
  43. package/dist/provider.js +18 -1
  44. package/dist/providers/_shared/google/workspace.d.ts +9 -4
  45. package/dist/providers/_shared/google/workspace.js +7 -3
  46. package/dist/providers/basecamp/index.d.ts +2 -0
  47. package/dist/providers/breeze/index.d.ts +2 -0
  48. package/dist/providers/ccb/index.d.ts +2 -0
  49. package/dist/providers/ccb/index.js +2 -2
  50. package/dist/providers/cloudflare/index.d.ts +2 -0
  51. package/dist/providers/cloudflare/index.js +5 -1
  52. package/dist/providers/cloudflare/openapi.generated.js +3296 -3206
  53. package/dist/providers/cloudflare/rest.js +19 -0
  54. package/dist/providers/cloudflare/skill.generated.js +2 -2
  55. package/dist/providers/cloudflare/value-safety.js +51 -18
  56. package/dist/providers/docs/index.js +1 -1
  57. package/dist/providers/docs/skill.generated.js +2 -2
  58. package/dist/providers/drive/index.js +1 -1
  59. package/dist/providers/drive/skill.generated.js +2 -2
  60. package/dist/providers/forms/index.js +1 -1
  61. package/dist/providers/forms/skill.generated.js +2 -2
  62. package/dist/providers/gmail/index.js +1 -1
  63. package/dist/providers/gmail/skill.generated.js +2 -2
  64. package/dist/providers/intercom/index.d.ts +24 -0
  65. package/dist/providers/intercom/index.js +121 -0
  66. package/dist/providers/intercom/skill.generated.js +8 -0
  67. package/dist/providers/linear/index.js +204 -19
  68. package/dist/providers/linear/skill.generated.js +2 -2
  69. package/dist/providers/mixpanel/index.d.ts +2 -0
  70. package/dist/providers/mixpanel/index.js +21 -17
  71. package/dist/providers/mixpanel/skill.generated.js +3 -3
  72. package/dist/providers/notion/index.d.ts +2 -0
  73. package/dist/providers/notion/index.js +1 -1
  74. package/dist/providers/notion/skill.generated.js +1 -1
  75. package/dist/providers/overflow/index.d.ts +2 -0
  76. package/dist/providers/overflow/index.js +1 -1
  77. package/dist/providers/overflow/skill.generated.js +2 -2
  78. package/dist/providers/planning-center/index.d.ts +2 -0
  79. package/dist/providers/planning-center/index.js +1 -1
  80. package/dist/providers/planning-center/skill.generated.js +4 -4
  81. package/dist/providers/revenuecat/index.d.ts +5 -3
  82. package/dist/providers/revenuecat/index.js +147 -7
  83. package/dist/providers/revenuecat/skill.generated.js +3 -3
  84. package/dist/providers/sheets/index.js +1 -1
  85. package/dist/providers/sheets/skill.generated.js +2 -2
  86. package/dist/providers/slides/index.js +1 -1
  87. package/dist/providers/slides/skill.generated.js +2 -2
  88. package/dist/providers/stripe/index.d.ts +2 -0
  89. package/dist/providers/stripe/index.js +50 -30
  90. package/dist/providers/stripe/skill.generated.js +2 -1
  91. package/dist/providers/tithely/index.d.ts +2 -0
  92. package/dist/providers/tithely/index.js +1 -1
  93. package/dist/providers/vercel/index.d.ts +2 -0
  94. package/dist/providers/vercel/index.js +2 -2
  95. package/dist/providers/vercel/openapi.generated.js +391 -374
  96. package/dist/providers/vercel/skill.generated.js +2 -2
  97. package/dist/providers/vercel/value-safety.js +14 -4
  98. package/dist/registry.d.ts +10 -14
  99. package/dist/registry.js +77 -62
  100. package/dist/routes/mcp.js +20 -13
  101. package/dist/routes/oauth.js +2 -2
  102. package/dist/routes/ui-data.js +8 -2
  103. package/dist/skills.js +18 -2
  104. package/dist/storage/sql.js +5 -1
  105. package/dist/types.d.ts +36 -11
  106. package/dist/ui.js +9 -4
  107. package/dist/usage-guide.js +1 -1
  108. package/dist/version.d.ts +1 -1
  109. package/dist/version.js +1 -1
  110. package/documentation/README.md +2 -2
  111. package/documentation/architecture.md +66 -18
  112. package/documentation/auth.md +183 -67
  113. package/documentation/code-mode.md +30 -10
  114. package/documentation/deploying.md +5 -1
  115. package/documentation/integrating.md +64 -7
  116. package/documentation/meta-tools.md +38 -24
  117. package/documentation/migration-0.33.md +21 -13
  118. package/documentation/migration-0.34.md +67 -0
  119. package/documentation/operating.md +1 -1
  120. package/documentation/operator-tests.md +52 -20
  121. package/documentation/operator-ui.md +341 -104
  122. package/documentation/provider-auth-migration.md +22 -0
  123. package/examples/worker/AGENTS.md +15 -9
  124. package/examples/worker/README.md +41 -14
  125. package/examples/worker/src/connecta.config.ts +5 -4
  126. package/examples/worker/wrangler.jsonc +1 -1
  127. package/package.json +23 -19
  128. package/templates/node/AGENTS.md +13 -7
  129. package/templates/node/README.md +14 -11
  130. package/templates/node/package.json +1 -1
  131. package/templates/node/src/connecta.config.ts +2 -2
@@ -11,7 +11,8 @@ A deployable Worker that aggregates a downstream remote MCP and an in-code HTTP
11
11
  API connector, guarded by Cloudflare Access. It uses three Cloudflare resources
12
12
  and nothing else: one D1 database (`CONNECTA_DB`) for every piece of state, the
13
13
  Worker Loader binding (`LOADER`) behind the six-tool surface, which requires
14
- the Workers Paid plan, and one secret (`CREDENTIAL_ENCRYPTION_KEY`).
14
+ the Workers Paid plan, and two secrets: `DOWNSTREAM_TOKEN` (the example remote
15
+ MCP connector's token) and `CREDENTIAL_ENCRYPTION_KEY` (the credential vault).
15
16
 
16
17
  This is also the **starting template for a deployment**: a real deployment
17
18
  should be its own repository that pins an exact `@zackbart/connecta` version and
@@ -46,9 +47,11 @@ This example has no `package.json` of its own — it resolves the installed
46
47
  package from the repository root.
47
48
 
48
49
  ```sh
49
- npm install # from the package root
50
+ pnpm install # from the repository root
50
51
 
51
52
  wrangler d1 create connecta # paste the id into wrangler.jsonc
53
+ # In wrangler.jsonc also set PUBLIC_URL to this Worker's URL and
54
+ # CONNECTA_MAINTAINERS to your Access user ids (user_uuid, else email).
52
55
 
53
56
  cd examples/worker
54
57
  wrangler secret put DOWNSTREAM_TOKEN
@@ -140,7 +143,8 @@ auth. [Deploying Connecta](https://github.com/zackbart/connecta/blob/main/docume
140
143
  records the untested cases and the propagation details.
141
144
 
142
145
  The checked-in `access.dev` block gives `wrangler dev` a local operator
143
- identity. Remove the block to test the missing-Access refusal. It has no effect
146
+ identity; it requires Wrangler 4.123.0 or later, and earlier versions ignore it
147
+ with an unexpected-field warning. Remove the block to test the missing-Access refusal. It has no effect
144
148
  on a deployed Worker's production identity.
145
149
 
146
150
  ### Optional resource management with Alchemy
@@ -228,12 +232,34 @@ Access adoption or preserve production identity.
228
232
 
229
233
  ### Copied into its own repository
230
234
 
231
- The `npm install` above is the connecta repository's, which already has every
235
+ The `pnpm install` above is the connecta repository's, which already has every
232
236
  dependency this file imports. A copy with its own `package.json` installs
233
237
  Connecta and the separately installed `@cloudflare/codemode` peer:
234
238
 
235
239
  ```sh
236
- npm install @zackbart/connecta @cloudflare/codemode
240
+ npm install --save-exact @zackbart/connecta@<version>
241
+ npm install @cloudflare/codemode
242
+ npm install --save-dev wrangler @cloudflare/workers-types typescript @types/node
243
+ ```
244
+
245
+ A `tsconfig.json` like the following lets `tsc --noEmit` resolve `D1Database`,
246
+ `WorkerLoader`, and `ExecutionContext`. `wrangler` also serves
247
+ `scripts/copy-kv-to-d1.mjs`.
248
+
249
+ ```json
250
+ {
251
+ "compilerOptions": {
252
+ "target": "ES2022",
253
+ "module": "ES2022",
254
+ "moduleResolution": "Bundler",
255
+ "lib": ["ES2022"],
256
+ "types": ["@cloudflare/workers-types", "node"],
257
+ "strict": true,
258
+ "skipLibCheck": true,
259
+ "noEmit": true
260
+ },
261
+ "include": ["src/**/*.ts"]
262
+ }
237
263
  ```
238
264
 
239
265
  `@cloudflare/codemode` is the optional peer behind `execute_code`, declared in
@@ -250,12 +276,12 @@ Then list the maintainers' Access user ids (`user_uuid`, else email) in the
250
276
  `CONNECTA_MAINTAINERS` var and point a maintainer's MCP client at
251
277
  `<PUBLIC_URL>/mcp`. Other people use `<PUBLIC_URL>/mcp/<pool>`, and agents
252
278
  `<PUBLIC_URL>/agent/<pool>`, for a pool that lists them in `members`. The example explicitly enables
253
- `ui: operatorUi()`; open `<PUBLIC_URL>/` for Connections and each connection's
254
- authentication controls. The page labels tool safety, offers fixed repair
279
+ `ui: operatorUi()`; open `<PUBLIC_URL>/` for endpoints, and each connector's Connection tab
280
+ (`/connectors/<id>`) for its authentication controls. The page labels tool safety, offers fixed repair
255
281
  prompts for classified failures, and shows client setup commands for endpoints
256
282
  the signed-in person may use. Those commands contain no token. There is no
257
- separate Credentials tab. The Access tokens page, listing one token slot per
258
- declared agent, is available to permitted interactive operators.
283
+ separate Credentials tab. The Tokens page, listing one token slot per
284
+ declared agent, is available to signed-in maintainers.
259
285
 
260
286
  ## Select optional modules
261
287
 
@@ -281,9 +307,9 @@ See [inbound identity](../../documentation/auth.md#principals-visibility-and-ope
281
307
  Machine clients are agents declared by name in `agents` in
282
308
  `src/connecta.config.ts`; this example declares `ci`. Each agent has one
283
309
  `cta_` token held by `accessTokens(storage)` over `CONNECTA_DB`, with no new
284
- binding. An agent with no issued token admits nothing. A human authenticated
285
- through Access can still sign in and issue the first token. Open
286
- `<PUBLIC_URL>/`, select Access tokens, and issue the agent's token. Save the
310
+ binding. An agent with no issued token admits nothing. A maintainer (an Access
311
+ identity listed in `CONNECTA_MAINTAINERS`) signs in and issues the first token.
312
+ Open `<PUBLIC_URL>/`, select Tokens, and issue the agent's token. Save the
287
313
  returned `cta_` secret privately; it is returned once. Rotating replaces it
288
314
  immediately: the old secret stops on its next request. An agent has no human
289
315
  principal, so personal connectors are absent for it; connector and pool rules
@@ -380,7 +406,7 @@ with the `cta_` token alone:
380
406
  CF_ACCESS_CLIENT_ID='REPLACE_WITH_ACCESS_CLIENT_ID' \
381
407
  CF_ACCESS_CLIENT_SECRET='REPLACE_WITH_ACCESS_CLIENT_SECRET' \
382
408
  CONNECTA_TOKEN='cta_REPLACE_WITH_STORED_SECRET' \
383
- connecta doctor --url "$PUBLIC_URL" --pool ci
409
+ npx connecta doctor --url https://connecta.example.workers.dev --pool ci
384
410
  ```
385
411
 
386
412
  Doctor reports the configured `DynamicWorkerExecutor`, not a presumed Node
@@ -439,7 +465,8 @@ CREATE TABLE IF NOT EXISTS connecta_kv (
439
465
  );
440
466
  CREATE INDEX IF NOT EXISTS connecta_kv_expiry ON connecta_kv (expires_at_ms);
441
467
  -- tool_call_activity: one row per completed call, keyset-paged on
442
- -- (occurred_at_ms, id); see src/storage/sql.ts in the package.
468
+ -- (occurred_at_ms, id); see
469
+ -- https://github.com/zackbart/connecta/blob/main/src/storage/sql.ts
443
470
  ```
444
471
 
445
472
  ### Upgrading from 0.28
@@ -4,8 +4,9 @@
4
4
  * One MCP endpoint aggregating a downstream remote MCP and an HTTP API, guarded
5
5
  * by Cloudflare Access. It needs three resources and nothing else: one D1
6
6
  * database (CONNECTA_DB) holding every piece of state, the Worker Loader
7
- * binding (LOADER) behind execute_code, and one secret
8
- * (CREDENTIAL_ENCRYPTION_KEY) sealing credentials in that database. Access
7
+ * binding (LOADER) behind execute_code, and two secrets: DOWNSTREAM_TOKEN for
8
+ * the example Notion connector and CREDENTIAL_ENCRYPTION_KEY sealing
9
+ * credentials in that database. Access
9
10
  * admits the request before this Worker runs and supplies trusted human
10
11
  * identity through ctx.access. Machines use stored cta_ tokens inside connecta.
11
12
  *
@@ -16,7 +17,7 @@
16
17
  *
17
18
  * Setup (this example has no package.json of its own — it self-references the
18
19
  * installed `@zackbart/connecta` package):
19
- * 1. `npm install` in the connecta package root (../../ from here) so the
20
+ * 1. `pnpm install` in the connecta repository root (../../ from here) so the
20
21
  * package import and wrangler resolve. A copy in its own repository
21
22
  * installs `@zackbart/connecta @cloudflare/codemode` instead. Codemode is
22
23
  * an optional peer.
@@ -90,7 +91,7 @@ export default defineConfig((env: Env) => {
90
91
  // alone is refused everywhere.
91
92
  auth: [cloudflareAccessAuth()],
92
93
  // Machine clients are agents declared here by name, each with one cta_
93
- // token. An Access-authenticated operator issues, rotates, and revokes it
94
+ // token. A signed-in maintainer issues, rotates, and revokes it
94
95
  // in the operator UI; removing a name stops its token on the next request.
95
96
  agents: ["ci"],
96
97
  // Always installed over the same D1 storage. An agent with no issued token
@@ -18,7 +18,7 @@
18
18
  "CONNECTA_MAINTAINERS": "operator@example.com",
19
19
  },
20
20
 
21
- // Local-only Access identity. Remove this block to exercise the
21
+ // Local-only Access identity (Wrangler 4.123.0 or later). Remove this block to exercise the
22
22
  // unauthenticated path in `wrangler dev`; production identity comes from the
23
23
  // Worker-level Access application, not from this file.
24
24
  "access": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zackbart/connecta",
3
- "version": "0.33.0",
3
+ "version": "0.34.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "One MCP to rule them all — a single MCP endpoint aggregating many downstream connectors behind a code-first surface of six meta-tools.",
@@ -8,6 +8,7 @@
8
8
  "engines": {
9
9
  "node": ">=22.13.0"
10
10
  },
11
+ "packageManager": "pnpm@12.4.2",
11
12
  "publishConfig": {
12
13
  "access": "public"
13
14
  },
@@ -113,6 +114,10 @@
113
114
  "types": "./dist/providers/infisical/index.d.ts",
114
115
  "import": "./dist/providers/infisical/index.js"
115
116
  },
117
+ "./providers/intercom": {
118
+ "types": "./dist/providers/intercom/index.d.ts",
119
+ "import": "./dist/providers/intercom/index.js"
120
+ },
116
121
  "./providers/linear": {
117
122
  "types": "./dist/providers/linear/index.d.ts",
118
123
  "import": "./dist/providers/linear/index.js"
@@ -187,20 +192,20 @@
187
192
  "build:operator-ui": "node scripts/build-operator-ui.mjs",
188
193
  "check:operator-ui": "node scripts/build-operator-ui.mjs --check",
189
194
  "check:clerk-sdk": "node scripts/build-clerk-sdk.mjs --check",
190
- "build": "npm run providers:generate && npm run clean && tsc -p tsconfig.build.json && node scripts/prune-declarations.mjs",
195
+ "build": "pnpm run providers:generate && pnpm run clean && tsc -p tsconfig.build.json && node scripts/prune-declarations.mjs",
191
196
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.operator-ui.json --noEmit",
192
197
  "test": "vitest run",
193
198
  "test:browser:install": "playwright install chromium",
194
199
  "test:browser": "playwright test",
195
200
  "test:browser:snapshots": "node scripts/update-operator-snapshots.mjs",
196
- "pretest:browser:snapshots": "npm run build:operator-ui",
201
+ "pretest:browser:snapshots": "pnpm run build:operator-ui",
197
202
  "test:node": "vitest run --project node",
198
203
  "test:workers": "vitest run --project workers",
199
204
  "check:docs": "node scripts/check-doc-links.mjs",
200
205
  "check:lint": "oxlint -D correctness --report-unused-disable-directives .",
201
206
  "check:unused": "knip --include dependencies,unlisted,exports,nsExports,types,nsTypes",
202
207
  "check:examples": "tsc -p tsconfig.template.node.json && tsc -p tsconfig.examples.worker.json",
203
- "check:security": "npm audit --omit=dev --audit-level=moderate",
208
+ "check:security": "pnpm audit --prod --audit-level moderate",
204
209
  "check:package": "node scripts/check-package.mjs",
205
210
  "check:declarations": "node scripts/check-declarations.mjs --dist .",
206
211
  "check:bundle": "node scripts/bundle-size.mjs",
@@ -211,23 +216,23 @@
211
216
  "eval:smoke": "tsx eval/run-smoke.ts",
212
217
  "eval:perf": "tsx eval/run-perf.ts",
213
218
  "eval:report": "tsx eval/report.ts",
214
- "check:core": "npm run format:check && npm run check:providers-generated && npm run check:docs && npm run check:changes && npm run check:operator-ui && npm run check:clerk-sdk && npm run check:lint && npm run check:unused && npm run typecheck && npm run test && npm run build && npm run check:declarations && npm run check:bundle && npm run check:examples",
219
+ "check:core": "pnpm run format:check && pnpm run check:providers-generated && pnpm run check:docs && pnpm run check:changes && pnpm run check:operator-ui && pnpm run check:clerk-sdk && pnpm run check:lint && pnpm run check:unused && pnpm run typecheck && pnpm run test && pnpm run build && pnpm run check:declarations && pnpm run check:bundle && pnpm run check:examples",
215
220
  "check:fast": "node scripts/check-fast.mjs",
216
- "check": "npm run check:core && npm run test:browser",
217
- "release:check": "npm run check && npm run check:security && npm run check:package",
218
- "prepack": "npm run check",
221
+ "check": "pnpm run check:core && pnpm run test:browser",
222
+ "release:check": "pnpm run check && pnpm run check:security && pnpm run check:package",
223
+ "prepack": "pnpm run check",
219
224
  "check:changes": "node scripts/changelog.mjs --check && node scripts/check-node-suites.mjs && node --test scripts/changelog.test.mjs",
220
225
  "changelog:assemble": "node scripts/changelog.mjs",
221
226
  "providers:generate": "tsx scripts/generate-providers.mjs",
222
227
  "check:providers-generated": "tsx scripts/generate-providers.mjs --check",
223
- "prebuild": "node scripts/generate-version.mjs && npm run build:operator-ui",
224
- "pretest": "node scripts/generate-version.mjs && npm run build:operator-ui",
225
- "pretest:node": "node scripts/generate-version.mjs && npm run build:operator-ui",
226
- "pretest:workers": "node scripts/generate-version.mjs && npm run build:operator-ui",
227
- "pretest:browser": "npm run build:operator-ui",
228
- "pretypecheck": "node scripts/generate-version.mjs && npm run build:operator-ui",
229
- "precheck:bundle": "npm run build:operator-ui",
230
- "precheck:fast": "npm run check:operator-ui",
228
+ "prebuild": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
229
+ "pretest": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
230
+ "pretest:node": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
231
+ "pretest:workers": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
232
+ "pretest:browser": "pnpm run build:operator-ui",
233
+ "pretypecheck": "node scripts/generate-version.mjs && pnpm run build:operator-ui",
234
+ "precheck:bundle": "pnpm run build:operator-ui",
235
+ "precheck:fast": "pnpm run check:operator-ui",
231
236
  "eval:regrade": "tsx eval/regrade.ts",
232
237
  "eval:compare": "tsx eval/compare.ts",
233
238
  "format": "oxfmt --write .",
@@ -263,8 +268,8 @@
263
268
  "@cloudflare/codemode": "^0.5.0",
264
269
  "@cloudflare/vitest-pool-workers": "^0.18.8",
265
270
  "@cloudflare/workers-types": "^4.20250101.0 || ^5.0.0",
266
- "@fontsource-variable/geist": "^5.3.0",
267
- "@fontsource-variable/geist-mono": "^5.3.0",
271
+ "@fontsource-variable/hanken-grotesk": "^5.3.0",
272
+ "@fontsource-variable/jetbrains-mono": "^5.3.0",
268
273
  "@playwright/test": "^1.62.0",
269
274
  "@radix-ui/react-dialog": "^1.2.0",
270
275
  "@radix-ui/react-slot": "^1.4.0",
@@ -273,7 +278,6 @@
273
278
  "@tailwindcss/oxide": "^4.3.3",
274
279
  "@tanstack/react-query": "^5.104.1",
275
280
  "@tanstack/react-router": "^1.170.41",
276
- "@tanstack/react-table": "^8.21.3",
277
281
  "@types/node": "^22.0.0",
278
282
  "@types/react": "^19.3.0",
279
283
  "@types/react-dom": "^19.3.0",
@@ -42,13 +42,19 @@ tokens, upgrading, and diagnosis with `connecta doctor` to their procedures.
42
42
  - Organize agent pools by connecta's agent pool layout:
43
43
  `node_modules/@zackbart/connecta/documentation/auth.md#organizing-an-agents-pools`
44
44
  ([online](https://github.com/zackbart/connecta/blob/main/documentation/auth.md#organizing-an-agents-pools)).
45
- Each agent keeps one Connecta connection whose client picks the pool per
46
- turn: base pool `<agent>` (shared connectors, no `owner`) outside a
47
- one-on-one, and `<agent>-<user>` (the base plus that user's own connector
48
- ids, `owner` set to their Workspace address) only with that user. Never list
49
- another person in a `<agent>-<user>` pool: its per-user connectors act as
50
- that user for every member. Never add a second Connecta connection or mount
51
- downstream tools directly.
45
+ Each agent keeps one Connecta connection whose harness, never the model,
46
+ picks the pool per turn. Tiers are nested pools of shared connectors with
47
+ no `owner`, each spreading the tool list below. Recommended names are
48
+ `<agent>` for the lowest and `<agent>-<tier>` above it; any named pool,
49
+ including an existing `team` or `leadership` pool, may be a tier if all its
50
+ human members are cleared for it. A chat gets the most capable tier everyone
51
+ present is cleared for, and the lowest when anyone present is unknown.
52
+ `<agent>-<user>` (that user's highest tier plus their own connector ids,
53
+ `owner` set to their Workspace address) is used only in a one-on-one with
54
+ that user. List only cleared people in a tier, and never another person in
55
+ a `<agent>-<user>` pool: its per-user connectors act as that user for every
56
+ member. Never add a second Connecta connection or mount downstream tools
57
+ directly.
52
58
  - Brand the operator UI in `operatorUi({ branding })`: product and owner names,
53
59
  description, favicon, and `theme` (`accent`, `radius`, `fontFamily`,
54
60
  `monoFamily`, `colorScheme`). Ask the deployment's owner for their brand
@@ -55,6 +55,8 @@ npm start
55
55
  ```
56
56
 
57
57
  The local commands read the process environment; they do not load `.env`.
58
+ To run them with the values in `.env`, export it into the shell first:
59
+ `set -a; . ./.env; set +a`.
58
60
  Compose reads `.env` for the container commands below. Keep the returned
59
61
  secret in a client secret store and out of source control and logs. A
60
62
  rotation cannot recover an old secret; only the hash persists. An agent has no
@@ -118,9 +120,9 @@ server, then copy the old file into the database once, before the first start:
118
120
  npx connecta migrate-state .connecta-state.json .connecta.sqlite
119
121
  ```
120
122
 
121
- In the container, run it against the volume, e.g. `docker compose run --rm
122
- connecta npx connecta migrate-state /data/connecta-state.json
123
- /data/connecta.sqlite`. It copies every live entry with its expiry, keeps any
123
+ In the container, mount the old file and import it into the volume:
124
+ `docker compose run --rm -v "$PWD/.connecta-state.json:/import/state.json:ro"
125
+ connecta npx connecta migrate-state /import/state.json /data/connecta.sqlite`. It copies every live entry with its expiry, keeps any
124
126
  key the database already holds, and never changes the old file; delete that
125
127
  once the deployment is verified. The 0.28 activity log
126
128
  (`.connecta-activity.jsonl`) is not imported; history starts fresh.
@@ -139,9 +141,9 @@ off. `.env.example` lists each one, and `npm run typecheck` checks every module
139
141
  whether or not it is switched on.
140
142
 
141
143
  The template explicitly enables `ui: operatorUi()` from
142
- `@zackbart/connecta/ui`. Open `http://localhost:8787/` and supply a
143
- declared agent's token to inspect Connections. Sign in with Clerk for human
144
- connection management. Omit that option and import for an API-only
144
+ `@zackbart/connecta/ui`. Open `http://localhost:8787/` and sign in with
145
+ Clerk as a maintainer to inspect Connections and manage connections. Agent
146
+ `cta_` tokens are refused by every human route, the operator UI included. Omit that option and import for an API-only
145
147
  server. OAuth callbacks remain in core even with no UI.
146
148
 
147
149
  The page labels each tool as a read or write and each endpoint as writable or
@@ -215,13 +217,13 @@ Keep this key outside the database. Losing it makes saved values unreadable;
215
217
  upgrades must reuse it. The shipped `time` connector declares no credential
216
218
  slot. Add `credential: { label: "API token" }` to an `api()` connector and read
217
219
  it through `await ctx.credential?.get()`, or use a Notion
218
- connector with `auth: { type: "token" }`, which declares its own slot. Authorized humans manage the slot inside that
219
- connection on `/`; there is no separate Credentials tab.
220
+ connector with `auth: { type: "token" }`, which declares its own slot. Maintainers manage the slot on that
221
+ connector's Connection tab (`/connectors/<id>`); there is no separate Credentials tab.
220
222
 
221
223
  In 0.25.0, this vault also seals downstream OAuth tokens on their first read.
222
224
  That is a one-way state migration for those tokens: rolling back to 0.24.x
223
225
  requires authorizing each OAuth connector again. See the
224
- [0.25.0 changelog](../../CHANGELOG.md#0250--2026-09-23) before upgrading a
226
+ [0.25.0 changelog](https://github.com/zackbart/connecta/blob/main/CHANGELOG.md#0250--2026-09-23) before upgrading a
225
227
  deployment with existing OAuth connections.
226
228
 
227
229
  A saved replacement takes effect on the next call. Connecta tests credentials
@@ -273,10 +275,11 @@ from `CONNECTA_TOKEN`; it never accepts the secret as a command-line argument.
273
275
  Remote URLs must use HTTPS.
274
276
 
275
277
  A fully-wired deployment reports exactly the same line as a bare one —
276
- connector count, QuickJS executed, six tools, plus any catalog drift:
278
+ connector count, the executor, the tool count, the negotiated MCP version, and
279
+ the package version:
277
280
 
278
281
  ```text
279
- Connecta doctor passed: 1 connector(s), QuickJS executed, prescribed six-tool surface.
282
+ Connecta doctor passed: 1 connector(s), QuickJS executed, prescribed 6-tool surface, MCP <version>, package <version>.
280
283
  ```
281
284
 
282
285
  `QuickJS` is this deployment's sandbox, reported by the deployment itself —
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@clerk/backend": "^3.12.0",
21
- "@zackbart/connecta": "0.33.0",
21
+ "@zackbart/connecta": "0.34.1",
22
22
  "quickjs-emscripten": "0.32.0"
23
23
  },
24
24
  "devDependencies": {
@@ -92,8 +92,8 @@ export default defineConfig((env: Env) => {
92
92
  // /mcp/<name>, and "agent:<name>" for a declared agent at /agent/<name>.
93
93
  // A member connects their own account on the pool's personal connectors.
94
94
  // `npm run doctor` checks /agent/local-machine with its token. The starter
95
- // pool is the agent's base pool (shared connectors, no owner), named after
96
- // the agent as the agent pool layout requires.
95
+ // pool is the agent's base pool, its lowest tier (shared connectors, no
96
+ // owner), named after the agent as the agent pool layout requires.
97
97
  pools: { "local-machine": { tools: ["time"], members: ["agent:local-machine"] } },
98
98
  // Machine clients are agents declared here by name, each with one cta_
99
99
  // token. Issue or rotate one locally with