stitchkit 0.89.0 → 0.90.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/dist/agent-runtime/coding-tool-refusals.d.ts +31 -10
  3. package/dist/agent-runtime/coding-tool-refusals.d.ts.map +1 -1
  4. package/dist/agent-runtime/spill.d.ts.map +1 -1
  5. package/dist/agent-runtime-coding-tools.js +4 -4
  6. package/dist/agent-runtime-harness.js +5 -5
  7. package/dist/agent-runtime-sandbox.js +5 -5
  8. package/dist/agent-runtime.js +17 -29
  9. package/dist/application/watch-hub.d.ts +24 -2
  10. package/dist/application/watch-hub.d.ts.map +1 -1
  11. package/dist/application-grammy.js +1 -1
  12. package/dist/application.js +103 -13
  13. package/dist/cli.js +7 -7
  14. package/dist/contract/errors.d.ts +3 -0
  15. package/dist/contract/errors.d.ts.map +1 -1
  16. package/dist/contract/index.js +2 -2
  17. package/dist/{index-qmgs7y68.js → index-1txvygak.js} +1 -1
  18. package/dist/{index-8c3a7m4g.js → index-2hrfpw2c.js} +1 -1
  19. package/dist/{index-7evdsyez.js → index-2hryh65w.js} +1 -1
  20. package/dist/index-2na0qrfn.js +214 -0
  21. package/dist/{index-zyvby92n.js → index-44ht2790.js} +2 -2
  22. package/dist/{index-27gm3d6g.js → index-6q3zjwaz.js} +2 -2
  23. package/dist/{index-mnm4qp0p.js → index-79hb1wyh.js} +3 -3
  24. package/dist/{index-apn8repm.js → index-7gqx71yd.js} +2 -2
  25. package/dist/{index-7601qfg1.js → index-8dph3pw6.js} +4 -4
  26. package/dist/{index-90d7h2cr.js → index-bg8ypxzn.js} +3 -3
  27. package/dist/{index-vchzar7e.js → index-db51n3xr.js} +5 -5
  28. package/dist/{index-hw2chdvy.js → index-f475yj00.js} +1 -1
  29. package/dist/{index-q3ve2d1k.js → index-gbqjt8jz.js} +3 -3
  30. package/dist/index-gte38nbm.js +101 -0
  31. package/dist/{index-cp20z0n6.js → index-j7q0xj6d.js} +7 -55
  32. package/dist/{index-2bxcmqkb.js → index-kazec06k.js} +1 -1
  33. package/dist/{index-0w9abg87.js → index-scs3f1eg.js} +3 -0
  34. package/dist/{index-31jw8fjq.js → index-wb15909q.js} +1 -1
  35. package/dist/{index-p18f59zy.js → index-z78bjcxj.js} +1 -1
  36. package/dist/{index-t7fkyxcr.js → index-zkcqhxx8.js} +1 -1
  37. package/dist/index.js +6 -6
  38. package/dist/live/watch-client.d.ts +2 -1
  39. package/dist/live/watch-client.d.ts.map +1 -1
  40. package/dist/live/watch-contract.d.ts +70 -4
  41. package/dist/live/watch-contract.d.ts.map +1 -1
  42. package/dist/live/watch-delta.d.ts +110 -0
  43. package/dist/live/watch-delta.d.ts.map +1 -0
  44. package/dist/live.d.ts +2 -1
  45. package/dist/live.d.ts.map +1 -1
  46. package/dist/live.js +56 -4
  47. package/dist/node.js +6 -6
  48. package/dist/observability/changes.d.ts +55 -0
  49. package/dist/observability/changes.d.ts.map +1 -0
  50. package/dist/observability/index.d.ts +2 -0
  51. package/dist/observability/index.d.ts.map +1 -1
  52. package/dist/observability/index.js +130 -3
  53. package/dist/observability/spool.d.ts +53 -0
  54. package/dist/observability/spool.d.ts.map +1 -0
  55. package/dist/primitives.js +2 -2
  56. package/dist/remote.js +5 -5
  57. package/dist/server/index.js +8 -8
  58. package/dist/testing.js +6 -6
  59. package/dist/tool-invoker.js +6 -6
  60. package/dist/tools.js +11 -11
  61. package/dist/tracking.js +2 -2
  62. package/llms-full.txt +156 -15
  63. package/package.json +1 -1
  64. package/dist/index-dre2ywck.js +0 -48
  65. package/dist/index-gskm1k5a.js +0 -50
package/CHANGELOG.md CHANGED
@@ -15,6 +15,108 @@ additive**; the first breaking change landed in 0.10.0. Grep the file for
15
15
 
16
16
  ## [Unreleased]
17
17
 
