@sentropic/h2a 0.97.2 → 0.97.3

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 (73) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/.codex-plugin/plugin.json +1 -1
  3. package/dist/bin.js +13 -0
  4. package/dist/bin.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +14 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/mcp.d.ts +1 -1
  10. package/dist/mcp.d.ts.map +1 -1
  11. package/dist/mcp.js +1 -0
  12. package/dist/mcp.js.map +1 -1
  13. package/dist/runtime/identity/bindings.d.ts.map +1 -1
  14. package/dist/runtime/identity/bindings.js +16 -1
  15. package/dist/runtime/identity/bindings.js.map +1 -1
  16. package/dist/runtime/identity/live.d.ts.map +1 -1
  17. package/dist/runtime/identity/live.js +15 -9
  18. package/dist/runtime/identity/live.js.map +1 -1
  19. package/dist/runtime/local-files/locks.d.ts +20 -0
  20. package/dist/runtime/local-files/locks.d.ts.map +1 -1
  21. package/dist/runtime/local-files/locks.js +42 -2
  22. package/dist/runtime/local-files/locks.js.map +1 -1
  23. package/dist/runtime/local-files/store.d.ts.map +1 -1
  24. package/dist/runtime/local-files/store.js +42 -4
  25. package/dist/runtime/local-files/store.js.map +1 -1
  26. package/dist/runtime/mcp/discovery-pagination.d.ts +73 -0
  27. package/dist/runtime/mcp/discovery-pagination.d.ts.map +1 -0
  28. package/dist/runtime/mcp/discovery-pagination.js +446 -0
  29. package/dist/runtime/mcp/discovery-pagination.js.map +1 -0
  30. package/dist/runtime/mcp/frame-budget.d.ts +149 -0
  31. package/dist/runtime/mcp/frame-budget.d.ts.map +1 -0
  32. package/dist/runtime/mcp/frame-budget.js +275 -0
  33. package/dist/runtime/mcp/frame-budget.js.map +1 -0
  34. package/dist/runtime/mcp/handlers.d.ts +14 -3
  35. package/dist/runtime/mcp/handlers.d.ts.map +1 -1
  36. package/dist/runtime/mcp/handlers.js +22 -1
  37. package/dist/runtime/mcp/handlers.js.map +1 -1
  38. package/dist/runtime/mcp/index.d.ts +1 -0
  39. package/dist/runtime/mcp/index.d.ts.map +1 -1
  40. package/dist/runtime/mcp/index.js +1 -0
  41. package/dist/runtime/mcp/index.js.map +1 -1
  42. package/dist/runtime/mcp/notifications.d.ts +13 -1
  43. package/dist/runtime/mcp/notifications.d.ts.map +1 -1
  44. package/dist/runtime/mcp/notifications.js +36 -20
  45. package/dist/runtime/mcp/notifications.js.map +1 -1
  46. package/dist/runtime/mcp/payload-store.d.ts +67 -0
  47. package/dist/runtime/mcp/payload-store.d.ts.map +1 -0
  48. package/dist/runtime/mcp/payload-store.js +242 -0
  49. package/dist/runtime/mcp/payload-store.js.map +1 -0
  50. package/dist/runtime/mcp/phase-trace.d.ts +98 -0
  51. package/dist/runtime/mcp/phase-trace.d.ts.map +1 -0
  52. package/dist/runtime/mcp/phase-trace.js +179 -0
  53. package/dist/runtime/mcp/phase-trace.js.map +1 -0
  54. package/dist/runtime/mcp/server.d.ts +13 -1
  55. package/dist/runtime/mcp/server.d.ts.map +1 -1
  56. package/dist/runtime/mcp/server.js +57 -3
  57. package/dist/runtime/mcp/server.js.map +1 -1
  58. package/dist/runtime/mcp/stdio.d.ts.map +1 -1
  59. package/dist/runtime/mcp/stdio.js +176 -15
  60. package/dist/runtime/mcp/stdio.js.map +1 -1
  61. package/dist/runtime/mcp/tools.d.ts.map +1 -1
  62. package/dist/runtime/mcp/tools.js +31 -4
  63. package/dist/runtime/mcp/tools.js.map +1 -1
  64. package/dist/runtime/mcp-central.d.ts.map +1 -1
  65. package/dist/runtime/mcp-central.js +17 -7
  66. package/dist/runtime/mcp-central.js.map +1 -1
  67. package/dist/runtime/mcp-http/hosted-mcp-server.d.ts.map +1 -1
  68. package/dist/runtime/mcp-http/hosted-mcp-server.js +16 -6
  69. package/dist/runtime/mcp-http/hosted-mcp-server.js.map +1 -1
  70. package/dist/runtime/mcp-http/readonly-allowlist.d.ts.map +1 -1
  71. package/dist/runtime/mcp-http/readonly-allowlist.js +3 -0
  72. package/dist/runtime/mcp-http/readonly-allowlist.js.map +1 -1
  73. package/package.json +3 -3
