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.
- package/CHANGELOG.md +102 -0
- package/dist/agent-runtime/coding-tool-refusals.d.ts +31 -10
- package/dist/agent-runtime/coding-tool-refusals.d.ts.map +1 -1
- package/dist/agent-runtime/spill.d.ts.map +1 -1
- package/dist/agent-runtime-coding-tools.js +4 -4
- package/dist/agent-runtime-harness.js +5 -5
- package/dist/agent-runtime-sandbox.js +5 -5
- package/dist/agent-runtime.js +17 -29
- package/dist/application/watch-hub.d.ts +24 -2
- package/dist/application/watch-hub.d.ts.map +1 -1
- package/dist/application-grammy.js +1 -1
- package/dist/application.js +103 -13
- package/dist/cli.js +7 -7
- package/dist/contract/errors.d.ts +3 -0
- package/dist/contract/errors.d.ts.map +1 -1
- package/dist/contract/index.js +2 -2
- package/dist/{index-qmgs7y68.js → index-1txvygak.js} +1 -1
- package/dist/{index-8c3a7m4g.js → index-2hrfpw2c.js} +1 -1
- package/dist/{index-7evdsyez.js → index-2hryh65w.js} +1 -1
- package/dist/index-2na0qrfn.js +214 -0
- package/dist/{index-zyvby92n.js → index-44ht2790.js} +2 -2
- package/dist/{index-27gm3d6g.js → index-6q3zjwaz.js} +2 -2
- package/dist/{index-mnm4qp0p.js → index-79hb1wyh.js} +3 -3
- package/dist/{index-apn8repm.js → index-7gqx71yd.js} +2 -2
- package/dist/{index-7601qfg1.js → index-8dph3pw6.js} +4 -4
- package/dist/{index-90d7h2cr.js → index-bg8ypxzn.js} +3 -3
- package/dist/{index-vchzar7e.js → index-db51n3xr.js} +5 -5
- package/dist/{index-hw2chdvy.js → index-f475yj00.js} +1 -1
- package/dist/{index-q3ve2d1k.js → index-gbqjt8jz.js} +3 -3
- package/dist/index-gte38nbm.js +101 -0
- package/dist/{index-cp20z0n6.js → index-j7q0xj6d.js} +7 -55
- package/dist/{index-2bxcmqkb.js → index-kazec06k.js} +1 -1
- package/dist/{index-0w9abg87.js → index-scs3f1eg.js} +3 -0
- package/dist/{index-31jw8fjq.js → index-wb15909q.js} +1 -1
- package/dist/{index-p18f59zy.js → index-z78bjcxj.js} +1 -1
- package/dist/{index-t7fkyxcr.js → index-zkcqhxx8.js} +1 -1
- package/dist/index.js +6 -6
- package/dist/live/watch-client.d.ts +2 -1
- package/dist/live/watch-client.d.ts.map +1 -1
- package/dist/live/watch-contract.d.ts +70 -4
- package/dist/live/watch-contract.d.ts.map +1 -1
- package/dist/live/watch-delta.d.ts +110 -0
- package/dist/live/watch-delta.d.ts.map +1 -0
- package/dist/live.d.ts +2 -1
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +56 -4
- package/dist/node.js +6 -6
- package/dist/observability/changes.d.ts +55 -0
- package/dist/observability/changes.d.ts.map +1 -0
- package/dist/observability/index.d.ts +2 -0
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +130 -3
- package/dist/observability/spool.d.ts +53 -0
- package/dist/observability/spool.d.ts.map +1 -0
- package/dist/primitives.js +2 -2
- package/dist/remote.js +5 -5
- package/dist/server/index.js +8 -8
- package/dist/testing.js +6 -6
- package/dist/tool-invoker.js +6 -6
- package/dist/tools.js +11 -11
- package/dist/tracking.js +2 -2
- package/llms-full.txt +156 -15
- package/package.json +1 -1
- package/dist/index-dre2ywck.js +0 -48
- 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
|
-
/**
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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;
|
|
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-
|
|
6
|
+
} from "./index-j7q0xj6d.js";
|
|
7
7
|
import"./index-bn2cjajt.js";
|
|
8
|
-
import"./index-
|
|
9
|
-
import"./index-
|
|
8
|
+
import"./index-gte38nbm.js";
|
|
9
|
+
import"./index-kazec06k.js";
|
|
10
10
|
import"./index-6k1937bx.js";
|
|
11
|
-
import"./index-
|
|
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-
|
|
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-
|
|
22
|
+
import"./index-44ht2790.js";
|
|
23
23
|
import"./index-vsbzgd7b.js";
|
|
24
24
|
import"./index-f9mb610r.js";
|
|
25
|
-
import"./index-
|
|
26
|
-
import"./index-
|
|
25
|
+
import"./index-2hryh65w.js";
|
|
26
|
+
import"./index-kazec06k.js";
|
|
27
27
|
import"./index-6k1937bx.js";
|
|
28
|
-
import"./index-
|
|
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-
|
|
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-
|
|
10
|
-
import"./index-
|
|
9
|
+
} from "./index-gte38nbm.js";
|
|
10
|
+
import"./index-kazec06k.js";
|
|
11
11
|
import"./index-6k1937bx.js";
|
|
12
|
-
import"./index-
|
|
12
|
+
import"./index-scs3f1eg.js";
|
|
13
13
|
import"./index-kzfs85xp.js";
|
|
14
14
|
import"./index-kc6h6hg0.js";
|
|
15
15
|
import"./index-r159gjwy.js";
|
package/dist/agent-runtime.js
CHANGED
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
renderAgentStateSlots,
|
|
32
32
|
repairedSearchCall,
|
|
33
33
|
selectAgentHistory
|
|
34
|
-
} from "./index-
|
|
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
|
-
|
|
166
|
+
recordAgentSandboxProbe,
|
|
167
|
+
refuseUnknownSpillReference
|
|
168
|
+
} from "./index-gte38nbm.js";
|
|
168
169
|
import {
|
|
169
170
|
buildToolManifest,
|
|
170
171
|
mountAgent
|
|
171
|
-
} from "./index-
|
|
172
|
+
} from "./index-gbqjt8jz.js";
|
|
172
173
|
import"./index-7rkhw9ec.js";
|
|
173
|
-
import"./index-
|
|
174
|
-
import"./index-
|
|
175
|
-
import"./index-
|
|
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-
|
|
179
|
-
import"./index-
|
|
179
|
+
import"./index-2hryh65w.js";
|
|
180
|
+
import"./index-kazec06k.js";
|
|
180
181
|
import"./index-6k1937bx.js";
|
|
181
|
-
import"./index-
|
|
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
|
|
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
|
-
|
|
2269
|
-
return
|
|
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
|
|
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
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/application.js
CHANGED
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
ApplicationShutdownBudgetSchema,
|
|
37
37
|
ApplicationShutdownOptionsSchema,
|
|
38
38
|
createApplication
|
|
39
|
-
} from "./index-
|
|
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-
|
|
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-
|
|
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,
|
|
1572
|
+
function tell(key, deliver2) {
|
|
1570
1573
|
try {
|
|
1571
|
-
|
|
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
|
|
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
|
-
|
|
1589
|
-
for (const subscriber of source.subscribers)
|
|
1590
|
-
|
|
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
|
-
|
|
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-
|
|
8
|
+
} from "./index-8dph3pw6.js";
|
|
9
9
|
import"./index-sbdmyz75.js";
|
|
10
|
-
import"./index-
|
|
11
|
-
import"./index-
|
|
12
|
-
import"./index-
|
|
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-
|
|
16
|
-
import"./index-
|
|
15
|
+
import"./index-2hryh65w.js";
|
|
16
|
+
import"./index-kazec06k.js";
|
|
17
17
|
import"./index-6k1937bx.js";
|
|
18
|
-
import"./index-
|
|
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). */
|