@zackbart/connecta 0.28.1 → 0.30.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 (332) hide show
  1. package/CHANGELOG.md +855 -5
  2. package/README.md +125 -116
  3. package/bin/connecta.mjs +121 -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/argument-redaction.js +230 -0
  12. package/dist/auth/clerk-sdk/client.d.ts +65 -0
  13. package/dist/auth/clerk-sdk/client.js +5 -0
  14. package/dist/auth/clerk-sdk/generated.js +1845 -0
  15. package/dist/auth/clerk-transport.js +19 -0
  16. package/dist/auth/clerk.d.ts +17 -7
  17. package/dist/auth/clerk.js +189 -107
  18. package/dist/auth/cloudflare-access.js +25 -26
  19. package/dist/auth/downstream-client-metadata.d.ts +29 -0
  20. package/dist/auth/downstream-client-metadata.js +133 -0
  21. package/dist/auth/downstream-oauth.js +1584 -1580
  22. package/dist/auth/downstream-revocation.js +106 -0
  23. package/dist/auth/oauth-token-response.js +231 -0
  24. package/dist/auth/oauth-v2-migration.js +116 -0
  25. package/dist/auth/static-oauth.js +93 -71
  26. package/dist/auth-elicitation.js +288 -0
  27. package/dist/authorization-handoff.js +111 -0
  28. package/dist/branding.d.ts +8 -16
  29. package/dist/branding.js +26 -59
  30. package/dist/byte-read-response.js +39 -0
  31. package/dist/call-admission.js +12 -16
  32. package/dist/catalog-cache.js +739 -0
  33. package/dist/catalog-drift.d.ts +50 -15
  34. package/dist/catalog-drift.js +365 -128
  35. package/dist/catalog-fingerprint.js +2 -4
  36. package/dist/catalog-freshness.js +13 -0
  37. package/dist/catalog-limits.js +2 -2
  38. package/dist/catalog-service.js +409 -225
  39. package/dist/catalog.js +43 -84
  40. package/dist/concurrency.js +3 -4
  41. package/dist/config-defaults.d.ts +39 -0
  42. package/dist/config-defaults.js +46 -0
  43. package/dist/config-schema.d.ts +181 -0
  44. package/dist/config-schema.js +435 -0
  45. package/dist/config-value-sources.js +102 -0
  46. package/dist/config.d.ts +633 -0
  47. package/dist/config.js +508 -0
  48. package/dist/connector-access.d.ts +1 -0
  49. package/dist/connector-access.js +13 -15
  50. package/dist/connector-caller.d.ts +8 -0
  51. package/dist/connector-caller.js +15 -6
  52. package/dist/connector-scope.js +1 -1
  53. package/dist/connectors/api-connector.d.ts +59 -7
  54. package/dist/connectors/api-connector.js +106 -19
  55. package/dist/connectors/api.js +4 -1
  56. package/dist/connectors/guarded-fetch.d.ts +144 -0
  57. package/dist/connectors/guarded-fetch.js +87 -38
  58. package/dist/connectors/negotiation-cache.js +46 -0
  59. package/dist/connectors/option-shapes.js +27 -0
  60. package/dist/connectors/remote-mcp.d.ts +30 -4
  61. package/dist/connectors/remote-mcp.js +1774 -320
  62. package/dist/connectors/resource-uri.js +335 -0
  63. package/dist/credential-contract.d.ts +10 -0
  64. package/dist/credential-rules.js +1 -3
  65. package/dist/credential-url.js +108 -0
  66. package/dist/credentials.d.ts +6 -1
  67. package/dist/credentials.js +27 -18
  68. package/dist/d1.d.ts +130 -0
  69. package/dist/d1.js +290 -0
  70. package/dist/describe-config.d.ts +165 -0
  71. package/dist/describe-config.js +315 -0
  72. package/dist/described.js +106 -0
  73. package/dist/downstream-input-context.js +128 -0
  74. package/dist/downstream-input.js +325 -0
  75. package/dist/errors.d.ts +132 -31
  76. package/dist/errors.js +175 -87
  77. package/dist/execute.js +798 -318
  78. package/dist/executor-admission.d.ts +1 -0
  79. package/dist/executor-admission.js +11 -15
  80. package/dist/executor-contract.d.ts +20 -0
  81. package/dist/executor-contract.js +48 -0
  82. package/dist/executor-result.js +30 -13
  83. package/dist/executors/quickjs-child.js +15 -9
  84. package/dist/executors/quickjs-protocol.js +5 -6
  85. package/dist/executors/quickjs-runtime.js +152 -59
  86. package/dist/executors/quickjs.js +49 -39
  87. package/dist/favicon.js +1 -2
  88. package/dist/fix-prompt.js +1 -3
  89. package/dist/guest-runtime.js +238 -0
  90. package/dist/guest-types.d.ts +218 -0
  91. package/dist/guest-types.js +1 -0
  92. package/dist/html-security.js +24 -0
  93. package/dist/identity.js +1 -3
  94. package/dist/inbound-credential.js +52 -0
  95. package/dist/index.d.ts +24 -256
  96. package/dist/index.js +65 -478
  97. package/dist/invocation-auth.js +69 -0
  98. package/dist/invocation.js +262 -79
  99. package/dist/json-schema.d.ts +1 -1
  100. package/dist/mcp-client-context.js +35 -0
  101. package/dist/mcp-result.js +11 -7
  102. package/dist/meta-output.js +61 -0
  103. package/dist/meta-tool-names.d.ts +2 -0
  104. package/dist/meta-tool-names.js +3 -0
  105. package/dist/meta-tools.js +419 -272
  106. package/dist/module-contracts.d.ts +8 -23
  107. package/dist/node.d.ts +0 -2
  108. package/dist/node.js +2 -2
  109. package/dist/oauth-callback-outcome.js +1 -3
  110. package/dist/oauth-handoff.js +194 -0
  111. package/dist/oauth-sealing.js +20 -0
  112. package/dist/operator-record.d.ts +137 -0
  113. package/dist/operator-record.js +420 -0
  114. package/dist/operator-ui/assets.js +31 -0
  115. package/dist/operator-ui/contract.d.ts +72 -0
  116. package/dist/operator-ui/contract.js +1 -0
  117. package/dist/operator-ui/fix-prompts.d.ts +18 -0
  118. package/dist/operator-ui/generated.js +5 -4
  119. package/dist/operator-ui/model.d.ts +12 -87
  120. package/dist/operator-ui/model.js +2 -9
  121. package/dist/operator-ui/setup-commands.js +1 -3
  122. package/dist/operator-ui/view.d.ts +323 -0
  123. package/dist/operator-ui/view.js +62 -189
  124. package/dist/page-styles.js +2 -3
  125. package/dist/program-result.js +5 -0
  126. package/dist/program-source.js +14 -2
  127. package/dist/{exempt-writes.js → program-writes.js} +60 -19
  128. package/dist/provider.d.ts +142 -0
  129. package/dist/provider.js +187 -0
  130. package/dist/providers/_shared/google/result-size.js +57 -0
  131. package/dist/providers/_shared/google/service-account.d.ts +58 -0
  132. package/dist/providers/_shared/google/service-account.js +500 -0
  133. package/dist/providers/_shared/google/workspace.d.ts +276 -0
  134. package/dist/providers/_shared/google/workspace.js +518 -0
  135. package/dist/providers/_shared/request-token.js +83 -0
  136. package/dist/providers/{basecamp.d.ts → basecamp/index.d.ts} +6 -28
  137. package/dist/providers/basecamp/index.js +997 -0
  138. package/dist/providers/basecamp/skill.generated.js +9 -0
  139. package/dist/providers/{breeze.d.ts → breeze/index.d.ts} +2 -2
  140. package/dist/providers/{breeze.js → breeze/index.js} +184 -140
  141. package/dist/providers/breeze/skill.generated.js +9 -0
  142. package/dist/providers/{ccb.d.ts → ccb/index.d.ts} +2 -2
  143. package/dist/providers/{ccb.js → ccb/index.js} +271 -116
  144. package/dist/providers/ccb/skill.generated.js +9 -0
  145. package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
  146. package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
  147. package/dist/providers/cloudflare/skill.generated.js +10 -0
  148. package/dist/providers/docs/index.d.ts +54 -0
  149. package/dist/providers/docs/index.js +1237 -0
  150. package/dist/providers/docs/skill.generated.js +9 -0
  151. package/dist/providers/drive/index.d.ts +53 -0
  152. package/dist/providers/drive/index.js +1523 -0
  153. package/dist/providers/drive/skill.generated.js +9 -0
  154. package/dist/providers/forms/index.d.ts +54 -0
  155. package/dist/providers/forms/index.js +1217 -0
  156. package/dist/providers/forms/skill.generated.js +11 -0
  157. package/dist/providers/github/auth.d.ts +32 -0
  158. package/dist/providers/github/auth.js +361 -0
  159. package/dist/providers/github/hosted.js +218 -0
  160. package/dist/providers/github/index.d.ts +13 -0
  161. package/dist/providers/github/index.js +140 -0
  162. package/dist/providers/github/key.js +100 -0
  163. package/dist/providers/github/rest.js +321 -0
  164. package/dist/providers/github/scope.d.ts +29 -0
  165. package/dist/providers/github/scope.js +124 -0
  166. package/dist/providers/github/skill.generated.js +8 -0
  167. package/dist/providers/gmail/index.d.ts +51 -0
  168. package/dist/providers/gmail/index.js +1436 -0
  169. package/dist/providers/gmail/skill.generated.js +9 -0
  170. package/dist/providers/infisical/index.d.ts +7 -0
  171. package/dist/providers/infisical/index.js +713 -0
  172. package/dist/providers/infisical/skill.generated.js +8 -0
  173. package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
  174. package/dist/providers/linear/index.js +352 -0
  175. package/dist/providers/linear/skill.generated.js +8 -0
  176. package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
  177. package/dist/providers/mixpanel/index.js +416 -0
  178. package/dist/providers/mixpanel/skill.generated.js +9 -0
  179. package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
  180. package/dist/providers/{notion.js → notion/index.js} +226 -239
  181. package/dist/providers/notion/skill.generated.js +10 -0
  182. package/dist/providers/{overflow.d.ts → overflow/index.d.ts} +2 -2
  183. package/dist/providers/{overflow.js → overflow/index.js} +74 -111
  184. package/dist/providers/overflow/skill.generated.js +8 -0
  185. package/dist/providers/{planning-center.d.ts → planning-center/index.d.ts} +2 -2
  186. package/dist/providers/{planning-center.js → planning-center/index.js} +264 -104
  187. package/dist/providers/planning-center/skill.generated.js +10 -0
  188. package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
  189. package/dist/providers/revenuecat/index.js +557 -0
  190. package/dist/providers/revenuecat/skill.generated.js +11 -0
  191. package/dist/providers/sheets/index.d.ts +54 -0
  192. package/dist/providers/sheets/index.js +1237 -0
  193. package/dist/providers/sheets/skill.generated.js +10 -0
  194. package/dist/providers/slides/index.d.ts +53 -0
  195. package/dist/providers/slides/index.js +2645 -0
  196. package/dist/providers/slides/skill.generated.js +9 -0
  197. package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
  198. package/dist/providers/stripe/index.js +266 -0
  199. package/dist/providers/stripe/skill.generated.js +11 -0
  200. package/dist/providers/{tithely.d.ts → tithely/index.d.ts} +2 -2
  201. package/dist/providers/{tithely.js → tithely/index.js} +60 -91
  202. package/dist/providers/tithely/skill.generated.js +8 -0
  203. package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
  204. package/dist/providers/vercel/index.js +1038 -0
  205. package/dist/providers/vercel/mcp-ownership.js +212 -0
  206. package/dist/providers/vercel/skill.generated.js +11 -0
  207. package/dist/registry.d.ts +110 -171
  208. package/dist/registry.js +588 -927
  209. package/dist/request-state.js +21 -0
  210. package/dist/resource-read.js +103 -0
  211. package/dist/result-shapes.js +17 -49
  212. package/dist/retired-toolkits.js +1 -1
  213. package/dist/routes/access-tokens.js +3 -6
  214. package/dist/routes/activity-context.js +21 -0
  215. package/dist/routes/activity-disclosure.js +40 -0
  216. package/dist/routes/activity.js +59 -21
  217. package/dist/routes/actor-labels.js +3 -50
  218. package/dist/routes/connect.js +221 -0
  219. package/dist/routes/credentials.js +15 -27
  220. package/dist/routes/mcp.js +365 -130
  221. package/dist/routes/oauth-client-metadata.js +15 -0
  222. package/dist/routes/oauth-management.js +45 -107
  223. package/dist/routes/oauth.js +110 -57
  224. package/dist/routes/operator.js +3 -3
  225. package/dist/routes/shared.d.ts +25 -64
  226. package/dist/routes/shared.js +160 -80
  227. package/dist/routes/skills.js +30 -0
  228. package/dist/routes/ui-config.js +225 -0
  229. package/dist/routes/ui-data.js +40 -35
  230. package/dist/routes/ui.js +66 -56
  231. package/dist/runtime/admission.js +4 -2
  232. package/dist/runtime/call-admission.js +3 -1
  233. package/dist/runtime/connector-scope.js +1 -4
  234. package/dist/runtime/run.js +10 -39
  235. package/dist/runtime/services.js +12 -117
  236. package/dist/runtime/shared-read.js +1 -3
  237. package/dist/runtime/storage.js +8 -1
  238. package/dist/sent-secrets.d.ts +93 -0
  239. package/dist/sent-secrets.js +1013 -0
  240. package/dist/server.js +28 -71
  241. package/dist/skills.js +416 -174
  242. package/dist/sqlite.d.ts +48 -0
  243. package/dist/sqlite.js +181 -0
  244. package/dist/storage/keys.js +443 -0
  245. package/dist/storage/memory.js +16 -4
  246. package/dist/storage/sql.d.ts +66 -0
  247. package/dist/storage/sql.js +543 -0
  248. package/dist/timeout.js +4 -2
  249. package/dist/tool-name.js +17 -0
  250. package/dist/tool-safety.d.ts +9 -35
  251. package/dist/tool-safety.js +20 -40
  252. package/dist/types.d.ts +336 -56
  253. package/dist/types.js +0 -1
  254. package/dist/ui.d.ts +7 -19
  255. package/dist/ui.js +76 -90
  256. package/dist/url-safety.js +3 -6
  257. package/dist/usage-guide.js +146 -0
  258. package/dist/validate.d.ts +7 -0
  259. package/dist/validate.js +309 -47
  260. package/dist/version.d.ts +1 -7
  261. package/dist/version.js +3 -7
  262. package/dist/worker.d.ts +11 -0
  263. package/dist/worker.js +435 -0
  264. package/documentation/README.md +63 -0
  265. package/documentation/architecture.md +696 -231
  266. package/documentation/auth.md +1069 -546
  267. package/documentation/code-mode.md +662 -356
  268. package/documentation/deploying.md +146 -0
  269. package/documentation/integrating.md +159 -0
  270. package/documentation/meta-tools.md +570 -216
  271. package/documentation/operating.md +135 -0
  272. package/documentation/operator-tests.md +97 -0
  273. package/documentation/operator-ui.md +132 -0
  274. package/documentation/provider-migration-0.29.md +65 -0
  275. package/examples/worker/AGENTS.md +34 -12
  276. package/examples/worker/README.md +293 -255
  277. package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
  278. package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
  279. package/examples/worker/src/connecta.config.ts +151 -0
  280. package/examples/worker/src/index.ts +14 -197
  281. package/examples/worker/wrangler.jsonc +15 -35
  282. package/package.json +126 -54
  283. package/templates/node/.dockerignore +1 -2
  284. package/templates/node/.env.example +20 -21
  285. package/templates/node/AGENTS.md +21 -17
  286. package/templates/node/Dockerfile +3 -5
  287. package/templates/node/README.md +140 -58
  288. package/templates/node/docker-compose.yml +11 -12
  289. package/templates/node/package.json +4 -2
  290. package/templates/node/src/connecta.config.ts +119 -0
  291. package/templates/node/src/index.ts +9 -154
  292. package/templates/node/src/provision-token.ts +17 -0
  293. package/AGENTS.md +0 -170
  294. package/dist/artifacts/connector.d.ts +0 -58
  295. package/dist/artifacts/connector.js +0 -730
  296. package/dist/artifacts/document.js +0 -86
  297. package/dist/artifacts/guide.js +0 -140
  298. package/dist/artifacts/html-scan.js +0 -329
  299. package/dist/artifacts/json.js +0 -78
  300. package/dist/artifacts/kv-store.d.ts +0 -20
  301. package/dist/artifacts/kv-store.js +0 -140
  302. package/dist/artifacts/markdown.js +0 -478
  303. package/dist/artifacts/module.d.ts +0 -37
  304. package/dist/artifacts/module.js +0 -66
  305. package/dist/artifacts/operations.d.ts +0 -197
  306. package/dist/artifacts/operations.js +0 -1002
  307. package/dist/artifacts/refresh.d.ts +0 -55
  308. package/dist/artifacts/refresh.js +0 -236
  309. package/dist/artifacts/routes.js +0 -206
  310. package/dist/artifacts/types.d.ts +0 -214
  311. package/dist/artifacts/types.js +0 -22
  312. package/dist/artifacts/validate.d.ts +0 -62
  313. package/dist/artifacts/validate.js +0 -651
  314. package/dist/artifacts.d.ts +0 -6
  315. package/dist/artifacts.js +0 -9
  316. package/dist/auth/bearer.d.ts +0 -11
  317. package/dist/auth/bearer.js +0 -50
  318. package/dist/providers/basecamp.js +0 -445
  319. package/dist/providers/linear.js +0 -217
  320. package/dist/providers/mixpanel.js +0 -247
  321. package/dist/providers/revenuecat.js +0 -317
  322. package/dist/providers/stripe.js +0 -253
  323. package/dist/providers/vercel.js +0 -1253
  324. package/dist/storage/file.d.ts +0 -15
  325. package/dist/storage/file.js +0 -455
  326. package/ethos.md +0 -93
  327. package/examples/worker/src/cloudflare-kv.ts +0 -43
  328. package/examples/worker/src/d1-activity-row.ts +0 -155
  329. package/examples/worker/src/d1-activity.ts +0 -147
  330. package/examples/worker/src/d1-storage.ts +0 -138
  331. package/examples/worker/src/r2-artifact-blobs.ts +0 -29
  332. package/templates/node/src/file-activity.ts +0 -182
