@zackbart/connecta 0.28.0 → 0.29.0

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 (320) hide show
  1. package/CHANGELOG.md +961 -5
  2. package/README.md +62 -39
  3. package/bin/connecta.mjs +110 -139
  4. package/bin/meta-tool-names.d.mts +2 -0
  5. package/bin/meta-tool-names.mjs +9 -0
  6. package/bin/version.mjs +3 -0
  7. package/dist/access-tokens.js +53 -63
  8. package/dist/activity-request.js +8 -0
  9. package/dist/activity.d.ts +76 -42
  10. package/dist/activity.js +110 -42
  11. package/dist/auth/clerk-sdk/client.d.ts +65 -0
  12. package/dist/auth/clerk-sdk/client.js +5 -0
  13. package/dist/auth/clerk-sdk/generated.js +1845 -0
  14. package/dist/auth/clerk-transport.js +19 -0
  15. package/dist/auth/clerk.d.ts +17 -7
  16. package/dist/auth/clerk.js +189 -107
  17. package/dist/auth/cloudflare-access.js +25 -26
  18. package/dist/auth/downstream-client-metadata.d.ts +29 -0
  19. package/dist/auth/downstream-client-metadata.js +133 -0
  20. package/dist/auth/downstream-oauth.js +1632 -1509
  21. package/dist/auth/downstream-revocation.js +106 -0
  22. package/dist/auth/oauth-token-response.js +231 -0
  23. package/dist/auth/oauth-v2-migration.js +116 -0
  24. package/dist/auth/static-oauth.js +526 -0
  25. package/dist/auth-elicitation.js +283 -0
  26. package/dist/branding.d.ts +8 -16
  27. package/dist/branding.js +26 -59
  28. package/dist/byte-read-response.js +39 -0
  29. package/dist/call-admission.js +12 -16
  30. package/dist/catalog-cache.js +739 -0
  31. package/dist/catalog-drift.d.ts +50 -15
  32. package/dist/catalog-drift.js +365 -128
  33. package/dist/catalog-fingerprint.js +2 -4
  34. package/dist/catalog-freshness.js +13 -0
  35. package/dist/catalog-limits.js +2 -2
  36. package/dist/catalog-service.js +368 -224
  37. package/dist/catalog.js +43 -84
  38. package/dist/concurrency.js +3 -4
  39. package/dist/config-defaults.d.ts +39 -0
  40. package/dist/config-defaults.js +46 -0
  41. package/dist/config-schema.d.ts +181 -0
  42. package/dist/config-schema.js +435 -0
  43. package/dist/config-value-sources.js +102 -0
  44. package/dist/config.d.ts +631 -0
  45. package/dist/config.js +503 -0
  46. package/dist/connector-access.d.ts +1 -0
  47. package/dist/connector-access.js +13 -15
  48. package/dist/connector-caller.d.ts +8 -0
  49. package/dist/connector-caller.js +15 -6
  50. package/dist/connector-scope.js +1 -1
  51. package/dist/connectors/api-connector.d.ts +220 -0
  52. package/dist/connectors/api-connector.js +214 -0
  53. package/dist/connectors/api.d.ts +8 -71
  54. package/dist/connectors/api.js +13 -99
  55. package/dist/connectors/guarded-fetch.d.ts +144 -0
  56. package/dist/connectors/guarded-fetch.js +108 -25
  57. package/dist/connectors/negotiation-cache.js +46 -0
  58. package/dist/connectors/option-shapes.js +27 -0
  59. package/dist/connectors/remote-mcp.d.ts +30 -4
  60. package/dist/connectors/remote-mcp.js +1780 -351
  61. package/dist/connectors/resource-uri.js +335 -0
  62. package/dist/credential-contract.d.ts +10 -0
  63. package/dist/credential-rules.js +1 -3
  64. package/dist/credential-url.js +108 -0
  65. package/dist/credentials.d.ts +6 -1
  66. package/dist/credentials.js +27 -18
  67. package/dist/d1.d.ts +130 -0
  68. package/dist/d1.js +290 -0
  69. package/dist/describe-config.d.ts +165 -0
  70. package/dist/describe-config.js +315 -0
  71. package/dist/described.js +106 -0
  72. package/dist/downstream-input-context.js +119 -0
  73. package/dist/downstream-input.js +323 -0
  74. package/dist/errors.d.ts +97 -20
  75. package/dist/errors.js +158 -80
  76. package/dist/execute.js +453 -305
  77. package/dist/executor-admission.d.ts +1 -0
  78. package/dist/executor-admission.js +11 -15
  79. package/dist/executor-contract.d.ts +20 -0
  80. package/dist/executor-contract.js +48 -0
  81. package/dist/executor-result.js +24 -9
  82. package/dist/executors/quickjs-child.js +3 -4
  83. package/dist/executors/quickjs-runtime.js +147 -59
  84. package/dist/executors/quickjs.js +29 -35
  85. package/dist/favicon.js +1 -2
  86. package/dist/fix-prompt.js +1 -3
  87. package/dist/guest-runtime.js +188 -0
  88. package/dist/guest-types.d.ts +176 -0
  89. package/dist/guest-types.js +1 -0
  90. package/dist/html-security.js +24 -0
  91. package/dist/identity.js +1 -3
  92. package/dist/inbound-credential.js +52 -0
  93. package/dist/index.d.ts +25 -257
  94. package/dist/index.js +65 -478
  95. package/dist/invocation-auth.js +69 -0
  96. package/dist/invocation.js +230 -73
  97. package/dist/json-schema.d.ts +1 -1
  98. package/dist/mcp-client-context.js +35 -0
  99. package/dist/mcp-result.js +11 -7
  100. package/dist/meta-output.js +76 -0
  101. package/dist/meta-tool-names.d.ts +2 -0
  102. package/dist/meta-tool-names.js +3 -0
  103. package/dist/meta-tools.js +285 -209
  104. package/dist/module-contracts.d.ts +8 -23
  105. package/dist/node.d.ts +0 -2
  106. package/dist/node.js +2 -2
  107. package/dist/oauth-callback-outcome.js +1 -3
  108. package/dist/oauth-handoff.js +117 -0
  109. package/dist/oauth-partition.js +17 -0
  110. package/dist/oauth-sealing.js +20 -0
  111. package/dist/operator-record.d.ts +137 -0
  112. package/dist/operator-record.js +420 -0
  113. package/dist/operator-ui/assets.js +31 -0
  114. package/dist/operator-ui/contract.d.ts +72 -0
  115. package/dist/operator-ui/contract.js +1 -0
  116. package/dist/operator-ui/fix-prompts.d.ts +18 -0
  117. package/dist/operator-ui/generated.js +5 -4
  118. package/dist/operator-ui/model.d.ts +12 -87
  119. package/dist/operator-ui/model.js +2 -9
  120. package/dist/operator-ui/setup-commands.js +1 -3
  121. package/dist/operator-ui/view.d.ts +323 -0
  122. package/dist/operator-ui/view.js +62 -189
  123. package/dist/page-styles.js +2 -3
  124. package/dist/program-source.js +14 -2
  125. package/dist/{exempt-writes.js → program-writes.js} +55 -18
  126. package/dist/provider.d.ts +142 -0
  127. package/dist/provider.js +187 -0
  128. package/dist/providers/_shared/google/result-size.js +57 -0
  129. package/dist/providers/_shared/google/service-account.d.ts +58 -0
  130. package/dist/providers/_shared/google/service-account.js +500 -0
  131. package/dist/providers/_shared/google/workspace.d.ts +276 -0
  132. package/dist/providers/_shared/google/workspace.js +518 -0
  133. package/dist/providers/basecamp/index.d.ts +43 -0
  134. package/dist/providers/basecamp/index.js +997 -0
  135. package/dist/providers/basecamp/skill.generated.js +9 -0
  136. package/dist/providers/breeze/index.d.ts +34 -0
  137. package/dist/providers/breeze/index.js +1446 -0
  138. package/dist/providers/breeze/skill.generated.js +9 -0
  139. package/dist/providers/ccb/index.d.ts +103 -0
  140. package/dist/providers/ccb/index.js +1725 -0
  141. package/dist/providers/ccb/skill.generated.js +9 -0
  142. package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
  143. package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
  144. package/dist/providers/cloudflare/skill.generated.js +10 -0
  145. package/dist/providers/docs/index.d.ts +54 -0
  146. package/dist/providers/docs/index.js +1237 -0
  147. package/dist/providers/docs/skill.generated.js +9 -0
  148. package/dist/providers/drive/index.d.ts +53 -0
  149. package/dist/providers/drive/index.js +1523 -0
  150. package/dist/providers/drive/skill.generated.js +9 -0
  151. package/dist/providers/forms/index.d.ts +54 -0
  152. package/dist/providers/forms/index.js +1217 -0
  153. package/dist/providers/forms/skill.generated.js +11 -0
  154. package/dist/providers/github/auth.d.ts +32 -0
  155. package/dist/providers/github/auth.js +361 -0
  156. package/dist/providers/github/hosted.js +218 -0
  157. package/dist/providers/github/index.d.ts +13 -0
  158. package/dist/providers/github/index.js +140 -0
  159. package/dist/providers/github/key.js +100 -0
  160. package/dist/providers/github/rest.js +321 -0
  161. package/dist/providers/github/scope.d.ts +29 -0
  162. package/dist/providers/github/scope.js +124 -0
  163. package/dist/providers/github/skill.generated.js +8 -0
  164. package/dist/providers/gmail/index.d.ts +51 -0
  165. package/dist/providers/gmail/index.js +1436 -0
  166. package/dist/providers/gmail/skill.generated.js +9 -0
  167. package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
  168. package/dist/providers/linear/index.js +352 -0
  169. package/dist/providers/linear/skill.generated.js +8 -0
  170. package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
  171. package/dist/providers/mixpanel/index.js +416 -0
  172. package/dist/providers/mixpanel/skill.generated.js +9 -0
  173. package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
  174. package/dist/providers/{notion.js → notion/index.js} +226 -239
  175. package/dist/providers/notion/skill.generated.js +10 -0
  176. package/dist/providers/overflow/index.d.ts +60 -0
  177. package/dist/providers/overflow/index.js +1535 -0
  178. package/dist/providers/overflow/skill.generated.js +8 -0
  179. package/dist/providers/planning-center/index.d.ts +59 -0
  180. package/dist/providers/planning-center/index.js +2199 -0
  181. package/dist/providers/planning-center/skill.generated.js +10 -0
  182. package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
  183. package/dist/providers/revenuecat/index.js +557 -0
  184. package/dist/providers/revenuecat/skill.generated.js +11 -0
  185. package/dist/providers/sheets/index.d.ts +54 -0
  186. package/dist/providers/sheets/index.js +1237 -0
  187. package/dist/providers/sheets/skill.generated.js +10 -0
  188. package/dist/providers/slides/index.d.ts +53 -0
  189. package/dist/providers/slides/index.js +2645 -0
  190. package/dist/providers/slides/skill.generated.js +9 -0
  191. package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
  192. package/dist/providers/stripe/index.js +266 -0
  193. package/dist/providers/stripe/skill.generated.js +11 -0
  194. package/dist/providers/tithely/index.d.ts +49 -0
  195. package/dist/providers/tithely/index.js +1003 -0
  196. package/dist/providers/tithely/skill.generated.js +8 -0
  197. package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
  198. package/dist/providers/vercel/index.js +1038 -0
  199. package/dist/providers/vercel/mcp-ownership.js +212 -0
  200. package/dist/providers/vercel/skill.generated.js +11 -0
  201. package/dist/registry.d.ts +108 -171
  202. package/dist/registry.js +513 -925
  203. package/dist/request-state.js +21 -0
  204. package/dist/resource-read.js +100 -0
  205. package/dist/result-shapes.js +17 -49
  206. package/dist/retired-toolkits.js +1 -1
  207. package/dist/routes/access-tokens.js +3 -6
  208. package/dist/routes/activity-context.js +21 -0
  209. package/dist/routes/activity-disclosure.js +40 -0
  210. package/dist/routes/activity.js +59 -21
  211. package/dist/routes/actor-labels.js +3 -50
  212. package/dist/routes/connect.js +221 -0
  213. package/dist/routes/credentials.js +15 -27
  214. package/dist/routes/mcp.js +356 -130
  215. package/dist/routes/oauth-client-metadata.js +15 -0
  216. package/dist/routes/oauth-management.js +45 -107
  217. package/dist/routes/oauth.js +136 -57
  218. package/dist/routes/operator.js +3 -3
  219. package/dist/routes/shared.d.ts +25 -64
  220. package/dist/routes/shared.js +160 -80
  221. package/dist/routes/skills.js +30 -0
  222. package/dist/routes/ui-config.js +225 -0
  223. package/dist/routes/ui-data.js +40 -35
  224. package/dist/routes/ui.js +66 -56
  225. package/dist/runtime/admission.js +4 -2
  226. package/dist/runtime/call-admission.js +3 -1
  227. package/dist/runtime/connector-scope.js +1 -4
  228. package/dist/runtime/run.js +10 -39
  229. package/dist/runtime/services.js +12 -117
  230. package/dist/runtime/shared-read.js +1 -3
  231. package/dist/runtime/storage.js +8 -1
  232. package/dist/sent-secrets.d.ts +52 -0
  233. package/dist/sent-secrets.js +474 -0
  234. package/dist/server.js +28 -71
  235. package/dist/skills.js +406 -174
  236. package/dist/sqlite.d.ts +48 -0
  237. package/dist/sqlite.js +166 -0
  238. package/dist/storage/keys.js +428 -0
  239. package/dist/storage/memory.js +7 -0
  240. package/dist/storage/sql.d.ts +66 -0
  241. package/dist/storage/sql.js +534 -0
  242. package/dist/timeout.js +4 -2
  243. package/dist/tool-name.js +17 -0
  244. package/dist/tool-safety.d.ts +9 -35
  245. package/dist/tool-safety.js +20 -40
  246. package/dist/types.d.ts +320 -54
  247. package/dist/types.js +0 -1
  248. package/dist/ui.d.ts +7 -19
  249. package/dist/ui.js +76 -90
  250. package/dist/url-safety.js +3 -6
  251. package/dist/usage-guide.js +137 -0
  252. package/dist/validate.d.ts +7 -0
  253. package/dist/validate.js +309 -47
  254. package/dist/version.d.ts +1 -7
  255. package/dist/version.js +3 -7
  256. package/dist/worker.d.ts +11 -0
  257. package/dist/worker.js +434 -0
  258. package/documentation/architecture.md +665 -230
  259. package/documentation/auth.md +962 -458
  260. package/documentation/code-mode.md +501 -312
  261. package/documentation/meta-tools.md +449 -200
  262. package/documentation/operator-tests.md +93 -0
  263. package/documentation/provider-migration-0.29.md +60 -0
  264. package/examples/worker/AGENTS.md +34 -12
  265. package/examples/worker/README.md +286 -255
  266. package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
  267. package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
  268. package/examples/worker/src/connecta.config.ts +151 -0
  269. package/examples/worker/src/index.ts +14 -197
  270. package/examples/worker/wrangler.jsonc +15 -35
  271. package/package.json +125 -35
  272. package/templates/node/.dockerignore +1 -2
  273. package/templates/node/.env.example +20 -21
  274. package/templates/node/AGENTS.md +21 -17
  275. package/templates/node/Dockerfile +3 -5
  276. package/templates/node/README.md +133 -58
  277. package/templates/node/docker-compose.yml +11 -12
  278. package/templates/node/package.json +4 -2
  279. package/templates/node/src/connecta.config.ts +119 -0
  280. package/templates/node/src/index.ts +9 -154
  281. package/templates/node/src/provision-token.ts +17 -0
  282. package/AGENTS.md +0 -170
  283. package/dist/artifacts/connector.d.ts +0 -58
  284. package/dist/artifacts/connector.js +0 -730
  285. package/dist/artifacts/document.js +0 -86
  286. package/dist/artifacts/guide.js +0 -140
  287. package/dist/artifacts/html-scan.js +0 -329
  288. package/dist/artifacts/json.js +0 -78
  289. package/dist/artifacts/kv-store.d.ts +0 -20
  290. package/dist/artifacts/kv-store.js +0 -140
  291. package/dist/artifacts/markdown.js +0 -478
  292. package/dist/artifacts/module.d.ts +0 -37
  293. package/dist/artifacts/module.js +0 -66
  294. package/dist/artifacts/operations.d.ts +0 -197
  295. package/dist/artifacts/operations.js +0 -1002
  296. package/dist/artifacts/refresh.d.ts +0 -55
  297. package/dist/artifacts/refresh.js +0 -236
  298. package/dist/artifacts/routes.js +0 -206
  299. package/dist/artifacts/types.d.ts +0 -214
  300. package/dist/artifacts/types.js +0 -22
  301. package/dist/artifacts/validate.d.ts +0 -62
  302. package/dist/artifacts/validate.js +0 -651
  303. package/dist/artifacts.d.ts +0 -6
  304. package/dist/artifacts.js +0 -9
  305. package/dist/auth/bearer.d.ts +0 -11
  306. package/dist/auth/bearer.js +0 -50
  307. package/dist/providers/linear.js +0 -217
  308. package/dist/providers/mixpanel.js +0 -247
  309. package/dist/providers/revenuecat.js +0 -317
  310. package/dist/providers/stripe.js +0 -253
  311. package/dist/providers/vercel.js +0 -1253
  312. package/dist/storage/file.d.ts +0 -15
  313. package/dist/storage/file.js +0 -455
  314. package/ethos.md +0 -93
  315. package/examples/worker/src/cloudflare-kv.ts +0 -43
  316. package/examples/worker/src/d1-activity-row.ts +0 -155
  317. package/examples/worker/src/d1-activity.ts +0 -147
  318. package/examples/worker/src/d1-storage.ts +0 -138
  319. package/examples/worker/src/r2-artifact-blobs.ts +0 -29
  320. package/templates/node/src/file-activity.ts +0 -182
