@zackbart/connecta 0.37.0 → 0.38.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 (183) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +2 -2
  3. package/bin/connecta.mjs +1 -39
  4. package/bin/version.mjs +1 -1
  5. package/dist/access-tokens.js +2 -4
  6. package/dist/agent-identity.js +1 -1
  7. package/dist/auth/clerk-sdk/generated.js +2 -1
  8. package/dist/auth/cloudflare-access.d.ts +3 -1
  9. package/dist/auth/cloudflare-access.js +22 -11
  10. package/dist/auth/downstream-oauth.js +195 -270
  11. package/dist/auth/downstream-revocation.js +1 -1
  12. package/dist/auth/oauth-grant.js +11 -0
  13. package/dist/auth/oauth-token-response.js +1 -1
  14. package/dist/auth/vercel-agent.js +2 -1
  15. package/dist/auth-elicitation.js +2 -2
  16. package/dist/branding.d.ts +1 -15
  17. package/dist/branding.js +2 -2
  18. package/dist/bytes.js +42 -0
  19. package/dist/call-admission-context.js +2 -5
  20. package/dist/call-admission.js +5 -0
  21. package/dist/call-recovery.js +0 -3
  22. package/dist/catalog-cache.js +26 -7
  23. package/dist/catalog-fingerprint.js +2 -18
  24. package/dist/catalog-revision.js +9 -0
  25. package/dist/catalog-service.js +51 -20
  26. package/dist/config-defaults.d.ts +1 -0
  27. package/dist/config-defaults.js +1 -0
  28. package/dist/config-schema.d.ts +1 -1
  29. package/dist/config-schema.js +6 -2
  30. package/dist/config.d.ts +41 -14
  31. package/dist/config.js +21 -71
  32. package/dist/connector-caller.js +1 -1
  33. package/dist/connectors/api-connector.js +4 -3
  34. package/dist/connectors/guarded-fetch.d.ts +0 -6
  35. package/dist/connectors/guarded-fetch.js +1 -11
  36. package/dist/connectors/remote-mcp.js +93 -69
  37. package/dist/connectors/resource-uri.js +0 -4
  38. package/dist/credentials.js +3 -0
  39. package/dist/d1.d.ts +0 -89
  40. package/dist/d1.js +0 -34
  41. package/dist/downstream-input.js +2 -2
  42. package/dist/execute.js +161 -116
  43. package/dist/executor-result.js +2 -1
  44. package/dist/executors/quickjs-runtime.js +2 -25
  45. package/dist/executors/quickjs.js +1 -1
  46. package/dist/guest-runtime.js +5 -3
  47. package/dist/guest-types.d.ts +5 -5
  48. package/dist/http/client.js +1 -1
  49. package/dist/http/errors.js +2 -2
  50. package/dist/http/json-schema.js +1 -1
  51. package/dist/http/node-transport.js +0 -1
  52. package/dist/http/oauth.js +1 -1
  53. package/dist/http/paging.js +6 -9
  54. package/dist/http/provider.js +1 -1
  55. package/dist/http/safety.js +1 -1
  56. package/dist/http/services.js +1 -8
  57. package/dist/http/tools.js +1 -7
  58. package/dist/http/vendor.js +7 -7
  59. package/dist/identity.js +2 -6
  60. package/dist/index.js +1 -2
  61. package/dist/invocation-auth.js +2 -1
  62. package/dist/invocation.js +8 -2
  63. package/dist/meta-tools.js +27 -27
  64. package/dist/native-tools.js +2 -1
  65. package/dist/oauth-handoff.js +2 -2
  66. package/dist/operation-vocabulary.js +1 -1
  67. package/dist/operator-record.d.ts +8 -2
  68. package/dist/operator-record.js +18 -50
  69. package/dist/operator-ui/contract.d.ts +4 -2
  70. package/dist/operator-ui/generated.js +3 -3
  71. package/dist/operator-ui/model.d.ts +7 -2
  72. package/dist/program-writes.js +3 -8
  73. package/dist/provider-call.js +0 -7
  74. package/dist/provider.d.ts +1 -1
  75. package/dist/providers/_shared/google/kit.js +1 -6
  76. package/dist/providers/_shared/google/service-account.js +1 -3
  77. package/dist/providers/_shared/google/workspace.d.ts +1 -1
  78. package/dist/providers/_shared/guide.js +3 -0
  79. package/dist/providers/_shared/json.js +12 -0
  80. package/dist/providers/_shared/rest/compact-index.js +1 -1
  81. package/dist/providers/_shared/rest/kit.js +1 -3
  82. package/dist/providers/_shared/rest/operation-index.js +1 -3
  83. package/dist/providers/_shared/rest/value-safety.js +26 -28
  84. package/dist/providers/breeze/api.js +2 -7
  85. package/dist/providers/breeze/index.js +4 -2
  86. package/dist/providers/breeze/tools.js +3 -4
  87. package/dist/providers/ccb/api.js +1 -6
  88. package/dist/providers/ccb/index.js +2 -1
  89. package/dist/providers/ccb/tools.js +1 -6
  90. package/dist/providers/cloudflare/api.js +2 -2
  91. package/dist/providers/cloudflare/index.js +2 -1
  92. package/dist/providers/cloudflare/safety.js +3 -3
  93. package/dist/providers/docs/tools.js +2 -10
  94. package/dist/providers/drive/tools.js +12 -25
  95. package/dist/providers/forms/tools.js +1 -9
  96. package/dist/providers/gmail/tools.js +5 -21
  97. package/dist/providers/overflow/api.js +1 -3
  98. package/dist/providers/overflow/index.js +2 -1
  99. package/dist/providers/overflow/tools.js +3 -7
  100. package/dist/providers/planning-center/api.js +2 -1
  101. package/dist/providers/planning-center/lib/constants.d.ts +1 -1
  102. package/dist/providers/planning-center/lib/json-api.js +1 -9
  103. package/dist/providers/planning-center/tools.js +2 -1
  104. package/dist/providers/sheets/tools.js +1 -9
  105. package/dist/providers/slides/tools.js +4 -13
  106. package/dist/providers/stripe/index.js +2 -1
  107. package/dist/providers/stripe/safety.js +2 -2
  108. package/dist/providers/tithely/api.js +2 -7
  109. package/dist/providers/tithely/index.js +3 -2
  110. package/dist/providers/tithely/tools.js +7 -5
  111. package/dist/providers/vercel/api.js +1 -6
  112. package/dist/providers/vercel/lib/pin.js +1 -1
  113. package/dist/providers/vercel/safety.js +1 -1
  114. package/dist/providers/vercel/tools.js +2 -1
  115. package/dist/redaction-marker.js +2 -2
  116. package/dist/registry.d.ts +4 -1
  117. package/dist/registry.js +35 -22
  118. package/dist/request-principal.js +15 -2
  119. package/dist/request-state.js +2 -2
  120. package/dist/routes/access-tokens.js +1 -1
  121. package/dist/routes/activity-disclosure.js +1 -1
  122. package/dist/routes/connect.js +2 -2
  123. package/dist/routes/credentials.js +1 -1
  124. package/dist/routes/dispatch.js +10 -0
  125. package/dist/routes/mcp.js +23 -21
  126. package/dist/routes/oauth-management.js +1 -1
  127. package/dist/routes/operator.js +53 -7
  128. package/dist/routes/shared.d.ts +8 -8
  129. package/dist/routes/shared.js +22 -15
  130. package/dist/routes/ui-config.js +6 -6
  131. package/dist/routes/ui-data.js +2 -2
  132. package/dist/routes/ui.js +9 -4
  133. package/dist/runtime/call-admission.js +1 -1
  134. package/dist/runtime/call.js +1 -1
  135. package/dist/runtime/settlement.js +1 -1
  136. package/dist/runtime/shared-read.js +2 -15
  137. package/dist/sent-secrets.d.ts +14 -6
  138. package/dist/sent-secrets.js +231 -85
  139. package/dist/server.js +4 -4
  140. package/dist/skills.js +8 -35
  141. package/dist/sqlite.d.ts +0 -19
  142. package/dist/sqlite.js +2 -83
  143. package/dist/storage/keys.js +29 -124
  144. package/dist/storage/sql-native.js +14 -111
  145. package/dist/storage/sql.d.ts +1 -24
  146. package/dist/storage/sql.js +1 -12
  147. package/dist/tool-error.js +4 -0
  148. package/dist/types.d.ts +4 -3
  149. package/dist/ui.js +3 -0
  150. package/dist/url-safety.js +0 -4
  151. package/dist/usage-guide.js +2 -2
  152. package/dist/version.d.ts +1 -1
  153. package/dist/version.js +1 -1
  154. package/dist/worker.js +1 -1
  155. package/documentation/README.md +6 -42
  156. package/documentation/architecture.md +190 -507
  157. package/documentation/auth.md +172 -58
  158. package/documentation/code-mode.md +98 -66
  159. package/documentation/deploying.md +19 -40
  160. package/documentation/integrating.md +8 -19
  161. package/documentation/meta-tools.md +23 -6
  162. package/documentation/migration-0.33.md +5 -5
  163. package/documentation/migration-0.34.md +2 -4
  164. package/documentation/migration-retired-layouts.md +74 -0
  165. package/documentation/operator-tests.md +19 -119
  166. package/documentation/operator-ui.md +46 -8
  167. package/documentation/provider-auth-migration.md +4 -10
  168. package/documentation/provider-migration-0.29.md +4 -15
  169. package/examples/worker/AGENTS.md +4 -6
  170. package/examples/worker/README.md +20 -115
  171. package/guides/connecting-agents.md +7 -30
  172. package/guides/how-it-works.md +2 -2
  173. package/guides/safety-and-trust.md +4 -1
  174. package/package.json +19 -19
  175. package/templates/node/README.md +9 -26
  176. package/templates/node/package.json +1 -1
  177. package/dist/auth/oauth-v2-migration.js +0 -135
  178. package/dist/provider-call-facts.d.ts +0 -115
  179. package/dist/provider-call.d.ts +0 -112
  180. package/dist/storage/d1-copy.js +0 -255
  181. package/dist/storage/sql-schema.d.ts +0 -6
  182. package/examples/worker/kv-to-d1.wrangler.jsonc +0 -26
  183. package/examples/worker/scripts/copy-kv-to-d1.mjs +0 -162