@@ -0,0 +1,17 @@
1
+ /** Trusted local provisioning against the same database the server uses. */
2
+ import { AccessTokenManager } from "@zackbart/connecta/auth/access-tokens";
3
+ import { openSqlite, sqliteStorage } from "@zackbart/connecta/sqlite";
4
+
5
+ const name = process.argv[2];
6
+ if (!name || process.argv.length !== 3) {
7
+ throw new Error('Usage: npm run provision-token -- "machine-name"');
8
+ }
9
+ const database = openSqlite(process.env.CONNECTA_DATABASE || "./.connecta.sqlite");
10
+ try {
11
+ const manager = new AccessTokenManager(sqliteStorage(database));
12
+ const { token } = await manager.create(name, "local-provisioning");
13
+ // The secret is returned once. Keep stdout private; storage holds its hash.
14
+ process.stdout.write(`${token}\n`);
15
+ } finally {
16
+ database.close();
17
+ }
package/AGENTS.md DELETED
@@ -1,170 +0,0 @@
1
- # Working on connecta
2
-
3
- This is the canonical instruction file for coding agents. `CLAUDE.md` is a
4
- symlink to this file so every agent works from the same conventions.
5
-
6
- A single MCP endpoint aggregating downstream connectors (remote MCP servers and
7
- plain HTTP APIs) behind seven meta-tools, `execute_code` among them. Every
8
- deployment configures an executor, and agents reach connectors by writing
9
- JavaScript against it. One fetch-native core on Effect behind a Promise API,
10
- running on both Node and Cloudflare Workers. A program runs read-only and
11
- config-exempt tools; every other write is its own `call_destructive_tool` call,
12
- so the host's permission prompt is the only approval. The code and the guides
13
- describe what exists.
14
-
15
- - **[`ethos.md`](./ethos.md) is the constitution.** It states what connecta is
16
- and isn't, and its decisions table carries a verdict for every shape already
17
- considered — accepted, planned, refused, removed, provisional, or gated.
18
- Check the table before designing or building anything: a `planned` row is a
19
- "yes" that has not shipped, binding on review now and absent from the guides
20
- until it lands, so never document it there as if it exists; a `refused` row
21
- is a "no" with the reason attached, and a `removed` row (toolkits
22
- [#178](https://github.com/zackbart/connecta/issues/178), proactive credential
23
- liveness [#179](https://github.com/zackbart/connecta/issues/179), the classic
24
- executor-free surface
25
- [#273](https://github.com/zackbart/connecta/issues/273)) records a surface
26
- that no longer exists — do not reintroduce it without a new decision.
27
- - There is no TODO.md — the roadmap lives in
28
- [GitHub issues](https://github.com/zackbart/connecta/issues). When you find
29
- TODO items (in code comments, docs, or conversation), don't accumulate them
30
- in a file: turn each one into a GitHub issue that clearly defines what to do
31
- — motivation, behavioral requirements, and acceptance criteria — without
32
- prescribing the implementation.
33
-
34
- ## Verification
35
-
36
- `npm run check` must pass before you claim anything is done — `check:docs` →
37
- `check:operator-ui` → `check:lint` → `check:unused` → `typecheck` → `test`
38
- (both vitest projects) → `test:browser` (the operator UI in Chromium; run
39
- `npm run test:browser:install` once per machine, since `check` is also what
40
- `npm pack` runs) → `build` (which prunes unreachable declarations) →
41
- `check:declarations` (no Effect type in what ships) → `check:bundle` (per-entry
42
- gzip caps in `scripts/bundle-budget.json`) → `check:examples`. It is also the
43
- `prepack` hook. `npm run release:check` adds `check:security` and `check:package` and is
44
- what CI runs on every pull request, on `main`, and again on publish; use it
45
- when touching packaging, dependencies, or exports.
46
-
47
- ## The map
48
-
49
- - [`ethos.md`](./ethos.md) — what connecta is, what it refuses to be, the
50
- decisions table, and the invariants every change must preserve. Check it
51
- before building something new; "we already decided not to" is a real answer
52
- there, and its planned/removed/provisional verdicts override anything staler.
53
- - [`documentation/`](./documentation/) — four guides for agents working on the
54
- repo: `architecture.md`, `meta-tools.md`, `code-mode.md`, and `auth.md`.
55
- Everything else — connectors, providers, admission, storage, the operator
56
- UI, operations — is documented where it lives, in the source and its tests.
57
- The guides that once covered those survive only in git history, which is
58
- worth mining for rationale and worth nothing where it disagrees with
59
- `ethos.md` or the code. Start with `architecture.md`.
60
- - [`README.md`](./README.md) — the human-facing overview.
61
- - [`templates/node/`](./templates/node/) — the one standalone Node deployment
62
- shape copied by `connecta init`, Docker-ready rather than Docker-only. Keep
63
- it small and prescribed. There are exactly two deployment shapes, this one
64
- and [`examples/worker/`](./examples/worker/); a third scaffold that is a
65
- diff away from one of them is the shape
66
- [#344](https://github.com/zackbart/connecta/issues/344) deleted.
67
-
68
- **Read `ethos.md` before changing a subsystem, and its guide when it has one.**
69
-
70
- ## Deployment setup
71
-
72
- `connecta init [directory]` is the golden path. It copies `templates/node/`,
73
- pins the generated deployment to the CLI package's exact version, restores the
74
- template `.gitignore` and the `CLAUDE.md` symlink, and refuses to merge into an
75
- existing path.
76
- `connecta doctor` verifies a running deployment's health, executor, and exact
77
- seven-tool surface. The template carries its own `Dockerfile` and
78
- `docker-compose.yml`, so the generated project is the container: setup changes
79
- must keep the root README, the template (source, container files, and README),
80
- and the `scripts/check-package.mjs` smoke — which builds and runs that
81
- container when Docker is available — aligned. Do not add a second initializer,
82
- a second container recipe, or another “recommended” project shape.
83
-
84
- ## Where new code goes
85
-
86
- Two boundaries CI enforces that are not obvious from reading a file:
87
-
88
- - **Import-graph purity.** Nothing reachable from `src/index.ts` may import a
89
- `node:` builtin — the core is Web-API only so it runs unchanged on Workers.
90
- `src/node.ts`, `src/storage/file.ts`, and the QuickJS process-pool entry
91
- (`src/executors/quickjs.ts` + child) are the Node-touching paths and must stay
92
- unreachable from the root entry. `test/purity.test.ts` walks the import graph
93
- and fails otherwise. Need a Node API? It goes behind an explicit Node-only
94
- subpath (`/node` or `/quickjs`), never the root. `effect/testing` is banned
95
- from `src/` on the same terms — its test clocks and layers have no business
96
- in a runtime graph — and the purity walk catches it. The same walk keeps
97
- the root entry to `effect` itself and lets only `src/runtime/run.ts` start
98
- a fiber.
99
- - **Optional modules.** Core owns catalog discovery, execution, invocation, and
100
- enforcement. UI, activity history, encrypted credentials, and bearer auth
101
- implementations stay behind explicit subpaths and outside the root import
102
- graph. Use the typed `ui`, `activity`, and `vault` slots; do not add a generic
103
- plugin registry or runtime installation.
104
- - **The published surface.** Platform-specific storage adapters live in
105
- `examples/worker/`, never in `src/` and never in the `exports` map. That
106
- example does ship in the tarball, Cloudflare KV and D1 adapters included —
107
- it is the Workers starting template a consumer copies, and copying it is the
108
- point — but every `exports` target resolves into `dist/`, so those adapters
109
- are readable reference source and not an importable subpath. What is
110
- forbidden is a platform-bound adapter becoming importable from the package,
111
- not a file appearing in the artifact. `@clerk/backend` and
112
- `quickjs-emscripten` are optional peers behind the `./auth/clerk` and
113
- `./quickjs` subpaths, and `@cloudflare/codemode` is the third, peered
114
- without a subpath because a Worker deployment imports it directly. None may
115
- become a dependency or install with core. Enforced by `test/package-surface.test.ts` and
116
- `scripts/check-package.mjs`. Anything heavyweight or platform-bound gets a
117
- subpath and an optional peer. The Effect core is the one deliberate
118
- exception: it is the core, so it is a hard dependency rather than a peer,
119
- under the rule in [Conventions](#conventions).
120
-
121
- ## Where new tests go
122
-
123
- Suites live in `test/` and run as two vitest projects (`vitest.config.ts`).
124
- Every `*.test.ts` belongs to exactly one explicit list: runtime-portable suites
125
- in `WORKERS_SUITES`, Node-bound suites in `NODE_ONLY_SUITES` with a reason. The
126
- `node` project runs both lists; the `workers` project re-runs the portable list
127
- inside workerd. `test/suite-partition.test.ts` walks the directory and fails on
128
- an unclassified, double-classified, stale, or reasonless entry.
129
-
130
- ## Conventions
131
-
132
- - **Static analysis.** `npm run check:lint` runs Oxlint's correctness category
133
- only; it does not enforce style. `npm run check:unused` runs Knip's
134
- unused-export and dependency gate. Keep both clean, and prefer removing dead
135
- declarations over suppressing a finding.
136
- - **Effect inside, Promises at the edge.** The core runs on Effect v4 and
137
- exports none of it; [Effect inside](./documentation/architecture.md#effect-inside)
138
- has the shell/core shape, the one runner, and the cross-request rules.
139
- `createConnecta`,
140
- `remoteMcp()`, `api()`, custom connectors, and every published `.d.ts` stay
141
- Promise-based and name no Effect type: a deployment author should never need
142
- a second async paradigm to write a connector, so convert at the boundary,
143
- not in the caller. Effect is a hard dependency pinned to one exact version,
144
- never a range, and compatible with Alchemy's peer requirement, so a deployment
145
- that uses both resolves one Effect rather than two. Modules tagged
146
- `@stability unstable` are allowed behind subpaths: they can break in minor releases,
147
- so an upgrade is its own deliberate pull request, never a drive-by in another
148
- change. `effect/testing` stays out of `src/` (see import-graph purity). The
149
- MCP edges do not move with the core — `@modelcontextprotocol/server` upward,
150
- the SDK client downstream. Replacing either requires separate proof of the
151
- wire contracts and request lifetimes; the stable core release is not that proof.
152
- - **Style.** There is no formatter. Match the surrounding code. The docs voice
153
- is precise, occasionally wry, and always explains *why* — don't flatten it
154
- into boilerplate.
155
- - **Commits.** Imperative summary naming the behavior change, with issue refs in
156
- parens: `Normalize maxResultBytes at every intake point (#32) (#39)`.
157
- - **CHANGELOG.** Each release opens with a narrative paragraph — what this
158
- release is, what breaks, what a deployment can ignore — then
159
- `### Added` / `### Changed` / `### Fixed`.
160
- - **Provider drift.** Run `npm run providers:check` for the credential-free
161
- public check across every maintained provider. It covers official MCP
162
- documentation and OpenAPI contracts and never reads a provider credential.
163
- Remote MCP schemas remain owned by the live `tools/list` response rather than
164
- a vendored copy. Findings are read by a human and become GitHub issues;
165
- nothing files itself. `scripts/drift-check.mjs` is the reference for what
166
- each flag covers.
167
- - **Releases.** `npm run release:check`, tag `v<version>` matching
168
- `package.json` exactly (the publish workflow verifies this and fails
169
- otherwise), and publishing fires on GitHub **Release publication**, not on the
170
- tag push.
@@ -1,58 +0,0 @@
1
- import { type ResolvedTheme } from "../branding.js";
2
- import type { Connector } from "../types.js";
3
- import { type ArtifactOperations } from "./operations.js";
4
- import { type ArtifactRefreshService } from "./refresh.js";
5
- import type { ArtifactAllowlist, ArtifactIssue, ArtifactKind, ArtifactLimits } from "./types.js";
6
- /** What a deployment's render check is handed: exactly what the viewer loads. */
7
- export interface ArtifactRenderCheckInput {
8
- /** The complete frame document, data injected. */
9
- document: string;
10
- /** The Content-Security-Policy the viewer serves it under. */
11
- csp: string;
12
- kind: ArtifactKind;
13
- /** Aborted when the check's 20-second deadline or the call's own passes. */
14
- signal: AbortSignal;
15
- }
16
- export type ArtifactRenderCheckResult = {
17
- ok: true;
18
- warnings?: string[];
19
- } | {
20
- ok: false;
21
- errors: string[];
22
- };
23
- /**
24
- * A real render check — a headless browser, say — run on `validate_artifact`
25
- * and on every write that changes what a page renders. It must answer within
26
- * 20 seconds; a throw or a timeout fails the write as retryable `unavailable`
27
- * and saves nothing.
28
- */
29
- export type ArtifactRenderCheck = (input: ArtifactRenderCheckInput) => Promise<ArtifactRenderCheckResult>;
30
- type RenderVerdict = {
31
- ok: true;
32
- warnings: ArtifactIssue[];
33
- } | {
34
- ok: false;
35
- errors: ArtifactIssue[];
36
- } | {
37
- ok: false;
38
- unavailable: string;
39
- };
40
- /** Run a hook under its 20-second deadline and the call's own signal. Never throws. */
41
- export declare function runRenderCheck(hook: ArtifactRenderCheck, input: {
42
- document: string;
43
- csp: string;
44
- kind: ArtifactKind;
45
- }, callSignal: AbortSignal | undefined): Promise<RenderVerdict>;
46
- export interface ArtifactsConnectorOptions {
47
- operations: ArtifactOperations;
48
- refresh: ArtifactRefreshService;
49
- allowlist: ArtifactAllowlist;
50
- limits: ArtifactLimits;
51
- renderCheck?: ArtifactRenderCheck;
52
- /** Where pages are served, when not the deployment's own origin. */
53
- origin?: string;
54
- /** Resolved deployment theme, available after the module binds to core. */
55
- theme?: () => ResolvedTheme | undefined;
56
- }
57
- export declare function artifactsConnector(options: ArtifactsConnectorOptions): Connector;
58
- export {};