@@ -0,0 +1,446 @@
1
+ /**
2
+ * Bounded, paginated `h2a_discover_instances` (lot L1).
3
+ *
4
+ * The historical handler returned EVERY registration in one frame — 19,185,053 B
5
+ * for the demo seed, over both the 1 MiB frame budget and Claude's 16 MiB cap.
6
+ * This pager replaces that with:
7
+ * - a default of the 200 MOST RECENT inscriptions (a documented public change),
8
+ * - `total` / `hasMore` / an opaque authenticated `cursor` for full traversal,
9
+ * - a stable canonical order (createdAt desc; missing/invalid last; then id by
10
+ * code point), with a duplicate id refused as `registry_inconsistent`,
11
+ * - a per-request STABLE snapshot: both registry sources are captured with
12
+ * before/after content checks, and a change during capture is `registry_changed`,
13
+ * - a `generation` fingerprint (registry ∪ grants ∪ sort version) so a cursor
14
+ * from a stale corpus (or a restarted server) fails `cursor_stale` rather than
15
+ * silently omitting or duplicating a row,
16
+ * - a page trimmed until the REAL serialized frame fits the budget, and an
17
+ * indivisible oversize entry surfaced as `entry_too_large` with a durable
18
+ * recovery ref and a `resumeCursor` — never skipped, never a silent drop.
19
+ *
20
+ * The CLI `discover` verb and `LocalStore.listInstances()` keep their exhaustive
21
+ * contract; only the MCP tool paginates.
22
+ */
23
+ import { createHash, createHmac, randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
24
+ import { readFileSync, statSync } from "node:fs";
25
+ import { effectiveOrgInstances } from "@sentropic/h2a";
26
+ import { encodeFrame } from "./frame-budget.js";
27
+ const DEFAULT_LIMIT = 200;
28
+ const MAX_LIMIT = 1000;
29
+ const MAX_ROLE_BYTES = 64;
30
+ const MAX_SCOPE_BYTES = 256;
31
+ const MAX_CURSOR_CHARS = 2048;
32
+ const SORT_ORDER_VERSION = "discovery-order-v1";
33
+ const CAPTURE_ATTEMPTS = 3;
34
+ /**
35
+ * Bytes reserved below the budget when fitting a page: the placeholder id used
36
+ * for measurement is 1 char, but a real id is ≤128 UTF-8 bytes and an SSE frame
37
+ * adds `event:`/`data:`/blank-line overhead. Reserving here keeps the fitted page
38
+ * within budget on every transport; the transport's universal guard is the final
39
+ * backstop that never lets a raw oversize frame reach the wire.
40
+ */
41
+ const PAGE_FRAME_RESERVE = 1024;
42
+ // eslint-disable-next-line no-control-regex
43
+ const C0_DEL_RE = /[\u0000-\u001f\u007f]/;
44
+ function err(code, message, data) {
45
+ return { kind: "error", error: { code, message, ...(data ? { data } : {}) } };
46
+ }
47
+ /** Compare two strings by Unicode code point (ascending) without `localeCompare`. */
48
+ function codePointCompare(a, b) {
49
+ const ai = a[Symbol.iterator]();
50
+ const bi = b[Symbol.iterator]();
51
+ for (;;) {
52
+ const x = ai.next();
53
+ const y = bi.next();
54
+ if (x.done && y.done)
55
+ return 0;
56
+ if (x.done)
57
+ return -1;
58
+ if (y.done)
59
+ return 1;
60
+ const cx = x.value.codePointAt(0) ?? 0;
61
+ const cy = y.value.codePointAt(0) ?? 0;
62
+ if (cx !== cy)
63
+ return cx - cy;
64
+ }
65
+ }
66
+ function readOrEmpty(path) {
67
+ try {
68
+ return readFileSync(path);
69
+ }
70
+ catch (e) {
71
+ if (e.code === "ENOENT")
72
+ return Buffer.alloc(0);
73
+ throw e;
74
+ }
75
+ }
76
+ function statSig(path) {
77
+ try {
78
+ const s = statSync(path);
79
+ return `${s.size}:${s.mtimeMs}:${s.ino}`;
80
+ }
81
+ catch {
82
+ return "absent";
83
+ }
84
+ }
85
+ /**
86
+ * Capture BOTH registry sources as a stable photograph: record every source's
87
+ * metadata, read every source, then re-read and re-check every source. A change
88
+ * detected across the window is `registry_changed` (retried up to 3 times). Not
89
+ * mtime/size alone — the byte content is compared, so a same-size mutation is
90
+ * still caught.
91
+ */
92
+ function captureSources(instancesPath, grantsPath) {
93
+ for (let attempt = 0; attempt < CAPTURE_ATTEMPTS; attempt += 1) {
94
+ const beforeI = statSig(instancesPath);
95
+ const beforeG = statSig(grantsPath);
96
+ const instances = readOrEmpty(instancesPath);
97
+ const grants = readOrEmpty(grantsPath);
98
+ const instances2 = readOrEmpty(instancesPath);
99
+ const grants2 = readOrEmpty(grantsPath);
100
+ const afterI = statSig(instancesPath);
101
+ const afterG = statSig(grantsPath);
102
+ if (beforeI === afterI &&
103
+ beforeG === afterG &&
104
+ instances.equals(instances2) &&
105
+ grants.equals(grants2)) {
106
+ return { instances, grants };
107
+ }
108
+ }
109
+ return undefined;
110
+ }
111
+ function uint64BE(n) {
112
+ const b = Buffer.alloc(8);
113
+ b.writeBigUInt64BE(BigInt(n));
114
+ return b;
115
+ }
116
+ /** Generation = SHA-256 of length-prefixed(instances) ++ length-prefixed(grants) ++ order version. */
117
+ function computeGeneration(capture) {
118
+ const h = createHash("sha256");
119
+ h.update(uint64BE(capture.instances.length));
120
+ h.update(capture.instances);
121
+ h.update(uint64BE(capture.grants.length));
122
+ h.update(capture.grants);
123
+ h.update(SORT_ORDER_VERSION);
124
+ return `sha256:${h.digest("hex")}`;
125
+ }
126
+ function toArray(value) {
127
+ if (value === undefined || value === null)
128
+ return [];
129
+ return Array.isArray(value) ? value : [value];
130
+ }
131
+ /**
132
+ * Canonical stable identity for ordering + duplicate detection. `instance` is
133
+ * always present; `id` is the pre-DEC-114 legacy address and may be absent on an
134
+ * old row, so the key falls back to `instance` (still unique per registration).
135
+ */
136
+ function regKey(reg) {
137
+ return typeof reg.id === "string" && reg.id.length > 0 ? reg.id : reg.instance;
138
+ }
139
+ function parseCorpus(capture) {
140
+ const registrations = [];
141
+ const seen = new Set();
142
+ const text = capture.instances.toString("utf8");
143
+ if (text.length > 0) {
144
+ for (const line of text.split("\n")) {
145
+ if (line.length === 0)
146
+ continue;
147
+ let reg;
148
+ try {
149
+ reg = JSON.parse(line);
150
+ }
151
+ catch {
152
+ return { duplicateOrInvalid: true };
153
+ }
154
+ if (typeof reg.instance !== "string" || reg.instance.length === 0) {
155
+ return { duplicateOrInvalid: true };
156
+ }
157
+ const key = regKey(reg);
158
+ if (seen.has(key))
159
+ return { duplicateOrInvalid: true };
160
+ seen.add(key);
161
+ registrations.push({ ...reg, roles: toArray(reg.roles), scopes: toArray(reg.scopes) });
162
+ }
163
+ }
164
+ const grants = [];
165
+ const gtext = capture.grants.toString("utf8");
166
+ if (gtext.length > 0) {
167
+ for (const line of gtext.split("\n")) {
168
+ if (line.length === 0)
169
+ continue;
170
+ try {
171
+ grants.push(JSON.parse(line));
172
+ }
173
+ catch {
174
+ return { duplicateOrInvalid: true };
175
+ }
176
+ }
177
+ }
178
+ return { registrations, grants };
179
+ }
180
+ function b64url(input) {
181
+ return Buffer.from(input).toString("base64url");
182
+ }
183
+ function macFor(secret, body) {
184
+ return createHmac("sha256", secret).update(body).digest();
185
+ }
186
+ function encodeCursor(secret, payload) {
187
+ const body = b64url(JSON.stringify(payload));
188
+ const mac = b64url(macFor(secret, body));
189
+ return `${body}.${mac}`;
190
+ }
191
+ function decodeCursor(secret, serverEpoch, raw) {
192
+ if (raw.length === 0 || raw.length > MAX_CURSOR_CHARS)
193
+ return { ok: false, code: "invalid_cursor" };
194
+ const dot = raw.indexOf(".");
195
+ if (dot <= 0 || dot === raw.length - 1)
196
+ return { ok: false, code: "invalid_cursor" };
197
+ const body = raw.slice(0, dot);
198
+ const mac = raw.slice(dot + 1);
199
+ let payload;
200
+ try {
201
+ payload = JSON.parse(Buffer.from(body, "base64url").toString("utf8"));
202
+ }
203
+ catch {
204
+ return { ok: false, code: "invalid_cursor" };
205
+ }
206
+ if (payload === null ||
207
+ typeof payload !== "object" ||
208
+ payload.v !== 1 ||
209
+ typeof payload.e !== "string" ||
210
+ typeof payload.g !== "string" ||
211
+ !Number.isInteger(payload.o) ||
212
+ payload.o < 0 ||
213
+ !Number.isInteger(payload.l) ||
214
+ typeof payload.r !== "string" ||
215
+ typeof payload.s !== "string") {
216
+ return { ok: false, code: "invalid_cursor" };
217
+ }
218
+ const expected = macFor(secret, body);
219
+ let macValid = false;
220
+ try {
221
+ const got = Buffer.from(mac, "base64url");
222
+ macValid = got.length === expected.length && timingSafeEqual(got, expected);
223
+ }
224
+ catch {
225
+ macValid = false;
226
+ }
227
+ if (!macValid) {
228
+ // A cursor minted by a PREVIOUS server instance (different secret) cannot be
229
+ // authenticated; distinguish a stale traversal from a forged/tampered cursor
230
+ // by the embedded (unauthenticated) epoch — either way traversal is refused.
231
+ return payload.e !== serverEpoch
232
+ ? { ok: false, code: "cursor_stale" }
233
+ : { ok: false, code: "invalid_cursor" };
234
+ }
235
+ if (payload.e !== serverEpoch)
236
+ return { ok: false, code: "cursor_stale" };
237
+ return { ok: true, payload };
238
+ }
239
+ const CURSOR_STALE_MESSAGE = "registry changed or server restarted; restart discovery without cursor";
240
+ export function createDiscoveryPager(store, options) {
241
+ const secret = options.secret ?? randomBytes(32);
242
+ const serverEpoch = options.serverEpoch ?? randomUUID();
243
+ const budget = options.budget;
244
+ const effectiveBudget = Math.max(1024, budget.maxBytes - PAGE_FRAME_RESERVE);
245
+ /** Measure the REAL frame bytes for a page (placeholder id; reserve covers the delta). */
246
+ function frameBytesFor(page) {
247
+ const text = JSON.stringify(page);
248
+ return encodeFrame({
249
+ jsonrpc: "2.0",
250
+ id: 0,
251
+ result: { content: [{ type: "text", text }] }
252
+ }).bytes;
253
+ }
254
+ function validateFilter(value, maxBytes) {
255
+ if (value === undefined)
256
+ return { ok: true, value: undefined };
257
+ if (typeof value !== "string")
258
+ return { ok: false };
259
+ if (C0_DEL_RE.test(value))
260
+ return { ok: false };
261
+ if (Buffer.byteLength(value, "utf8") > maxBytes)
262
+ return { ok: false };
263
+ return { ok: true, value: value.length === 0 ? undefined : value };
264
+ }
265
+ function discover(args) {
266
+ const a = args ?? {};
267
+ // 1. Validate filters and limit (cheap, before any registry read).
268
+ const roleV = validateFilter(a.role, MAX_ROLE_BYTES);
269
+ if (!roleV.ok) {
270
+ return err("invalid_filter", "role or scope exceeds the supported filter format");
271
+ }
272
+ const scopeV = validateFilter(a.scope, MAX_SCOPE_BYTES);
273
+ if (!scopeV.ok) {
274
+ return err("invalid_filter", "role or scope exceeds the supported filter format");
275
+ }
276
+ if (a.limit !== undefined) {
277
+ if (typeof a.limit !== "number" || !Number.isInteger(a.limit) || a.limit < 1 || a.limit > MAX_LIMIT) {
278
+ return err("invalid_limit", "limit must be an integer between 1 and 1000");
279
+ }
280
+ }
281
+ if (a.cursor !== undefined) {
282
+ if (typeof a.cursor !== "string" || a.cursor.length === 0 || a.cursor.length > MAX_CURSOR_CHARS) {
283
+ return err("invalid_cursor", "cursor is malformed or does not match the query");
284
+ }
285
+ }
286
+ // 2. Capture a stable photograph of BOTH sources.
287
+ const capture = captureSources(store.paths.instances, store.paths.orgMembership);
288
+ if (!capture) {
289
+ return err("registry_changed", "registry changed during capture; retry discovery", {
290
+ retryable: true
291
+ });
292
+ }
293
+ // 3. Generation fingerprint (registry ∪ grants ∪ sort version).
294
+ const generation = computeGeneration(capture);
295
+ // 4. Parse corpus (duplicate id / malformed row → inconsistent).
296
+ const parsed = parseCorpus(capture);
297
+ if ("duplicateOrInvalid" in parsed) {
298
+ return err("registry_inconsistent", "registry contains conflicting or invalid records", {
299
+ generation
300
+ });
301
+ }
302
+ // 5. Resolve offset + effective filters/limit from the cursor when present.
303
+ let offset = 0;
304
+ let role = roleV.value;
305
+ let scope = scopeV.value;
306
+ let limit = a.limit ?? DEFAULT_LIMIT;
307
+ if (a.cursor !== undefined) {
308
+ const decoded = decodeCursor(secret, serverEpoch, a.cursor);
309
+ if (!decoded.ok) {
310
+ if (decoded.code === "cursor_stale") {
311
+ return err("cursor_stale", CURSOR_STALE_MESSAGE, { restartRequired: true });
312
+ }
313
+ return err("invalid_cursor", "cursor is malformed or does not match the query");
314
+ }
315
+ const p = decoded.payload;
316
+ if (p.g !== generation) {
317
+ return err("cursor_stale", CURSOR_STALE_MESSAGE, { restartRequired: true });
318
+ }
319
+ // The client keeps its filters/limit OR omits them; a DIFFERENT explicit
320
+ // value is a mismatch (invalid_cursor), never a silent override.
321
+ const cursorRole = p.r === "" ? undefined : p.r;
322
+ const cursorScope = p.s === "" ? undefined : p.s;
323
+ if (a.role !== undefined && roleV.value !== cursorRole) {
324
+ return err("invalid_cursor", "cursor is malformed or does not match the query");
325
+ }
326
+ if (a.scope !== undefined && scopeV.value !== cursorScope) {
327
+ return err("invalid_cursor", "cursor is malformed or does not match the query");
328
+ }
329
+ if (a.limit !== undefined && a.limit !== p.l) {
330
+ return err("invalid_cursor", "cursor is malformed or does not match the query");
331
+ }
332
+ offset = p.o;
333
+ role = cursorRole;
334
+ scope = cursorScope;
335
+ limit = p.l;
336
+ }
337
+ // 6. Filter on the effective org view (registration ∪ grants), like the CLI.
338
+ const effective = effectiveOrgInstances(parsed.registrations, parsed.grants);
339
+ const effByInstance = new Map(effective.map((e) => [e.instance, e]));
340
+ let filtered = parsed.registrations;
341
+ if (role !== undefined) {
342
+ filtered = filtered.filter((reg) => effByInstance.get(reg.instance)?.roles.includes(role));
343
+ }
344
+ if (scope !== undefined) {
345
+ filtered = filtered.filter((reg) => effByInstance.get(reg.instance)?.scopes.includes(scope));
346
+ }
347
+ // 7. Canonical order: createdAt desc (valid), missing/invalid last, then id by code point.
348
+ const decorated = filtered.map((reg) => {
349
+ const ts = Date.parse(reg.createdAt);
350
+ return { reg, ts, hasValid: Number.isFinite(ts) };
351
+ });
352
+ decorated.sort((x, y) => {
353
+ if (x.hasValid && y.hasValid) {
354
+ if (x.ts !== y.ts)
355
+ return y.ts - x.ts;
356
+ }
357
+ else if (x.hasValid !== y.hasValid) {
358
+ return x.hasValid ? -1 : 1;
359
+ }
360
+ return codePointCompare(regKey(x.reg), regKey(y.reg));
361
+ });
362
+ const sorted = decorated.map((d) => d.reg);
363
+ const total = sorted.length;
364
+ if (offset > total) {
365
+ // A cursor whose offset is past the (possibly shrunk) end for THIS
366
+ // generation cannot be trusted to complete the traversal.
367
+ return err("cursor_stale", CURSOR_STALE_MESSAGE, { restartRequired: true });
368
+ }
369
+ // 8. Build the page, trimming until the REAL frame fits the budget.
370
+ const maxAvailable = Math.min(limit, total - offset);
371
+ const buildPage = (n) => {
372
+ const instances = sorted.slice(offset, offset + n);
373
+ const nextOffset = offset + n;
374
+ const hasMore = nextOffset < total;
375
+ const nextCursor = hasMore
376
+ ? encodeCursor(secret, {
377
+ v: 1,
378
+ e: serverEpoch,
379
+ g: generation,
380
+ o: nextOffset,
381
+ l: limit,
382
+ r: role ?? "",
383
+ s: scope ?? ""
384
+ })
385
+ : null;
386
+ return { instances, total, hasMore, nextCursor, generation, limit, returned: n };
387
+ };
388
+ if (total === 0 || maxAvailable === 0) {
389
+ return { kind: "page", page: buildPage(0) };
390
+ }
391
+ // Binary search for the largest n whose full frame fits the reserved budget.
392
+ let lo = 0;
393
+ let hi = maxAvailable;
394
+ while (lo < hi) {
395
+ const mid = Math.ceil((lo + hi) / 2);
396
+ if (frameBytesFor(buildPage(mid)) <= effectiveBudget)
397
+ lo = mid;
398
+ else
399
+ hi = mid - 1;
400
+ }
401
+ const fitCount = lo;
402
+ if (fitCount === 0) {
403
+ // Even a single entry at `offset` overflows: recover its intact bytes and
404
+ // hand back a resumeCursor for the NEXT offset — never skip the entry.
405
+ const entry = sorted[offset];
406
+ const entryId = regKey(entry);
407
+ const entryJson = JSON.stringify(entry);
408
+ const entryBytes = Buffer.byteLength(entryJson, "utf8");
409
+ let recovery;
410
+ if (options.payloadStore) {
411
+ try {
412
+ recovery = options.payloadStore.persistOutput(Buffer.from(entryJson, "utf8"));
413
+ }
414
+ catch {
415
+ recovery = undefined;
416
+ }
417
+ }
418
+ const resumeOffset = offset + 1;
419
+ const resumeCursor = resumeOffset < total
420
+ ? encodeCursor(secret, {
421
+ v: 1,
422
+ e: serverEpoch,
423
+ g: generation,
424
+ o: resumeOffset,
425
+ l: limit,
426
+ r: role ?? "",
427
+ s: scope ?? ""
428
+ })
429
+ : null;
430
+ return err("entry_too_large", "one registry entry exceeds the MCP frame budget", {
431
+ budgetBytes: budget.maxBytes,
432
+ entryBytes,
433
+ id: entryId.length > 256 ? `${entryId.slice(0, 256)}…` : entryId,
434
+ entrySha256: `sha256:${createHash("sha256").update(entryJson).digest("hex")}`,
435
+ generation,
436
+ total,
437
+ offset,
438
+ resumeCursor,
439
+ ...(recovery ? { recovery } : {})
440
+ });
441
+ }
442
+ return { kind: "page", page: buildPage(fitCount) };
443
+ }
444
+ return { discover };
445
+ }
446
+ //# sourceMappingURL=discovery-pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-pagination.js","sourceRoot":"","sources":["../../../src/runtime/mcp/discovery-pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Universal MCP output-emission policy (lot L1).
3
+ *
4
+ * EVERY frame written to a client — a success result, a JSON-RPC error, a parse
5
+ * error, `initialize`, `tools/list`, a preformatted Track result, AND every
6
+ * server-pushed notification — passes through this policy so no single write can
7
+ * exceed the negotiated byte budget. The budget is measured on the EXACT bytes
8
+ * finally emitted: one `JSON.stringify` of the whole message (its inner MCP text
9
+ * is already stringified), a trailing `\n`, then `Buffer.byteLength(..,"utf8")`.
10
+ *
11
+ * Substantiated budget (see build brief): the frozen frame ceiling is 1 MiB.
12
+ * `initialize` (~153 B) and `tools/list` (~30.8 kB) fit with >4x margin; a
13
+ * 200-record discovery page (~130-170 kB) fits with >6x. The full historical
14
+ * discover result (19,185,053 B) exceeds BOTH this ceiling AND Claude's
15
+ * 16,777,216 B cap — so the contract is pagination + chunked read-recovery +
16
+ * an explicit oversize refusal, NEVER a raised cap and NEVER a silent truncation
17
+ * that could cut a UTF-8 codepoint or corrupt JSON.
18
+ */
19
+ import type { PayloadRecoveryRef } from "./payload-store.js";
20
+ /** Frozen frame ceiling. Substantiated at 1 MiB; never raised toward the 16 MiB cap. */
21
+ export declare const MCP_MAX_FRAME_BYTES = 1048576;
22
+ /** Technical floor: a budget below this cannot hold a fixed bounded error. */
23
+ export declare const MCP_MIN_FRAME_BYTES: number;
24
+ /** Env override (never above the ceiling; never below the floor). */
25
+ export declare const MCP_FRAME_BUDGET_ENV = "H2A_MCP_MAX_FRAME_BYTES";
26
+ /** Overflow notice method for an oversize notification (a notice, not a payload). */
27
+ export declare const MCP_OVERFLOW_NOTIFICATION_METHOD = "notifications/h2a/overflow";
28
+ /** Max UTF-8 bytes an incoming request `id` string may carry (kept correlatable). */
29
+ export declare const MCP_MAX_REQUEST_ID_BYTES = 128;
30
+ export interface FrameBudget {
31
+ readonly maxBytes: number;
32
+ }
33
+ export interface EncodedFrame {
34
+ /** The single JSON serialization of the whole message (no newline). */
35
+ readonly json: string;
36
+ /** The exact bytes written to the wire, including the trailing `\n`. */
37
+ readonly line: string;
38
+ /** `Buffer.byteLength(line, "utf8")` — the calibration ground truth. */
39
+ readonly bytes: number;
40
+ }
41
+ export type JsonRpcId = string | number | null;
42
+ /**
43
+ * Resolve the effective budget. An explicit/env value is clamped to
44
+ * `[MCP_MIN_FRAME_BYTES, MCP_MAX_FRAME_BYTES]`. A value below the floor is a
45
+ * bootstrap misconfiguration; we clamp UP to the floor so a fixed bounded error
46
+ * can always be emitted rather than crashing the transport.
47
+ */
48
+ export declare function resolveFrameBudget(env?: Record<string, string | undefined>): FrameBudget;
49
+ /**
50
+ * Encode a message as the exact bytes finally emitted. A SINGLE `JSON.stringify`
51
+ * — the inner MCP `content[].text` is already a string. Throws only on a cyclic
52
+ * / non-serializable value; the caller converts that into a bounded -32603.
53
+ */
54
+ export declare function encodeFrame(message: unknown): EncodedFrame;
55
+ /**
56
+ * Validate an incoming JSON-RPC `id` BEFORE execution: a finite JSON number,
57
+ * `null`, or a UTF-8 string ≤128 bytes. Anything else (a huge string, an object,
58
+ * an array) cannot be correlated within budget → the caller answers -32600 with
59
+ * `id:null`. Absent id (a notification) is handled by the caller, not here.
60
+ */
61
+ export declare function isAcceptableRequestId(id: unknown): id is JsonRpcId;
62
+ export interface JsonRpcErrorFrameObject {
63
+ jsonrpc: "2.0";
64
+ id: JsonRpcId;
65
+ error: {
66
+ code: number;
67
+ message: string;
68
+ data?: unknown;
69
+ };
70
+ }
71
+ /** -32600 Invalid Request with `id:null` (an unusable incoming id). */
72
+ export declare function buildInvalidRequestId(): JsonRpcErrorFrameObject;
73
+ /** -32010 response_too_large: a produced result exceeded the byte budget. */
74
+ export declare function buildResponseTooLargeError(id: JsonRpcId, info: {
75
+ budgetBytes: number;
76
+ actualBytes: number;
77
+ recovery?: PayloadRecoveryRef | undefined;
78
+ }): JsonRpcErrorFrameObject;
79
+ /** -32603 serialization_failed: the value could not be serialized (e.g. cyclic). */
80
+ export declare function buildSerializationFailedError(id: JsonRpcId): JsonRpcErrorFrameObject;
81
+ /**
82
+ * Bound a full JSON-RPC RESPONSE object to the budget. Returns the frame to
83
+ * actually write — the original when it fits, else a fixed bounded -32010 (with
84
+ * a recovery ref when `recover` persisted the intact bytes), else a bounded
85
+ * -32603 when the value cannot even be serialized. The bounded error is small
86
+ * and always fits a valid budget (≥16 KiB).
87
+ */
88
+ export declare function boundResponseFrame(id: JsonRpcId, responseObject: unknown, budget: FrameBudget, recover?: (intactJson: string, intactBytes: number) => PayloadRecoveryRef | undefined): EncodedFrame;
89
+ export interface CallToolResultShape {
90
+ content: Array<{
91
+ type: string;
92
+ text?: string;
93
+ [k: string]: unknown;
94
+ }>;
95
+ isError?: boolean;
96
+ [k: string]: unknown;
97
+ }
98
+ /**
99
+ * Bound an SDK CallToolResult before the SDK serializes it (central / hosted
100
+ * transports). Models the emitted JSON-RPC frame; an oversize result is replaced
101
+ * with a bounded error result carrying a recovery ref, so the SDK never emits a
102
+ * frame over budget. A small reserve covers the id delta and SSE/HTTP framing;
103
+ * the stdio path's universal guard remains the exact backstop there.
104
+ */
105
+ export declare function boundCallToolResult(result: CallToolResultShape, budget: FrameBudget, recover?: (intactJson: string, intactBytes: number) => PayloadRecoveryRef | undefined): CallToolResultShape;
106
+ export interface NotificationFrameOutcome {
107
+ /** The frame to write (the original, an overflow notice, or a recovery-unavailable notice). */
108
+ readonly frame: EncodedFrame;
109
+ /**
110
+ * Whether the dispatcher may advance its snapshot: true when the original fit
111
+ * OR the intact bytes were persisted (a recoverable overflow notice went out);
112
+ * false when persistence was impossible (the source event is NOT acknowledged).
113
+ */
114
+ readonly accepted: boolean;
115
+ /** Byte size of the original notification when it overflowed. */
116
+ readonly originalBytes?: number;
117
+ }
118
+ /** Build the bounded overflow notice for an oversize notification. */
119
+ export declare function buildOverflowNotification(info: {
120
+ originalMethod: string;
121
+ topic?: string | undefined;
122
+ bytes: number;
123
+ recovery: PayloadRecoveryRef;
124
+ }): {
125
+ jsonrpc: "2.0";
126
+ method: string;
127
+ params: Record<string, unknown>;
128
+ };
129
+ /** Build the bounded recovery-unavailable notice (persistence was impossible). */
130
+ export declare function buildRecoveryUnavailableNotification(info: {
131
+ originalMethod: string;
132
+ topic?: string | undefined;
133
+ bytes: number;
134
+ cause: string;
135
+ }): {
136
+ jsonrpc: "2.0";
137
+ method: string;
138
+ params: Record<string, unknown>;
139
+ };
140
+ /**
141
+ * Bound a NOTIFICATION frame. Notifications carry no id, so an overflow yields a
142
+ * bounded NOTICE (never a JSON-RPC response). Returns `undefined` only when the
143
+ * notification itself cannot be serialized (dropped; the caller logs).
144
+ */
145
+ export declare function boundNotificationFrame(notification: unknown, meta: {
146
+ method: string;
147
+ topic?: string | undefined;
148
+ }, budget: FrameBudget, recover?: (intactJson: string, intactBytes: number) => PayloadRecoveryRef | undefined): NotificationFrameOutcome | undefined;
149
+ //# sourceMappingURL=frame-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-budget.d.ts","sourceRoot":"","sources":["../../../src/runtime/mcp/frame-budget.ts"],"names":[],"mappings":"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"}