@@ -113,7 +113,8 @@ Connecta passes exactly one provider, named `connecta`. An executor must:
113
113
 
114
114
  1. **Expose each provider as a guest global** whose properties are its `fns`,
115
115
  called with the program's arguments and awaited. Connecta supplies `search`,
116
- `describe`, `call`, `read`, `result`, `skill`, and `emit`.
116
+ `describe`, `call`, `read`, `result`, `skill`, and `emit`; the prelude also
117
+ binds the guest's `skills` alias to `skill`.
117
118
  2. **Evaluate `prelude` after the provider globals exist and before the
118
119
  program.** It is trusted host code that installs the immutable namespace
119
120
  and waits for emission acknowledgements. Capture runner intrinsics first;
@@ -202,7 +203,8 @@ belonged to shortcut dispatch and stay retired; nothing reuses those ids.
202
203
 
203
204
  ## The surface
204
205
 
205
- Seven functions: `search`, `describe`, `call`, `read`, `result`, `skill`, and `emit`.
206
+ Seven functions: `search`, `describe`, `call`, `read`, `result`, `skill`, and `emit`,
207
+ plus `skills`, an undeclared alias bound to the same host function as `skill`.
206
208
  All return awaitable values; emission also works without `await`. The namespace
207
209
  has no inherited members. Unknown properties are undefined, and calling them
208
210
  fails as a guest `TypeError`. The host also dispatches only own members of `fns`.
@@ -413,7 +415,11 @@ The `get_result` meta-tool is removed.
413
415
  top-level `skills`, within the admitted connector view. It reads the registry
414
416
  behind native `skills/get` and `resources/read`, including opted-in downstream
415
417
  skills. It returns
416
- `{ name, format: "text", text }`; an unknown name is `not_found`.
418
+ `{ name, format: "text", text }`; an unknown name is `not_found`. It also
419
+ accepts the top-level tool's `{ name }` object, and `connecta.skills` is an
420
+ undeclared alias of `connecta.skill` with the same host-call accounting, because
421
+ models copy the `skills` tool's shape into programs. Any other argument is
422
+ `invalid_args`, with a message naming `connecta.skill("usage")`.
417
423
 
418
424
  ### Parallel calls
419
425
 
