@zackbart/connecta 0.7.8 → 0.8.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 (187) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +67 -144
  3. package/dist/activity.d.ts +1 -1
  4. package/dist/activity.d.ts.map +1 -1
  5. package/dist/activity.js.map +1 -1
  6. package/dist/auth/bearer.d.ts +1 -1
  7. package/dist/auth/bearer.js +4 -4
  8. package/dist/auth/bearer.js.map +1 -1
  9. package/dist/auth/clerk.d.ts +1 -1
  10. package/dist/auth/clerk.js +1 -1
  11. package/dist/call-admission.d.ts +81 -0
  12. package/dist/call-admission.d.ts.map +1 -0
  13. package/dist/call-admission.js +345 -0
  14. package/dist/call-admission.js.map +1 -0
  15. package/dist/catalog-fingerprint.d.ts +20 -0
  16. package/dist/catalog-fingerprint.d.ts.map +1 -0
  17. package/dist/catalog-fingerprint.js +34 -0
  18. package/dist/catalog-fingerprint.js.map +1 -0
  19. package/dist/catalog-limits.d.ts +10 -0
  20. package/dist/catalog-limits.d.ts.map +1 -0
  21. package/dist/catalog-limits.js +10 -0
  22. package/dist/catalog-limits.js.map +1 -0
  23. package/dist/catalog-service.d.ts +138 -0
  24. package/dist/catalog-service.d.ts.map +1 -0
  25. package/dist/catalog-service.js +407 -0
  26. package/dist/catalog-service.js.map +1 -0
  27. package/dist/catalog.js +2 -2
  28. package/dist/catalog.js.map +1 -1
  29. package/dist/concurrency.d.ts +4 -0
  30. package/dist/concurrency.d.ts.map +1 -0
  31. package/dist/concurrency.js +31 -0
  32. package/dist/concurrency.js.map +1 -0
  33. package/dist/connectors/api.d.ts +3 -1
  34. package/dist/connectors/api.d.ts.map +1 -1
  35. package/dist/connectors/api.js +22 -11
  36. package/dist/connectors/api.js.map +1 -1
  37. package/dist/connectors/remote-mcp.d.ts +3 -1
  38. package/dist/connectors/remote-mcp.d.ts.map +1 -1
  39. package/dist/connectors/remote-mcp.js +44 -18
  40. package/dist/connectors/remote-mcp.js.map +1 -1
  41. package/dist/credential-health.d.ts +0 -22
  42. package/dist/credential-health.d.ts.map +1 -1
  43. package/dist/credential-health.js +14 -10
  44. package/dist/credential-health.js.map +1 -1
  45. package/dist/credentials.d.ts +3 -2
  46. package/dist/credentials.d.ts.map +1 -1
  47. package/dist/errors.d.ts +1 -1
  48. package/dist/errors.d.ts.map +1 -1
  49. package/dist/errors.js.map +1 -1
  50. package/dist/execute.d.ts +9 -8
  51. package/dist/execute.d.ts.map +1 -1
  52. package/dist/execute.js +144 -291
  53. package/dist/execute.js.map +1 -1
  54. package/dist/executor-result.d.ts +0 -3
  55. package/dist/executor-result.d.ts.map +1 -1
  56. package/dist/executor-result.js +2 -2
  57. package/dist/executor-result.js.map +1 -1
  58. package/dist/executors/quickjs-child.js +3 -3
  59. package/dist/executors/quickjs-child.js.map +1 -1
  60. package/dist/executors/quickjs-protocol.d.ts +4 -1
  61. package/dist/executors/quickjs-protocol.d.ts.map +1 -1
  62. package/dist/executors/quickjs-runtime.d.ts.map +1 -1
  63. package/dist/executors/quickjs-runtime.js +7 -2
  64. package/dist/executors/quickjs-runtime.js.map +1 -1
  65. package/dist/executors/quickjs.d.ts.map +1 -1
  66. package/dist/executors/quickjs.js +4 -1
  67. package/dist/executors/quickjs.js.map +1 -1
  68. package/dist/favicon.js +2 -2
  69. package/dist/favicon.js.map +1 -1
  70. package/dist/index.d.ts +6 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +45 -17
  73. package/dist/index.js.map +1 -1
  74. package/dist/invocation.d.ts +96 -0
  75. package/dist/invocation.d.ts.map +1 -0
  76. package/dist/invocation.js +369 -0
  77. package/dist/invocation.js.map +1 -0
  78. package/dist/meta-tools.d.ts +11 -86
  79. package/dist/meta-tools.d.ts.map +1 -1
  80. package/dist/meta-tools.js +145 -485
  81. package/dist/meta-tools.js.map +1 -1
  82. package/dist/operator-ui/generated.d.ts +3 -0
  83. package/dist/operator-ui/generated.d.ts.map +1 -0
  84. package/dist/operator-ui/generated.js +5 -0
  85. package/dist/operator-ui/generated.js.map +1 -0
  86. package/dist/operator-ui/model.d.ts +94 -0
  87. package/dist/operator-ui/model.d.ts.map +1 -0
  88. package/dist/operator-ui/model.js +28 -0
  89. package/dist/operator-ui/model.js.map +1 -0
  90. package/dist/registry.d.ts +47 -6
  91. package/dist/registry.d.ts.map +1 -1
  92. package/dist/registry.js +356 -35
  93. package/dist/registry.js.map +1 -1
  94. package/dist/routes/activity.d.ts +3 -0
  95. package/dist/routes/activity.d.ts.map +1 -0
  96. package/dist/routes/activity.js +173 -0
  97. package/dist/routes/activity.js.map +1 -0
  98. package/dist/routes/credentials.d.ts +3 -0
  99. package/dist/routes/credentials.d.ts.map +1 -0
  100. package/dist/routes/credentials.js +181 -0
  101. package/dist/routes/credentials.js.map +1 -0
  102. package/dist/routes/mcp.d.ts +8 -0
  103. package/dist/routes/mcp.d.ts.map +1 -0
  104. package/dist/routes/mcp.js +383 -0
  105. package/dist/routes/mcp.js.map +1 -0
  106. package/dist/routes/oauth.d.ts +4 -0
  107. package/dist/routes/oauth.d.ts.map +1 -0
  108. package/dist/routes/oauth.js +268 -0
  109. package/dist/routes/oauth.js.map +1 -0
  110. package/dist/routes/shared.d.ts +97 -0
  111. package/dist/routes/shared.d.ts.map +1 -0
  112. package/dist/routes/shared.js +199 -0
  113. package/dist/routes/shared.js.map +1 -0
  114. package/dist/routes/ui.d.ts +3 -0
  115. package/dist/routes/ui.d.ts.map +1 -0
  116. package/dist/routes/ui.js +122 -0
  117. package/dist/routes/ui.js.map +1 -0
  118. package/dist/server.d.ts +9 -40
  119. package/dist/server.d.ts.map +1 -1
  120. package/dist/server.js +67 -1292
  121. package/dist/server.js.map +1 -1
  122. package/dist/skills.d.ts +0 -15
  123. package/dist/skills.d.ts.map +1 -1
  124. package/dist/skills.js +6 -5
  125. package/dist/skills.js.map +1 -1
  126. package/dist/storage/file.d.ts.map +1 -1
  127. package/dist/storage/file.js +3 -1
  128. package/dist/storage/file.js.map +1 -1
  129. package/dist/storage/memory.d.ts.map +1 -1
  130. package/dist/storage/memory.js +3 -1
  131. package/dist/storage/memory.js.map +1 -1
  132. package/dist/toolkits.d.ts +0 -22
  133. package/dist/toolkits.d.ts.map +1 -1
  134. package/dist/toolkits.js +2 -2
  135. package/dist/toolkits.js.map +1 -1
  136. package/dist/types.d.ts +64 -2
  137. package/dist/types.d.ts.map +1 -1
  138. package/dist/ui.d.ts +3 -93
  139. package/dist/ui.d.ts.map +1 -1
  140. package/dist/ui.js +26 -1389
  141. package/dist/ui.js.map +1 -1
  142. package/dist/version.d.ts +1 -1
  143. package/dist/version.js +1 -1
  144. package/package.json +15 -8
  145. package/src/activity.ts +5 -1
  146. package/src/auth/bearer.ts +4 -4
  147. package/src/auth/clerk.ts +1 -1
  148. package/src/call-admission.ts +522 -0
  149. package/src/catalog-fingerprint.ts +52 -0
  150. package/src/catalog-limits.ts +11 -0
  151. package/src/catalog-service.ts +601 -0
  152. package/src/catalog.ts +2 -2
  153. package/src/concurrency.ts +39 -0
  154. package/src/connectors/api.ts +25 -11
  155. package/src/connectors/remote-mcp.ts +55 -21
  156. package/src/credential-health.ts +13 -10
  157. package/src/credentials.ts +2 -2
  158. package/src/errors.ts +1 -1
  159. package/src/execute.ts +194 -377
  160. package/src/executor-result.ts +2 -2
  161. package/src/executors/quickjs-child.ts +8 -4
  162. package/src/executors/quickjs-protocol.ts +1 -1
  163. package/src/executors/quickjs-runtime.ts +5 -1
  164. package/src/executors/quickjs.ts +11 -8
  165. package/src/favicon.ts +2 -2
  166. package/src/index.ts +54 -17
  167. package/src/invocation.ts +527 -0
  168. package/src/meta-tools.ts +369 -797
  169. package/src/operator-ui/browser.css +413 -0
  170. package/src/operator-ui/browser.ts +1121 -0
  171. package/src/operator-ui/generated.ts +4 -0
  172. package/src/operator-ui/model.ts +127 -0
  173. package/src/registry.ts +489 -44
  174. package/src/routes/activity.ts +220 -0
  175. package/src/routes/credentials.ts +266 -0
  176. package/src/routes/mcp.ts +485 -0
  177. package/src/routes/oauth.ts +328 -0
  178. package/src/routes/shared.ts +330 -0
  179. package/src/routes/ui.ts +153 -0
  180. package/src/server.ts +70 -1702
  181. package/src/skills.ts +6 -5
  182. package/src/storage/file.ts +3 -1
  183. package/src/storage/memory.ts +3 -1
  184. package/src/toolkits.ts +2 -2
  185. package/src/types.ts +70 -2
  186. package/src/ui.ts +52 -1489
  187. package/src/version.ts +1 -1
