stitchkit 0.103.10 → 0.103.12

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 (60) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/agent-runtime/coding-shell-process.d.ts.map +1 -1
  3. package/dist/agent-runtime/sandbox-process-owner.d.ts +1 -1
  4. package/dist/agent-runtime/sandbox-process-owner.d.ts.map +1 -1
  5. package/dist/agent-runtime/store-conformance-lifecycle.d.ts +10 -10
  6. package/dist/durability/json.d.ts.map +1 -1
  7. package/dist/entrypoints/agent-runtime/coding-tools.js +2 -1
  8. package/dist/entrypoints/agent-runtime/harness.js +2 -2
  9. package/dist/entrypoints/agent-runtime/sandbox.js +37 -19
  10. package/dist/entrypoints/agent-runtime.js +2 -2
  11. package/dist/entrypoints/application/diagnostic-journal.js +2 -2
  12. package/dist/entrypoints/files.js +8 -2
  13. package/dist/entrypoints/primitives.js +4 -3
  14. package/dist/entrypoints/process.js +1 -1
  15. package/dist/entrypoints/tools.js +1 -1
  16. package/dist/{index-ary5s7k0.js → index-69nvze1q.js} +1 -2
  17. package/dist/{index-a4ajxwmb.js → index-806d5phm.js} +114 -131
  18. package/dist/index-f330qqyg.js +653 -0
  19. package/dist/index-fm1c1a08.js +138 -0
  20. package/dist/index-xvdd2rbb.js +265 -0
  21. package/dist/{index-9jb61j5a.js → index-zp4jpkp0.js} +1 -1
  22. package/dist/internal/exclusive-lock-read.d.ts +20 -0
  23. package/dist/internal/exclusive-lock-read.d.ts.map +1 -0
  24. package/dist/internal/exclusive-lock.d.ts +2 -1
  25. package/dist/internal/exclusive-lock.d.ts.map +1 -1
  26. package/dist/internal/json-data.d.ts +8 -2
  27. package/dist/internal/json-data.d.ts.map +1 -1
  28. package/dist/internal/json-string-size.d.ts +3 -0
  29. package/dist/internal/json-string-size.d.ts.map +1 -0
  30. package/dist/internal/with-exclusive-lock.d.ts.map +1 -1
  31. package/dist/primitives/canonical-json.d.ts.map +1 -1
  32. package/dist/process/cleanup.d.ts +12 -0
  33. package/dist/process/cleanup.d.ts.map +1 -0
  34. package/dist/process/command-lifetime.d.ts +19 -0
  35. package/dist/process/command-lifetime.d.ts.map +1 -0
  36. package/dist/process/command-owner.d.ts +4 -2
  37. package/dist/process/command-owner.d.ts.map +1 -1
  38. package/dist/process/contract.d.ts +12 -1
  39. package/dist/process/contract.d.ts.map +1 -1
  40. package/dist/process/group.d.ts +6 -1
  41. package/dist/process/group.d.ts.map +1 -1
  42. package/dist/process/launch.d.ts +74 -0
  43. package/dist/process/launch.d.ts.map +1 -0
  44. package/dist/process/leader-settlement.d.ts +2 -0
  45. package/dist/process/leader-settlement.d.ts.map +1 -1
  46. package/dist/process/owned-child.d.ts +10 -0
  47. package/dist/process/owned-child.d.ts.map +1 -0
  48. package/dist/process/start-failure.d.ts +4 -0
  49. package/dist/process/start-failure.d.ts.map +1 -0
  50. package/dist/process/transport.d.ts +30 -0
  51. package/dist/process/transport.d.ts.map +1 -0
  52. package/llms/agent-runtime-sandbox.txt +9 -1
  53. package/llms/agent-runtime.txt +7 -1
  54. package/llms/process.txt +70 -7
  55. package/llms-full.txt +86 -9
  56. package/llms.txt +3 -3
  57. package/package.json +2 -2
  58. package/dist/index-6m6a9ty4.js +0 -285
  59. package/dist/index-c1jmtxa0.js +0 -74
  60. package/dist/index-ga597cvy.js +0 -184
