@zackbart/connecta 0.35.0 → 0.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/README.md +8 -4
  3. package/bin/version.mjs +1 -1
  4. package/dist/auth/downstream-oauth.js +71 -79
  5. package/dist/auth/static-oauth.js +104 -26
  6. package/dist/connectors/api-connector.d.ts +17 -0
  7. package/dist/connectors/api-connector.js +3 -1
  8. package/dist/http/client.js +1 -1
  9. package/dist/http/hatch-paging.js +2 -2
  10. package/dist/http/paging.js +3 -89
  11. package/dist/http/provider.js +1 -2
  12. package/dist/http/services.js +1 -1
  13. package/dist/http/tools.js +1 -27
  14. package/dist/operator-ui/contract.d.ts +1 -0
  15. package/dist/operator-ui/generated.js +4 -4
  16. package/dist/program-writes.js +0 -1
  17. package/dist/providers/_shared/google/kit.js +29 -139
  18. package/dist/providers/_shared/rest/kit.js +4 -404
  19. package/dist/providers/_shared/sensitive-fields.js +0 -16
  20. package/dist/providers/breeze/api.js +2 -2
  21. package/dist/providers/ccb/api.js +1 -1
  22. package/dist/providers/cloudflare/api.js +8 -8
  23. package/dist/providers/cloudflare/lib/config.d.ts +2 -1
  24. package/dist/providers/docs/api.js +1 -1
  25. package/dist/providers/docs/tools.js +1 -2
  26. package/dist/providers/drive/api.js +2 -2
  27. package/dist/providers/drive/lib/hatch.js +1 -1
  28. package/dist/providers/drive/tools.js +1 -1
  29. package/dist/providers/forms/api.js +1 -1
  30. package/dist/providers/forms/lib/hatch.js +1 -1
  31. package/dist/providers/forms/tools.js +2 -3
  32. package/dist/providers/github/api.js +1 -1
  33. package/dist/providers/github/lib/discovery.js +2 -2
  34. package/dist/providers/gmail/api.js +1 -1
  35. package/dist/providers/gmail/tools.js +2 -2
  36. package/dist/providers/granola/api.js +155 -0
  37. package/dist/providers/granola/index.d.ts +10 -0
  38. package/dist/providers/granola/index.js +68 -0
  39. package/dist/providers/granola/openapi.generated.js +30 -0
  40. package/dist/providers/granola/safety.js +37 -0
  41. package/dist/providers/granola/skill.generated.js +5 -0
  42. package/dist/providers/granola/tools.js +2 -0
  43. package/dist/providers/overflow/api.js +26 -26
  44. package/dist/providers/planning-center/api.js +4 -4
  45. package/dist/providers/planning-center/lib/constants.d.ts +1 -1
  46. package/dist/providers/planning-center/lib/json-api.js +2 -2
  47. package/dist/providers/quickbooks/api.js +299 -0
  48. package/dist/providers/quickbooks/index.d.ts +13 -0
  49. package/dist/providers/quickbooks/index.js +93 -0
  50. package/dist/providers/quickbooks/lib/query.js +118 -0
  51. package/dist/providers/quickbooks/lib/writes.js +168 -0
  52. package/dist/providers/quickbooks/safety.js +222 -0
  53. package/dist/providers/quickbooks/skill.generated.js +5 -0
  54. package/dist/providers/quickbooks/tools.js +117 -0
  55. package/dist/providers/sheets/api.js +1 -1
  56. package/dist/providers/sheets/lib/hatch.js +2 -2
  57. package/dist/providers/sheets/lib/requests.js +1 -1
  58. package/dist/providers/sheets/tools.js +1 -2
  59. package/dist/providers/slides/api.js +1 -1
  60. package/dist/providers/slides/tools.js +2 -2
  61. package/dist/providers/stripe/api.js +7 -7
  62. package/dist/providers/tithely/api.js +2 -2
  63. package/dist/providers/vercel/api.js +12 -12
  64. package/dist/providers/vercel/index.js +1 -2
  65. package/dist/providers/vercel/lib/pin.js +1 -1
  66. package/dist/routes/mcp.js +1 -1
  67. package/dist/routes/oauth.js +3 -0
  68. package/dist/runtime/admission.js +0 -12
  69. package/dist/runtime/call.js +0 -4
  70. package/dist/skills.js +0 -1
  71. package/dist/storage/keys.js +2 -3
  72. package/dist/types.d.ts +2 -0
  73. package/dist/ui.d.ts +1 -1
  74. package/dist/ui.js +0 -1
  75. package/dist/version.d.ts +1 -1
  76. package/dist/version.js +1 -1
  77. package/documentation/README.md +1 -0
  78. package/documentation/architecture.md +249 -366
  79. package/documentation/auth.md +56 -19
  80. package/documentation/code-mode.md +6 -6
  81. package/documentation/integrating.md +1 -1
  82. package/documentation/meta-tools.md +6 -3
  83. package/documentation/operator-tests.md +11 -2
  84. package/documentation/operator-ui.md +17 -5
  85. package/documentation/providers.md +492 -0
  86. package/package.json +12 -9
  87. package/templates/node/package.json +1 -1
  88. package/dist/operator-ui/agents.d.ts +0 -75
  89. package/dist/operator-ui/agents.js +0 -114
  90. package/dist/operator-ui/config-summary.js +0 -566
  91. package/dist/operator-ui/connection-map.js +0 -378
  92. package/dist/operator-ui/endpoints.js +0 -212
  93. package/dist/operator-ui/fix-prompts.d.ts +0 -18
  94. package/dist/operator-ui/fix-prompts.js +0 -79
  95. package/dist/operator-ui/health.js +0 -52
  96. package/dist/operator-ui/member-page.js +0 -97
  97. package/dist/operator-ui/overview.js +0 -126
  98. package/dist/operator-ui/setup-commands.js +0 -47
  99. package/dist/operator-ui/view.d.ts +0 -378
  100. package/dist/operator-ui/view.js +0 -631
  101. package/dist/providers/_shared/rest/dispatch.js +0 -21
  102. package/dist/providers/_shared/rest/tools.js +0 -592