18
+ ## [0.90.1] — 2026-09-15
19
+
20
+ ### Fixed
21
+
22
+ - **An unknown spilled-output reference is a refusal, not a server fault.** The
23
+ SQLite spill store threw a bare `TypeError('Unknown spill reference')`, which
24
+ is not an `AppError`, so `toolResultFromError` scrubbed it to
25
+ `{"error":"INTERNAL_SERVER_ERROR","details":{"message":"Internal server
26
+ error"}}`. A model that passed the wrong identifier — a background terminal
27
+ session id where a spill reference was wanted — could not tell "fix the
28
+ argument" from "the store is broken"; in the run this was reported from, it
29
+ retried the same call three times and declared the tool broken. It now refuses
30
+ with `SPILL_REFERENCE_UNKNOWN` / 404, naming the reference and hinting at the
31
+ one the spilling command returned. Authorization, `read` and `search` shared
32
+ three copies of the lookup and its refusal; they now share one, so the answer
33
+ cannot differ by path. The lookup is scoped by conversation, so a reference
34
+ held by another conversation refuses identically and discloses nothing.
35
+
36
+ - **A coding-tool refusal keeps its declared status across a process boundary.**
37
+ Those refusals carried their own private `code → status` map, while
38
+ `toolErrorFromResult` — which rebuilds an envelope that reached another
39
+ process through MCP or the CLI — resolves the status from
40
+ `STITCH_ERROR_STATUS`. Every refusal code missing from that map came back
41
+ `500`: measured, `SANDBOX_UNAVAILABLE` → 500 against its declared 503, with
42
+ `NOT_FOUND` → 404 and `WAIT_TIMEOUT` → 408 as controls. `SANDBOX_UNAVAILABLE`,
43
+ `SANDBOX_INSUFFICIENT` and `SPILL_REFERENCE_UNKNOWN` join the framework
44
+ vocabulary, and the refusal list is now an allowlist of names typed against
45
+ it — a refusal code absent from the framework map is a compile error rather
46
+ than a 500 on the wire.
47
+
48
+ - **The mechanical refusal gate can see the artifact tools.** It enumerates
49
+ mounted coding tools and refuses one with no registered refusal, and
50
+ `read_output` / `search_output` are mounted only when an artifact store is —
51
+ which the gate's own profile did not do. "Every tool has a refusal" was
52
+ vacuously true for exactly the two tools that had none.
53
+ `packages/core/tests/coding-tool-refusals.test.ts` now mounts a real spill
54
+ store.
55
+
56
+ - **Heavy release lanes no longer count memory that swap cannot back.**
57
+ `verify --release` sized its lane concurrency from `MemAvailable` alone. On a
58
+ host whose swap was 97% consumed that read 9.2 GiB and chose two lanes, and
59
+ the pair was killed; with swap exhausted the reclaimable half of that figure
60
+ is not reclaimable. It now falls back to `MemFree` when free swap is under 5%
61
+ of swap total — 0.97 GiB and one lane on the host that prompted this — and
62
+ says `GiB affordable` rather than `GiB available`.
63
+
64
+ ## [0.90.0] — 2026-09-15
65
+
66
+ ### ⚠️ Breaking changes
67
+
68
+ **Who must act:** applications that bind the watch protocol themselves or read
69
+ `WatchValueFrame.value` directly — a hand-written subscriber, a test double, a custom
70
+ server binding. Applications using `createWatchClient` and the starter's binding need
71
+ no code change. **Both ends must come from the same major:** a client older than 0.90.0
72
+ reads a `delta` frame as a value of `undefined`, silently.
73
+
74
+ - **`stitchkit.watch.value` is a discriminated union on `kind`.** `full` carries the value,
75
+ `delta` carries a structural difference against a `base` revision, `unchanged` says the
76
+ value held is still current. Every frame carries `fingerprint`, the order-independent
77
+ digest of the value the receiver holds after applying it.
78
+
79
+ ```ts
80
+ // before: frame.value
81
+ // after:
82
+ if (frame.kind === 'full') hold(frame.value);
83
+ else if (frame.kind === 'delta') hold(applyWatchDelta(held, frame.delta));
84
+ // 'unchanged' leaves what you hold standing
85
+ ```
86
+
87
+ - **`AttachedWatcher.open` takes an optional third argument, `have`.** A custom server
88
+ binding forwarding `stitchkit.watch.open` should pass the payload's `have` through;
89
+ omitting it costs a whole value on every reconnection and is otherwise harmless.
90
+
91
+ ### Added
92
+
93
+ - **Watched reads cross as differences.** The hub chooses per subscriber, from the revision
94
+ it last delivered to that subscriber, and sends a difference only when it is strictly
95
+ smaller than the value. Measured: a ~75 KB list answer with one field changed crosses as a
96
+ frame under 1 KB. `deltaMemoryBytes` (default 262144, `0` disables) bounds the superseded
97
+ values kept per key. → ADR 0183.
98
+ - **A reconnection offers what it holds.** `stitchkit.watch.open` may carry
99
+ `have: { revision, fingerprint }`; a subscriber returning to an answer that has not moved
100
+ is told `unchanged` instead of being sent the value again. Requires the key to still exist
101
+ on the hub — set `holdMs` past your reconnect delay.
102
+ - **Reassembly is checked.** The client verifies the rebuilt value against the server's
103
+ fingerprint on every frame and resynchronises **that one key** on any mismatch, publishing
104
+ `resync-required`. Other keys on the same socket are untouched.
105
+ - **`watchDiff` / `applyWatchDelta` / `watchDeltaWins`** and the `WatchDelta` shapes are
106
+ exported from `stitchkit/live` for applications building their own binding.
107
+ - **`auditChanges`** — the sink `filter` most projects were writing themselves: drops `GET`,
108
+ `HEAD` and `OPTIONS`, keeps `401` and `403` whatever the verb was, keeps an unrecognised
109
+ verb. One predicate across HTTP, MCP and agent calls. → ADR 0184.
110
+ - **`createSpooledSink`** — writes the audit row to a local append-only file before offering
111
+ it to the store and replays what a previous process left undelivered. At least once; the
112
+ store must be idempotent on the record key (`spanId` by default).
113
+
114
+ ### Unchanged on purpose
115
+
116
+ - **Auditing stays opt-in.** `createHandler` and the tool mounts are untouched. Making a
117
+ decision about audit mandatory at startup was considered and rejected — the measurement it
118
+ rested on counted projects without an HTTP surface as projects that had forgotten. → ADR 0184.
119
+
18
120
  ## [0.89.0] — 2026-09-12