@@ -0,0 +1,345 @@
1
+ import { ConnectorCallError } from "./errors.js";
2
+ const DEFAULT_MAX_QUEUE_SIZE = 32;
3
+ const DEFAULT_QUEUE_TIMEOUT_MS = 5_000;
4
+ const DEFAULT_RETRY_AFTER_MS = 1_000;
5
+ const DEFAULT_MAX_PARTITIONS = 1_024;
6
+ const MAX_PARTITION_KEY_BYTES = 128;
7
+ const DEFAULT_PARTITION_KEY = "";
8
+ const enc = new TextEncoder();
9
+ /**
10
+ * A locally-produced connector-call failure. Extending ConnectorCallError
11
+ * preserves the public error envelope while letting call paths avoid recording
12
+ * a refusal as evidence that the downstream provider is unhealthy.
13
+ */
14
+ export class CallAdmissionError extends ConnectorCallError {
15
+ admissionKind;
16
+ constructor(admissionKind, code, message, opts = {}) {
17
+ super(code, message, opts);
18
+ this.admissionKind = admissionKind;
19
+ this.name = "CallAdmissionError";
20
+ }
21
+ }
22
+ export function isCallAdmissionError(error) {
23
+ return error instanceof CallAdmissionError;
24
+ }
25
+ function positiveWhole(value, name) {
26
+ if (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) {
27
+ throw new TypeError(`${name} must be a positive whole number.`);
28
+ }
29
+ return value;
30
+ }
31
+ function nonNegativeWhole(value, name) {
32
+ if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
33
+ throw new TypeError(`${name} must be a non-negative whole number.`);
34
+ }
35
+ return value;
36
+ }
37
+ /**
38
+ * Per-runtime, per-connector call admission. State contains only bounded
39
+ * partition keys, counters, timestamps, signals, and promise continuations;
40
+ * tool arguments never enter the controller.
41
+ */
42
+ export class ConnectorCallAdmissionController {
43
+ connectorId;
44
+ maxConcurrency;
45
+ maxQueueSize;
46
+ queueTimeoutMs;
47
+ retryAfterMs;
48
+ maxPartitions;
49
+ budget;
50
+ partitionKey;
51
+ partitions = new Map();
52
+ closed = false;
53
+ admittedTotal = 0;
54
+ queuedTotal = 0;
55
+ rejectedTotal = 0;
56
+ rateLimitedTotal = 0;
57
+ cancelledTotal = 0;
58
+ queueWaitCount = 0;
59
+ queueWaitTotalMs = 0;
60
+ queueWaitMaxMs = 0;
61
+ constructor(connectorId, policy) {
62
+ this.connectorId = connectorId;
63
+ if (!Array.isArray(policy.rules) || policy.rules.length !== 1) {
64
+ throw new TypeError(`connector "${connectorId}" callAdmission.rules must contain exactly one rule in this release.`);
65
+ }
66
+ const rule = policy.rules[0];
67
+ if (rule.maxConcurrency === undefined &&
68
+ rule.budget === undefined) {
69
+ throw new TypeError(`connector "${connectorId}" callAdmission rule must declare maxConcurrency or budget.`);
70
+ }
71
+ this.maxConcurrency =
72
+ rule.maxConcurrency === undefined
73
+ ? undefined
74
+ : positiveWhole(rule.maxConcurrency, `connector "${connectorId}" callAdmission maxConcurrency`);
75
+ if (this.maxConcurrency === undefined &&
76
+ (rule.maxQueueSize !== undefined ||
77
+ rule.queueTimeoutMs !== undefined ||
78
+ rule.retryAfterMs !== undefined)) {
79
+ throw new TypeError(`connector "${connectorId}" callAdmission queue settings require maxConcurrency.`);
80
+ }
81
+ this.maxQueueSize = nonNegativeWhole(rule.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE, `connector "${connectorId}" callAdmission maxQueueSize`);
82
+ this.queueTimeoutMs = positiveWhole(rule.queueTimeoutMs ?? DEFAULT_QUEUE_TIMEOUT_MS, `connector "${connectorId}" callAdmission queueTimeoutMs`);
83
+ this.retryAfterMs = nonNegativeWhole(rule.retryAfterMs ?? DEFAULT_RETRY_AFTER_MS, `connector "${connectorId}" callAdmission retryAfterMs`);
84
+ this.maxPartitions = positiveWhole(policy.maxPartitions ?? DEFAULT_MAX_PARTITIONS, `connector "${connectorId}" callAdmission maxPartitions`);
85
+ if (rule.budget) {
86
+ if (rule.budget.kind !== "rolling-window") {
87
+ throw new TypeError(`connector "${connectorId}" callAdmission budget kind must be "rolling-window".`);
88
+ }
89
+ const maxCalls = positiveWhole(rule.budget.maxCalls, `connector "${connectorId}" callAdmission budget.maxCalls`);
90
+ const windowMs = positiveWhole(rule.budget.windowMs, `connector "${connectorId}" callAdmission budget.windowMs`);
91
+ this.budget = { maxCalls, windowMs };
92
+ }
93
+ else {
94
+ this.budget = undefined;
95
+ }
96
+ this.partitionKey = rule.partitionKey;
97
+ }
98
+ acquire(input) {
99
+ // Copy the signal out before constructing any waiter closure. Referencing
100
+ // `input` from a queued callback would retain its `args`, defeating the
101
+ // limiter's payload-free state contract.
102
+ const signal = input.signal;
103
+ if (this.closed) {
104
+ return Promise.reject(new CallAdmissionError("closed", "unavailable", `Connector "${this.connectorId}" call admission is closed.`));
105
+ }
106
+ if (signal?.aborted) {
107
+ this.cancelledTotal++;
108
+ return Promise.reject(this.cancelled(signal));
109
+ }
110
+ let key;
111
+ try {
112
+ key = this.partitionKey
113
+ ? this.partitionKey({
114
+ toolName: input.toolName,
115
+ args: input.args,
116
+ })
117
+ : DEFAULT_PARTITION_KEY;
118
+ }
119
+ catch (cause) {
120
+ this.rejectedTotal++;
121
+ return Promise.reject(new CallAdmissionError("partition", "connector_call_failed", `Connector "${this.connectorId}" call-admission partitionKey threw.`, { cause }));
122
+ }
123
+ if (typeof key !== "string" ||
124
+ enc.encode(key).length > MAX_PARTITION_KEY_BYTES) {
125
+ this.rejectedTotal++;
126
+ return Promise.reject(new CallAdmissionError("partition", "connector_call_failed", `Connector "${this.connectorId}" call-admission partitionKey must return a string of at most ${MAX_PARTITION_KEY_BYTES} UTF-8 bytes.`));
127
+ }
128
+ // A partition callback is operator code and may synchronously abort the
129
+ // caller. Recheck after it returns so that cancellation cannot consume a
130
+ // budget entry or concurrency slot.
131
+ if (signal?.aborted) {
132
+ this.cancelledTotal++;
133
+ return Promise.reject(this.cancelled(signal));
134
+ }
135
+ const now = Date.now();
136
+ let state = this.partitions.get(key);
137
+ if (!state) {
138
+ this.evictIdlePartitions(now);
139
+ if (this.partitions.size >= this.maxPartitions) {
140
+ this.rejectedTotal++;
141
+ return Promise.reject(new CallAdmissionError("partition", "rate_limited", `Connector "${this.connectorId}" call-admission partition capacity is exhausted.`, { retryAfterMs: this.retryAfterMs }));
142
+ }
143
+ state = {
144
+ active: 0,
145
+ waiters: [],
146
+ admittedAt: [],
147
+ };
148
+ this.partitions.set(key, state);
149
+ }
150
+ this.pruneBudget(state, now);
151
+ const budgetRetryAfterMs = this.budgetRetryAfterMs(state, now);
152
+ if (budgetRetryAfterMs !== undefined) {
153
+ this.rateLimitedTotal++;
154
+ return Promise.reject(this.budgetLimited(budgetRetryAfterMs));
155
+ }
156
+ if (this.maxConcurrency === undefined ||
157
+ state.active < this.maxConcurrency) {
158
+ return Promise.resolve(this.admit(state, now, 0));
159
+ }
160
+ if (state.waiters.length >= this.maxQueueSize) {
161
+ this.rejectedTotal++;
162
+ return Promise.reject(this.concurrencyLimited("queue is full"));
163
+ }
164
+ return new Promise((resolve, reject) => {
165
+ const waiter = {
166
+ queuedAt: now,
167
+ resolve,
168
+ reject,
169
+ ...(signal ? { signal } : {}),
170
+ };
171
+ waiter.onAbort = () => {
172
+ if (!this.removeWaiter(state, waiter))
173
+ return;
174
+ this.cleanupWaiter(waiter);
175
+ this.cancelledTotal++;
176
+ reject(this.cancelled(signal));
177
+ this.maybeDeletePartition(key, state, Date.now());
178
+ };
179
+ waiter.timer = setTimeout(() => {
180
+ if (!this.removeWaiter(state, waiter))
181
+ return;
182
+ this.cleanupWaiter(waiter);
183
+ this.rejectedTotal++;
184
+ reject(this.concurrencyLimited(`queue wait exceeded ${this.queueTimeoutMs}ms`));
185
+ this.maybeDeletePartition(key, state, Date.now());
186
+ }, this.queueTimeoutMs);
187
+ state.waiters.push(waiter);
188
+ this.queuedTotal++;
189
+ signal?.addEventListener("abort", waiter.onAbort, { once: true });
190
+ // Close the check-to-listener race: an abort before registration is not
191
+ // replayed by AbortSignal, so inspect it once after the waiter is fully
192
+ // removable and its timer is installed.
193
+ if (signal?.aborted)
194
+ waiter.onAbort();
195
+ });
196
+ }
197
+ snapshot() {
198
+ let active = 0;
199
+ let queued = 0;
200
+ for (const state of this.partitions.values()) {
201
+ active += state.active;
202
+ queued += state.waiters.length;
203
+ }
204
+ return {
205
+ rules: 1,
206
+ partitions: this.partitions.size,
207
+ active,
208
+ queued,
209
+ closed: this.closed,
210
+ totals: {
211
+ admitted: this.admittedTotal,
212
+ queued: this.queuedTotal,
213
+ rejected: this.rejectedTotal,
214
+ rateLimited: this.rateLimitedTotal,
215
+ cancelled: this.cancelledTotal,
216
+ },
217
+ queueWaitMs: {
218
+ count: this.queueWaitCount,
219
+ total: this.queueWaitTotalMs,
220
+ max: this.queueWaitMaxMs,
221
+ },
222
+ };
223
+ }
224
+ close() {
225
+ if (this.closed)
226
+ return;
227
+ this.closed = true;
228
+ for (const state of this.partitions.values()) {
229
+ for (const waiter of state.waiters.splice(0)) {
230
+ this.cleanupWaiter(waiter);
231
+ waiter.reject(new CallAdmissionError("closed", "unavailable", `Connector "${this.connectorId}" call admission is closed.`));
232
+ }
233
+ }
234
+ }
235
+ admit(state, now, waitMs) {
236
+ state.active++;
237
+ if (this.budget)
238
+ state.admittedAt.push(now);
239
+ this.admittedTotal++;
240
+ if (waitMs > 0) {
241
+ this.queueWaitCount++;
242
+ this.queueWaitTotalMs += waitMs;
243
+ this.queueWaitMaxMs = Math.max(this.queueWaitMaxMs, waitMs);
244
+ }
245
+ let released = false;
246
+ return {
247
+ waitMs,
248
+ release: () => {
249
+ if (released)
250
+ return;
251
+ released = true;
252
+ if (state.active > 0)
253
+ state.active--;
254
+ this.pump(state);
255
+ },
256
+ };
257
+ }
258
+ pump(state) {
259
+ if (this.closed || this.maxConcurrency === undefined)
260
+ return;
261
+ while (state.active < this.maxConcurrency &&
262
+ state.waiters.length > 0) {
263
+ const waiter = state.waiters.shift();
264
+ this.cleanupWaiter(waiter);
265
+ if (waiter.signal?.aborted) {
266
+ this.cancelledTotal++;
267
+ waiter.reject(this.cancelled(waiter.signal));
268
+ continue;
269
+ }
270
+ const now = Date.now();
271
+ this.pruneBudget(state, now);
272
+ const retryAfterMs = this.budgetRetryAfterMs(state, now);
273
+ if (retryAfterMs !== undefined) {
274
+ this.rateLimitedTotal++;
275
+ waiter.reject(this.budgetLimited(retryAfterMs));
276
+ continue;
277
+ }
278
+ const waitMs = Math.max(0, now - waiter.queuedAt);
279
+ waiter.resolve(this.admit(state, now, waitMs));
280
+ }
281
+ }
282
+ pruneBudget(state, now) {
283
+ const budget = this.budget;
284
+ if (!budget || state.admittedAt.length === 0)
285
+ return;
286
+ let expired = 0;
287
+ while (expired < state.admittedAt.length) {
288
+ const admittedAt = state.admittedAt[expired];
289
+ if (admittedAt === undefined || admittedAt + budget.windowMs > now) {
290
+ break;
291
+ }
292
+ expired++;
293
+ }
294
+ if (expired > 0)
295
+ state.admittedAt.splice(0, expired);
296
+ }
297
+ budgetRetryAfterMs(state, now) {
298
+ const budget = this.budget;
299
+ if (!budget || state.admittedAt.length < budget.maxCalls) {
300
+ return undefined;
301
+ }
302
+ const oldestAdmission = state.admittedAt[0];
303
+ if (oldestAdmission === undefined)
304
+ return undefined;
305
+ return Math.max(0, oldestAdmission + budget.windowMs - now);
306
+ }
307
+ evictIdlePartitions(now) {
308
+ for (const [key, state] of this.partitions) {
309
+ this.pruneBudget(state, now);
310
+ this.maybeDeletePartition(key, state, now);
311
+ }
312
+ }
313
+ maybeDeletePartition(key, state, now) {
314
+ this.pruneBudget(state, now);
315
+ if (state.active === 0 &&
316
+ state.waiters.length === 0 &&
317
+ state.admittedAt.length === 0) {
318
+ this.partitions.delete(key);
319
+ }
320
+ }
321
+ removeWaiter(state, waiter) {
322
+ const index = state.waiters.indexOf(waiter);
323
+ if (index < 0)
324
+ return false;
325
+ state.waiters.splice(index, 1);
326
+ return true;
327
+ }
328
+ cleanupWaiter(waiter) {
329
+ if (waiter.timer !== undefined)
330
+ clearTimeout(waiter.timer);
331
+ if (waiter.onAbort) {
332
+ waiter.signal?.removeEventListener("abort", waiter.onAbort);
333
+ }
334
+ }
335
+ concurrencyLimited(reason) {
336
+ return new CallAdmissionError("concurrency", "rate_limited", `Connector "${this.connectorId}" call concurrency ${reason}.`, { retryAfterMs: this.retryAfterMs });
337
+ }
338
+ budgetLimited(retryAfterMs) {
339
+ return new CallAdmissionError("budget", "rate_limited", `Connector "${this.connectorId}" rolling call budget is exhausted.`, { retryAfterMs });
340
+ }
341
+ cancelled(signal) {
342
+ return new CallAdmissionError("cancelled", "timeout", `Connector "${this.connectorId}" call was cancelled before admission.`, { cause: signal.reason });
343
+ }
344
+ }
345
+ //# sourceMappingURL=call-admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-admission.js","sourceRoot":"","sources":["../src/call-admission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ToolDef } from "./types.js";
2
+ export interface CatalogSnapshot {
3
+ tools: ToolDef[];
4
+ /** SHA-256 over the exact serialized tool array, prefixed with its size. */
5
+ fingerprint: string;
6
+ /** UTF-8 form reused by hashing, size enforcement, and chunking. */
7
+ serializedBytes: Uint8Array;
8
+ }
9
+ /** Fingerprint an already serialized catalog without parsing/reserializing it. */
10
+ export declare function fingerprintSerializedCatalog(serializedTools: string): Promise<{
11
+ fingerprint: string;
12
+ byteLength: number;
13
+ }>;
14
+ /**
15
+ * Capture every persisted/discovered field in one deterministic snapshot.
16
+ * Object key order is allowed to cause a conservative extra write; changing
17
+ * any serialized field must change the digest.
18
+ */
19
+ export declare function snapshotCatalog(tools: ToolDef[]): Promise<CatalogSnapshot>;
20
+ //# sourceMappingURL=catalog-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-fingerprint.d.ts","sourceRoot":"","sources":["../src/catalog-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,eAAe,EAAE,UAAU,CAAC;CAC7B;AAYD,kFAAkF;AAClF,wBAAsB,4BAA4B,CAChD,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAMtD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,OAAO,EAAE,GACf,OAAO,CAAC,eAAe,CAAC,CAW1B"}
@@ -0,0 +1,34 @@
1
+ const encoder = new TextEncoder();
2
+ async function fingerprintBytes(bytes) {
3
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
4
+ const hex = [...digest]
5
+ .map((byte) => byte.toString(16).padStart(2, "0"))
6
+ .join("");
7
+ return `sha256:${bytes.byteLength}:${hex}`;
8
+ }
9
+ /** Fingerprint an already serialized catalog without parsing/reserializing it. */
10
+ export async function fingerprintSerializedCatalog(serializedTools) {
11
+ const bytes = encoder.encode(serializedTools);
12
+ return {
13
+ fingerprint: await fingerprintBytes(bytes),
14
+ byteLength: bytes.byteLength,
15
+ };
16
+ }
17
+ /**
18
+ * Capture every persisted/discovered field in one deterministic snapshot.
19
+ * Object key order is allowed to cause a conservative extra write; changing
20
+ * any serialized field must change the digest.
21
+ */
22
+ export async function snapshotCatalog(tools) {
23
+ const serializedTools = JSON.stringify(tools);
24
+ if (serializedTools === undefined) {
25
+ throw new TypeError("Tool catalog is not JSON-serializable.");
26
+ }
27
+ const bytes = encoder.encode(serializedTools);
28
+ return {
29
+ tools,
30
+ fingerprint: await fingerprintBytes(bytes),
31
+ serializedBytes: bytes,
32
+ };
33
+ }
34
+ //# sourceMappingURL=catalog-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-fingerprint.js","sourceRoot":"","sources":["../src/catalog-fingerprint.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAUlC,KAAK,UAAU,gBAAgB,CAAC,KAAiB;IAC/C,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAC7C,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC;SACpB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACjD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,UAAU,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,eAAuB;IAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9C,OAAO;QACL,WAAW,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAgB;IAEhB,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK;QACL,WAAW,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC;QAC1C,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Complete-catalog ceiling shared by dynamically listed connector catalogs. */
2
+ export declare const MAX_CATALOG_TOOLS = 100000;
3
+ /**
4
+ * Large enough to cross a single Workers KV value boundary while keeping the
5
+ * serialized form at one quarter of a 128 MiB Worker heap.
6
+ */
7
+ export declare const MAX_SERIALIZED_CATALOG_BYTES: number;
8
+ /** Persisted values stay comfortably below platform per-value limits. */
9
+ export declare const MAX_CATALOG_CHUNK_BYTES: number;
10
+ //# sourceMappingURL=catalog-limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-limits.d.ts","sourceRoot":"","sources":["../src/catalog-limits.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAEzC;;;GAGG;AACH,eAAO,MAAM,4BAA4B,QAAmB,CAAC;AAE7D,yEAAyE;AACzE,eAAO,MAAM,uBAAuB,QAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** Complete-catalog ceiling shared by dynamically listed connector catalogs. */
2
+ export const MAX_CATALOG_TOOLS = 100_000;
3
+ /**
4
+ * Large enough to cross a single Workers KV value boundary while keeping the
5
+ * serialized form at one quarter of a 128 MiB Worker heap.
6
+ */
7
+ export const MAX_SERIALIZED_CATALOG_BYTES = 32 * 1024 * 1024;
8
+ /** Persisted values stay comfortably below platform per-value limits. */
9
+ export const MAX_CATALOG_CHUNK_BYTES = 1024 * 1024;
10
+ //# sourceMappingURL=catalog-limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-limits.js","sourceRoot":"","sources":["../src/catalog-limits.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7D,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,IAAI,CAAC"}
@@ -0,0 +1,138 @@
1
+ import type { CallErrorDetails } from "./errors.js";
2
+ import type { ConnectorOperationOptions, RegistryView } from "./registry.js";
3
+ import type { Connector, ToolDef } from "./types.js";
4
+ export declare const MAX_SEARCH_LIMIT = 100;
5
+ export declare const MAX_DESCRIBE_ADDRESSES = 100;
6
+ export declare const MAX_DISCOVERY_RESULT_BYTES = 256000;
7
+ export declare class DiscoveryPolicyError extends Error {
8
+ readonly code: "invalid_args" | "result_too_large";
9
+ constructor(code: "invalid_args" | "result_too_large", message: string);
10
+ }
11
+ /** Serialize once and count the exact bytes the MCP adapter would emit. */
12
+ export declare function boundedDiscoveryText(value: unknown, hint: string): string;
13
+ /** Apply the same final UTF-8 boundary where only the check is needed. */
14
+ export declare function assertDiscoveryResultSize(value: unknown, hint: string): void;
15
+ export interface CatalogSearchArgs {
16
+ query?: string;
17
+ connector?: string;
18
+ limit?: number;
19
+ offset?: number;
20
+ fullDescriptions?: boolean;
21
+ includeSchemas?: "compact" | "json";
22
+ }
23
+ export interface CatalogDescribeArgs {
24
+ addresses?: unknown;
25
+ format?: "compact" | "json";
26
+ fullDescriptions?: boolean;
27
+ }
28
+ interface CatalogSearchEntry {
29
+ connector: Connector;
30
+ guide?: string;
31
+ tool: {
32
+ name: string;
33
+ address: string;
34
+ description?: string;
35
+ inputSchema?: unknown;
36
+ outputSchema?: unknown;
37
+ annotations?: ToolDef["annotations"];
38
+ };
39
+ }
40
+ export interface CatalogSearchPage {
41
+ entries: CatalogSearchEntry[];
42
+ total: number;
43
+ offset: number;
44
+ limit: number;
45
+ hasMore: boolean;
46
+ nextOffset?: number;
47
+ matchMode?: "partial";
48
+ }
49
+ export interface CatalogDescription {
50
+ address: string;
51
+ name?: string;
52
+ description?: string;
53
+ guide?: string;
54
+ inputSchema?: unknown;
55
+ outputSchema?: unknown;
56
+ annotations?: ToolDef["annotations"];
57
+ error?: string;
58
+ }
59
+ export interface ResolvedCatalogTool {
60
+ connector: Connector;
61
+ toolName: string;
62
+ definition: ToolDef;
63
+ }
64
+ export type CatalogResolution = {
65
+ ok: true;
66
+ resolved: ResolvedCatalogTool;
67
+ catalogMs: number;
68
+ } | {
69
+ ok: false;
70
+ error: CallErrorDetails;
71
+ catalogMs: number;
72
+ connector?: Connector;
73
+ toolName?: string;
74
+ cause?: unknown;
75
+ };
76
+ /**
77
+ * Request-local catalog operations shared by MCP meta-tools and code mode.
78
+ * Successful catalogs may be reused inside this request; failures are not
79
+ * retained, and the service itself never escapes its request adapter.
80
+ */
81
+ export declare class CatalogService {
82
+ private readonly registry;
83
+ readonly baseUrl: string;
84
+ readonly requestScope: object;
85
+ private readonly probeTimeoutMs;
86
+ private readonly concurrency;
87
+ private readonly loaded;
88
+ private readonly loading;
89
+ constructor(registry: RegistryView, baseUrl: string, options?: {
90
+ requestScope?: object;
91
+ probeTimeoutMs?: number;
92
+ concurrency?: number;
93
+ });
94
+ loadConnector(id: string, callOptions?: ConnectorOperationOptions): Promise<ToolDef[]>;
95
+ private loadForDiscovery;
96
+ resolveTool(address: string, callOptions?: ConnectorOperationOptions): Promise<CatalogResolution>;
97
+ /**
98
+ * Resolve the JavaScript-safe property used by a lazy code-mode namespace
99
+ * back to exactly one catalog tool. Ambiguous aliases fail with an explicit
100
+ * escape hatch instead of silently choosing the first tool.
101
+ */
102
+ resolveToolAlias(connectorId: string, alias: string, aliasFor: (toolName: string) => string, callOptions?: ConnectorOperationOptions): Promise<CatalogResolution>;
103
+ search(args: CatalogSearchArgs): Promise<CatalogSearchPage>;
104
+ describe(args: CatalogDescribeArgs): Promise<CatalogDescription[]>;
105
+ }
106
+ export declare function groupedSearchResult(page: CatalogSearchPage): {
107
+ matchMode?: "partial";
108
+ nextOffset?: number;
109
+ connectors: {
110
+ id: string;
111
+ title?: string;
112
+ description?: string;
113
+ guide?: string;
114
+ tools: CatalogSearchEntry["tool"][];
115
+ }[];
116
+ total: number;
117
+ offset: number;
118
+ limit: number;
119
+ hasMore: boolean;
120
+ };
121
+ export declare function flatSearchResult(page: CatalogSearchPage): {
122
+ matchMode?: "partial";
123
+ nextOffset?: number;
124
+ tools: {
125
+ name: string;
126
+ address: string;
127
+ description?: string;
128
+ inputSchema?: unknown;
129
+ outputSchema?: unknown;
130
+ annotations?: ToolDef["annotations"];
131
+ }[];
132
+ total: number;
133
+ offset: number;
134
+ limit: number;
135
+ hasMore: boolean;
136
+ };
137
+ export {};
138
+ //# sourceMappingURL=catalog-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-service.d.ts","sourceRoot":"","sources":["../src/catalog-service.ts"],"names":[],"mappings":"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"}