@@ -412,6 +412,11 @@ agent. Enabling `preview` lets code on any pushed preview branch act as the agen
412
412
  Treat the project's OIDC token as a bearer credential for all of this agent's
413
413
  pools. Its default audience, `https://vercel.com/<team-slug>`, is shared by every
414
414
  service accepting Vercel's default OIDC tokens; it is not specific to Connecta.
415
+ Connecta accepts only that default audience. Vercel's custom-audience token
416
+ exchange can produce a validly signed token for another service; Connecta
417
+ refuses it. For example, a token exchanged for `https://tickets.example.com`
418
+ cannot authenticate to `/agent/assistant`. Resolve the ordinary workload token
419
+ with `getVercelOidcToken()` without an `audience` option.
415
420
  Anything holding the project's token can act as the agent:
416
421
  project code, builds (including build steps and dependency install scripts with
417
422
  access to `VERCEL_OIDC_TOKEN`), and services the project sends the token to,
@@ -448,7 +453,7 @@ export default defineMcpClientConnection({
448
453
  url: "https://connecta.example.com/agent/assistant",
449
454
  description: "Use the assistant's shared CRM and ticket tools.",
450
455
  auth: {
451
- credentialOwner: "app",
456
+ principalType: "app",
452
457
  getToken: async () => ({ token: await getVercelOidcToken() }),
453
458
  },
454
459
  });
@@ -1390,8 +1395,10 @@ leaves the local grant removed. The management route returns HTTP 200 with
1390
1395
  code. Revoke the old grant in the provider's console if removal there matters.
1391
1396
  With no advertised endpoint, Disconnect makes no request. Repeating Disconnect