19
121
 
20
122
  ### ⚠️ Breaking changes
@@ -16,16 +16,19 @@
16
16
  * knows; `contained-files.ts` stays `AppError`-free, and everything it throws
17
17
  * keeps being scrubbed. Default-deny: a cause with no case here is internal.
18
18
  */
19
- /** Codes a coding tool may hand a model, with the status each one carries. */
20
- declare const REFUSAL_STATUS: {
21
- readonly BAD_REQUEST: 400;
22
- readonly FORBIDDEN: 403;
23
- readonly NOT_FOUND: 404;
24
- readonly CONFLICT: 409;
25
- readonly SANDBOX_UNAVAILABLE: 503;
26
- readonly SANDBOX_INSUFFICIENT: 503;
27
- };
28
- export type CodingRefusalCode = keyof typeof REFUSAL_STATUS;
19
+ /**
20
+ * The codes a coding tool may hand a model — an allowlist of names, not a
21
+ * second status map.
22
+ *
23
+ * It used to carry its own `code → status` object, and the two maps disagreed
24
+ * where it mattered: `toolErrorFromResult` rebuilds an envelope that crossed a
25
+ * process boundary and reads the status from `STITCH_ERROR_STATUS`, so a
26
+ * refusal missing there arrived as a 500 no matter what this file declared.
27
+ * `satisfies readonly StitchErrorCode[]` now makes that unrepresentable — a
28
+ * refusal code absent from the framework vocabulary is a compile error here.
29
+ */
30
+ declare const REFUSAL_CODES: readonly ["BAD_REQUEST", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "SANDBOX_UNAVAILABLE", "SANDBOX_INSUFFICIENT", "SPILL_REFERENCE_UNKNOWN"];
31
+ export type CodingRefusalCode = (typeof REFUSAL_CODES)[number];
29
32
  /**
30
33
  * Refuse with a reason the model actually receives.
31
34
  *
@@ -57,5 +60,23 @@ export declare function codingPathRefusal(code: CodingRefusalCode, message: stri
57
60
  * model can do about it, and keeps being scrubbed. Default-deny by omission.
58
61
  */
59
62
  export declare function refuseMissingCodingPath(error: unknown, relative: string): never;
63
+ /**
64
+ * Refuse a spill reference the store does not hold.
65
+ *
66
+ * The same failure this module was written for, one layer down. The SQLite
67
+ * spill store threw a bare `TypeError('Unknown spill reference')`, which is not
68
+ * an `AppError`, so `toolResultFromError` scrubbed it to an empty
69
+ * `INTERNAL_SERVER_ERROR`: a model that passed the wrong identifier — a
70
+ * background terminal session id instead of a spill reference — could not tell
71
+ * "fix the argument" from "the store is broken". Observed: it retried the same
72
+ * call three times and declared the tool broken.
73
+ *
74
+ * The reference is echoed back because it is the model's own input: naming it
75
+ * tells the model which of its arguments to replace, and leaks nothing it did
76
+ * not already send. A reference belonging to ANOTHER conversation refuses
77
+ * through this same path — the lookup is scoped by conversation, so a foreign
78
+ * reference is simply absent, and the refusal cannot distinguish the two.
79
+ */
80
+ export declare function refuseUnknownSpillReference(reference: string): never;
60
81
  export {};
