@zackbart/connecta 0.7.9 → 0.8.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 +135 -0
- package/README.md +47 -148
- package/dist/activity.d.ts +0 -8
- package/dist/activity.d.ts.map +1 -1
- package/dist/activity.js +0 -1
- package/dist/activity.js.map +1 -1
- package/dist/auth/bearer.d.ts +1 -7
- package/dist/auth/bearer.d.ts.map +1 -1
- package/dist/auth/bearer.js +3 -24
- package/dist/auth/bearer.js.map +1 -1
- package/dist/auth/clerk.d.ts +2 -11
- package/dist/auth/clerk.d.ts.map +1 -1
- package/dist/auth/clerk.js +31 -46
- package/dist/auth/clerk.js.map +1 -1
- package/dist/call-admission.d.ts.map +1 -1
- package/dist/call-admission.js +9 -4
- package/dist/call-admission.js.map +1 -1
- package/dist/catalog-fingerprint.d.ts +20 -0
- package/dist/catalog-fingerprint.d.ts.map +1 -0
- package/dist/catalog-fingerprint.js +34 -0
- package/dist/catalog-fingerprint.js.map +1 -0
- package/dist/catalog-limits.d.ts +10 -0
- package/dist/catalog-limits.d.ts.map +1 -0
- package/dist/catalog-limits.js +10 -0
- package/dist/catalog-limits.js.map +1 -0
- package/dist/catalog-service.d.ts +137 -0
- package/dist/catalog-service.d.ts.map +1 -0
- package/dist/catalog-service.js +401 -0
- package/dist/catalog-service.js.map +1 -0
- package/dist/catalog.d.ts +6 -0
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +53 -2
- package/dist/catalog.js.map +1 -1
- package/dist/concurrency.d.ts +4 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +31 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/connectors/api.d.ts.map +1 -1
- package/dist/connectors/api.js +22 -12
- package/dist/connectors/api.js.map +1 -1
- package/dist/connectors/remote-mcp.d.ts.map +1 -1
- package/dist/connectors/remote-mcp.js +53 -41
- package/dist/connectors/remote-mcp.js.map +1 -1
- package/dist/credentials.d.ts +3 -2
- package/dist/credentials.d.ts.map +1 -1
- package/dist/errors.d.ts +19 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +10 -16
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +143 -330
- package/dist/execute.js.map +1 -1
- package/dist/executor-result.d.ts +0 -3
- package/dist/executor-result.d.ts.map +1 -1
- package/dist/executor-result.js +3 -3
- package/dist/executor-result.js.map +1 -1
- package/dist/executors/quickjs-child.js +3 -3
- package/dist/executors/quickjs-child.js.map +1 -1
- package/dist/executors/quickjs-protocol.d.ts +4 -1
- package/dist/executors/quickjs-protocol.d.ts.map +1 -1
- package/dist/executors/quickjs-runtime.d.ts.map +1 -1
- package/dist/executors/quickjs-runtime.js +7 -2
- package/dist/executors/quickjs-runtime.js.map +1 -1
- package/dist/executors/quickjs.d.ts.map +1 -1
- package/dist/executors/quickjs.js +4 -1
- package/dist/executors/quickjs.js.map +1 -1
- package/dist/favicon.js +2 -2
- package/dist/favicon.js.map +1 -1
- package/dist/index.d.ts +8 -82
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -104
- package/dist/index.js.map +1 -1
- package/dist/invocation.d.ts +101 -0
- package/dist/invocation.d.ts.map +1 -0
- package/dist/invocation.js +405 -0
- package/dist/invocation.js.map +1 -0
- package/dist/meta-tools.d.ts +9 -95
- package/dist/meta-tools.d.ts.map +1 -1
- package/dist/meta-tools.js +235 -725
- package/dist/meta-tools.js.map +1 -1
- package/dist/operator-ui/generated.d.ts +3 -0
- package/dist/operator-ui/generated.d.ts.map +1 -0
- package/dist/operator-ui/generated.js +5 -0
- package/dist/operator-ui/generated.js.map +1 -0
- package/dist/operator-ui/model.d.ts +73 -0
- package/dist/operator-ui/model.d.ts.map +1 -0
- package/dist/operator-ui/model.js +28 -0
- package/dist/operator-ui/model.js.map +1 -0
- package/dist/registry.d.ts +33 -184
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +345 -330
- package/dist/registry.js.map +1 -1
- package/dist/retired-toolkits.d.ts +3 -0
- package/dist/retired-toolkits.d.ts.map +1 -0
- package/dist/retired-toolkits.js +9 -0
- package/dist/retired-toolkits.js.map +1 -0
- package/dist/routes/activity.d.ts +3 -0
- package/dist/routes/activity.d.ts.map +1 -0
- package/dist/routes/activity.js +170 -0
- package/dist/routes/activity.js.map +1 -0
- package/dist/routes/credentials.d.ts +3 -0
- package/dist/routes/credentials.d.ts.map +1 -0
- package/dist/routes/credentials.js +170 -0
- package/dist/routes/credentials.js.map +1 -0
- package/dist/routes/mcp.d.ts +8 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +270 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/oauth.d.ts +4 -0
- package/dist/routes/oauth.d.ts.map +1 -0
- package/dist/routes/oauth.js +263 -0
- package/dist/routes/oauth.js.map +1 -0
- package/dist/routes/shared.d.ts +76 -0
- package/dist/routes/shared.d.ts.map +1 -0
- package/dist/routes/shared.js +140 -0
- package/dist/routes/shared.js.map +1 -0
- package/dist/routes/ui.d.ts +3 -0
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +116 -0
- package/dist/routes/ui.js.map +1 -0
- package/dist/server.d.ts +9 -40
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +62 -1322
- package/dist/server.js.map +1 -1
- package/dist/skills.d.ts +3 -21
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +15 -43
- package/dist/skills.js.map +1 -1
- package/dist/storage/file.d.ts.map +1 -1
- package/dist/storage/file.js +3 -1
- package/dist/storage/file.js.map +1 -1
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +3 -1
- package/dist/storage/memory.js.map +1 -1
- package/dist/timeout.d.ts.map +1 -1
- package/dist/timeout.js +2 -4
- package/dist/timeout.js.map +1 -1
- package/dist/types.d.ts +9 -59
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +3 -94
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +30 -1427
- package/dist/ui.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +15 -8
- package/src/activity.ts +0 -9
- package/src/auth/bearer.ts +4 -33
- package/src/auth/clerk.ts +35 -48
- package/src/call-admission.ts +8 -6
- package/src/catalog-fingerprint.ts +52 -0
- package/src/catalog-limits.ts +11 -0
- package/src/catalog-service.ts +601 -0
- package/src/catalog.ts +57 -2
- package/src/concurrency.ts +39 -0
- package/src/connectors/api.ts +22 -12
- package/src/connectors/remote-mcp.ts +63 -45
- package/src/credentials.ts +2 -2
- package/src/errors.ts +21 -1
- package/src/execute.ts +193 -423
- package/src/executor-result.ts +3 -3
- package/src/executors/quickjs-child.ts +8 -4
- package/src/executors/quickjs-protocol.ts +1 -1
- package/src/executors/quickjs-runtime.ts +5 -1
- package/src/executors/quickjs.ts +11 -8
- package/src/favicon.ts +2 -2
- package/src/index.ts +70 -222
- package/src/invocation.ts +580 -0
- package/src/meta-tools.ts +393 -985
- package/src/operator-ui/browser.css +360 -0
- package/src/operator-ui/browser.ts +987 -0
- package/src/operator-ui/generated.ts +4 -0
- package/src/operator-ui/model.ts +105 -0
- package/src/registry.ts +459 -439
- package/src/retired-toolkits.ts +14 -0
- package/src/routes/activity.ts +215 -0
- package/src/routes/credentials.ts +254 -0
- package/src/routes/mcp.ts +339 -0
- package/src/routes/oauth.ts +322 -0
- package/src/routes/shared.ts +240 -0
- package/src/routes/ui.ts +143 -0
- package/src/server.ts +64 -1731
- package/src/skills.ts +15 -43
- package/src/storage/file.ts +3 -1
- package/src/storage/memory.ts +3 -1
- package/src/timeout.ts +2 -4
- package/src/types.ts +8 -60
- package/src/ui.ts +60 -1538
- package/src/version.ts +1 -1
- package/dist/credential-health.d.ts +0 -227
- package/dist/credential-health.d.ts.map +0 -1
- package/dist/credential-health.js +0 -606
- package/dist/credential-health.js.map +0 -1
- package/dist/toolkits.d.ts +0 -146
- package/dist/toolkits.d.ts.map +0 -1
- package/dist/toolkits.js +0 -322
- package/dist/toolkits.js.map +0 -1
- package/src/credential-health.ts +0 -832
- package/src/toolkits.ts +0 -461
package/dist/registry.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import type { Connector, ConnectorContext, ConnectorStatus, KVStorage, Logger, ToolDef } from "./types.js";
|
|
2
2
|
import { type CredentialVault } from "./credentials.js";
|
|
3
|
-
import { type CredentialCheckOptions, type CredentialCheckResult, type CredentialHealthConfig, type CredentialHealthRecord } from "./credential-health.js";
|
|
4
3
|
import { type CallAdmissionPermit, type ConnectorCallAdmissionSnapshot } from "./call-admission.js";
|
|
5
|
-
import type { DeferredWork } from "./connector-scope.js";
|
|
6
|
-
import { type Toolkit } from "./toolkits.js";
|
|
7
|
-
export declare const DEFAULT_MAX_RESULT_BYTES = 50000;
|
|
8
|
-
/** Independent final-envelope boundary for `batch_call`. */
|
|
9
|
-
export declare const DEFAULT_MAX_BATCH_RESULT_BYTES = 100000;
|
|
10
4
|
/**
|
|
11
5
|
* Smallest accepted inline-result cap. One byte is pathological but harmless:
|
|
12
6
|
* `alignEndToCharBoundary` widens a window narrower than the codepoint at the
|
|
@@ -43,23 +37,6 @@ export interface HealthObservation {
|
|
|
43
37
|
consecutiveFailures: number;
|
|
44
38
|
lastError?: string;
|
|
45
39
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Recent real-call outcomes per connector, as observed by ONE view.
|
|
48
|
-
*
|
|
49
|
-
* The deployment keeps one log, and each toolkit keeps its own. That split is a
|
|
50
|
-
* scope boundary, not bookkeeping: `lastError` is a downstream error string
|
|
51
|
-
* that routinely names the tool that failed, and `list_connectors` returns the
|
|
52
|
-
* observation verbatim. Sharing one log would let a toolkit read back the tools
|
|
53
|
-
* and failures of a sibling toolkit through a connector they happen to share —
|
|
54
|
-
* and let a sibling's failures flip this view's reported status. A scoped view
|
|
55
|
-
* reads back only the calls it made itself.
|
|
56
|
-
*/
|
|
57
|
-
export declare class HealthLog {
|
|
58
|
-
private readonly observations;
|
|
59
|
-
recordSuccess(id: string, latencyMs: number): void;
|
|
60
|
-
recordFailure(id: string, latencyMs: number, error: unknown): void;
|
|
61
|
-
get(id: string): HealthObservation | undefined;
|
|
62
|
-
}
|
|
63
40
|
export interface RegistryOptions {
|
|
64
41
|
storage: KVStorage;
|
|
65
42
|
logger: Logger;
|
|
@@ -78,21 +55,16 @@ export interface RegistryOptions {
|
|
|
78
55
|
* of bytes >= 1; anything else warns and falls back to 100_000.
|
|
79
56
|
*/
|
|
80
57
|
maxBatchResultBytes?: number;
|
|
81
|
-
/** Tuning for the credential liveness checks (issue #24). */
|
|
82
|
-
credentialHealth?: CredentialHealthConfig;
|
|
83
58
|
}
|
|
84
|
-
type ConnectorOperationOptions = Pick<ConnectorContext, "signal" | "timeoutMs">;
|
|
59
|
+
export type ConnectorOperationOptions = Pick<ConnectorContext, "signal" | "timeoutMs">;
|
|
85
60
|
/**
|
|
86
61
|
* The registry surface a per-connection MCP server consumes: every meta-tool
|
|
87
62
|
* (`src/meta-tools.ts`) and the `execute_code` sandbox bridge (`src/execute.ts`)
|
|
88
63
|
* is typed against THIS, never against the concrete `Registry`.
|
|
89
64
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
* here is a compile error, and adding one here is a compile error until
|
|
94
|
-
* `ScopedRegistry` filters it — so a new meta-tool cannot quietly step around
|
|
95
|
-
* the boundary.
|
|
65
|
+
* The read-only seam remains useful even without scoped views: meta-tools can
|
|
66
|
+
* consume registry behavior without depending on the concrete implementation
|
|
67
|
+
* or its construction-only methods.
|
|
96
68
|
*/
|
|
97
69
|
export interface RegistryView {
|
|
98
70
|
/** Deployment-wide result-size cap threaded to the meta-tools. */
|
|
@@ -109,10 +81,7 @@ export interface RegistryView {
|
|
|
109
81
|
refreshTools(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
|
|
110
82
|
peekTools(id: string): ToolDef[] | undefined;
|
|
111
83
|
contextFor(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): ConnectorContext;
|
|
112
|
-
/**
|
|
113
|
-
* Acquire the connector's shared downstream-call permit. Scoped views
|
|
114
|
-
* delegate to the base registry so every toolkit contends on the same pool.
|
|
115
|
-
*/
|
|
84
|
+
/** Acquire the connector's shared downstream-call permit. */
|
|
116
85
|
admitCall(id: string, input: {
|
|
117
86
|
toolName: string;
|
|
118
87
|
args: unknown;
|
|
@@ -123,12 +92,9 @@ export interface RegistryView {
|
|
|
123
92
|
recordFailure(id: string, latencyMs: number, error: unknown): void;
|
|
124
93
|
healthFor(id: string): HealthObservation | undefined;
|
|
125
94
|
hasObservedSuccess(id: string): boolean;
|
|
126
|
-
/** When ANY view last saw a successful call to `id`, deployment-wide. */
|
|
127
95
|
observedSuccessAt(id: string): string | undefined;
|
|
128
|
-
/**
|
|
129
|
-
|
|
130
|
-
/** Store a liveness verdict a live status check just produced. */
|
|
131
|
-
recordCredentialHealth(id: string, record: CredentialHealthRecord): Promise<void>;
|
|
96
|
+
/** Local declared-vs-stored credential mismatch, with no downstream I/O. */
|
|
97
|
+
credentialDriftFor(id: string): Promise<string | undefined>;
|
|
132
98
|
statusFor(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ConnectorStatus>;
|
|
133
99
|
invalidateStored(id: string): Promise<void>;
|
|
134
100
|
}
|
|
@@ -147,6 +113,8 @@ export declare class Registry implements RegistryView {
|
|
|
147
113
|
private readonly catalogGenerations;
|
|
148
114
|
/** Serialize persisted catalog set/delete operations within this isolate. */
|
|
149
115
|
private readonly catalogMutations;
|
|
116
|
+
/** Same-request cold loads share one promise without retaining the request. */
|
|
117
|
+
private readonly requestCatalogLoads;
|
|
150
118
|
/** Deployment-wide observations — every call, whatever view made it. */
|
|
151
119
|
private readonly health;
|
|
152
120
|
private readonly ttlMs;
|
|
@@ -156,8 +124,6 @@ export declare class Registry implements RegistryView {
|
|
|
156
124
|
readonly maxResultBytes: number;
|
|
157
125
|
/** Final batch envelope cap threaded to the meta-tools. */
|
|
158
126
|
readonly maxBatchResultBytes: number;
|
|
159
|
-
/** Proactive liveness checks over stored downstream credentials (issue #24). */
|
|
160
|
-
private readonly credentialHealth;
|
|
161
127
|
constructor(connectors: Connector[], opts: RegistryOptions);
|
|
162
128
|
/**
|
|
163
129
|
* Warn once per unusable result cap, at construction time — the same
|
|
@@ -197,8 +163,15 @@ export declare class Registry implements RegistryView {
|
|
|
197
163
|
toolName: string;
|
|
198
164
|
} | null;
|
|
199
165
|
private catalogKey;
|
|
200
|
-
private
|
|
166
|
+
private catalogChunkKey;
|
|
167
|
+
private validLegacyCatalog;
|
|
168
|
+
private validCatalogTools;
|
|
169
|
+
private validCatalogManifest;
|
|
170
|
+
private parseCatalogManifest;
|
|
171
|
+
private splitCatalogChunks;
|
|
172
|
+
private readCatalog;
|
|
201
173
|
private storeCatalog;
|
|
174
|
+
private deleteCatalog;
|
|
202
175
|
private catalogGeneration;
|
|
203
176
|
private advanceCatalogGeneration;
|
|
204
177
|
/**
|
|
@@ -210,159 +183,35 @@ export declare class Registry implements RegistryView {
|
|
|
210
183
|
/** Force a live listTools refresh and replace both catalog cache layers. */
|
|
211
184
|
refreshTools(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
|
|
212
185
|
/** Cached listTools with in-memory + persisted serializable catalog layers. */
|
|
186
|
+
private loadTools;
|
|
187
|
+
/**
|
|
188
|
+
* Coalesce one connector's cold load inside one inbound request. The WeakMap
|
|
189
|
+
* neither roots the request scope nor lets its connector context escape into
|
|
190
|
+
* another request; settled entries are also removed eagerly.
|
|
191
|
+
*
|
|
192
|
+
* The first caller's `callOptions` govern the shared load: a later caller's
|
|
193
|
+
* signal or timeout neither cancels nor extends it, and an abort by the
|
|
194
|
+
* first caller rejects every coalesced caller. Within one request that is
|
|
195
|
+
* the deal being made — one fetch, one deadline.
|
|
196
|
+
*/
|
|
213
197
|
getTools(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
|
|
214
198
|
/** Return a cached catalog without performing storage or network I/O. */
|
|
215
199
|
peekTools(id: string): ToolDef[] | undefined;
|
|
216
200
|
recordSuccess(id: string, latencyMs: number): void;
|
|
217
201
|
recordFailure(id: string, latencyMs: number, error: unknown): void;
|
|
218
202
|
healthFor(id: string): HealthObservation | undefined;
|
|
219
|
-
/**
|
|
220
|
-
* Whether ANY view of this deployment has seen a successful call to `id` —
|
|
221
|
-
* a bare boolean, never the observation. Connector liveness (reachable,
|
|
222
|
-
* credentials still valid) is a deployment-level fact, not a per-view one, so
|
|
223
|
-
* `list_connectors` may classify a connector as ok/unknown from it. The
|
|
224
|
-
* observation itself — `lastError` above all, which names the tool that
|
|
225
|
-
* failed — stays strictly per view.
|
|
226
|
-
*/
|
|
203
|
+
/** Whether this deployment has seen a successful call to `id`. */
|
|
227
204
|
hasObservedSuccess(id: string): boolean;
|
|
228
|
-
/**
|
|
229
|
-
* The timestamp behind `hasObservedSuccess`, on the same deployment-wide
|
|
230
|
-
* terms and for the same reason: it says only *when* the connector last
|
|
231
|
-
* answered, never what was called or what failed. Credential health reads it
|
|
232
|
-
* to decide whether a failed verdict has been overtaken by real traffic.
|
|
233
|
-
*/
|
|
205
|
+
/** The timestamp behind `hasObservedSuccess`. */
|
|
234
206
|
observedSuccessAt(id: string): string | undefined;
|
|
235
|
-
|
|
236
|
-
* The last credential-liveness verdict for `id` — the layer that lets a cached
|
|
237
|
-
* status read report `auth_required` before a real call discovers it. Read
|
|
238
|
-
* from storage (mirrored in memory for a few seconds) rather than held in
|
|
239
|
-
* memory alone, because on Workers the isolate that ran the check is usually
|
|
240
|
-
* not the isolate answering this read.
|
|
241
|
-
*/
|
|
242
|
-
credentialHealthFor(id: string): Promise<CredentialHealthRecord | undefined>;
|
|
243
|
-
recordCredentialHealth(id: string, record: CredentialHealthRecord): Promise<void>;
|
|
244
|
-
/**
|
|
245
|
-
* Check stored downstream credentials now and return one outcome per
|
|
246
|
-
* connector considered. THE operator-facing entry point behind
|
|
247
|
-
* `Connecta.checkCredentials()`: wire it to a Worker cron trigger or a Node
|
|
248
|
-
* interval. Never rejects; connectors checked recently are reported as
|
|
249
|
-
* `fresh` unless `force` is set.
|
|
250
|
-
*/
|
|
251
|
-
checkCredentialHealth(baseUrl: string, opts?: CredentialCheckOptions, defer?: DeferredWork): Promise<CredentialCheckResult[]>;
|
|
252
|
-
/**
|
|
253
|
-
* The traffic-triggered sweep: a promise for the caller to defer (Workers:
|
|
254
|
-
* `ctx.waitUntil`), or `undefined` when nothing is due — which is the common
|
|
255
|
-
* case and costs no I/O. Called by the server after an authenticated request;
|
|
256
|
-
* the checker owns the rate limiting.
|
|
257
|
-
*/
|
|
258
|
-
sweepCredentialHealthIfDue(baseUrl: string, defer?: DeferredWork): Promise<CredentialCheckResult[]> | undefined;
|
|
259
|
-
/**
|
|
260
|
-
* Drop a connector's liveness verdict, because its credential just changed
|
|
261
|
-
* under us (OAuth callback completed, credential stored or removed on
|
|
262
|
-
* /credentials). A
|
|
263
|
-
* stale `auth_required` must not outlive the re-authorization that fixed it —
|
|
264
|
-
* that is the difference between recovery working and needing a restart.
|
|
265
|
-
*/
|
|
266
|
-
clearCredentialHealth(id: string): Promise<void>;
|
|
207
|
+
credentialDriftFor(id: string): Promise<string | undefined>;
|
|
267
208
|
/** Best-effort connector status for list_connectors. */
|
|
268
209
|
statusFor(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ConnectorStatus>;
|
|
210
|
+
private markCatalogInvalid;
|
|
211
|
+
private deleteStoredCatalog;
|
|
269
212
|
/** Drop a connector's cached tool list (e.g. after auth completes). */
|
|
270
213
|
invalidate(id: string): void;
|
|
271
214
|
/** Drop both in-memory and persisted tool catalogs. */
|
|
272
215
|
invalidateStored(id: string): Promise<void>;
|
|
273
216
|
}
|
|
274
|
-
/**
|
|
275
|
-
* THE toolkit enforcement point (issue #22).
|
|
276
|
-
*
|
|
277
|
-
* A filtered VIEW of one long-lived `Registry`: same connectors, same tool
|
|
278
|
-
* caches, same health — narrowed to the connectors and tool addresses one
|
|
279
|
-
* toolkit selects. `serveMcp` builds it once per scoped connection and hands it
|
|
280
|
-
* to `registerMetaTools`/`registerExecuteTool`, so `list_connectors`,
|
|
281
|
-
* `search_tools`, `describe_tools`, `call_tool`, `call_destructive_tool`,
|
|
282
|
-
* `batch_call`, `authorize_connector`, `get_result`, `skills`, and the
|
|
283
|
-
* `execute_code` host bridge all inherit the boundary from here instead of
|
|
284
|
-
* re-implementing nine checks.
|
|
285
|
-
*
|
|
286
|
-
* Two invariants make it reviewable:
|
|
287
|
-
*
|
|
288
|
-
* 1. **Indistinguishability.** Out-of-scope input fails through the SAME code
|
|
289
|
-
* path, with the same error class and message, as input naming something
|
|
290
|
-
* that does not exist at all. An out-of-scope CONNECTOR disappears from
|
|
291
|
-
* `resolveAddress`/`getConnector` (→ `Unknown address` / `Unknown
|
|
292
|
-
* connector`); an out-of-scope TOOL disappears from the catalog this view
|
|
293
|
-
* returns (→ `Unknown tool "<t>" on connector "<c>"`), which is exactly the
|
|
294
|
-
* error a misspelled tool name already produced. Scoping deliberately does
|
|
295
|
-
* NOT reject at `resolveAddress` for tools: that would answer with the
|
|
296
|
-
* connector-level message and make "hidden here" distinguishable from
|
|
297
|
-
* "never existed".
|
|
298
|
-
* 2. **It filters views, never state.** Every read delegates to the shared
|
|
299
|
-
* registry and filters the returned array, so the tool cache, the persisted
|
|
300
|
-
* catalog, and the health map stay whole and shared across scopes.
|
|
301
|
-
*/
|
|
302
|
-
export declare class ScopedRegistry implements RegistryView {
|
|
303
|
-
private readonly base;
|
|
304
|
-
private readonly toolkit;
|
|
305
|
-
/** This toolkit's own health observations — see HealthLog. */
|
|
306
|
-
private readonly health;
|
|
307
|
-
constructor(base: Registry, toolkit: Toolkit);
|
|
308
|
-
get maxResultBytes(): number;
|
|
309
|
-
get maxBatchResultBytes(): number;
|
|
310
|
-
/** In scope AND actually registered. */
|
|
311
|
-
private visible;
|
|
312
|
-
/** Byte-identical to what the unscoped registry throws for an unknown id. */
|
|
313
|
-
private unknownConnector;
|
|
314
|
-
private inScopeTools;
|
|
315
|
-
listConnectors(): Connector[];
|
|
316
|
-
getConnector(id: string): Connector | undefined;
|
|
317
|
-
resolveAddress(address: string): {
|
|
318
|
-
connector: Connector;
|
|
319
|
-
toolName: string;
|
|
320
|
-
} | null;
|
|
321
|
-
getTools(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
|
|
322
|
-
refreshTools(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
|
|
323
|
-
peekTools(id: string): ToolDef[] | undefined;
|
|
324
|
-
contextFor(id: string, baseUrl: string, requestScope?: object, callOptions?: ConnectorOperationOptions): ConnectorContext;
|
|
325
|
-
admitCall(id: string, input: {
|
|
326
|
-
toolName: string;
|
|
327
|
-
args: unknown;
|
|
328
|
-
signal?: AbortSignal;
|
|
329
|
-
}): Promise<CallAdmissionPermit>;
|
|
330
|
-
/**
|
|
331
|
-
* Stashed oversized results are bound to the scope that produced them: a
|
|
332
|
-
* scoped session cannot page a result it could not have produced, and an id
|
|
333
|
-
* from another scope reads back as the ordinary "Unknown or expired result
|
|
334
|
-
* id". Unscoped sessions keep the historical `results:` prefix untouched.
|
|
335
|
-
*/
|
|
336
|
-
resultsStorage(): KVStorage;
|
|
337
|
-
recordSuccess(id: string, latencyMs: number): void;
|
|
338
|
-
recordFailure(id: string, latencyMs: number, error: unknown): void;
|
|
339
|
-
healthFor(id: string): HealthObservation | undefined;
|
|
340
|
-
/**
|
|
341
|
-
* Deliberately NOT per view: whether the connector has ever answered is a
|
|
342
|
-
* fact about the connector, not about a team's traffic, and withholding it
|
|
343
|
-
* would report every remote connector as "unknown" to a scoped session that
|
|
344
|
-
* has not called it yet. It carries no tool name, error text, or count — the
|
|
345
|
-
* per-view isolation of those, above, is unchanged.
|
|
346
|
-
*/
|
|
347
|
-
hasObservedSuccess(id: string): boolean;
|
|
348
|
-
/** Deployment-wide for the same reason as `hasObservedSuccess` above. */
|
|
349
|
-
observedSuccessAt(id: string): string | undefined;
|
|
350
|
-
/**
|
|
351
|
-
* Also deliberately NOT per view, for the same reason as
|
|
352
|
-
* `hasObservedSuccess`: whether the credential connecta stores for a connector
|
|
353
|
-
* still works is a fact about the deployment's credential, not about a team's
|
|
354
|
-
* traffic. Withholding it would leave a scoped session unable to see that the
|
|
355
|
-
* connector it shares needs re-authorization. The verdict carries the
|
|
356
|
-
* connector's own connector-level reason — never a tool name — so the per-view
|
|
357
|
-
* isolation of `lastError` above is unchanged.
|
|
358
|
-
*/
|
|
359
|
-
credentialHealthFor(id: string): Promise<CredentialHealthRecord | undefined>;
|
|
360
|
-
recordCredentialHealth(id: string, record: CredentialHealthRecord): Promise<void>;
|
|
361
|
-
statusFor(id: string, baseUrl: string, requestScope?: object, callOptions?: {
|
|
362
|
-
signal?: AbortSignal;
|
|
363
|
-
timeoutMs?: number;
|
|
364
|
-
}): Promise<ConnectorStatus>;
|
|
365
|
-
invalidateStored(id: string): Promise<void>;
|
|
366
|
-
}
|
|
367
|
-
export {};
|
|
368
217
|
//# sourceMappingURL=registry.d.ts.map
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,MAAM,EACN,OAAO,EACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAEL,KAAK,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|