@@ -0,0 +1,74 @@
1
+ import type { ChildProcessWithoutNullStreams } from 'node:child_process';
2
+ import { Readable } from 'node:stream';
3
+ import { type ParsedNativeCommandOptions } from './contract.js';
4
+ import { type NativeCommandTransport } from './transport.js';
5
+ /** A structural host launcher may supply pipes without importing Node ambient types. */
6
+ export interface NativeCommandLaunchedProcess {
7
+ readonly pid?: number;
8
+ readonly exitCode: number | null;
9
+ readonly signalCode: string | null;
10
+ readonly stdout: NativeCommandLaunchedOutput;
11
+ readonly stderr: NativeCommandLaunchedOutput;
12
+ kill(signal: 'SIGKILL'): boolean;
13
+ on(event: 'error', listener: (error: Error) => void): unknown;
14
+ on(event: 'exit' | 'close', listener: (code: number | null, signal: string | null) => void): unknown;
15
+ }
16
+ export interface NativeCommandLaunchedOutput {
17
+ readonly destroyed: boolean;
18
+ on(event: 'data', listener: (chunk: Uint8Array) => void): unknown;
19
+ destroy(): unknown;
20
+ }
21
+ /** Internal transport selection; application policy never enters the public command contract. */
22
+ export interface NativeCommandLaunchDriver {
23
+ launch?: () => NativeCommandLaunchedProcess;
24
+ maxBufferedBytes?: number;
25
+ group?: boolean;
26
+ force?: boolean;
27
+ cleanupTimeoutMs?: number;
28
+ timeoutMs?: number;
29
+ closeTimeoutMs?: number;
30
+ }
31
+ /** Driver overrides retain the same finite, safe-integer budget admission. */
32
+ export declare function nativeCommandBudgets(options: ParsedNativeCommandOptions, driver: NativeCommandLaunchDriver | undefined): {
33
+ cleanupTimeoutMs: number;
34
+ timeoutMs: number | undefined;
35
+ };
36
+ interface NativeCommandOwner {
37
+ result: Promise<unknown>;
38
+ stop(): Promise<void>;
39
+ terminate(): Promise<void>;
40
+ }
41
+ /** A launcher and its admission owner share the execution owner's shutdown barrier. */
42
+ export declare function registerNativeCommandOwner(child: object, owner: NativeCommandOwner): void;
43
+ export declare function nativeCommandOwner(child: object): NativeCommandOwner | undefined;
44
+ /** Install every observation before starting stdin or invoking an admission callback. */
45
+ export declare function launchNativeCommand(options: ParsedNativeCommandOptions, driver: NativeCommandLaunchDriver | undefined, onSpawn: ((child: ChildProcessWithoutNullStreams) => void) | undefined, onFailure: (error: Error) => void, onInputFailure: (error: Error) => void, onAcquired: (transport: NativeCommandTransport) => void): {
46
+ stdout: AsyncIterable<Uint8Array<ArrayBufferLike>>;
47
+ stderr: AsyncIterable<Uint8Array<ArrayBufferLike>>;
48
+ start(): void;
49
+ child: NativeCommandLaunchedProcess;
50
+ leader: Promise<{
51
+ kind: "exit";
52
+ exitCode: number | null;
53
+ signal: string | null;
54
+ } | {
55
+ kind: "error";
56
+ cause: unknown;
57
+ }>;
58
+ closed: Promise<{
59
+ exitCode: number | null;
60
+ signal: string | null;
61
+ }>;
62
+ released: Promise<void>;
63
+ pendingHandles: Set<string>;
64
+ stdin: import("node:stream").Writable | undefined;
65
+ observe(onFailure: (cause: Error) => void): void;
66
+ capture(): {
67
+ stdout: NativeCommandLaunchedOutput | Readable;
68
+ stderr: NativeCommandLaunchedOutput | Readable;
69
+ };
70
+ pipeDestructor(name: 'stdout' | 'stderr', destroy: () => unknown): void;
71
+ destroy(): void;
72
+ };
73
+ export {};
74
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/process/launch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAsB,KAAK,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEjF,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAElF,wFAAwF;AACxF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;IAC9D,EAAE,CACA,KAAK,EAAE,MAAM,GAAG,OAAO,EACvB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAC7D,OAAO,CAAC;CACZ;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC;IAClE,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,iGAAiG;AACjG,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,MAAM,4BAA4B,CAAC;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,yBAAyB,GAAG,SAAS;;;EAY9C;AAED,UAAU,kBAAkB;IAC1B,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAGD,uFAAuF;AACvF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAEzF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEhF;AAwED,yFAAyF;AACzF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,yBAAyB,GAAG,SAAS,EAC7C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,8BAA8B,KAAK,IAAI,CAAC,GAAG,SAAS,EACtE,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EACjC,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EACtC,UAAU,EAAE,CAAC,SAAS,EAAE,sBAAsB,KAAK,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8CxD"}
@@ -1,4 +1,6 @@
1
1
  import type { NativeCommandSettlement, ParsedNativeCommandOptions } from './contract.js';
2
+ /** An internal caller may bound drain/close after leader settlement without changing generic drain. */
3
+ export declare function createLeaderCloseDeadline(leader: Promise<NativeCommandSettlement>, timeoutMs: number | undefined, controller: AbortController): () => void;
2
4
  /** One bounded external resource settlement, shared by observed exit and terminal failure. */
3
5
  export declare function createLeaderSettlement(options: ParsedNativeCommandOptions, signal: AbortSignal): (event: NativeCommandSettlement) => Promise<void>;
4
6
  //# sourceMappingURL=leader-settlement.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"leader-settlement.d.ts","sourceRoot":"","sources":["../../src/process/leader-settlement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGtF,8FAA8F;AAC9F,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,WAAW,WAGJ,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAAC,CA+BvD"}