61
82
  //# sourceMappingURL=coding-tool-refusals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coding-tool-refusals.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/coding-tool-refusals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,8EAA8E;AAC9E,QAAA,MAAM,cAAc;aAClB,WAAW,EAAE,GAAG;aAChB,SAAS,EAAE,GAAG;aACd,SAAS,EAAE,GAAG;aACd,QAAQ,EAAE,GAAG;aACb,mBAAmB,EAAE,GAAG;aACxB,oBAAoB,EAAE,GAAG;CACjB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,cAAc,CAAC;AAE5D;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,KAAK,CAQP;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,KAAK,CAKP;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAiC/E"}
1
+ {"version":3,"file":"coding-tool-refusals.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/coding-tool-refusals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;;;;;;;;GAUG;AACH,QAAA,MAAM,aAAa,0IAQ4B,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,KAAK,CAQP;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,KAAK,CAKP;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAiC/E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CASpE"}
@@ -1 +1 @@
1
- {"version":3,"file":"spill.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/spill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAkBxD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,uBAAuB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,GAAG,wBAAwB,GAAG;IAC7B,MAAM,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;QAClF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CAqHA"}
1
+ {"version":3,"file":"spill.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/spill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAkBxD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,MAAM,EAAE,uBAAuB,CAAC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,GAAG,wBAAwB,GAAG;IAC7B,MAAM,CAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;QAClF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD,CAgHA"}
@@ -3,12 +3,12 @@ import {
3
3
  AgentCodingToolLimitsSchema,
4
4
  AgentCodingToolPathAuthorizationSchema,
5
5
  createAgentCodingTools
6
- } from "./index-cp20z0n6.js";
6
+ } from "./index-j7q0xj6d.js";
7
7
  import"./index-bn2cjajt.js";
8
- import"./index-gskm1k5a.js";
9
- import"./index-2bxcmqkb.js";
8
+ import"./index-gte38nbm.js";
9
+ import"./index-kazec06k.js";
10
10
  import"./index-6k1937bx.js";
11
- import"./index-0w9abg87.js";
11
+ import"./index-scs3f1eg.js";
12
12
  import"./index-kzfs85xp.js";
13
13
  import"./index-kc6h6hg0.js";
14
14
  import"./index-r159gjwy.js";
@@ -6,7 +6,7 @@ import {
6
6
  composeAgentPrompt,
7
7
  createAgentRuntime,
8
8
  createAgentRuntimeEventSink
9
- } from "./index-hw2chdvy.js";
9
+ } from "./index-f475yj00.js";
10
10
  import"./index-p13mwz16.js";
11
11
  import"./index-y64k3s0h.js";
12
12
  import {
@@ -19,13 +19,13 @@ import {
19
19
  walkContainedFiles
20
20
  } from "./index-bn2cjajt.js";
21
21
  import"./index-7rkhw9ec.js";
22
- import"./index-zyvby92n.js";
22
+ import"./index-44ht2790.js";
23
23
  import"./index-vsbzgd7b.js";
24
24
  import"./index-f9mb610r.js";
25
- import"./index-7evdsyez.js";
26
- import"./index-2bxcmqkb.js";
25
+ import"./index-2hryh65w.js";
26
+ import"./index-kazec06k.js";
27
27
  import"./index-6k1937bx.js";
28
- import"./index-0w9abg87.js";
28
+ import"./index-scs3f1eg.js";
29
29
  import"./index-zcgf3gqf.js";
30
30
  import"./index-7zbps32p.js";
31
31
  import"./index-kzfs85xp.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
- codingRefusal,
3
2
  createAgentCodingTools
4
- } from "./index-cp20z0n6.js";
3
+ } from "./index-j7q0xj6d.js";
5
4
  import"./index-bn2cjajt.js";
6
5
  import {
6
+ codingRefusal,
7
7
  missingSandboxRestrictions,
8
8
  probeAgentProcessSandbox
9
- } from "./index-gskm1k5a.js";
10
- import"./index-2bxcmqkb.js";
9
+ } from "./index-gte38nbm.js";
10
+ import"./index-kazec06k.js";
11
11
  import"./index-6k1937bx.js";
12
- import"./index-0w9abg87.js";
12
+ import"./index-scs3f1eg.js";
13
13
  import"./index-kzfs85xp.js";
14
14
  import"./index-kc6h6hg0.js";
15
15
  import"./index-r159gjwy.js";
@@ -31,7 +31,7 @@ import {
31
31
  renderAgentStateSlots,
32
32
  repairedSearchCall,
33
33
  selectAgentHistory
34
- } from "./index-hw2chdvy.js";
34
+ } from "./index-f475yj00.js";
35
35
  import"./index-p13mwz16.js";
36
36
  import {
37
37
  AgentAdmissionEventSchema,
@@ -163,22 +163,23 @@ import {
163
163
  AgentSandboxRestrictionSchema,
164
164
  missingSandboxRestrictions,
165
165
  probeAgentProcessSandbox,
166
- recordAgentSandboxProbe
167
- } from "./index-gskm1k5a.js";
166
+ recordAgentSandboxProbe,
167
+ refuseUnknownSpillReference
168
+ } from "./index-gte38nbm.js";
168
169
  import {
169
170
  buildToolManifest,
170
171
  mountAgent
171
- } from "./index-q3ve2d1k.js";
172
+ } from "./index-gbqjt8jz.js";
172
173
  import"./index-7rkhw9ec.js";