1392
1397
  never retries revocation, because the removed grant is no longer available.
1393
- Restart makes no revocation request. Static `api()` OAuth has no discovered
1394
- revocation endpoint and continues to remove authorization locally.
1398
+ Restart makes no revocation request. Static `api()` OAuth uses the same
1399
+ removal and revocation flow when deployment configuration supplies
1400
+ `revocationEndpoint`; without it, removal remains local. The configured
1401
+ client secret is used in memory and is never saved with the grant.
1395
1402
 
1396
1403
  ## Refresh failures
1397
1404
 
@@ -1406,11 +1413,11 @@ Copy these durable records during storage migration.
1406
1413
 
1407
1414
  Each fingerprint record names its dispatch epoch, holder, and resolution state:
1408
1415
 
1409
- | State | Send gate |
1410
- | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1411
- | `outstanding` | Dispatched without a definitive outcome yet. Refuse the fingerprint in every epoch. |
1412
- | `ambiguous` | The sent request's outcome is unknowable. Refuse the fingerprint in every epoch, including when re-consent returns it again. |
1413
- | `resolved` | The tokens were committed or a definitive failure was recorded. Refuse another send in the same epoch. A later epoch may send once only when its code exchange completed after the resolution was recorded. |
1416
+ | State | Send gate |
1417
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1418
+ | `outstanding` | Dispatched without a definitive outcome yet. Refuse the fingerprint in every epoch. |
1419
+ | `ambiguous` | The sent request's outcome is unknowable. Refuse the fingerprint in every epoch, including when re-consent returns it again. |
1420
+ | `resolved` | The tokens were committed or a definitive failure was recorded. A completed lease whose token digest matches the current grant may start the next generation in the same epoch. A later epoch needs a code exchange that observed this exact resolved record. |
1414
1421
 
1415
1422
  Resolution writes use CAS against the exact outstanding record and record a
1416
1423
  `resolvedAt` timestamp with a resolved outcome. When accepting a code response,
@@ -1423,6 +1430,14 @@ outstanding dispatch. An earlier consent cannot become eligible merely because
1423
1430
  the pending refresh later resolves. Competing epochs cannot both replace the
1424
1431
  same record, and a late answer cannot turn an ambiguous record into resolved.
1425
1432
 
1433
+ For vendors that return unchanged refresh-token bytes, a successful token
1434
+ commit and its matching completed lease authorize the next refresh generation
1435
+ in that epoch. It must replace the exact resolved fingerprint by CAS before
1436
+ sending. Outstanding, ambiguous and failed attempts never authorize reuse;
1437
+ concurrent callers with an older access token adopt the committed result.
1438
+ An unsent successor retains the prior successful proof during cleanup, so a
1439
+ transient storage failure before dispatch can be retried without losing the grant.
1440
+
1426
1441
  An ambiguous token stays blocked even if re-consent returns identical bytes.
1427
1442
  Recovery requires re-consent that yields a different refresh token, or
1428
1443
  revocation at the provider. Restart never deletes spent records or moves old
@@ -2400,6 +2415,13 @@ need `consumeAuthError` to accept error callbacks, sharing `finishAuth`'s atomic
2400
2415
  consent claim. Reissue
2401
2416
  pending consent links after upgrading; callbacks without a saved initiating user cannot complete.
2402
2417
 
2418
+ Custom connectors may implement `verifyCallbackParameters(params, ctx)` for
2419
+ provider-specific callback assertions. The route calls it after successful
2420
+ state verification and before issuer validation, handoff consumption, error
2421
+ handling, or code exchange. Returning false or throwing produces the generic
2422
+ invalid-callback refusal. Apply the same assertions inside `finishAuth` when
2423
+ supporting direct programmatic completion.
2424
+
2403
2425
  `compareAndSet` atomically claims link nonces, callback handoffs, and consents, with one concurrent winner,
