@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.
- package/CHANGELOG.md +97 -0
- package/README.md +8 -4
- package/bin/version.mjs +1 -1
- package/dist/auth/downstream-oauth.js +71 -79
- package/dist/auth/static-oauth.js +104 -26
- package/dist/connectors/api-connector.d.ts +17 -0
- package/dist/connectors/api-connector.js +3 -1
- package/dist/http/client.js +1 -1
- package/dist/http/hatch-paging.js +2 -2
- package/dist/http/paging.js +3 -89
- package/dist/http/provider.js +1 -2
- package/dist/http/services.js +1 -1
- package/dist/http/tools.js +1 -27
- package/dist/operator-ui/contract.d.ts +1 -0
- package/dist/operator-ui/generated.js +4 -4
- package/dist/program-writes.js +0 -1
- package/dist/providers/_shared/google/kit.js +29 -139
- package/dist/providers/_shared/rest/kit.js +4 -404
- package/dist/providers/_shared/sensitive-fields.js +0 -16
- package/dist/providers/breeze/api.js +2 -2
- package/dist/providers/ccb/api.js +1 -1
- package/dist/providers/cloudflare/api.js +8 -8
- package/dist/providers/cloudflare/lib/config.d.ts +2 -1
- package/dist/providers/docs/api.js +1 -1
- package/dist/providers/docs/tools.js +1 -2
- package/dist/providers/drive/api.js +2 -2
- package/dist/providers/drive/lib/hatch.js +1 -1
- package/dist/providers/drive/tools.js +1 -1
- package/dist/providers/forms/api.js +1 -1
- package/dist/providers/forms/lib/hatch.js +1 -1
- package/dist/providers/forms/tools.js +2 -3
- package/dist/providers/github/api.js +1 -1
- package/dist/providers/github/lib/discovery.js +2 -2
- package/dist/providers/gmail/api.js +1 -1
- package/dist/providers/gmail/tools.js +2 -2
- package/dist/providers/granola/api.js +155 -0
- package/dist/providers/granola/index.d.ts +10 -0
- package/dist/providers/granola/index.js +68 -0
- package/dist/providers/granola/openapi.generated.js +30 -0
- package/dist/providers/granola/safety.js +37 -0
- package/dist/providers/granola/skill.generated.js +5 -0
- package/dist/providers/granola/tools.js +2 -0
- package/dist/providers/overflow/api.js +26 -26
- package/dist/providers/planning-center/api.js +4 -4
- package/dist/providers/planning-center/lib/constants.d.ts +1 -1
- package/dist/providers/planning-center/lib/json-api.js +2 -2
- package/dist/providers/quickbooks/api.js +299 -0
- package/dist/providers/quickbooks/index.d.ts +13 -0
- package/dist/providers/quickbooks/index.js +93 -0
- package/dist/providers/quickbooks/lib/query.js +118 -0
- package/dist/providers/quickbooks/lib/writes.js +168 -0
- package/dist/providers/quickbooks/safety.js +222 -0
- package/dist/providers/quickbooks/skill.generated.js +5 -0
- package/dist/providers/quickbooks/tools.js +117 -0
- package/dist/providers/sheets/api.js +1 -1
- package/dist/providers/sheets/lib/hatch.js +2 -2
- package/dist/providers/sheets/lib/requests.js +1 -1
- package/dist/providers/sheets/tools.js +1 -2
- package/dist/providers/slides/api.js +1 -1
- package/dist/providers/slides/tools.js +2 -2
- package/dist/providers/stripe/api.js +7 -7
- package/dist/providers/tithely/api.js +2 -2
- package/dist/providers/vercel/api.js +12 -12
- package/dist/providers/vercel/index.js +1 -2
- package/dist/providers/vercel/lib/pin.js +1 -1
- package/dist/routes/mcp.js +1 -1
- package/dist/routes/oauth.js +3 -0
- package/dist/runtime/admission.js +0 -12
- package/dist/runtime/call.js +0 -4
- package/dist/skills.js +0 -1
- package/dist/storage/keys.js +2 -3
- package/dist/types.d.ts +2 -0
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +0 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/documentation/README.md +1 -0
- package/documentation/architecture.md +249 -366
- package/documentation/auth.md +56 -19
- package/documentation/code-mode.md +6 -6
- package/documentation/integrating.md +1 -1
- package/documentation/meta-tools.md +6 -3
- package/documentation/operator-tests.md +11 -2
- package/documentation/operator-ui.md +17 -5
- package/documentation/providers.md +492 -0
- package/package.json +12 -9
- package/templates/node/package.json +1 -1
- package/dist/operator-ui/agents.d.ts +0 -75
- package/dist/operator-ui/agents.js +0 -114
- package/dist/operator-ui/config-summary.js +0 -566
- package/dist/operator-ui/connection-map.js +0 -378
- package/dist/operator-ui/endpoints.js +0 -212
- package/dist/operator-ui/fix-prompts.d.ts +0 -18
- package/dist/operator-ui/fix-prompts.js +0 -79
- package/dist/operator-ui/health.js +0 -52
- package/dist/operator-ui/member-page.js +0 -97
- package/dist/operator-ui/overview.js +0 -126
- package/dist/operator-ui/setup-commands.js +0 -47
- package/dist/operator-ui/view.d.ts +0 -378
- package/dist/operator-ui/view.js +0 -631
- package/dist/providers/_shared/rest/dispatch.js +0 -21
- package/dist/providers/_shared/rest/tools.js +0 -592
package/documentation/auth.md
CHANGED
|
@@ -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
|
-
|
|
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
|
|
1394
|
-
|
|
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.
|
|
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
|
|
2510
|
-
|
|
|
2511
|
-
| Endpoints
|
|
2512
|
-
| `pkce`
|
|
2513
|
-
| `authorizationParams`
|
|
2514
|
-
| `
|
|
2515
|
-
| `
|
|
2516
|
-
|
|
|
2517
|
-
|
|
|
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-
|
|
2672
|
-
|
|
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/
|
|
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
|
|
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-
|
|
1293
|
-
| `V5`, `W9` | `test/program-writes.test.ts` (
|
|
1294
|
-
| `W10`, `W12` | `test/
|
|
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` (
|
|
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
|
-
|
|
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.
|
|
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.
|
|
1338
|
-
|
|
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
|
|
194
|
-
|
|
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
|
|
523
|
-
|
|
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
|
|
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
|
-
|
|
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.
|