173
- import"./index-31jw8fjq.js";
174
- import"./index-8c3a7m4g.js";
175
- import"./index-zyvby92n.js";
174
+ import"./index-wb15909q.js";
175
+ import"./index-2hrfpw2c.js";
176
+ import"./index-44ht2790.js";
176
177
  import"./index-vsbzgd7b.js";
177
178
  import"./index-f9mb610r.js";
178
- import"./index-7evdsyez.js";
179
- import"./index-2bxcmqkb.js";
179
+ import"./index-2hryh65w.js";
180
+ import"./index-kazec06k.js";
180
181
  import"./index-6k1937bx.js";
181
- import"./index-0w9abg87.js";
182
+ import"./index-scs3f1eg.js";
182
183
  import {
183
184
  childSpan,
184
185
  createTraceContext
@@ -2258,16 +2259,17 @@ function decodeAuthorization(value) {
2258
2259
  function createSqliteAgentSpillStore(input) {
2259
2260
  const now = input.now ?? (() => new Date);
2260
2261
  const database = input.sqlite.database;
2261
- const authorization = (reference) => {
2262
+ const rowFor = (reference) => {
2262
2263
  const raw = database.prepare(`
2263
2264
  SELECT payload, bytes, authorization_payload
2264
2265
  FROM stitchkit_agent_runtime_spills
2265
2266
  WHERE reference_id = ? AND conversation_id = ?
2266
2267
  `).get(reference, input.conversationId);
2267
2268
  if (raw === null || raw === undefined)
2268
- throw new TypeError("Unknown spill reference");
2269
- return decodeAuthorization(SpillRowSchema.parse(raw).authorization_payload);
2269
+ refuseUnknownSpillReference(reference);
2270
+ return SpillRowSchema.parse(raw);
2270
2271
  };
2272
+ const authorization = (reference) => decodeAuthorization(rowFor(reference).authorization_payload);
2271
2273
  const write = async (request) => {
2272
2274
  const reference = randomUUID3();
2273
2275
  const createdAt = now();
@@ -2290,14 +2292,7 @@ function createSqliteAgentSpillStore(input) {
2290
2292
  return { reference };
2291
2293
  };
2292
2294
  const read = async (request) => {
2293
- const raw = database.prepare(`
2294
- SELECT payload, bytes, authorization_payload
2295
- FROM stitchkit_agent_runtime_spills
2296
- WHERE reference_id = ? AND conversation_id = ?
2297
- `).get(request.reference, input.conversationId);
2298
- if (raw === null || raw === undefined)
2299
- throw new TypeError("Unknown spill reference");
2300
- const row = SpillRowSchema.parse(raw);
2295
+ const row = rowFor(request.reference);
2301
2296
  return {
2302
2297
  data: row.payload.slice(request.offset, request.offset + request.maxBytes),
2303
2298
  totalBytes: row.bytes,
@@ -2307,14 +2302,7 @@ function createSqliteAgentSpillStore(input) {
2307
2302
  };
2308
2303
  };
2309
2304
  const search = (request) => {
2310
- const raw = database.prepare(`
2311
- SELECT payload, bytes, authorization_payload
2312
- FROM stitchkit_agent_runtime_spills
2313
- WHERE reference_id = ? AND conversation_id = ?
2314
- `).get(request.reference, input.conversationId);
2315
- if (raw === null || raw === undefined)
2316
- throw new TypeError("Unknown spill reference");
2317
- const row = SpillRowSchema.parse(raw);
2305
+ const row = rowFor(request.reference);
2318
2306
  const matches = [];
2319
2307
  new TextDecoder("utf-8", { fatal: true }).decode(row.payload).split(`
2320
2308
  `).forEach((text, index) => {
@@ -38,7 +38,7 @@
38
38
  * → ADR 0153.
39
39
  */
40
40
  import { type BackoffPolicy } from '../browser/resumable.js';
41
- import { type WatchKey, type WatchStateFrame, type WatchValueFrame } from '../live/watch-contract.js';
41
+ import { type WatchHave, type WatchKey, type WatchStateFrame, type WatchValueFrame } from '../live/watch-contract.js';
42
42
  import type { StitchLogger } from '../logger.js';
43
43
  /** The operation a watched read runs — `OperationIdentity`'s two stable halves. */
44
44
  export interface WatchOperation {
@@ -52,7 +52,15 @@ export interface WatchSubscriber {
52
52
  state(frame: WatchStateFrame): void;
53
53
  }
54
54
  export interface AttachedWatcher {
55
- open(key: WatchKey, args: unknown): {
55
+ /**
56
+ * Start watching a key.
57
+ *
58
+ * `have` is what the caller already holds from an earlier connection. Offered,
59
+ * it turns a reconnection into a difference — or into nothing at all when the
60
+ * answer has not moved — instead of the whole value again. Omitted, the caller
61
+ * is treated as holding nothing, which is what a first subscription is.
62
+ */
63
+ open(key: WatchKey, args: unknown, have?: WatchHave): {
56
64
  accepted: boolean;
57
65
  reason?: string;
58
66
  };
@@ -105,6 +113,20 @@ export interface WatchHubConfig {
105
113
  holdMs?: number;
106
114
  /** Retry pacing after a failed read. */
107
115
  backoff?: BackoffPolicy;
116
+ /**
117
+ * How many bytes of superseded values one key may keep, for differences.
118
+ *
119
+ * A difference needs the value the receiver actually holds, which is no longer
120
+ * the current one. This is the ceiling on that memory, per key, and it is a
121
+ * byte budget rather than a count of revisions because the thing being
122
+ * protected is the process's heap and revisions have no size.
123
+ *
124
+ * Zero disables differences entirely: every frame carries the whole value,
125
+ * which is what this hub did before they existed. Default 262144 (256 KiB),
126
+ * which holds several revisions of the large answers differences are for and
127
+ * a great many small ones.
128
+ */
129
+ deltaMemoryBytes?: number;
108
130
  /** Whether two answers are the same. Defaults to key-order-independent JSON equality. */
109
131
  same?(previous: unknown, next: unknown): boolean;
110
132
  logger?: StitchLogger;
@@ -1 +1 @@
1
- {"version":3,"file":"watch-hub.d.ts","sourceRoot":"","sources":["../../src/application/watch-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,oDAAoD;IACpD,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,yEAAyE;IACzE,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,gFAAgF;IAChF,SAAS,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9C;;;;;;;;;OASG;IACH,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;IAC3E,mFAAmF;IACnF,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3D,kEAAkE;IAClE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,yFAAyF;IACzF,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,eAAe,CAAC;IACrD;;;;;;OAMG;IACH,SAAS,IAAI,MAAM,CAAC;IACpB,qEAAqE;IACrE,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,IAAI,CAAC;CACf;AAqBD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAU3E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAoR/D"}
1
+ {"version":3,"file":"watch-hub.d.ts","sourceRoot":"","sources":["../../src/application/watch-hub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,KAAK,aAAa,EAAiB,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EACL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,eAAe,EAErB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,oDAAoD;IACpD,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7F,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,yEAAyE;IACzE,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,gFAAgF;IAChF,SAAS,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC;IAC9C;;;;;;;;;OASG;IACH,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAAC;IAC3E,mFAAmF;IACnF,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3D,kEAAkE;IAClE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;;;;;;;;;;;OAYG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,UAAU,EAAE,eAAe,GAAG,eAAe,CAAC;IACrD;;;;;;OAMG;IACH,SAAS,IAAI,MAAM,CAAC;IACpB,qEAAqE;IACrE,IAAI,IAAI,MAAM,CAAC;IACf,KAAK,IAAI,IAAI,CAAC;CACf;AA2CD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAU3E;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CA4Y/D"}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./index-2k4yrqkc.js";
4
4
  import {
5
5
  AppError
6
- } from "./index-0w9abg87.js";
6
+ } from "./index-scs3f1eg.js";
7
7
 
8
8
  // src/application/grammy.ts
9
9
  import { Context } from "grammy";
@@ -36,7 +36,7 @@ import {
36
36
  ApplicationShutdownBudgetSchema,
37
37
  ApplicationShutdownOptionsSchema,
38
38
  createApplication
39
- } from "./index-t7fkyxcr.js";
39
+ } from "./index-zkcqhxx8.js";
40
40
  import {
41
41
  ApplicationAdmissionSnapshotSchema,
42
42
  ApplicationHealthSchema,
@@ -66,8 +66,10 @@ import {
66
66
  createBackoff
67
67
  } from "./index-s8cnx02s.js";
68
68
  import {
69
+ deltaWins,
70
+ diff,
69
71
  watchKeyString
70
- } from "./index-dre2ywck.js";
72
+ } from "./index-2na0qrfn.js";
71
73
  import"./index-ywd0y6m1.js";
72
74
  import {
73
75
  BoundedChannelPolicySchema,
@@ -85,7 +87,7 @@ import {
85
87
  argumentsDigest,
86
88
  stableValue
87
89
  } from "./index-a916km3r.js";
88
- import"./index-0w9abg87.js";
90
+ import"./index-scs3f1eg.js";
89
91
  import"./index-kzfs85xp.js";
90
92
  import"./index-77fekveh.js";
91
93
  // src/application/admission.ts
@@ -1563,17 +1565,20 @@ function createWatchHub(config) {
1563
1565
  const held = new Map;
1564
1566
  const maxWatches = config.maxWatchesPerSubscriber ?? 64;
1565
1567
  const holdMs = config.holdMs ?? 0;
1568
+ const deltaMemoryBytes = config.deltaMemoryBytes ?? 262144;
1566
1569
  const same = config.same ?? ((previous, next) => JSON.stringify(stableValue(previous)) === JSON.stringify(stableValue(next)));
1567
1570
  let reads = 0;
1568
1571
  let closed = false;
1569
- function tell(key, deliver) {
1572
+ function tell(key, deliver2) {
1570
1573
  try {
1571
- deliver();
1574
+ deliver2();
1575
+ return true;
1572
1576
  } catch (error) {
1573
1577
  config.logger?.warn?.("[stitchkit] watch subscriber threw", {
1574
1578
  key: watchKeyString(key),
1575
1579
  error: error instanceof Error ? error.message : String(error)
1576
1580
  });
1581
+ return false;
1577
1582
  }
1578
1583
  }
1579
1584
  function announceState(source, state) {
@@ -1582,13 +1587,85 @@ function createWatchHub(config) {
1582
1587
  tell(source.key, () => subscriber.state(state));
1583
1588
  }
1584
1589
  }
1585
- function publish(source, value) {
1590
+ function remember(source, revision, value, fingerprint) {
1591
+ if (deltaMemoryBytes === 0)
1592
+ return;
1593
+ const bytes = (JSON.stringify(value) ?? "null").length;
1594
+ if (bytes > deltaMemoryBytes)
1595
+ return;
1596
+ source.history.set(revision, { value, fingerprint, bytes });
1597
+ source.historyBytes += bytes;
1598
+ for (const [oldest, entry] of source.history) {
1599
+ if (source.historyBytes <= deltaMemoryBytes)
1600
+ break;
1601
+ source.history.delete(oldest);
1602
+ source.historyBytes -= entry.bytes;
1603
+ }
1604
+ }
1605
+ function frameFor(source, subscriber) {
1606
+ const value = source.value;
1607
+ const fingerprint = source.fingerprint ?? valueFingerprint(value);
1608
+ const full = {
1609
+ kind: "full",
1610
+ key: source.key,
1611
+ revision: source.revision,
1612
+ fingerprint,
1613
+ value
1614
+ };
1615
+ const base = source.baselines.get(subscriber);
1616
+ if (base === undefined)
1617
+ return full;
1618
+ if (base === source.revision) {
1619
+ return { kind: "unchanged", key: source.key, revision: source.revision, fingerprint };
1620
+ }
1621
+ const held2 = source.history.get(base);
1622
+ if (!held2)
1623
+ return full;
1624
+ const delta = diff(held2.value, value);
1625
+ if (delta === undefined || !deltaWins(delta, value))
1626
+ return full;
1627
+ return {
1628
+ kind: "delta",
1629
+ key: source.key,
1630
+ revision: source.revision,
1631
+ fingerprint,
1632
+ base,
1633
+ delta
1634
+ };
1635
+ }
1636
+ function adoptBaseline(source, subscriber, have) {
1637
+ if (source.fingerprint === have.fingerprint) {
1638
+ source.baselines.set(subscriber, source.revision);
1639
+ return;
1640
+ }
1641
+ const named = source.history.get(have.revision);
1642
+ if (named?.fingerprint === have.fingerprint) {
1643
+ source.baselines.set(subscriber, have.revision);
1644
+ return;
1645
+ }
1646
+ for (const [revision, entry] of source.history) {
1647
+ if (entry.fingerprint !== have.fingerprint)
1648
+ continue;
1649
+ source.baselines.set(subscriber, revision);
1650
+ return;
1651
+ }
1652
+ }
1653
+ function deliver(source, subscriber) {
1654
+ const frame = frameFor(source, subscriber);
1655
+ const delivered = tell(source.key, () => subscriber.value(frame));
1656
+ if (delivered)
1657
+ source.baselines.set(subscriber, source.revision);
1658
+ return delivered;
1659
+ }
1660
+ function publish(source, value, fingerprint) {
1661
+ if (source.fingerprint !== undefined) {
1662
+ remember(source, source.revision, source.value, source.fingerprint);
1663
+ }
1586
1664
  source.revision += 1;
1587
1665
  source.value = value;
1588
- const frame = { key: source.key, revision: source.revision, value };
1589
- for (const subscriber of source.subscribers) {
1590
- tell(source.key, () => subscriber.value(frame));
1591
- }
1666
+ source.fingerprint = fingerprint;
1667
+ for (const subscriber of source.subscribers)
1668
+ deliver(source, subscriber);
1592
1669
  }
1593
1670
  async function pump(source) {
1594
1671
  if (source.reading || closed)
@@ -1605,7 +1682,7 @@ function createWatchHub(config) {
1605
1682
  const unchanged = source.signature !== undefined && same(source.value, value);
1606
1683
  source.signature = signature;
1607
1684
  if (!unchanged)
1608
- publish(source, value);
1685
+ publish(source, value, valueFingerprint(value));
1609
1686
  if (source.state.phase !== "live") {
1610
1687
  announceState(source, { key: source.key, phase: "live" });
1611
1688
  }
@@ -1655,6 +1732,9 @@ function createWatchHub(config) {
1655
1732
  subscribers: new Set,
1656
1733
  unsubscribes: [],
1657
1734
  revision: 0,
1735
+ history: new Map,
1736
+ historyBytes: 0,
1737
+ baselines: new Map,
1658
1738
  reading: false,
1659
1739
  dirty: true,
1660
1740
  state: { key, phase: "opening" },
@@ -1696,7 +1776,7 @@ function createWatchHub(config) {
1696
1776
  const keys = new Set;
1697
1777
  held.set(subscriber, keys);
1698
1778
  return {
1699
- open(key, args) {
1779
+ open(key, args, have) {
1700
1780
  if (closed)
1701
1781
  return { accepted: false, reason: "the watch hub is closed" };
1702
1782
  const operation = { service: key.service, action: key.action };
@@ -1718,13 +1798,18 @@ function createWatchHub(config) {
1718
1798
  const source = acquire(operation, key, args);
1719
1799
  source.subscribers.add(subscriber);
1720
1800
  keys.add(id);
1801
+ if (have)
1802
+ adoptBaseline(source, subscriber, have);
1721
1803
  try {
1722
1804
  if (source.signature !== undefined) {
1723
- subscriber.value({ key, revision: source.revision, value: source.value });
1805
+ const frame = frameFor(source, subscriber);
1806
+ subscriber.value(frame);
1807
+ source.baselines.set(subscriber, source.revision);
1724
1808
  }
1725
1809
  subscriber.state(source.state);
1726
1810
  } catch (error) {
1727
1811
  source.subscribers.delete(subscriber);
1812
+ source.baselines.delete(subscriber);
1728
1813
  keys.delete(id);
1729
1814
  release(source);
1730
1815
  return {
@@ -1743,6 +1828,7 @@ function createWatchHub(config) {
1743
1828
  if (!source)
1744
1829
  return;
1745
1830
  source.subscribers.delete(subscriber);
1831
+ source.baselines.delete(subscriber);
1746
1832
  release(source);
1747
1833
  },
1748
1834
  detach() {
@@ -1751,6 +1837,7 @@ function createWatchHub(config) {
1751
1837
  if (!source)
1752
1838
  continue;
1753
1839
  source.subscribers.delete(subscriber);
1840
+ source.baselines.delete(subscriber);
1754
1841
  release(source);
1755
1842
  }
1756
1843
  keys.clear();
@@ -1779,6 +1866,9 @@ function createWatchHub(config) {
1779
1866
  }
1780
1867
  };
1781
1868
  }
1869
+ function valueFingerprint(value) {
1870
+ return argumentsDigest({ value });
1871
+ }
1782
1872
  function readErrorCode(error) {
1783
1873
  if (typeof error !== "object" || error === null)
1784
1874
  return;
package/dist/cli.js CHANGED
@@ -5,17 +5,17 @@ import {
5
5
  emitResult,
6
6
  parseCliArgs,
7
7
  pollUntilDone
8
- } from "./index-7601qfg1.js";
8
+ } from "./index-8dph3pw6.js";
9
9
  import"./index-sbdmyz75.js";
10
- import"./index-31jw8fjq.js";
11
- import"./index-8c3a7m4g.js";
12
- import"./index-zyvby92n.js";
10
+ import"./index-wb15909q.js";
11
+ import"./index-2hrfpw2c.js";
12
+ import"./index-44ht2790.js";
13
13
  import"./index-vsbzgd7b.js";
14
14
  import"./index-f9mb610r.js";
15
- import"./index-7evdsyez.js";
16
- import"./index-2bxcmqkb.js";
15
+ import"./index-2hryh65w.js";
16
+ import"./index-kazec06k.js";
17
17
  import"./index-6k1937bx.js";
18
- import"./index-0w9abg87.js";
18
+ import"./index-scs3f1eg.js";
19
19
  import"./index-zcgf3gqf.js";
20
20
  import"./index-7zbps32p.js";
21
21
  import"./index-kzfs85xp.js";
@@ -92,6 +92,9 @@ export declare const STITCH_ERROR_STATUS: {
92
92
  STREAM_FRAME_TOO_LARGE: number;
93
93
  STREAM_TERMINAL_MISSING: number;
94
94
  STREAM_LIFETIME_EXCEEDED: number;
95
+ SANDBOX_UNAVAILABLE: number;
96
+ SANDBOX_INSUFFICIENT: number;
97
+ SPILL_REFERENCE_UNKNOWN: number;
95
98
  INTERNAL_SERVER_ERROR: number;
96
99
  };
97
100
  /** A code stitchkit itself emits — derived from `STITCH_ERROR_STATUS` (no dup). */