2404
2426
  so each completes once.
2405
2427
  [Meta-tools](./meta-tools.md#authorization-recovery) describes recovery.
@@ -2506,15 +2528,28 @@ api("church", {
2506
2528
  No discovery or registration occurs; all URLs are configuration, so the
2507
2529
  [advertised-URL rule](#urls-a-downstream-advertises) does not apply.
2508
2530
 
2509
- | Option or binding | Contract |
2510
- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2511
- | Endpoints | Checked at construction: HTTPS, HTTP only on loopback, no credentials or fragment. |
2512
- | `pkce` | S256 by default; `false` omits challenge and verifier. |
2513
- | `authorizationParams` | Adds provider parameters; cannot restate the grant's own. |
2514
- | `tokenRequestHeaders` | Adds code-exchange and every refresh's headers; cannot set `Authorization`, `Content-Type`, `Content-Length`, `Cookie`, or `Host`. |
2515
- | `tokenEndpointAuthMethod` | Defaults to `client_secret_basic` with a secret, `none` without; mismatched pairings refuse construction. |
2516
- | Issuer/resource | No advertised issuer means no required RFC 9207 `iss` or sent RFC 8707 `resource`. The grant binds to the token endpoint; after it changes, old tokens are never sent and the next consent replaces them. |
2517
- | Client | One deployment-config identity, never written or sealed to storage; no owner vault slot. Store leaks contain no client secret; Disconnect deletes none and Restart carries none. Read from environment or Worker secrets; empty strings refuse construction without quoting values. |
2531
+ | Option or binding | Contract |
2532
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2533
+ | Endpoints | Checked at construction: HTTPS, HTTP only on loopback, no credentials or fragment. |
2534
+ | `pkce` | S256 by default; `false` omits challenge and verifier. |
2535
+ | `authorizationParams` | Adds provider parameters; cannot restate the grant's own. |
2536
+ | `expectedCallbackParameters` | Optional `Readonly<Record<string, string>>` of fixed provider response values. Each configured parameter must occur exactly once with its exact decoded value, after pending-state verification and before issuer validation, flow claims, code exchange, or grant persistence. Missing, duplicate, or mismatched values refuse without exchanging a code or returning parameter values. Omission preserves existing behavior. |
2537
+ | `revocationEndpoint` | Optional trusted HTTPS revocation URL (loopback HTTP allowed), without credentials, query or fragment. Disconnect removes the local grant before one bounded attempt using the configured client. Failure reports `oauth_revocation_failed`; a repeated Disconnect never retries. |
2538
+ | `revocationRequestFormat` | `"form"` by default; `"json"` sends JSON without `token_type_hint`. Requires `revocationEndpoint` when set. |
2539
+ | `tokenRequestHeaders` | Adds code-exchange and every refresh's headers; cannot set `Authorization`, `Content-Type`, `Content-Length`, `Cookie`, or `Host`. |
2540
+ | `tokenEndpointAuthMethod` | Defaults to `client_secret_basic` with a secret, `none` without; mismatched pairings refuse construction. |
2541
+ | Issuer/resource | No advertised issuer means no required RFC 9207 `iss` or sent RFC 8707 `resource`. The grant binds to the token endpoint; after it changes, old tokens are never sent and the next consent replaces them. |
2542
+ | Client | One deployment-config identity, never written or sealed to storage; no owner vault slot. Store leaks contain no client secret; Disconnect deletes none and Restart carries none. Read from environment or Worker secrets; empty strings refuse construction without quoting values. |
2543
+
2544
+ For a connector bound to a fixed company, set
2545
+ `expectedCallbackParameters: { realmId: "company_alice" }`. This checks all
2546
+ callbacks, including errors, and direct `finishAuth` calls. Names must be
2547
+ nonempty ASCII letters, digits, dots, underscores, or hyphens; values must be
2548
+ nonempty strings. The protocol fields `code`, `state`, `iss`, `error`,
2549
+ `error_description`, and `error_uri` are reserved. Malformed expectations throw
2550
+ at construction without quoting values. Unconfigured provider parameters are
2551
+ ignored. Expectations are deployment configuration, never grant metadata or
2552
+ dynamic company selection; they do not inspect or rebind an existing grant.
2518
2553
 
2519
2554
  Handlers never see the grant. `ctx.oauth.fetch(url, init)` sends the calling
2520
2555
  owner's access token as `Authorization: Bearer` with these rules:
@@ -2668,8 +2703,10 @@ The encoding lattice is exactly this, and anything outside it is out of scope:
2668
2703
 
2669
2704
  [Decision 0007](https://github.com/zackbart/connecta/blob/main/decisions/0007-agent-pool-layout.md)
2670
2705
  explains the pool layout; [decision 0006](https://github.com/zackbart/connecta/blob/main/decisions/0006-pools-are-the-access-model.md)
2671
- explains pools as the access model. `test/identity-scope.test.ts` checks identity
2672
- boundaries, and `src/storage/keys.ts` owns credential key families.
2706
+ explains pools as the access model. `test/identity-write-journey.node.test.ts`
2707
+ checks real HTTP identity, pool and personal credential isolation;
2708
+ `test/identity-scope.test.ts` retains handoff, callback and admission-revocation
2709
+ fault probes. `src/storage/keys.ts` owns credential key families.
2673
2710
 
2674
2711
  Inbound adapters live in [src/auth](https://github.com/zackbart/connecta/tree/main/src/auth);
2675
2712
  [auth routes](https://github.com/zackbart/connecta/blob/main/src/routes/oauth.ts)
@@ -1274,7 +1274,7 @@ rejection, and branded adapter acceptance across module copies.
1274
1274
  | `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) |
1275
1275
  | `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) |
1276
1276
  | `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` |
1277
- | `E3`, `E4` | `test/guest-api-contract.test.ts`, `test/execute.test.ts` (`auth_required`, destructive reroute), `test/program-writes.test.ts` (the refusal's `nextAction`, nothing sent, a caught refusal) |
1277
+ | `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) |
1278
1278
  | `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) |
1279
1279
  | `E6`, `X8` | `test/guest-api-contract.test.ts` (unknown and inherited members, retained error identities), `test/quickjs-executor.node.test.ts` |
1280
1280
  | `E7` | `test/guest-api-contract.test.ts` (refusals about a `503`-named connector), `test/errors.test.ts` |
@@ -1288,10 +1288,10 @@ rejection, and branded adapter acceptance across module copies.
1288
1288
  | `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) |
1289
1289
  | `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) |
1290
1290
  | `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) |
1291
- | `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/d1-storage.node.test.ts` (shared stash transfers), `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) |
1292
- | `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/operator-view.test.ts`, `test/sql-storage-contract.ts`, run by `test/d1-storage.node.test.ts` and `test/sqlite-storage.node.test.ts` (historical pause and approval rows still render and round-trip) |
1293
- | `V5`, `W9` | `test/program-writes.test.ts` (an unawaited program write finished and recorded, its unknown outcome reported, counts on a failed program, the classification table), `test/invocation-pipeline.test.ts` (the gate after validation, an unrecorded refusal) |
1294
- | `W10`, `W12` | `test/program-writes.test.ts` (a writable endpoint's program write runs, a read-only endpoint omits writes from search and describe and refuses every write call on every path, including a write its guide names, a required deployment `readOnly`, the write budget, `readOnly` inheritance and overrides, `call_tool` still refusing, search and describe verdicts, construction refusals including retired `trust`), `test/operator-ui-model.test.ts`, `test/browser/operator-ui.spec.ts` (the badge) |
1291
+ | `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) |
1292
+ | `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) |
1293
+ | `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) |
1294
+ | `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) |
1295
1295
  | `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) |
1296
1296
  | `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) |
1297
1297
  | `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) |
@@ -1304,4 +1304,4 @@ rejection, and branded adapter acceptance across module copies.
1304
1304
 
1305
1305
  The surface itself is checked by `test/server.test.ts` (the exact six-tool list),
1306
1306
  `test/code-first-surface.test.ts` (construction, executor, removed tools, copy, and size),
1307
- and `test/program-writes.test.ts` (the retired pause options refused at construction).
1307
+ and `test/program-writes.test.ts` (deployment policy and classification construction refusals).
@@ -328,7 +328,7 @@ check shared behavior. Provider-specific tests remain beside each provider.
328
328
 
329
329
  Use [`@zackbart/connecta-eve`](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md)
330
330
  in the Eve app for an app-owned connection and endpoint instructions refreshed
331
- at turn start. It requires Node 24 and Eve 0.83.x, and installs separately from
331
+ once per turn. It requires Node 24 and Eve 0.84.x, and installs separately from
332
332
  Connecta. Follow its README for the two agent files, token environment variables,
333
333
  optional write approval and Vercel OIDC token source. Configure the server's
334
334
  [agent and pool membership](./auth.md#issue-rotate-or-revoke-an-agent-token)
@@ -1292,7 +1292,7 @@ window, a native `tools/list` carries a 300-second private cache hint, against
1292
1292
  an hour on meta endpoints. This hint does not guarantee that a host refreshes
1293
1293
  its cached annotations; the stale-approval race is accepted on writable pools.
1294
1294
 
1295
- **Listing.** `tools/list` is one page with no cursor (Eve 0.83 reads only the
1295
+ **Listing.** `tools/list` is one page with no cursor (Eve 0.84 reads only the
1296
1296
  first page). A pool listing more than 1,000 tools fails `tools/list` with a
1297
1297
  JSON-RPC error asking the operator to narrow the pool; nothing is silently
1298
1298
  dropped. A connector whose catalog cannot load is left out of that listing
@@ -1334,8 +1334,11 @@ Connector ids already appear in native tool names. The
1334
1334
  operator UI and `describeConfig()` show every pool's effective `surface` and
1335
1335
  `executeCode` as facts from deployment code. Change these settings in code.
1336
1336
 
1337
- Keep native pools bounded. Comparisons so far used 40 synthetic tools;
1338
- large production catalogs near the cap have not been evaluated.
1337
+ Keep native pools bounded. Local real-Eve validation uses seeded catalogs from
1338
+ 40 through 1,000 downstream tools across meta, native and native-plus-code
1339
+ surfaces, with a deterministic model transport and no paid model calls. These
1340
+ checks establish local runtime contracts; model task quality and large
1341
+ production catalogs near the cap remain unmeasured.
1339
1342
 
1340
1343
  ### Eve agents
1341
1344
 
@@ -190,8 +190,17 @@ OAuth provider validates the code exchange and PKCE. Credential Test calls a
190
190
  loopback downstream endpoint. Operator APIs, cookie/bearer admission, CSRF,
191
191
  assets, handoffs, callbacks, and encrypted storage use production code.
192
192
 
193
- The flows cover Clerk sign-in/reload/sign-out; OAuth connect/consent/callback/
194
- connected reread/reload; and credential save/test/replace/remove. They collect
193
+ The flows use a real SQLite file and cover Clerk sign-in/reload/sign-out,
194
+ actual Settings provenance and asset cache validators; OAuth
195
+ connect/consent/callback/connected reread/disconnect; and credential
196
+ save/test/replace/remove. They close and reopen the app, database and vault
197
+ before rereading OAuth and credential state. A rejected SQL replacement leaves
198
+ the previous secret usable downstream after restart. Trigger rows read from an
199
+ independent SQL connection require one save, one replacement and one removal;
200
+ reads and the rejected save commit no credential writes. Actual MCP calls
201
+ check that credential edits preserve a reader pool's read access and refusal. Activity renders
202
+ successful calls recorded before the SQLite restart without exposing either
203
+ credential value. They collect
195
204
  CSP violations across every document and popup, and fail on unexpected network
196
205
  traffic. No credentials enter visual fixtures or screenshot baselines.
197
206
 
@@ -519,8 +519,9 @@ says the snapshot is for maintainers. It requires the UI module and the
519
519
  existing doctor authentication environment variables; it runs no diagnostic
520
520
  program, follows no redirects, and prints no raw HTTP failure body.
521
521
 
522
- The operator shell uses React, TanStack Router/Query/Table, Radix, cmdk and
523
- Tailwind v4. Hanken Grotesk, JetBrains Mono, CSS, JavaScript and dependency notices are hashed assets
522
+ The operator shell uses React, TanStack Router, Radix and cmdk. Esbuild bundles
523
+ the authored CSS with an explicit browser reset; it generates no utility classes.
524
+ Hanken Grotesk, JetBrains Mono, CSS, JavaScript and dependency notices are hashed assets
524
525
  under `/ui/assets/*`, served identically with immutable cache headers on Node
525
526
  and Workers. HTML contains only mount points and escaped inert configuration;
526
527
  it remains uncached. Ahead of the stylesheet, every operator page (sign-in
@@ -537,7 +538,11 @@ private browsing: a read finds nothing stored and a write keeps nothing, so a
537
538
  bearer token is not remembered there. `generated.ts` is ignored and generated before build and
538
539
  test; `check:operator-ui` detects stale assets and shared page styles. The UI
539
540
  stays behind `./ui`, outside the root import graph. The identity-fenced store
540
- owns authenticated reads and existing mutations. An Access-only shell selects
541
+ owns authenticated reads and existing mutations, with explicit identity and
542
+ read-cycle AbortControllers, revision fences, and no query cache or automatic
543
+ mutation replay. Browser-only view models ship inside the hashed bundle, with
544
+ no duplicate standalone server modules. The shared contract owns the unchanged
545
+ `OperatorPage` union exported from `@zackbart/connecta/ui`. An Access-only shell selects
541
546
  Access even when the HTML request has no trusted context; only authenticated
542
547
  API responses establish the session. A gated Access session offers Retry.
543
548
  Focus, visibility, and timer-driven recovery share one admission-read schedule
@@ -639,8 +644,7 @@ and each personal connector's exact `manage`;
639
644
  The Overview's map and attention rows are pure functions of the contract in
640
645
  [connection-map.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/connection-map.ts)
641
646
  and [overview.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/overview.ts),
642
- covered by `test/operator-connection-map.test.ts` and
643
- `test/operator-overview.test.ts`; `src/operator-ui/styles/overview.css` holds
647
+ exercised in Chromium by `test/browser/operator-overview.spec.ts`; `src/operator-ui/styles/overview.css` holds
644
648
  the page's styles.
645
649
 
646
650
  `src/operator-ui/config-summary.ts` maps the snapshot and its provenance to
@@ -661,3 +665,11 @@ serve the authenticated shell and data. The browser lives in
661
665
  and [browser flows](https://github.com/zackbart/connecta/blob/main/test/browser/operator-ui.spec.ts)
662
666
  defend filtering and behavior. Use [Operator UI tests](./operator-tests.md)
663
667
  for the browser state matrix and Linux snapshot procedure.
668
+
669
+ The browser flows also hold configuration and connector reads open across a
670
+ bearer identity switch, observe cancellation of the old HTTP response, and
671
+ require only the replacement viewer's data after navigation. A held OAuth poll
672
+ must abort on navigation without sending its start again; the Access recovery
673
+ flow checks explicit Retry and browser-history navigation without a document
674
+ reload. The packed deployment journey compiles every `OperatorPage` through
675
+ the public `@zackbart/connecta/ui` alias after declaration pruning.