@@ -673,11 +679,26 @@ fields. Program-authored projection saved bytes; host heuristics could drop
673
679
  deliberately returned fields. Helpers need [#222](https://github.com/zackbart/connecta/issues/222)
674
680
  evidence that programs fail to project.
675
681
 
676
- **R2.** The boundary is 24,000 serialized characters (~6k tokens), shared with
677
- emitted text. An oversized return is stashed as compact JSON through the same
682
+ **R2.** The boundary is `execute.maxResultChars` serialized characters, shared
683
+ with emitted text: 24,000 (~6k tokens) by default, configurable from 4,000 to
684
+ 1,000,000. Raise it when agents need large results whole and the model's
685
+ context can afford them, since every paging round trip costs a model step.
686
+ The response carries a return twice (text content and `structuredContent`),
687
+ and Connecta has no response-size limit of its own, so the client's limits
688
+ apply; `admission.requests.maxBodyBytes` bounds request bodies only. Claude Code,
689
+ for one, passes at most 50,000 characters of text and can reject a larger result
690
+ with no content (see [truncated direct-call results](./meta-tools.md#truncated-direct-call-results)),
691
+ so keep the cap below what every client of the deployment accepts. Redaction scans the whole envelope once, so its cost grows with the cap.
692
+ The cap does not change stash paging: pages still obey the stashed call's
693
+ `maxResultBytes` and the 32 KiB bridge ceiling.
694
+ An oversized return is stashed as compact JSON through the same
678
695
  result store as direct calls. The returned notice carries `truncated`, `resultId`,
679
696
  `totalBytes`, `hint`, `nextOffset: 0`, and an executable `nextAction` that pages
680
- with `connecta.result`. It also retains `totalChars` and a bounded `preview`.
697
+ with `connecta.result`. Its page size is `floor((maxResultChars - 1024) / 6)`
698
+ bytes, so a page fits the next program's return even when every byte escapes to
699
+ six characters (3,829 bytes by default), at most the stashed call's
700
+ `maxResultBytes` and the 32 KiB bridge ceiling; direct-call notices use the same
701
+ size. It also retains `totalChars` and a bounded `preview`.
681
702
  The recovery action and hint precede the preview, so clients that spill results
682
703
  after the first 2,000 characters retain the handle and the instruction.
683
704
  Small returns pass through unchanged; Connecta does not select fields.
@@ -790,8 +811,8 @@ a successful result, appended to `content` after the JSON envelope, which gains
790
811
  response (`R6`). `structuredContent` stays the envelope alone — emission is
791
812
  presentation, not a second data channel.
792
813
 
793
- **M3.** Text emission shares `R2`'s 24,000 serialized-character cap, less 512
794
- characters reserved for the envelope (23,488 for emitted text). Its
814
+ **M3.** Text emission shares `R2`'s `execute.maxResultChars` cap, less 512
815
+ characters reserved for the envelope (23,488 for emitted text by default). Its
795
816
  serialized block size reduces the return budget, and oversized text fails with
796
817
  `result_too_large`. Image/audio blocks use the separate transport budget and
797
818
  reach the model as real MCP media content, including when `emit` is not awaited.
@@ -874,12 +895,24 @@ including discovery. The response returns `executor_cancelled` without awaiting
874
895
  a wedged executor or `acquire()` that ignores its signal. It releases the lease;
875
896
  a late-granted lease releases on arrival. Nothing request-bound survives the
876
897
  request. Whether guest computation stops is the executor's (`X3`).
898
+ Final program-return paging remains request-owned after the executor lease is
899
+ released. Cancellation stops its storage waits and starts no further stash
900
+ operations when a pending storage response arrives. An in-process caller receives
901
+ `executor_cancelled` with any completed writes counted in `writes.succeeded`.
877
902
 
878
903
  Programs and direct calls use the same invocation deadline and stages. A call's
879
904
  `timeoutMs` wins, then `calls.defaultTimeoutMs`, then `execute.hostCallTimeoutMs`
880
- (default 15,000). A guest may request a longer individual call, but the sandbox
905
+ (default 15,000). `connecta.result`, `connecta.skill` and `connecta.read` always
906
+ use `execute.hostCallTimeoutMs`. The `execute_code` description advertises the
907
+ `connecta.call` default as `<n>s/host call`, or, when `calls.defaultTimeoutMs`
908
+ differs, both deadlines, for example `25s/call (15s result/skill/read)`.
909
+ A guest may request a longer individual call, but the sandbox
881
910
  and request ceilings still bound the whole run. Timeout details are agent-facing;
882
911
  operator records retain only checked classifications and numeric facts.
912
+ Result processing, including stash reservation, uses the same remaining call
913
+ budget and request cancellation. If it cannot finish after a successful call,
914
+ the error is non-retryable `result_processing_failed`; the write already
915
+ happened and stays successful in program write accounting.
883
916
  A dispatched write timeout becomes `write_outcome_unknown` and retains its
884
917
  deadline details even when the program catches the failure. A completed
885
918
  maintained-provider call that reports a timeout keeps `timeout` when its complete
@@ -905,17 +938,17 @@ deadline past the ceiling means raising the ceiling too.
905
938
  **L4.** Per-execution bounds that are contract, identical in both executors
906
939
  because connecta enforces them above the sandbox:
907
940
 
908
- | Bound | Value |
909
- | --------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
910
- | Host calls per execution, shared by every guest call except `emit` | 20 by default, `execute.maxHostCalls` |
911
- | Writes per run on a writable endpoint, on top of the host calls they also spend (`W10`) | 10 by default, `execute.maxWrites` |
912
- | Deadline per host call | 15 s, `execute.hostCallTimeoutMs`; one deadline covers catalog resolution, admission, and the connector call |
913
- | Discovery page | ≤ 100 tools, ≤ 256,000 serialized bytes |
914
- | `describe` addresses | ≤ 100 |
915
- | `describe` nearby suggestions | ≤ 3 canonical addresses per failed entry |
916
- | Caller text echoed by `describe` recovery | ≤ 512 UTF-8 bytes per field, plus `…` |
917
- | Result | 24,000 serialized characters |
918
- | Logs presented to the model | 4,000 characters |
941
+ | Bound | Value |
942
+ | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
943
+ | Host calls per execution, shared by every guest call except `emit` | 20 by default, `execute.maxHostCalls` |
944
+ | Writes per run on a writable endpoint, on top of the host calls they also spend (`W10`) | 10 by default, `execute.maxWrites` |
945
+ | Deadline per host call | `connecta.call`: its `timeoutMs`, else `calls.defaultTimeoutMs`, else `execute.hostCallTimeoutMs` (15 s); `result`, `skill` and `read`: `execute.hostCallTimeoutMs`. One deadline covers catalog resolution, admission, the connector call, and result processing |
946
+ | Discovery page | ≤ 100 tools, ≤ 256,000 serialized bytes |
947
+ | `describe` addresses | ≤ 100 |
948
+ | `describe` nearby suggestions | ≤ 3 canonical addresses per failed entry |
949
+ | Caller text echoed by `describe` recovery | ≤ 512 UTF-8 bytes per field, plus `…` |
950
+ | Result | 24,000 serialized characters by default, `execute.maxResultChars` (4,000–1,000,000) |
951
+ | Logs presented to the model | 4,000 characters |
919
952
 
920
953
  For any tool whose output declares `page`, continue while `page.hasMore` is true.
921
954
  When approaching the program's host-call limit, return `page.nextCursor` before
@@ -1278,50 +1311,49 @@ Titles name clauses; executor-independent clauses run in both arms.
1278
1311
  `test/codemode-compat.test.ts` pins upstream shape compatibility, minified upstream
1279
1312
  rejection, and branded adapter acceptance across module copies.
1280
1313
 
1281
- | Clauses | Test |
1282
- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1283
- | `P1`, `P5` | both guest-contract executors (TypeScript syntax, trailing terminators, wrapper recovery), `test/program-source.test.ts` (which semicolons and wrappers are recovered), `test/quickjs-executor.node.test.ts` (`normalizeCode`) |
1284
- | `P2`, `X5` | `test/guest-api-contract.test.ts` (Dynamic globals plus loader-only filesystem, HTTP, environment, egress, DNS, and local `data:` boundaries), `test/guest-api-contract-quickjs.node.test.ts` (exact absent globals and blocked imports), `test/quickjs-child-stderr.node.test.ts` (a child-process environment holding only `TZ=UTC`), `test/deployment-shapes.node.test.ts` (loader-only Worker construction) |
1285
- | `P3`, `X9` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` |
1286
- | `P4` | `test/guest-api-contract.test.ts` (no cross-run leakage), `test/execute.test.ts` (one catalog load per connector per execution) |
1287
- | `A1`, `A2` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (canonical addressing), `test/server.test.ts` (bounded live connector inventory) |
1288
- | `S1`, `S1a`, `S2` | `test/guest-api-contract.test.ts` (flat page, connector guides, schema keys, unfiltered browse), `test/execute.test.ts` (guide pagination/partial/no-match behavior and `$ref`/`allOf`), `test/meta-tools-search.test.ts` (mixed complete/partial ranking, stable pagination, the two safety classes), `test/typescript-signatures.test.ts` (the TypeScript format over provider and pathological schemas, search/describe parity, observed labeling), `test/typescript-signatures-parse.node.test.ts` (every rendering parses) |
1289
- | `S3` | `test/guest-api-contract.test.ts` (typed uncaught bound), `test/execute.test.ts` (count limits, fan-out bound) |
1290
- | `S4` | both guest-contract executors (ordered mixed describe results with unknown-address, unknown-tool suggestion, and catalog-failure details), `test/meta-tools-search.test.ts` (top-level routing, no-suggestion, catalog-failure, and hostile-input bounds) |
1291
- | `S5`, `S6` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (`unwrapMcpResult`, fail-closed annotations, activity parity) |
1292
- | `S7` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (parallel calls and shared admission) |
1293
- | `S8`, `E1`, `X11` | both guest-contract executors (caught call, discovery, utility, removed-function, and forgery cases; typed promise rejections), `test/quickjs-executor.node.test.ts` (oversized messages, private transport, forged outcomes) |
1294
- | `S9` | `test/result-shapes.test.ts` (value exclusion, bounds, merging, LRU and time expiry, runtime isolation, read-only admission, declared precedence, definition invalidation, unwrapped MCP results, discovery provenance, copy isolation, failure isolation) |
1295
- | `S10` | `test/resource-read.test.ts` (qualified routing, whole-connector grants, personal credentials, redaction, admission, timeout, cancellation and downstream MCP reads), both guest-contract executors (successful resource reads and caught/uncaught typed failures) |
1296
- | `E2`, `E8` | `test/guest-api-contract.test.ts` (code → `retryable`, caught, parallel, and uncaught validation recovery, a conflict's bounded `current`), `test/meta-tools-call.test.ts` (direct, destructive, provider fallback), `test/validate.test.ts` (bounded payload-free findings), `test/errors.test.ts` |
1297
- | `E3`, `E4` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (`auth_required`, destructive reroute), `test/identity-write-journey.node.test.ts` (read-only refusals before validation or dispatch, actual QuickJS) |
1298
- | `E5` | `test/guest-api-contract.test.ts` (execution-failure channel, in-flight `cancelled`), `test/execute.test.ts` (admission), `test/executor-admission.test.ts`, `test/quickjs-executor.node.test.ts` (mid-run shutdown) |
1299
- | `E6`, `X8` | `test/guest-api-contract.test.ts` (unknown and inherited members, retained error identities), `test/quickjs-executor.node.test.ts` |
1300
- | `E7` | `test/guest-api-contract.test.ts` (refusals about a `503`-named connector), `test/errors.test.ts` |
1301
- | `R1`, `R2`, `R3`, `R4` | `test/guest-api-contract.test.ts` and `test/guest-api-contract-quickjs.node.test.ts` (small pass-through, shared return paging and unavailable fallback, no repeated writes, live authority), `test/program-result-cases.ts` (reconstruction, redaction, notice survives a 2,000-character spill) |
1302
- | `M6`, `M9` | verdicts; `R2`'s guard, `M1`'s strict typing, and `M2`'s collect-then-deliver are their enforcement |
1303
- | `R5` | `test/guest-api-contract.test.ts`, `test/quickjs-log-limits.node.test.ts` |
1304
- | `R6`–`R8` | `test/guest-api-contract.test.ts` (normal result keys), `test/execute.test.ts` (opt-in operation aggregates, failure paths, payload exclusion) |
1305
- | `Y1`, `Y2`, `Y3` | `test/guest-api-contract.test.ts` (one attempt per call, retryable flags by code) |
1306
- | `Y4` | `test/meta-tools-call.test.ts`, `test/call-admission.test.ts` (one attempt, retry hints, caller reissue) |
1307
- | `L1`, `L2` | `test/guest-api-contract.test.ts` (in-flight call fails `cancelled`), `test/execute.test.ts` (cancels outstanding host calls, discovery included, and refuses discovery after the run; a cancelled wedged executor, or one whose `acquire()` ignores the signal, returns promptly and releases its lease) |
1308
- | `L3`, `X1` | `test/guest-api-contract.test.ts` (short-deadline executors), `test/execute.test.ts` (the watchdog ends a never-settling executor, frees the default pool, spares a slow run, and falls back from an unusable value) |
1309
- | `L4`, `L8` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (shared discovery/call budgets and terminal catch-and-continue loops and queued-write cancellation on both executors), `test/worker-budget-response.node.test.ts` (native handle disposal and admission recovery across completed HTTP responses) |
1310
- | `L5`, `L7`, `X2` | `test/quickjs-executor.node.test.ts` (CPU, heap), `test/execute.test.ts` and `test/executor-admission.test.ts` (bounded admission and queue), `test/executor-requests.test.ts` (queued handoffs and refusal shape across separate workerd requests), `test/request-context.node.test.ts` (queued and QuickJS host-call request context) |
1311
- | `L6`, `X10` | `test/guest-api-contract-quickjs.node.test.ts` and `test/guest-api-contract.test.ts` (whole oversized reads and one-write pageable handles), `test/sqlite-storage.node.test.ts` and `test/kv-to-d1.test.ts` (SQL stash and native D1 fault probes), `test/quickjs-executor.node.test.ts` (bridge and IPC bounds for arguments and result; the address in the over-bound message), `test/quickjs-child-stderr.node.test.ts` (outer reply serialization failure settles the call) |
1312
- | `V1`–`V4` | `test/guest-api-contract.test.ts` (dispatched calls, every refusal class including an address no connector owns, the friction each derives, no event for the execution itself), `test/activity.test.ts` (the shared code → friction table, the identity clamp, the one-attempt floor), `test/browser/operator-ui.spec.ts` (identity changes), `test/sql-storage-contract.ts`, run by `test/sqlite-storage.node.test.ts` (historical activity rows still round-trip) |
1313
- | `V5`, `W9` | `test/program-writes.test.ts` (unawaited program drain, failed-program accounting), `test/identity-write-journey.node.test.ts` (committed ambiguity, reconciliation and physical writes), `test/invocation-pipeline.test.ts` (the gate after validation, an unrecorded refusal) |
1314
- | `W10`, `W12` | `test/identity-write-journey.node.test.ts` (real HTTP/MCP and QuickJS: write budget, read-only discovery and refusal, named guide, pool inheritance/reopening and connector policy), `test/program-writes.test.ts` (construction refusals and classification drift), `test/operator-ui-model.test.ts`, `test/browser/operator-ui.spec.ts` (the badge) |
1315
- | `M1` | `test/guest-api-contract.test.ts` (invalid emits throw catchably, accept nothing), `test/execute-emit.test.ts` (rejected shapes, bounded native snapshots, paging before metadata traversal, and cyclic presentation refusal) |
1316
- | `M2`, `M3` | `test/guest-api-contract.test.ts` (delivery order, truncated return plus delivered blocks), `test/execute-emit.test.ts` (envelope, `structuredContent`, byte-for-byte no-emit path) |
1317
- | `M4` | `test/guest-api-contract.test.ts` (discard is visible), `test/execute-emit.test.ts` (structured and plain paths), `test/quickjs-executor.node.test.ts` (mid-run shutdown) |
1318
- | `M5`, `M7` | `test/execute-emit.test.ts` (both budgets fail the crossing block; host-call budget untouched) |
1319
- | `M8` | two arms passing one case table, `test/codemode-compat.test.ts` |
1320
- | `M10` | `test/execute-emit.test.ts` (aggregate present, numbers only, absent when nothing emitted) |
1321
- | `X4` | `test/guest-api-contract.test.ts` (string logs only), `test/quickjs-executor.node.test.ts` (logs before cancellation), `test/quickjs-child-stderr.node.test.ts` (crash, shutdown, deadline, IPC failure, bounded parent retention), `test/quickjs-log-limits.node.test.ts` (unchanged successful logs) |
1322
- | `X3`, `X6` | `test/quickjs-executor.node.test.ts` (cancels a running child, never-settling await), `test/execute.test.ts` (a wedged executor stops being awaited) |
1323
- | `X7` | `P3`'s tests; the Workers superset is deliberately unused |
1324
-
1325
- The surface itself is checked by `test/server.test.ts` (the exact six-tool list),
1326
- `test/code-first-surface.test.ts` (construction, executor, removed tools, copy, and size),
1314
+ | Clauses | Test |
1315
+ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1316
+ | `P1`, `P5` | both guest-contract executors (TypeScript syntax, trailing terminators, wrapper recovery), `test/program-source.test.ts` (which semicolons and wrappers are recovered), `test/quickjs-executor.node.test.ts` (`normalizeCode`) |
1317
+ | `P2`, `X5` | `test/guest-api-contract.test.ts` (Dynamic globals plus loader-only filesystem, HTTP, environment, egress, DNS, and local `data:` boundaries), `test/guest-api-contract-quickjs.node.test.ts` (exact absent globals and blocked imports), `test/deployment-shapes.node.test.ts` (loader-only Worker construction) |
1318
+ | `P3`, `X9` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` |
1319
+ | `P4` | `test/guest-api-contract.test.ts` (no cross-run leakage), `test/execute.test.ts` (one catalog load per connector per execution) |
1320
+ | `A1`, `A2` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (canonical addressing), `test/server.test.ts` (bounded live connector inventory) |
1321
+ | `S1`, `S1a`, `S2` | `test/guest-api-contract.test.ts` (flat page, connector guides, schema keys, unfiltered browse), `test/execute.test.ts` (guide pagination/partial/no-match behavior and `$ref`/`allOf`), `test/meta-tools-search.test.ts` (mixed complete/partial ranking, stable pagination, the two safety classes), `test/typescript-signatures.test.ts` (the TypeScript format over provider and pathological schemas, search/describe parity, observed labeling) |
1322
+ | `S3` | `test/guest-api-contract.test.ts` (typed uncaught bound), `test/execute.test.ts` (count limits, fan-out bound) |
1323
+ | `S4` | both guest-contract executors (ordered mixed describe results with unknown-address, unknown-tool suggestion, and catalog-failure details), `test/meta-tools-search.test.ts` (top-level routing, no-suggestion, catalog-failure, and hostile-input bounds) |
1324
+ | `S5`, `S6` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (`unwrapMcpResult`, fail-closed annotations, activity parity) |
1325
+ | `S7` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (parallel calls and shared admission) |
1326
+ | `S8`, `E1`, `X11` | both guest-contract executors (caught call, discovery, utility, removed-function, and forgery cases; typed promise rejections), `test/quickjs-executor.node.test.ts` (oversized messages, private transport, forged outcomes) |
1327
+ | `S9` | `test/result-shapes.test.ts` (value exclusion, bounds, merging, LRU and time expiry, runtime isolation, read-only admission, declared precedence, definition invalidation, unwrapped MCP results, discovery provenance, copy isolation, failure isolation) |
1328
+ | `S10` | `test/resource-read.test.ts` (qualified routing, whole-connector grants, personal credentials, redaction, admission, timeout, cancellation and downstream MCP reads), both guest-contract executors (successful resource reads and caught/uncaught typed failures) |
1329
+ | `E2`, `E8` | `test/guest-api-contract.test.ts` (code → `retryable`, caught, parallel, and uncaught validation recovery, a conflict's bounded `current`), `test/meta-tools-call.test.ts` (direct, destructive, provider fallback), `test/validate.test.ts` (bounded payload-free findings), `test/errors.test.ts` |
1330
+ | `E3`, `E4` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (`auth_required`, destructive reroute), `test/identity-write-journey.node.test.ts` (read-only refusals before validation or dispatch, actual QuickJS) |
1331
+ | `E5` | `test/guest-api-contract.test.ts` (execution-failure channel, in-flight `cancelled`), `test/execute.test.ts` (admission), `test/executor-admission.test.ts`, `test/quickjs-executor.node.test.ts` (mid-run shutdown) |
1332
+ | `E6`, `X8` | `test/guest-api-contract.test.ts` (unknown and inherited members, retained error identities), `test/quickjs-executor.node.test.ts` |
1333
+ | `E7` | `test/guest-api-contract.test.ts` (refusals about a `503`-named connector), `test/errors.test.ts` |
1334
+ | `R1`, `R2`, `R3`, `R4` | `test/guest-api-contract.test.ts` and `test/guest-api-contract-quickjs.node.test.ts` (small pass-through, shared return paging and unavailable fallback, no repeated writes, live authority), `test/program-result-cases.ts` (reconstruction, redaction, notice survives a 2,000-character spill) |
1335
+ | `M6`, `M9` | verdicts; `R2`'s guard, `M1`'s strict typing, and `M2`'s collect-then-deliver are their enforcement |
1336
+ | `R5` | `test/guest-api-contract.test.ts` |
1337
+ | `R6`–`R8` | `test/guest-api-contract.test.ts` (normal result keys), `test/execute.test.ts` (opt-in operation aggregates, failure paths, payload exclusion) |
1338
+ | `Y1`, `Y2`, `Y3` | `test/guest-api-contract.test.ts` (one attempt per call, retryable flags by code) |
1339
+ | `Y4` | `test/meta-tools-call.test.ts`, `test/call-admission.test.ts` (one attempt, retry hints, caller reissue) |
1340
+ | `L1`, `L2` | `test/guest-api-contract.test.ts` (in-flight call fails `cancelled`), `test/execute.test.ts` (cancels outstanding host calls, discovery included, and refuses discovery after the run; a cancelled wedged executor, or one whose `acquire()` ignores the signal, returns promptly and releases its lease) |
1341
+ | `L3`, `X1` | `test/guest-api-contract.test.ts` (short-deadline executors), `test/execute.test.ts` (the watchdog ends a never-settling executor, frees the default pool, spares a slow run, and falls back from an unusable value) |
1342
+ | `L4`, `L8` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (shared discovery/call budgets and terminal catch-and-continue loops and queued-write cancellation on both executors) |
1343
+ | `L5`, `L7`, `X2` | `test/quickjs-executor.node.test.ts` (CPU, heap), `test/execute.test.ts` and `test/executor-admission.test.ts` (bounded admission and queue), `test/executor-requests.test.ts` (queued handoffs and refusal shape across separate workerd requests), `test/request-context.node.test.ts` (queued and QuickJS host-call request context) |
1344
+ | `L6`, `X10` | `test/guest-api-contract-quickjs.node.test.ts` and `test/guest-api-contract.test.ts` (whole oversized reads and one-write pageable handles), `test/sqlite-storage.node.test.ts` and `test/storage-sql-d1.test.ts` (SQL stash and native D1 fault probes), `test/quickjs-executor.node.test.ts` (bridge and IPC bounds for arguments and result; the address in the over-bound message) |
1345
+ | `V1`–`V4` | `test/guest-api-contract.test.ts` (dispatched calls, every refusal class including an address no connector owns, the friction each derives, no event for the execution itself), `test/activity.test.ts` (the shared code → friction table, the identity clamp, the one-attempt floor), `test/browser/operator-ui.spec.ts` (identity changes), `test/sql-storage-contract.ts`, run by `test/sqlite-storage.node.test.ts` (historical activity rows still round-trip) |
1346
+ | `V5`, `W9` | `test/program-writes.test.ts` (unawaited program drain, failed-program accounting), `test/identity-write-journey.node.test.ts` (committed ambiguity, reconciliation and physical writes), `test/invocation-pipeline.test.ts` (the gate after validation, an unrecorded refusal) |
1347
+ | `W10`, `W12` | `test/identity-write-journey.node.test.ts` (real HTTP/MCP and QuickJS: write budget, read-only discovery and refusal, named guide, pool inheritance/reopening and connector policy), `test/program-writes.test.ts` (construction refusals and classification drift), `test/browser/operator-ui.spec.ts` (the badge) |
1348
+ | `M1` | `test/guest-api-contract.test.ts` (invalid emits throw catchably, accept nothing), `test/execute-emit.test.ts` (rejected shapes, bounded native snapshots, paging before metadata traversal, and cyclic presentation refusal) |
1349
+ | `M2`, `M3` | `test/guest-api-contract.test.ts` (delivery order, truncated return plus delivered blocks), `test/execute-emit.test.ts` (envelope, `structuredContent`, byte-for-byte no-emit path) |
1350
+ | `M4` | `test/guest-api-contract.test.ts` (discard is visible), `test/execute-emit.test.ts` (structured and plain paths), `test/quickjs-executor.node.test.ts` (mid-run shutdown) |
1351
+ | `M5`, `M7` | `test/execute-emit.test.ts` (both budgets fail the crossing block; host-call budget untouched) |
1352
+ | `M8` | two arms passing one case table, `test/codemode-compat.test.ts` |
1353
+ | `M10` | `test/execute-emit.test.ts` (aggregate present, numbers only, absent when nothing emitted) |
1354
+ | `X4` | `test/guest-api-contract.test.ts` (string logs only), `test/quickjs-executor.node.test.ts` (logs before cancellation) |
1355
+ | `X3`, `X6` | `test/quickjs-executor.node.test.ts` (cancels a running child, never-settling await), `test/execute.test.ts` (a wedged executor stops being awaited) |
1356
+ | `X7` | `P3`'s tests; the Workers superset is deliberately unused |
1357
+
1358
+ The surface itself is checked by `test/server.test.ts` (the exact six-tool list)
1327
1359
  and `test/program-writes.test.ts` (deployment policy and classification construction refusals).
@@ -64,12 +64,9 @@ platform, proxy or adapter cap still wins. See
64
64
  A Node host serving `connecta.fetch` without `listen()` has no owned sender:
65
65
  every maintained-provider write, every reviewed POST read and every remote MCP
66
66
  write is refused before sending. Downstream OAuth credential POSTs also require
67
- that sender; discovery GETs retain native fetch. Resource writes worked in 0.34.1;
68
- credential POSTs used native fetch through 0.34.1. For example, an `assistant` using
67
+ that sender. For example, an `assistant` using
69
68
  `vercel_api_read` to POST `/v1/registrar/domains/availability` needs that
70
- transport even on a read-only endpoint. A Node deployment using only the root
71
- entry refuses those requests before sending them. Workers use their native
72
- fetch transport.
69
+ transport even on a read-only endpoint. Workers use their native fetch transport.
73
70
 
74
71
  By default, Node's `listen()` handles SIGTERM and SIGINT: it stops accepting
75
72
  connections, closes idle connections and accepted sockets without a first HTTP
@@ -81,9 +78,8 @@ keepalive before shutdown is unchanged. Its shutdown deadline defaults to ten se
81
78
  (`shutdownTimeoutMs`). For example, retain the template's `listen(connecta, port)` when running it under
82
79
  Docker Compose so `docker compose stop` uses this cleanup.
83
80
 
84
- The owned Node sender connects directly by default. To send maintained-provider
85
- requests (including reads), remote MCP writes and OAuth credential POSTs through an HTTP(S) CONNECT
86
- proxy, set `proxy` explicitly on `listen`:
81
+ The owned Node sender connects directly by default. For HTTP(S) CONNECT proxy
82
+ egress, set `proxy` explicitly on `listen`:
87
83
 
88
84
  ```ts
89
85
  listen(connecta, { port: 3000, proxy: "http://proxy.example.com:8080" });
@@ -108,9 +104,7 @@ replayed by the sender, including after HTTP 421, a reset or a 503. An uncertain
108
104
  refresh requires authorization again; Connecta blocks the spent refresh
109
105
  fingerprint rather than redeeming it twice. Once a refresh claim has been
110
106
  submitted, that protection remains conservative even if proxy setup later fails.
111
- Use a fresh authorization flow to reconcile. OAuth discovery remains on native
112
- fetch and needs its own host proxy policy. These credential POST requirements
113
- change the native-fetch behavior of 0.34.1.
107
+ Use a fresh authorization flow to reconcile.
114
108
 
115
109
  ## Start on Workers
116
110
 
@@ -136,10 +130,8 @@ verified ingress behavior and the cases that still require verification.
136
130
  Agents use `/agent/<pool>`, which connecta authenticates with the `cta_` token
137
131
  alone and which ignores Access context entirely
138
132
  ([agent endpoints](./auth.md#agent-endpoints)). Behind Access, the edge must
139
- let those requests through without an Access login or service token. The P0
140
- probe ([observations](./architecture.md#production-access-bypass-for-agent-endpoints))
141
- verified this shape on 2026-10-15. The Worker example's `alchemy.run.ts`
142
- declares both applications:
133
+ let those requests through without an Access login or service token.
134
+ The Worker example's `alchemy.run.ts` declares both applications:
143
135
 
144
136
  1. Keep the Worker-level application, whose destination is
145
137
  `{ "type": "worker", "worker_id": "<the Worker script tag>" }`, exactly as
@@ -170,12 +162,9 @@ declares both applications:
170
162
  3. Point each agent at `https://<host>/agent/<pool>` with
171
163
  `Authorization: Bearer cta_…` and drop its `CF-Access-Client-Id` and
172
164
  `CF-Access-Client-Secret` headers. The pool must list `"agent:<name>"`.
173
- 4. Verify after the change has settled. Access changes took 15–19 seconds to
174
- settle in the probe, and while they propagate the edge can answer with
175
- transient 500 (`error code: 1104`) or 404 (`error code: 1042` or `1043`)
176
- responses, and in one round a 403 on a bypassed path after more than 30
177
- seconds. Do not rely on a fixed wait: repeat these checks until they agree
178
- for several consecutive rounds. Without credentials, `/agent/<pool>`
165
+ 4. Verify after the change has settled. Do not rely on a fixed wait: repeat
166
+ these checks until they agree for several consecutive rounds. Without
167
+ credentials, `/agent/<pool>`
179
168
  reaches connecta (its 401 carries `WWW-Authenticate: Bearer`, not Access's
180
169
  403 page), while `/mcp` and `/` still get Access's refusal. Then run
181
170
  `connecta doctor --pool <pool>` with the agent's token.
@@ -185,11 +174,8 @@ Connecta answers there only an issued token of an agent listed in the pool,
185
174
  and gives every other spelling of the agent namespace a 404 before auth,
186
175
  because Access matches `/agent/*` after resolving dot segments, folding case,
187
176
  decoding unreserved escapes, and collapsing a leading `//`, while the Worker
188
- sees the raw path. Two cases were not tested: a human's `CF_Authorization`
189
- cookie on a bypassed path, whose `ctx.access` identity is unknown (connecta
190
- never reads it at `/agent/*`), and Custom Domains, which use the same
191
- documented hostname-and-path form but were not observed; only `workers.dev`
192
- was probed. Pinning the Worker-level application's AUD on human routes is
177
+ sees the raw path. Connecta never reads `ctx.access` at `/agent/*`.
178
+ Pinning the Worker-level application's AUD on human routes is
193
179
  recommended hardening that connecta does not yet do.
194
180
 
195
181
  ## Compose capabilities and access
@@ -314,22 +300,16 @@ Bump the exact package pin, read the [changelog](../CHANGELOG.md) for every
314
300
  intervening release, and apply the relevant migration before startup. `init`
315
301
  does not merge changes into an existing deployment.
316
302
 
303
+ Before upgrading past 0.37.1 with pre-0.29 state, follow
304
+ [Retired layout migrations](./migration-retired-layouts.md). Version 0.37.1 is
305
+ the last bridge for KV → D1, JSON → SQLite, and OAuth layout-2 conversions.
306
+
317
307
  For an existing Node deployment, add the Node entry's pinned optional peer
318
308
  before starting the upgraded package: `npm install --save-exact undici@6.29.1`.
319
309
  The current Node template already declares this dependency.
320
310
 
321
- For 0.35.0, serve Node with `listen` from `@zackbart/connecta/node`, as the
322
- current template does. Without `listen()`, a host serving `connecta.fetch` has
323
- no owned sender: every maintained-provider write, every reviewed POST read and
324
- every remote MCP write is refused before sending, although each worked in 0.34.1.
325
- Downstream OAuth token, registration and revocation POSTs also require that
326
- sender. With `listen()`, every maintained-provider request, reads included,
327
- remote MCP writes and those credential POSTs use the owned sender. Configure
328
- `listen(..., { proxy })` explicitly for HTTP(S) CONNECT proxy egress; ambient
329
- `NODE_USE_ENV_PROXY`, `HTTP_PROXY`, `HTTPS_PROXY` and host proxy dispatchers do
330
- not configure it. Remote MCP reads and OAuth discovery GETs retain native fetch
331
- and need their own host proxy policy. An uncertain refresh requires fresh
332
- authorization rather than replaying the spent token. See [Start on Node](#start-on-node).
311
+ For Node upgrades, retain the template's `listen` entrypoint and apply the
312
+ [Node transport and proxy requirements](#start-on-node).
333
313
 
334
314
  Authenticated MCP bodies now default to 4 MiB through
335
315
  `admission.requests.maxBodyBytes`; Node's separate pre-auth buffer also defaults
@@ -354,8 +334,7 @@ and [Eve agents](./meta-tools.md#eve-agents).
354
334
  - [Migration to 0.34](./migration-0.34.md) covers the Overview landing page, Endpoints at `/endpoints`, default browser titles, and Workspace discovery in owner-less agent pools. No storage migration or token rotation is needed from 0.33.
355
335
  - [Migration to 0.33](./migration-0.33.md) maps every removed access option to `maintainers`, pool `members`, and `agents`, moves agents to `/agent/<pool>`, and covers pool owners, token revisions, operator contract v2 with its operator route changes, and the pre-auth listen fix.
356
336
  - [Tokens issued before agents](./auth.md#agent-tokens-and-upgrading-from-earlier-tokens) stop admitting until each machine's token is bound once to a declared agent with `npm run adopt-token -- <token-id> <agent>` (Node) or `AccessTokenManager.adopt`, which keeps its secret. Human-bound tokens stay refused; issue those agents new tokens. Pool members name `"agent:<name>"` instead of matching token record ids.
357
- - [Node storage from 0.28](../templates/node/README.md#storage) uses `connecta migrate-state` to copy the JSON state into SQLite. Activity JSONL is not imported.
358
- - [Worker storage from 0.28](../examples/worker/README.md#upgrading-from-028) copies KV into D1 with a one-shot migration.
337
+ - [Retired layout migrations](./migration-retired-layouts.md) requires completing Node JSON → SQLite, Workers KV → D1, and every OAuth layout-2 grant conversion on 0.37.1 before upgrading. The new package no longer supplies those migrations.
359
338
  - [Worker deployments on Wrangler](../examples/worker/README.md#moving-a-wrangler-deployed-worker-to-alchemy) move to Alchemy once, adopting the Worker, D1 database, and Access applications so the script tag and Access AUD stay unchanged.
360
339
  - [Notion, Vercel, and Cloudflare for 0.29](./provider-migration-0.29.md) records historical defaults and retained API tool names.
361
340
  - [Executor wiring](./code-mode.md#deploy-time-capability) requires branded shipped executors or a self-managed custom executor.
@@ -90,6 +90,10 @@ value is validated at construction. Malformed policies, including `false`,
90
90
  `null`, `0`, and `""`, throw before serving requests; they never disable
91
91
  admission or select a default. Custom connector policies are validated when
92
92
  the deployment constructs its registry.
93
+ A queued connector call whose wait reaches `queueTimeoutMs` is refused with a
94
+ concurrency `rate_limited` error, even if timer delivery is delayed. For example,
95
+ with `maxConcurrency: 1` and `queueTimeoutMs: 10`, releasing the occupied slot
96
+ after 40 ms refuses the expired waiter instead of dispatching it.
93
97
 
94
98
  ## Maintained integrations
95
99
 
@@ -215,26 +219,11 @@ failure also reports an unknown outcome with no retry or wait advice; a proven
215
219
  unsent failure retains its own recovery advice. Connector `readOnly` remains
216
220
  optional and composes with endpoint policy.
217
221
 
218
- On Node, serve with `listen` from `@zackbart/connecta/node`: it installs the
219
- owned transport that prevents native fetch or a host-configured dispatcher
220
- from silently resending a remote MCP write. Without that transport, Node
221
- refuses remote writes before dispatch. A connector with its own `fetch` hands
222
- writes to that function instead, which owns their single attempt. Downstream OAuth token, registration and
223
- revocation POSTs also require the owned sender. Read calls and OAuth discovery
224
- GETs keep native fetch. Workers
225
- use their native fetch with manual redirects; transport failures after
222
+ On Node, follow the [Node transport and proxy requirements](./deploying.md#start-on-node).
223
+ A connector with its own `fetch` hands writes to that function, which owns their
224
+ single attempt. Workers use native fetch with manual redirects; failures after
226
225
  dispatch remain unknown and non-retryable.
227
226
 
228
- The owned sender connects directly by default. For HTTP(S) CONNECT proxy egress,
229
- configure `listen(connecta, { port: 3000, proxy: "http://proxy.example.com:8080" })`.
230
- This controls maintained-provider requests, remote MCP writes and OAuth
231
- credential POSTs; it ignores `NODE_USE_ENV_PROXY`, `HTTP_PROXY`, `HTTPS_PROXY`
232
- and host proxy dispatchers. Remote MCP reads and OAuth discovery GETs retain
233
- native fetch and need their own host proxy policy. An uncertain refresh requires
234
- fresh authorization rather than replaying the spent token. See
235
- [Node startup](./deploying.md#start-on-node) for the proxy URL, credentials and
236
- TLS trust rules.
237
-
238
227
  Remote catalogs evolve. Discovery, direct calls, and programs enforce the
239
228
  current annotations and `ConnectaConfig.classification` overrides. A leftover
240
229
  `classify` option throws at construction and names that map. Provider reviews,
@@ -342,7 +331,7 @@ check shared behavior. Provider-specific tests remain beside each provider.
342
331
 
343
332
  Use [`@zackbart/connecta-eve`](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md)
344
333
  in the Eve app for an app-owned connection and endpoint instructions refreshed
345
- once per turn. It requires Node 24 and Eve 0.84.x, and installs separately from
334
+ once per turn. It requires Node 24 and Eve 0.86.x, and installs separately from
346
335
  Connecta. Follow its README for the two agent files, token environment variables,
347
336
  optional write approval and Vercel OIDC token source. Configure the server's
348
337
  [agent and pool membership](./auth.md#issue-rotate-or-revoke-an-agent-token)
@@ -221,6 +221,16 @@ act on is the flag: any cap sets `inputSchemaTruncated` or
221
221
  `outputSchemaTruncated`, and that means repeat with `includeSchemas: "json"`, or
222
222
  describe, when the exact constraints matter.
223
223
 
224
+ Repeated searches in one request reuse a private lexical index for the same
225
+ visible catalog and safety filter. Returned schemas and annotations are independent
226
+ copies: changing a result cannot change later discovery or tool classification.
227
+ In-process registry invalidation (including refresh and OAuth connect/disconnect/restart)
228
+ or built-in vault set/clear replaces the retained catalog and its index before the
229
+ next discovery read in that request, without storage reads on unchanged repeats.
230
+ Changes from another process/isolate or direct storage writes need not be observed
231
+ until the next request. Custom vault mutations must also invalidate the registry.
232
+ The index never crosses request or caller/pool boundaries.
233
+
224
234
  ### TypeScript signatures
225
235
 
226
236
  `includeSchemas: "typescript"` replaces both schema fields with one
@@ -423,6 +433,13 @@ new entries. A later attempt deletes expired entries before reusing their
423
433
  capacity; a failed deletion keeps the charge. These bounds cover all processes and Worker isolates sharing the store.
424
434
  Compare-and-set reserves each charge in one storage ledger before any chunk
425
435
  is written; chunk TTLs cannot exceed the charge deadline.
436
+ The whole stash, including reservation, stops waiting after 45 seconds, or sooner
437
+ when the call's remaining deadline or request cancellation ends result processing.
438
+ A completed call whose result processing is cut off returns the non-retryable
439
+ `result_processing_failed`: any write already happened and must not be repeated
440
+ to recover its result. Programs keep that write in `writes.succeeded`, even if
441
+ paging is cancelled. A full or unavailable stash that answers within the budget
442
+ still returns the ordinary truncated result and paging-unavailable hint.
426
443
 
427
444
  Results belong to the authenticated subject whenever auth supplies a subject or
428
445
  user id, independently of activity configuration, under the provider's namespace
@@ -511,8 +528,10 @@ The default cap sits under both lines with room to spare. Preview plus notice
511
528
  stays under 25,000 bytes, which is under 50,000 characters for any text, because
512
529
  a character is at least one UTF-8 byte, and under 25,000 tokens for any text,
513
530
  because a token covers at least one byte. A `connecta.result` page is bounded by the same
514
- inline byte cap, and 24,000 matches the program result boundary in
515
- [code mode](./code-mode.md). A deployment whose
531
+ inline byte cap, and 24,000 matches the default program result boundary in
532
+ [code mode](./code-mode.md) (`execute.maxResultChars`). The `maxBytes` in
533
+ `nextAction` is sized so one page fits that boundary under worst-case JSON
534
+ escaping, capped by the call's own inline cap: 3,829 bytes by default. A deployment whose
516
535
  clients take more can raise the cap, and one whose clients take less can lower
517
536
  it, per connector if need be; a result between 24,000 and 50,000 bytes that
518
537
  used to arrive whole now pages. A client that spills rather than rejects keeps
@@ -1292,7 +1311,7 @@ window, a native `tools/list` carries a 300-second private cache hint, against
1292
1311
  an hour on meta endpoints. This hint does not guarantee that a host refreshes
1293
1312
  its cached annotations; the stale-approval race is accepted on writable pools.
1294
1313
 
1295
- **Listing.** `tools/list` is one page with no cursor (Eve 0.84 reads only the
1314
+ **Listing.** `tools/list` is one page with no cursor (Eve 0.86 reads only the
1296
1315
  first page). A pool listing more than 1,000 tools fails `tools/list` with a
1297
1316
  JSON-RPC error asking the operator to narrow the pool; nothing is silently
1298
1317
  dropped. A connector whose catalog cannot load is left out of that listing
@@ -1363,8 +1382,6 @@ listing, and call translation live in
1363
1382
  [search tests](https://github.com/zackbart/connecta/blob/main/test/meta-tools-search.test.ts),
1364
1383
  [call tests](https://github.com/zackbart/connecta/blob/main/test/meta-tools-call.test.ts),
1365
1384
  [skills tests](https://github.com/zackbart/connecta/blob/main/test/skills-extension.test.ts),
1366
- [native surface tests](https://github.com/zackbart/connecta/blob/main/test/native-tools.test.ts),
1367
- [surface tests](https://github.com/zackbart/connecta/blob/main/test/code-first-surface.test.ts),
1368
- and [pool description tests](https://github.com/zackbart/connecta/blob/main/test/pool-description.test.ts)
1385
+ and [native surface tests](https://github.com/zackbart/connecta/blob/main/test/native-tools.test.ts)
1369
1386
  check the published contract. Guest parity and clause evidence are in
1370
1387
  [code-mode verification](./code-mode.md#verification).
@@ -1,8 +1,7 @@
1
1
  # Migration to 0.33
2
2
 
3
- Use this upgrade guide for an existing deployment moving to 0.33.
4
- [Deployment upgrades](./deploying.md#upgrade-an-existing-deployment) cover the
5
- general procedure; [the agent index](./README.md) routes other work.
3
+ Apply the [general upgrade procedure](./deploying.md#upgrade-an-existing-deployment)
4
+ when moving from 0.32 to 0.33.
6
5
 
7
6
  0.33 makes pools the access model.
8
7
  Every deployment with inbound auth changes its configuration. Each removed
@@ -338,8 +337,9 @@ pools: {
338
337
 
339
338
  ## Verify
340
339
 
341
- 1. Start the deployment; construction errors name each removed option's
342
- replacement.
340
+ 1. Start the deployment; 0.33 construction errors name each removed option's
341
+ replacement. Releases after 0.37.1 use generic unknown-option errors;
342
+ use this guide for replacements.
343
343
  2. Sign in as a maintainer and confirm plain `/mcp` and the operator UI work.
344
344
  3. Run `connecta doctor --pool <pool>` with each agent's token, and confirm
345
345
  the same token at `/mcp` is refused.
@@ -1,9 +1,7 @@
1
1
  # Migration to 0.34
2
2
 
3
- Use this guide when upgrading an existing deployment from 0.33 to 0.34.
4
- [Deployment upgrades](./deploying.md#upgrade-an-existing-deployment) cover the
5
- general procedure; [the agent index](./README.md) routes other work. Upgrades
6
- from earlier versions must also apply the intervening migrations.
3
+ Apply the [general upgrade procedure](./deploying.md#upgrade-an-existing-deployment)
4
+ when moving from 0.33 to 0.34, including intervening migrations for older versions.
7
5
 
8
6
  No storage migration, token rotation or required configuration field is added.
9
7
  Review the following changes before updating the package pin.