1
+ {"version":3,"file":"leader-settlement.d.ts","sourceRoot":"","sources":["../../src/process/leader-settlement.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAGtF,uGAAuG;AACvG,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,EACxC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,EAAE,eAAe,cAmB5B;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,WAAW,WAGJ,uBAAuB,KAAG,OAAO,CAAC,IAAI,CAAC,CAmCvD"}
@@ -0,0 +1,10 @@
1
+ /** Only this native spawn can establish group ownership; structural PIDs cannot. */
2
+ export declare function spawnOwnedCommand(input: {
3
+ executable: string;
4
+ args: readonly string[];
5
+ cwd?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ group: boolean;
8
+ }): import("node:child_process").ChildProcessWithoutNullStreams;
9
+ export declare function ownsCommandGroup(child: object): boolean;
10
+ //# sourceMappingURL=owned-child.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-child.d.ts","sourceRoot":"","sources":["../../src/process/owned-child.ts"],"names":[],"mappings":"AAIA,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;CAChB,+DASA;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,4 @@
1
+ import { NativeCommandError } from './contract.js';
2
+ /** A failed native admission still owns one bounded external-resource settlement. */
3
+ export declare function failedCommandStart(cause: unknown, cleanup: (error: NativeCommandError) => Promise<void>): Promise<never>;
4
+ //# sourceMappingURL=start-failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-failure.d.ts","sourceRoot":"","sources":["../../src/process/start-failure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,qFAAqF;AACrF,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GACpD,OAAO,CAAC,KAAK,CAAC,CAMhB"}
@@ -0,0 +1,30 @@
1
+ import { Readable, Writable } from 'node:stream';
2
+ import type { NativeCommandLaunchedOutput, NativeCommandLaunchedProcess } from './launch.js';
3
+ /** Acquired before subscriptions: failed setup and normal execution own the same handles. */
4
+ export declare function createCommandTransport(child: NativeCommandLaunchedProcess): {
5
+ child: NativeCommandLaunchedProcess;
6
+ leader: Promise<{
7
+ kind: "exit";
8
+ exitCode: number | null;
9
+ signal: string | null;
10
+ } | {
11
+ kind: "error";
12
+ cause: unknown;
13
+ }>;
14
+ closed: Promise<{
15
+ exitCode: number | null;
16
+ signal: string | null;
17
+ }>;
18
+ released: Promise<void>;
19
+ pendingHandles: Set<string>;
20
+ readonly stdin: Writable | undefined;
21
+ observe(onFailure: (cause: Error) => void): void;
22
+ capture(): {
23
+ stdout: NativeCommandLaunchedOutput | Readable;
24
+ stderr: NativeCommandLaunchedOutput | Readable;
25
+ };
26
+ pipeDestructor(name: 'stdout' | 'stderr', destroy: () => unknown): void;
27
+ destroy(): void;
28
+ };
29
+ export type NativeCommandTransport = ReturnType<typeof createCommandTransport>;
30
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/process/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,KAAK,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AAE1F,6FAA6F;AAC7F,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,4BAA4B;;;;;;;;;;;kBAEvB,MAAM,GAAG,IAAI;gBAAU,MAAM,GAAG,IAAI;;;;;uBA6BhE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;;;;;yBAkCpB,QAAQ,GAAG,QAAQ,WAAW,MAAM,OAAO;;EAmBnE;AAED,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -15,6 +15,12 @@ Also read:
15
15
  ---
16
16
  title: Optional process sandbox
17
17
  description: Linux namespace isolation, durable workspaces and a host credential gateway.
18
+ updated: 2026-10-03 14:47 +07:00
19
+ participants:
20
+ - role: implemented
21
+ harness: Codex
22
+ model: GPT-6
23
+ at: 2026-10-03 14:47 +07:00
18
24
  ---
19
25
 
20
26
  # Optional process sandbox
@@ -84,7 +90,9 @@ Unsupported backends omit the binding and the factory refuses explicitly.
84
90
  Stop also kills coding commands. Both launch paths share the configured
85
91
  `maxConcurrentCommands` admission limit (default 8); an occupied slot gives
86
92
  `SANDBOX_BUSY` before another process starts. This counts direct commands, not
87
- guest descendants. Required restrictions are checked again during preparation;
93
+ guest descendants. A direct launch retains its slot through terminal group cleanup,
94
+ including descendants that outlive the leader. Required restrictions are checked again
95
+ during preparation;
88
96
  a network-policy change invalidates an outstanding prepared launch. After
89
97
  reconnect, create the coding profile from the new handle; old tools remain stopped.
90
98
 
@@ -19,7 +19,7 @@ description: Configure Stitchkit's optional durable history, stream loop, run co
19
19
  type: architecture
20
20
  status: active
21
21
  created: 2026-08-22
22
- updated: 2026-09-28 18:39 +07:00
22
+ updated: 2026-10-02 16:28 +07:00
23
23
  ---
24
24
 
25
25
  # Agent application runtime
@@ -376,6 +376,12 @@ second host executable, so Windows kills the direct child, destroys retained pip
376
376
  deadline and makes no descendant-cleanup claim. A signal already aborted before execution returns
377
377
  `cancelled` without spawning.
378
378
 
379
+ Coding commands compose the shared native execution owner. Artifact retention and UTF-8
380
+ previews remain coding-tool policy; normal leader exit still forcibly stops remaining POSIX
381
+ group members before draining. A structural sandbox launcher uses the same settlement owner
382
+ with a finite output queue. Sandbox shutdown waits for actual owned completion and surfaces
383
+ cleanup refusal rather than treating it as successful teardown.
384
+
379
385
  One `createAgentHarnessFileResources` instance represents one immutable discovery generation:
380
386
  concurrent and repeated `load()` calls share it, so a direct resource read cannot cross into a
381
387
  new catalog unexpectedly. Discovery uses the same descriptor-anchored traversal as coding search;
package/llms/process.txt CHANGED
@@ -15,7 +15,7 @@ description: Native IO для Bun и Node, с явно выбранной durabi
15
15
  type: guide
16
16
  status: active
17
17
  created: 2026-10-01 20:44 +07:00
18
- updated: 2026-10-02 00:37 +07:00
18
+ updated: 2026-10-03 13:36 +07:00
19
19
  participants:
20
20
  - role: authored
21
21
  harness: Codex
@@ -25,6 +25,10 @@ participants:
25
25
  harness: Codex
26
26
  model: GPT-6
27
27
  at: 2026-10-02 00:08 +07:00
28
+ - role: implemented
29
+ harness: Codex
30
+ model: GPT-6
31
+ at: 2026-10-03 13:36 +07:00
28
32
  ---
29
33
 
30
34
  # Native IO
@@ -131,6 +135,32 @@ await runNativeCommand({
131
135
  означает пустой environment; `ambient` явно разрешает наследование. Cwd/executable policy остаётся
132
136
  приложению; этот primitive запускает native executable и сам не создаёт shell.
133
137
 
138
+ Машинная классификация limit error использует `NativeCommandError.reason`: `deadline` при
139
+ истечении собственного `timeoutMs`, `output-budget` при превышении суммарных bytes stdout+stderr
140
+ в capture или streaming. Оба случая сохраняют `code: 'COMMAND_LIMIT'`; `message` служит
141
+ диагностике, не протоколу. У `COMMAND_UNAVAILABLE` и `COMMAND_CLEANUP` reason отсутствует;
142
+ caller abort и sink failure сохраняют исходную ошибку. При cleanup failure первоначальный
143
+ limit вместе с reason остаётся внутри `AggregateError` cause.
144
+
145
+ ```ts
146
+ import { NativeCommandError } from 'stitchkit/process'
147
+
148
+ try {
149
+ await runNativeCommand({ executable: '/usr/bin/git', args: ['status'], timeoutMs: 5000 })
150
+ } catch (error) {
151
+ if (error instanceof NativeCommandError && error.code === 'COMMAND_LIMIT') {
152
+ if (error.reason === 'deadline') console.error('Command timed out')
153
+ if (error.reason === 'output-budget') console.error('Command produced too many bytes')
154
+ }
155
+ throw error
156
+ }
157
+ ```
158
+
159
+ Конструктор сохраняет вызов `new NativeCommandError(code, message, { cause })` и принимает
160
+ `{ cause, reason: 'deadline' | 'output-budget' }` только для `COMMAND_LIMIT`. Owner всегда
161
+ заполняет reason для собственных limits. Созданная вызывающей стороной ошибка без reason
162
+ не получает выдуманную причину из текста; её reason остаётся `undefined`.
163
+
134
164
  Вывод читается с backpressure отдельно для stdout/stderr: один выполняющийся sink на канал плюс
135
165
  bounded native Readable buffer; накопления всей истории при streaming нет. Callback получает
136
166
  lifetime signal. Abort освобождает ожидание даже игнорирующего signal callback, но не способен
@@ -164,7 +194,11 @@ packed размера и dependency closure.
164
194
  close. A resource owner can stop its external scope there, allowing pipe drain to complete.
165
195
  The callback runs once: `event.kind === 'exit'` carries observed `exitCode`/`signal`; a terminal
166
196
  failure uses `kind: 'error'` and preserves its cause. Unavailable executables, output sink
167
- failure and caller cancellation settle through the same owner. `cleanupTimeoutMs` bounds
197
+ failure and caller cancellation settle through the same owner. Synchronous native launch
198
+ failures such as `E2BIG` also return a rejected result after this bounded settlement;
199
+ schema-invalid and already-aborted inputs refuse before native ownership and do not invoke
200
+ the hook. A failing hook preserves both the initial launch error and cleanup cause.
201
+ `cleanupTimeoutMs` bounds
168
202
  the callback after settlement starts; it never becomes a deadline for signal-only execution.
169
203
  Honor the settlement signal; arbitrary user promises cannot be forcibly cancelled.
170
204
 
@@ -184,14 +218,23 @@ caller established: `matched`, `different-boot`, `reused-pid`, `pid-gone`, `lega
184
218
  `unavailable`. Missing/partial/denied evidence is not death. Supervisor tree fencing remains
185
219
  the caller's job; a PID lifetime is not proof that its whole workload stopped.
186
220
 
221
+ Exclusive acquisition checks cancellation again before invoking the protected callback;
222
+ an aborted acquisition releases its newly owned lock without starting the callback.
223
+ Existing lock and reclaim-guard records are opened with nonblocking/no-follow flags,
224
+ must be regular files with one link, and are capped at 16 KiB. Descriptor metadata must
225
+ remain stable during the read. Unsafe records are not evidence of absence or permission
226
+ to reclaim. This bounds local record reads; it does not make a hung remote-filesystem
227
+ syscall interruptible or provide a snapshot against a hostile writer.
228
+
187
229
  An exclusive lock applies exact requested permissions through its creating descriptor,
188
230
  independent of umask. Default `0600` stays private. Shared `0640` requires a common group and
189
231
  traversable directories; another UID also needs directory write permission to reclaim a
190
232
  proven-dead owner's file. Set `ownerlessGraceMs: null` to refuse every age-only reclaim,
191
233
  including ownerless reclaim guards. The default remains 5000 ms for existing clients.
192
- Восстановление stale reclaim guard использует тот же lock owner и следующий guard:
193
- проверка inode и удаление выполняются под ним. Конкурирующий writer не обходит guard,
194
- пока прежнее удаление приостановлено; live и unknown lifetime evidence остаются отказом.
234
+ Stale reclaim guards use the same lock owner and a child guard for the inode check and
235
+ unlink. Recovery depth is capped at 16; a deeper stale chain refuses recovery with a depth diagnosis retained as the cause of
236
+ the bounded `LOCK_TIMEOUT`. Live owners, unknown process-lifetime evidence and unsafe records are never
237
+ reclaimed. Concurrent writers cannot bypass a guard while a prior unlink is paused.
195
238
 
196
239
  ## Libraries with a Zod-only runtime
197
240
 
@@ -221,6 +264,26 @@ Stitchkit leaf fails there. A separate schema-only entry must not import the nat
221
264
  This delivery removes a runtime kernel installation; it does not remove the build-time
222
265
  Stitchkit installation or create an independent lightweight npm package.
223
266
 
267
+ ## Qualification boundaries
268
+
269
+ Native command cleanup owns the child before launch subscriptions are installed. Setup
270
+ refusal still settles leader closure and teardown within the cleanup budget; failure to
271
+ prove closure reports `COMMAND_CLEANUP` with the original failure retained. Process-group
272
+ signaling requires evidence from the actual detached launcher, not a structural PID field.
273
+ The built-in sandbox transport carries that ownership across the package's split entrypoints.
274
+ Internal finite deadlines and Darwin retry admission use monotonic elapsed time.
275
+
276
+ Linux UID-refusal qualification is a separate privileged installed-package proof in Bun
277
+ and real Node; an unsupported platform or insufficient UID reports an explicit skip.
278
+ A generic native-owner marker does not certify the privileged case. Real Darwin CI remains
279
+ the qualification for native Darwin behavior.
280
+
281
+ Local filesystem tests do not attest delayed NFS visibility, shared-volume microVM or gVisor
282
+ ownership, actual PGID reuse, power-loss durability or macOS full-sync behavior. Those
283
+ require their actual topology or failure environment. The default ownerless grace remains
284
+ 5000 ms; stricter callers can retain `ownerlessGraceMs: null`. No age-only observation
285
+ proves a partially published owner's process dead.
286
+
224
287
  ==============================================================================
225
288
  # API reference: `stitchkit/process` (docs/api/reference.md)
226
289
  ==============================================================================
@@ -234,9 +297,9 @@ Native POSIX Bun/Node one-shot command execution. See [native IO](../guide/nativ
234
297
  | `runNativeCommand` | function | caller-lifetime streaming or explicitly bounded binary capture |
235
298
  | `NativeCommandOptions` | type | executable/args, env policy, signal/deadline, bytes sink and finite cleanup limits |
236
299
  | `NativeCommandResult` | type | observed nullable exit code/signal and captured stdout/stderr bytes |
237
- | `NativeCommandError` | class | COMMAND_LIMIT, COMMAND_UNAVAILABLE or COMMAND_CLEANUP with internal cause |
300
+ | `NativeCommandError` | class | COMMAND_LIMIT with machine reason `deadline` or `output-budget`; COMMAND_UNAVAILABLE / COMMAND_CLEANUP have no limit reason. Preserves internal cause and existing constructor; caller-created limits without supplied reason remain unclassified |
238
301
 
239
- | `NativeCommandSettlement` | type | observed leader `exit` or terminal `error`; `onLeaderSettled` runs once before drain, bounded by cleanupTimeoutMs, with a cancellable settlement signal |
302
+ | `NativeCommandSettlement` | type | observed leader `exit` or terminal `error`, including synchronous native launch failure; `onLeaderSettled` runs once before drain, bounded by cleanupTimeoutMs, with a cancellable settlement signal; schema/pre-abort refusal creates no settlement obligation |
240
303
  | `observeProcessInstance` / `ProcessInstanceObservation` | function / type | Linux/Darwin lifetime observation; observed identity or unavailable with its original cause, never guessed absence |
241
304
  | `ProcessInstanceSchema` / `ProcessInstance` | schema / type | platform, boot ID, namespace and process start identity from the shared native reader |
242
305
  | `probeProcessOwner` / `ProcessOwnerEvidence` | function / type | compare lifetimes on one caller-established machine; matched, boot change, reused PID, gone, legacy or unavailable with cause |
package/llms-full.txt CHANGED
@@ -5119,7 +5119,7 @@ description: Configure Stitchkit's optional durable history, stream loop, run co
5119
5119
  type: architecture
5120
5120
  status: active
5121
5121
  created: 2026-08-22
5122
- updated: 2026-09-28 18:39 +07:00
5122
+ updated: 2026-10-02 16:28 +07:00
5123
5123
  ---
5124
5124
 
5125
5125
  # Agent application runtime
@@ -5476,6 +5476,12 @@ second host executable, so Windows kills the direct child, destroys retained pip
5476
5476
  deadline and makes no descendant-cleanup claim. A signal already aborted before execution returns
5477
5477
  `cancelled` without spawning.
5478
5478
 
5479
+ Coding commands compose the shared native execution owner. Artifact retention and UTF-8
5480
+ previews remain coding-tool policy; normal leader exit still forcibly stops remaining POSIX
5481
+ group members before draining. A structural sandbox launcher uses the same settlement owner
5482
+ with a finite output queue. Sandbox shutdown waits for actual owned completion and surfaces
5483
+ cleanup refusal rather than treating it as successful teardown.
5484
+
5479
5485
  One `createAgentHarnessFileResources` instance represents one immutable discovery generation:
5480
5486
  concurrent and repeated `load()` calls share it, so a direct resource read cannot cross into a
5481
5487
  new catalog unexpectedly. Discovery uses the same descriptor-anchored traversal as coding search;
@@ -7894,6 +7900,12 @@ boundary is required. Send and projection callbacks own their external deadlines
7894
7900
  ---
7895
7901
  title: Optional process sandbox
7896
7902
  description: Linux namespace isolation, durable workspaces and a host credential gateway.
7903
+ updated: 2026-10-03 14:47 +07:00
7904
+ participants:
7905
+ - role: implemented
7906
+ harness: Codex
7907
+ model: GPT-6
7908
+ at: 2026-10-03 14:47 +07:00
7897
7909
  ---
7898
7910
 
7899
7911
  # Optional process sandbox
@@ -7963,7 +7975,9 @@ Unsupported backends omit the binding and the factory refuses explicitly.
7963
7975
  Stop also kills coding commands. Both launch paths share the configured
7964
7976
  `maxConcurrentCommands` admission limit (default 8); an occupied slot gives
7965
7977
  `SANDBOX_BUSY` before another process starts. This counts direct commands, not
7966
- guest descendants. Required restrictions are checked again during preparation;
7978
+ guest descendants. A direct launch retains its slot through terminal group cleanup,
7979
+ including descendants that outlive the leader. Required restrictions are checked again
7980
+ during preparation;
7967
7981
  a network-policy change invalidates an outstanding prepared launch. After
7968
7982
  reconnect, create the coding profile from the new handle; old tools remain stopped.
7969
7983
 
@@ -8031,7 +8045,7 @@ description: Native IO для Bun и Node, с явно выбранной durabi
8031
8045
  type: guide
8032
8046
  status: active
8033
8047
  created: 2026-10-01 20:44 +07:00
8034
- updated: 2026-10-02 00:37 +07:00
8048
+ updated: 2026-10-03 13:36 +07:00
8035
8049
  participants:
8036
8050
  - role: authored
8037
8051
  harness: Codex
@@ -8041,6 +8055,10 @@ participants:
8041
8055
  harness: Codex
8042
8056
  model: GPT-6
8043
8057
  at: 2026-10-02 00:08 +07:00
8058
+ - role: implemented
8059
+ harness: Codex
8060
+ model: GPT-6
8061
+ at: 2026-10-03 13:36 +07:00
8044
8062
  ---
8045
8063
 
8046
8064
  # Native IO
@@ -8147,6 +8165,32 @@ await runNativeCommand({
8147
8165
  означает пустой environment; `ambient` явно разрешает наследование. Cwd/executable policy остаётся
8148
8166
  приложению; этот primitive запускает native executable и сам не создаёт shell.
8149
8167
 
8168
+ Машинная классификация limit error использует `NativeCommandError.reason`: `deadline` при
8169
+ истечении собственного `timeoutMs`, `output-budget` при превышении суммарных bytes stdout+stderr
8170
+ в capture или streaming. Оба случая сохраняют `code: 'COMMAND_LIMIT'`; `message` служит
8171
+ диагностике, не протоколу. У `COMMAND_UNAVAILABLE` и `COMMAND_CLEANUP` reason отсутствует;
8172
+ caller abort и sink failure сохраняют исходную ошибку. При cleanup failure первоначальный
8173
+ limit вместе с reason остаётся внутри `AggregateError` cause.
8174
+
8175
+ ```ts
8176
+ import { NativeCommandError } from 'stitchkit/process'
8177
+
8178
+ try {
8179
+ await runNativeCommand({ executable: '/usr/bin/git', args: ['status'], timeoutMs: 5000 })
8180
+ } catch (error) {
8181
+ if (error instanceof NativeCommandError && error.code === 'COMMAND_LIMIT') {
8182
+ if (error.reason === 'deadline') console.error('Command timed out')
8183
+ if (error.reason === 'output-budget') console.error('Command produced too many bytes')
8184
+ }
8185
+ throw error
8186
+ }
8187
+ ```
8188
+
8189
+ Конструктор сохраняет вызов `new NativeCommandError(code, message, { cause })` и принимает
8190
+ `{ cause, reason: 'deadline' | 'output-budget' }` только для `COMMAND_LIMIT`. Owner всегда
8191
+ заполняет reason для собственных limits. Созданная вызывающей стороной ошибка без reason
8192
+ не получает выдуманную причину из текста; её reason остаётся `undefined`.
8193
+
8150
8194
  Вывод читается с backpressure отдельно для stdout/stderr: один выполняющийся sink на канал плюс
8151
8195
  bounded native Readable buffer; накопления всей истории при streaming нет. Callback получает
8152
8196
  lifetime signal. Abort освобождает ожидание даже игнорирующего signal callback, но не способен
@@ -8180,7 +8224,11 @@ packed размера и dependency closure.
8180
8224
  close. A resource owner can stop its external scope there, allowing pipe drain to complete.
8181
8225
  The callback runs once: `event.kind === 'exit'` carries observed `exitCode`/`signal`; a terminal
8182
8226
  failure uses `kind: 'error'` and preserves its cause. Unavailable executables, output sink
8183
- failure and caller cancellation settle through the same owner. `cleanupTimeoutMs` bounds
8227
+ failure and caller cancellation settle through the same owner. Synchronous native launch
8228
+ failures such as `E2BIG` also return a rejected result after this bounded settlement;
8229
+ schema-invalid and already-aborted inputs refuse before native ownership and do not invoke
8230
+ the hook. A failing hook preserves both the initial launch error and cleanup cause.
8231
+ `cleanupTimeoutMs` bounds
8184
8232
  the callback after settlement starts; it never becomes a deadline for signal-only execution.
8185
8233
  Honor the settlement signal; arbitrary user promises cannot be forcibly cancelled.
8186
8234
 
@@ -8200,14 +8248,23 @@ caller established: `matched`, `different-boot`, `reused-pid`, `pid-gone`, `lega
8200
8248
  `unavailable`. Missing/partial/denied evidence is not death. Supervisor tree fencing remains
8201
8249
  the caller's job; a PID lifetime is not proof that its whole workload stopped.
8202
8250
 
8251
+ Exclusive acquisition checks cancellation again before invoking the protected callback;
8252
+ an aborted acquisition releases its newly owned lock without starting the callback.
8253
+ Existing lock and reclaim-guard records are opened with nonblocking/no-follow flags,
8254
+ must be regular files with one link, and are capped at 16 KiB. Descriptor metadata must
8255
+ remain stable during the read. Unsafe records are not evidence of absence or permission
8256
+ to reclaim. This bounds local record reads; it does not make a hung remote-filesystem
8257
+ syscall interruptible or provide a snapshot against a hostile writer.
8258
+
8203
8259
  An exclusive lock applies exact requested permissions through its creating descriptor,
8204
8260
  independent of umask. Default `0600` stays private. Shared `0640` requires a common group and
8205
8261
  traversable directories; another UID also needs directory write permission to reclaim a
8206
8262
  proven-dead owner's file. Set `ownerlessGraceMs: null` to refuse every age-only reclaim,
8207
8263
  including ownerless reclaim guards. The default remains 5000 ms for existing clients.
8208
- Восстановление stale reclaim guard использует тот же lock owner и следующий guard:
8209
- проверка inode и удаление выполняются под ним. Конкурирующий writer не обходит guard,
8210
- пока прежнее удаление приостановлено; live и unknown lifetime evidence остаются отказом.
8264
+ Stale reclaim guards use the same lock owner and a child guard for the inode check and
8265
+ unlink. Recovery depth is capped at 16; a deeper stale chain refuses recovery with a depth diagnosis retained as the cause of
8266
+ the bounded `LOCK_TIMEOUT`. Live owners, unknown process-lifetime evidence and unsafe records are never
8267
+ reclaimed. Concurrent writers cannot bypass a guard while a prior unlink is paused.
8211
8268
 
8212
8269
  ## Libraries with a Zod-only runtime
8213
8270
 
@@ -8237,6 +8294,26 @@ Stitchkit leaf fails there. A separate schema-only entry must not import the nat
8237
8294
  This delivery removes a runtime kernel installation; it does not remove the build-time
8238
8295
  Stitchkit installation or create an independent lightweight npm package.
8239
8296
 
8297
+ ## Qualification boundaries
8298
+
8299
+ Native command cleanup owns the child before launch subscriptions are installed. Setup
8300
+ refusal still settles leader closure and teardown within the cleanup budget; failure to
8301
+ prove closure reports `COMMAND_CLEANUP` with the original failure retained. Process-group
8302
+ signaling requires evidence from the actual detached launcher, not a structural PID field.
8303
+ The built-in sandbox transport carries that ownership across the package's split entrypoints.
8304
+ Internal finite deadlines and Darwin retry admission use monotonic elapsed time.
8305
+
8306
+ Linux UID-refusal qualification is a separate privileged installed-package proof in Bun
8307
+ and real Node; an unsupported platform or insufficient UID reports an explicit skip.
8308
+ A generic native-owner marker does not certify the privileged case. Real Darwin CI remains
8309
+ the qualification for native Darwin behavior.
8310
+
8311
+ Local filesystem tests do not attest delayed NFS visibility, shared-volume microVM or gVisor
8312
+ ownership, actual PGID reuse, power-loss durability or macOS full-sync behavior. Those
8313
+ require their actual topology or failure environment. The default ownerless grace remains
8314
+ 5000 ms; stricter callers can retain `ownerlessGraceMs: null`. No age-only observation
8315
+ proves a partially published owner's process dead.
8316
+
8240
8317
 
8241
8318
  ==============================================================================
8242
8319
  # Guide: Generic application primitives (docs/guide/primitives.md)
@@ -21191,9 +21268,9 @@ Native POSIX Bun/Node one-shot command execution. See [native IO](../guide/nativ
21191
21268
  | `runNativeCommand` | function | caller-lifetime streaming or explicitly bounded binary capture |
21192
21269
  | `NativeCommandOptions` | type | executable/args, env policy, signal/deadline, bytes sink and finite cleanup limits |
21193
21270
  | `NativeCommandResult` | type | observed nullable exit code/signal and captured stdout/stderr bytes |
21194
- | `NativeCommandError` | class | COMMAND_LIMIT, COMMAND_UNAVAILABLE or COMMAND_CLEANUP with internal cause |
21271
+ | `NativeCommandError` | class | COMMAND_LIMIT with machine reason `deadline` or `output-budget`; COMMAND_UNAVAILABLE / COMMAND_CLEANUP have no limit reason. Preserves internal cause and existing constructor; caller-created limits without supplied reason remain unclassified |
21195
21272
 
21196
- | `NativeCommandSettlement` | type | observed leader `exit` or terminal `error`; `onLeaderSettled` runs once before drain, bounded by cleanupTimeoutMs, with a cancellable settlement signal |
21273
+ | `NativeCommandSettlement` | type | observed leader `exit` or terminal `error`, including synchronous native launch failure; `onLeaderSettled` runs once before drain, bounded by cleanupTimeoutMs, with a cancellable settlement signal; schema/pre-abort refusal creates no settlement obligation |
21197
21274
  | `observeProcessInstance` / `ProcessInstanceObservation` | function / type | Linux/Darwin lifetime observation; observed identity or unavailable with its original cause, never guessed absence |
21198
21275
  | `ProcessInstanceSchema` / `ProcessInstance` | schema / type | platform, boot ID, namespace and process start identity from the shared native reader |
21199
21276
  | `probeProcessOwner` / `ProcessOwnerEvidence` | function / type | compare lifetimes on one caller-established machine; matched, boot change, reused PID, gone, legacy or unavailable with cause |
package/llms.txt CHANGED
@@ -23,7 +23,7 @@ Load the slice for each entrypoint your code imports — `import … from 'stitc
23
23
  - **stitchkit/primitives**: [llms/primitives.txt](llms/primitives.txt) 11.2 KB
24
24
  - **stitchkit/server**: [llms/server.txt](llms/server.txt) 45.3 KB → [llms/server.2.txt](llms/server.2.txt) 14.6 KB → [llms/server.3.txt](llms/server.3.txt) 45.6 KB → [llms/server.4.txt](llms/server.4.txt) 38.1 KB → [llms/server.5.txt](llms/server.5.txt) 21.8 KB
25
25
  - **stitchkit/observability**: [llms/observability.txt](llms/observability.txt) 44.8 KB
26
- - **stitchkit/agent-runtime**: [llms/agent-runtime.txt](llms/agent-runtime.txt) 36.8 KB → [llms/agent-runtime.2.txt](llms/agent-runtime.2.txt) 46.7 KB → [llms/agent-runtime.3.txt](llms/agent-runtime.3.txt) 34.3 KB
26
+ - **stitchkit/agent-runtime**: [llms/agent-runtime.txt](llms/agent-runtime.txt) 37.2 KB → [llms/agent-runtime.2.txt](llms/agent-runtime.2.txt) 46.7 KB → [llms/agent-runtime.3.txt](llms/agent-runtime.3.txt) 34.3 KB
27
27
  - **stitchkit/agent-runtime/testing**: [llms/agent-runtime-testing.txt](llms/agent-runtime-testing.txt) 2.6 KB
28
28
  - **stitchkit/agent-runtime/harness**: [llms/agent-runtime-harness.txt](llms/agent-runtime-harness.txt) 10.1 KB
29
29
  - **stitchkit/agent-runtime/coding-tools**: [llms/agent-runtime-coding-tools.txt](llms/agent-runtime-coding-tools.txt) 4.9 KB
@@ -38,7 +38,7 @@ Load the slice for each entrypoint your code imports — `import … from 'stitc
38
38
  - **stitchkit/application/diagnostic-journal**: [llms/application-diagnostic-journal.txt](llms/application-diagnostic-journal.txt) 1.8 KB
39
39
  - **stitchkit/application/schemas**: [llms/application-schemas.txt](llms/application-schemas.txt) 1.8 KB
40
40
  - **stitchkit/testing**: [llms/testing.txt](llms/testing.txt) 30.8 KB
41
- - **stitchkit/agent-runtime/sandbox**: [llms/agent-runtime-sandbox.txt](llms/agent-runtime-sandbox.txt) 8.1 KB
41
+ - **stitchkit/agent-runtime/sandbox**: [llms/agent-runtime-sandbox.txt](llms/agent-runtime-sandbox.txt) 8.3 KB
42
42
  - **stitchkit/files**: [llms/files.txt](llms/files.txt) 4.5 KB
43
43
  - **stitchkit/telegram**: [llms/telegram.txt](llms/telegram.txt) 26.9 KB
44
44
  - **stitchkit/telegram/html**: [llms/telegram-html.txt](llms/telegram-html.txt) 2.7 KB
@@ -55,7 +55,7 @@ Load the slice for each entrypoint your code imports — `import … from 'stitc
55
55
  - **stitchkit/agent-runtime/react**: [llms/agent-runtime-react.txt](llms/agent-runtime-react.txt) 1.0 KB
56
56
  - **stitchkit/agent-runtime/realtime**: [llms/agent-runtime-realtime.txt](llms/agent-runtime-realtime.txt) 1.8 KB
57
57
  - **stitchkit/agent-runtime/harness-tools**: [llms/agent-runtime-harness-tools.txt](llms/agent-runtime-harness-tools.txt) 1.3 KB
58
- - **stitchkit/process**: [llms/process.txt](llms/process.txt) 15.9 KB
58
+ - **stitchkit/process**: [llms/process.txt](llms/process.txt) 20.0 KB
59
59
 
60
60
  ## Upgrading slices
61
61
  - **Upgrading — how to move across versions**: [llms/upgrading.txt](llms/upgrading.txt) 10.3 KB
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stitchkit",
3
- "version": "0.103.10",
3
+ "version": "0.103.12",
4
4
  "description": "Contract-first backend framework — one defineContract() into an HTTP API, MCP tools, AI-agent tools and a typed client. Bun and Node.",
5
5
  "keywords": [
6
6
  "bun",
@@ -250,7 +250,7 @@
250
250
  "build": "bun ../../scripts/package-build-lock.ts -- bun run build:unlocked",
251
251
  "build:unlocked": "rm -rf dist && cp ../../CHANGELOG.md ./CHANGELOG.md && bun run build:js && chmod +x dist/entrypoints/bin/upgrade-cli.js && bun run build:types && bun scripts/check-browser-clean.mjs && bun scripts/check-browser-executes.mjs && bun scripts/check-env-live.mjs && bun scripts/check-public-types.mjs && bun scripts/check-durability-port-standalone.mjs && bun scripts/check-declarations-strict.mjs",
252
252
  "dev": "bun run build:entrypoints -- --watch",
253
- "prepack": "cp ../../README.md ./README.md && bun ../../scripts/gen-llms.ts && bun run build",
253
+ "prepack": "bun ../../scripts/sync-package-readme.ts && bun ../../scripts/gen-llms.ts && bun run build",
254
254
  "test": "bun test",
255
255
  "smoke:node": "node scripts/node-smoke.mjs",
256
256
  "smoke:next-ssr": "node scripts/next-ssr-retry-smoke.mjs",