@@ -0,0 +1,93 @@
1
+ # Operator UI tests
2
+
3
+ `test/fixtures/operator-visual.ts` owns the visual data. It builds the config,
4
+ live overlay, viewer, and legacy auth details through the current server routes,
5
+ using the types in `src/operator-ui/contract.ts` and `model.ts`. Collections use
6
+ their corresponding browser types. `test/operator-visual-fixtures.test.ts`
7
+ validates contract versions, connector IDs, granted tools, classification,
8
+ permissions, provenance, and secret exclusion on Node and Workers. A fixture's
9
+ config cannot silently become a stale copy of the server serializer.
10
+
11
+ `test/browser/operator-visual.spec.ts` intercepts API reads and serves the real
12
+ hashed assets and HTML with the production CSP. Loading responses wait on an
13
+ explicit gate. Error responses use fixed HTTP failures. Screenshots use a fixed
14
+ clock, UTC, en-US, locally hosted fonts, disabled animations, hidden carets,
15
+ and a 1280 × 900 viewport. Narrow fixtures use 390 × 844. Every test waits for
16
+ its state and fonts before capturing.
17
+
18
+ ## Page and state matrix
19
+
20
+ Each row runs empty, loading, error, populated, and restricted-viewer fixtures
21
+ in both light and dark themes, for 120 screenshots.
22
+
23
+ | Page or tab | Empty state | Loading/error request | Restricted viewer |
24
+ | --------------------- | ------------------------------------ | --------------------- | --------------------------------------------------- |
25
+ | Overview | No connectors or attention items | Config | Scoped connectors, no privileged navigation |
26
+ | Connectors | No connectors | Config | Read grant and credential slot, no other connectors |
27
+ | Connector Config | Zero-tool connector | Config | Scoped connector snapshot |
28
+ | Connector Tools | Empty catalog | Config | Read tool only |
29
+ | Connector Auth | Deployment-managed auth | Config | Visible slot, deployment-managed auth |
30
+ | Connector Activity | No calls | Activity | Unavailable |
31
+ | Connector Diagnostics | No observed drift/call | Config | Scoped diagnostics |
32
+ | Tools | Empty catalog | Config | Read tool only |
33
+ | Access | No pools or client tokens | Config | No token management |
34
+ | Access tokens | No client tokens | Token list | No token management |
35
+ | Activity | No calls | Activity | Unavailable |
36
+ | Config | Snapshot without connectors or pools | Config | Scoped snapshot |
37
+
38
+ Another 36 screenshots cover configured, mismatched, unreadable and multifield
39
+ credentials; all three OAuth client mechanisms; clean and unobserved drift;
40
+ historical Activity; client setup; schema dialog; read/write filters; expanded
41
+ config provenance; narrow sign-in and Auth; and deployment branding. The base
42
+ populated Activity fixture includes grouped calls, an ungrouped legacy row,
43
+ classification/result size/client facts, and a catalog-change event.
44
+
45
+ Screenshots cover presentation. Keep unit and server tests for INV-6 sentinels,
46
+ secret disclosure, auth and grant boundaries, CSRF, identity fences, cancellation,
47
+ request lifetime, and error sanitization. Keep browser tests for keyboard/focus,
48
+ XSS, real CSP enforcement, and popup lifetimes. A screenshot
49
+ cannot prove these rules.
50
+
51
+ ## Updating Linux snapshots
52
+
53
+ The source of truth is `*-linux.png`, produced on `ubuntu-latest` with the
54
+ lockfile's Playwright Chromium. Both CI workflows use the same runner, Node 22,
55
+ and `npm run test:browser:install -- --with-deps`. macOS runs fixture routing and
56
+ readiness checks but omits screenshot comparison. The update script refuses
57
+ non-Linux hosts. Do not commit Darwin baselines.
58
+
59
+ When Docker is unavailable, use the **Operator snapshots** workflow:
60
+
61
+ ```sh
62
+ git push --force-with-lease origin feat/p4-ui-tests
63
+ gh workflow run operator-snapshots.yml --ref feat/p4-ui-tests
64
+ # Read the completed run ID from the Actions page or gh run list.
65
+ gh run download RUN_ID --name operator-linux-snapshots \
66
+ --dir test/browser/operator-visual.spec.ts-snapshots
67
+ ```
68
+
69
+ The workflow uploads all generated baselines and never commits them. Review the
70
+ images and changed files, commit the intentional changes, and push again. The
71
+ normal CI browser job must compare and pass against that commit. Opening the
72
+ initial PR also runs the update workflow, so the first baselines can be generated
73
+ before the workflow reaches main. Later updates use `workflow_dispatch`.
74
+
75
+ On a matching Linux runner, `npm ci`, install Chromium with the command above,
76
+ then run `npm run test:browser:snapshots`. The normal command is
77
+ `npm run test:browser`. Missing baselines fail CI; retries cannot bless them.
78
+ Set `OPERATOR_VISUAL_INSPECT=1` to retain local screenshots under ignored
79
+ `test-results/` for inspection, without updating committed baselines.
80
+
81
+ ## Real-server flows
82
+
83
+ `test/browser/operator-flows.spec.ts` uses `listen()` from `src/node.ts` with
84
+ loopback TCP servers. It intercepts only Clerk provider traffic with a test
85
+ publishable key; server identity uses the existing `fakeClerkAuth` seam. The
86
+ OAuth provider validates the code exchange and PKCE. Credential Test calls a
87
+ loopback downstream endpoint. Operator APIs, cookie/bearer admission, CSRF,
88
+ assets, handoffs, callbacks, and encrypted storage use production code.
89
+
90
+ The flows cover Clerk sign-in/reload/sign-out; OAuth connect/consent/callback/
91
+ connected reread/reload; and credential save/test/replace/remove. They collect
92
+ CSP violations across every document and popup, and fail on unexpected network
93
+ traffic. No credentials enter visual fixtures or screenshot baselines.
@@ -0,0 +1,60 @@
1
+ # Notion, Vercel and Cloudflare migration for 0.29
2
+
3
+ This is the Phase 1 item 5d migration input for [Phase 5 release #709](https://github.com/zackbart/connecta/issues/709).
4
+ Deploy it with the consolidated 0.29 release, not while the rework is in progress.
5
+ BePresent and One&Many use Notion and Cloudflare; their actual grants and
6
+ connector ids must be checked in deployment configuration before that release.
7
+ The provider audit establishes available auth modes, not production OAuth grants.
8
+
9
+ All three providers now default to hosted MCP. `surface: "api"` explicitly
10
+ selects a REST complement and accepts only its API-specific options. The old
11
+ Vercel/Cloudflare API modes are no longer complete alternatives; Notion retains
12
+ all operations required by its distinct integration identity. Adding `surface: "api"` keeps
13
+ REST reads/gaps but does not restore removed duplicates. For both sets of
14
+ capabilities, configure both connectors under distinct ids and authorize each.
15
+
16
+ ```ts
17
+ connectors: [
18
+ notion("notion", { purpose: "Workspace content" }),
19
+ notion("notion_rest", { surface: "api", purpose: "Internal integration content and exact REST operations" }),
20
+ cloudflare("cloudflare", { purpose: "Estate mutations", auth: { type: "credential" } }),
21
+ cloudflare("cloudflare_rest", { surface: "api", purpose: "Estate reads and byte/header operations", accountId: "account-id", zoneId: "zone-id" }),
22
+ ]
23
+ ```
24
+
25
+ Notion preserves headless/internal-integration capabilities. Add explicit
26
+ `surface: "api"` to retain that identity and migrate old REST names to
27
+ `integration_*`, for example `search` to `integration_search`, `create_page`
28
+ to `integration_create_page`, and `query_data_source` to
29
+ `integration_query_data_source`. Its token/sharing boundary stays intact.
30
+ Hosted MCP acts as an OAuth user, has its own grant, and cannot adopt an internal
31
+ token. Use it for user-owned work and hosted-only capabilities; authorize it
32
+ explicitly if those are needed. Do not replace a bot with a user as an auth fix.
33
+ All REST pagination, exact JSON blocks/properties, trash/restore and bot-owned
34
+ content writes remain available.
35
+
36
+ For Cloudflare, migrate ordinary JSON writes to hosted `search` then `execute`.
37
+ A scoped API token can authorize hosted MCP without interactive OAuth; configure
38
+ that credential independently even if it has the same value as the REST token.
39
+ Keep REST reads in read-only programs. Global API Key/email and R2 jurisdiction/storage-class
40
+ JSON mutations, plus byte/header-compatible uploads, stay in the explicit REST
41
+ complement. Replace `update_r2_bucket` with `cloudflare_api_mutate` using
42
+ `PATCH /accounts/{accountId}/r2/buckets/{bucketName}` and the header
43
+ `cf-r2-storage-class` set to `Standard` or `InfrequentAccess`. Omit the body;
44
+ include `cf-r2-jurisdiction` only when the bucket needs it. This remains a write.
45
+ `execute` remains a write even when its program only calls GET.
46
+ Trusted pools may execute writes; read-only pools use direct host-approved writes.
47
+
48
+ For Vercel, authorize the owning teams in hosted OAuth, migrate discovery/logs,
49
+ domain listing/adding, deployment cancellation and file uploads to live MCP
50
+ schemas, and keep the independently authorized REST complement for value-safe
51
+ project environment variables (including `upsert: false` create-only writes), domain verification/removal and deployment
52
+ deletion. Promotion now uses hosted `request_promote` from the rolling-releases
53
+ category. Raw hatches refuse all published REST counterparts, including project
54
+ creation/update. Do not copy REST argument
55
+ shapes into vendor tools, even when a tool name is unchanged.
56
+
57
+ The per-provider tables map every removed name and explain retained API tools:
58
+ [Notion](https://github.com/zackbart/connecta/blob/main/src/providers/notion/reconciliation.md),
59
+ [Vercel](https://github.com/zackbart/connecta/blob/main/src/providers/vercel/reconciliation.md), and
60
+ [Cloudflare](https://github.com/zackbart/connecta/blob/main/src/providers/cloudflare/reconciliation.md).
@@ -2,12 +2,18 @@
2
2
 
3
3
  This repository is deployment configuration, not a copy of Connecta itself.
4
4
 
5
- - Edit `src/index.ts` for connectors, authentication, storage, and public URL.
6
- - Keep `cloudflareAccessAuth()` as the inbound auth provider. Cloudflare Access
7
- authenticates the request before the Worker runs; do not add JWT parsing or a
8
- second Worker-side identity gate.
5
+ - Edit `src/connecta.config.ts` for connectors, authentication, storage, public
6
+ URL, and optional modules. `src/index.ts` only starts it. Set plain vars
7
+ `CONNECTA_ACTIVITY="on"` for preserved activity.
8
+ - Keep `cloudflareAccessAuth()` for human identity and `accessTokens(storage)`
9
+ always installed over the same `CONNECTA_DB` for machines. Cloudflare Access
10
+ admits the request before the Worker runs; a service identity alone is
11
+ refused inside connecta. Do not add JWT parsing or another identity gate.
12
+ Grant `identity.accessTokenManagement` explicitly to interactive operators;
13
+ this example permits every signed-in human to manage connectors and tokens.
9
14
  - Attach Access to the Worker itself, not only its hostname. Enable Managed
10
- OAuth and Dynamic Client Registration on that Access application.
15
+ OAuth on that Access application. CIMD is the spec's preferred client
16
+ registration; enable DCR as the fallback Access currently requires.
11
17
  - Managed OAuth's **Allowed redirect URIs** must contain all three entries
12
18
  below. This is application configuration under
13
19
  `oauth_configuration.dynamic_client_registration.allowed_uris`, not an
@@ -25,24 +31,40 @@ This repository is deployment configuration, not a copy of Connecta itself.
25
31
  allowed. If a client presents a different callback, copy that exact URI from
26
32
  its registration attempt and add the narrowest matching entry rather than
27
33
  broadening the allowlist to an entire origin.
28
- - Keep `new DynamicWorkerExecutor({ loader: env.LOADER })` loader-only. Do not
34
+
35
+ - Keep `workerExecutor({ loader: env.LOADER })` loader-only. Do not
29
36
  add bindings, modules, or outbound access to generated code.
37
+ Import it from `@zackbart/connecta/worker`; direct upstream
38
+ `new DynamicWorkerExecutor()` construction throws at boot. Keep the
39
+ `@cloudflare/codemode` optional peer installed.
30
40
  - Keep credentials in Worker secrets. Never commit credential values, Access
31
41
  service-token secrets, or `CREDENTIAL_ENCRYPTION_KEY`.
42
+ - All state lives in the one D1 database bound as `CONNECTA_DB`, through
43
+ `d1Storage` (and `d1ActivityStore`) from `@zackbart/connecta/d1`. Do not add
44
+ a KV namespace, a second database, or a copied storage adapter; connecta
45
+ creates its own tables. The only KV binding is in `kv-to-d1.wrangler.jsonc`,
46
+ which is never deployed. It exists for the one-shot copy from a 0.28 Workers
47
+ KV deployment (README.md § "Upgrading from 0.28"). Back up, block traffic
48
+ and background writers, drain, wait for stable KV, copy and verify, deploy
49
+ while maintenance remains, then mark cutover before reopening traffic. Never
50
+ rerun stale KV after cutover. Retain backups before removing KV.
32
51
  - Add application logic only inside deliberate `api()` connector handlers.
33
52
  Do not copy or modify Connecta package internals here.
34
53
  - Prefer `api()` when the agent must see an exact reviewed capability set;
35
54
  `remoteMcp()` follows the downstream server's evolving tool catalog.
36
- - Use Access service credentials for `connecta doctor` and unattended clients.
37
- A configured Connecta bearer cannot cross the Access edge alone. Connecta-issued
38
- tokens are removed. UI, vault, and activity use explicit optional imports;
55
+ - Unattended clients and `connecta doctor` need Access service credentials
56
+ plus a stored `cta_` bearer. Set `CF_ACCESS_CLIENT_ID`,
57
+ `CF_ACCESS_CLIENT_SECRET`, and `CONNECTA_TOKEN` together for doctor.
58
+ Bootstrap tokens through the Access-authenticated operator page or trusted
59
+ `AccessTokenManager.create` tooling against this same D1 storage, as README
60
+ "Machine tokens" describes. Never configure a static bearer or open startup.
61
+ UI, vault, and activity use explicit optional imports;
39
62
  auth changes require code-derived shared or personal management permissions.
40
63
  - Brand the operator UI in `operatorUi({ branding })`: product and owner names,
41
64
  description, favicon, and `theme` (`accent`, `radius`, `fontFamily`,
42
65
  `monoFamily`, `colorScheme`). Ask the deployment's owner for their brand
43
- rather than leaving the default. The commented block above
44
- `ui: operatorUi()` in `src/index.ts` shows the shape; README "UI and
45
- encrypted credentials" covers the rest.
66
+ rather than leaving the default. README "UI and encrypted credentials" shows
67
+ the shape.
46
68
  - After configuration changes, typecheck: inside the connecta repository that
47
69
  is `npm run check:examples`; a copied deployment runs its own `tsc --noEmit`.
48
70
  After deployment, connect both Claude and ChatGPT to `<PUBLIC_URL>/mcp` and