@excitedjs/dreamux-utils 0.4.0-beta.168 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -26,21 +26,8 @@ export type ResolvedCompletionBody = {
26
26
  path: string;
27
27
  };
28
28
  export interface CompletionBodyInput {
29
- source: string;
30
- id: string;
31
29
  result: string | null;
32
30
  }
33
- /**
34
- * Spill file for a teammate completion result that overflows the inline budget.
35
- * The host writes the full result here and inlines only this path into the
36
- * dispatcher or TeamLeader turn, so a large result never floods the target
37
- * agent's context.
38
- * `spillDir` is the owning dispatcher's completion spill dir, supplied by the
39
- * caller so a TeamLeader delivery target still spills under its operator
40
- * dispatcher, not its composite runtime id. `source` and `id` are sanitized for
41
- * filename safety; the id is unique per completion (teammate name + turn id).
42
- */
43
- export declare function teamMateCompletionOutputPath(spillDir: string, source: string, id: string): string;
44
31
  /**
45
32
  * Resolve the effective inline budget from the environment, in the spirit of
46
33
  * native `validateBoundedIntEnvVar`: unset/blank or non-positive falls back to
@@ -1 +1 @@
1
- {"version":3,"file":"completion-body.d.ts","sourceRoot":"","sources":["../src/completion-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,4BAA4B,SAAU,CAAC;AAGpD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAOD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,GACT,MAAM,CAER;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAmC,GAC9C,MAAM,CAUR;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CAmBjC"}
1
+ {"version":3,"file":"completion-body.d.ts","sourceRoot":"","sources":["../src/completion-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,4BAA4B,SAAU,CAAC;AAGpD,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AACD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAmC,GAC9C,MAAM,CAUR;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,mBAAmB,EAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CA6BjC"}
@@ -11,7 +11,8 @@
11
11
  * no Dreamux layout contract — only the safe filename shape inside that
12
12
  * directory.
13
13
  */
14
- import { chmod, writeFile } from 'node:fs/promises';
14
+ import { randomUUID } from 'node:crypto';
15
+ import { open } from 'node:fs/promises';
15
16
  import { join } from 'node:path';
16
17
  import { ensureOwnerOnlyDir } from './os.js';
17
18
  /**
@@ -22,23 +23,6 @@ import { ensureOwnerOnlyDir } from './os.js';
22
23
  export const COMPLETION_INLINE_BUDGET_DEFAULT = 32_000;
23
24
  export const COMPLETION_INLINE_BUDGET_MAX = 160_000;
24
25
  const COMPLETION_INLINE_BUDGET_ENV = 'TASK_MAX_OUTPUT_LENGTH';
25
- /** Sanitize a name into a safe single path segment. */
26
- function safeSegment(name) {
27
- return name.replace(/[^A-Za-z0-9._-]/g, '_');
28
- }
29
- /**
30
- * Spill file for a teammate completion result that overflows the inline budget.
31
- * The host writes the full result here and inlines only this path into the
32
- * dispatcher or TeamLeader turn, so a large result never floods the target
33
- * agent's context.
34
- * `spillDir` is the owning dispatcher's completion spill dir, supplied by the
35
- * caller so a TeamLeader delivery target still spills under its operator
36
- * dispatcher, not its composite runtime id. `source` and `id` are sanitized for
37
- * filename safety; the id is unique per completion (teammate name + turn id).
38
- */
39
- export function teamMateCompletionOutputPath(spillDir, source, id) {
40
- return join(spillDir, `teammate-${safeSegment(source)}-${safeSegment(id)}.output`);
41
- }
42
26
  /**
43
27
  * Resolve the effective inline budget from the environment, in the spirit of
44
28
  * native `validateBoundedIntEnvVar`: unset/blank or non-positive falls back to
@@ -71,14 +55,31 @@ export async function resolveCompletionBody(completion, spillDir) {
71
55
  if (result.length <= budget) {
72
56
  return { kind: 'inline', text: result };
73
57
  }
74
- const path = teamMateCompletionOutputPath(spillDir, completion.source, completion.id);
75
58
  // Owner-only spill dir: the cache may hold full teammate output. Use the
76
59
  // shared helper so a pre-existing permissive dir is tightened and a symlink /
77
60
  // foreign-uid dir is rejected (issue #182 — same invariant as the run tree),
78
61
  // then a 0600 file + explicit chmod (writeFile's `mode` honors the umask).
79
62
  await ensureOwnerOnlyDir(spillDir);
80
- await writeFile(path, result, { mode: 0o600 });
81
- await chmod(path, 0o600);
82
- return { kind: 'spilled', path };
63
+ for (let attempt = 0; attempt < 8; attempt += 1) {
64
+ // The storage key is deliberately opaque. Business labels and provider
65
+ // identifiers never become filenames or surrogate Turn identifiers.
66
+ const path = join(spillDir, `completion-${randomUUID()}.output`);
67
+ try {
68
+ const handle = await open(path, 'wx', 0o600);
69
+ try {
70
+ await handle.writeFile(result, 'utf8');
71
+ await handle.chmod(0o600);
72
+ }
73
+ finally {
74
+ await handle.close();
75
+ }
76
+ return { kind: 'spilled', path };
77
+ }
78
+ catch (error) {
79
+ if (error.code !== 'EEXIST')
80
+ throw error;
81
+ }
82
+ }
83
+ throw new Error('failed to allocate an exclusive completion spill file');
83
84
  }
84
85
  //# sourceMappingURL=completion-body.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"completion-body.js","sourceRoot":"","sources":["../src/completion-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AACvD,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC;AACpD,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAY9D,uDAAuD;AACvD,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAgB,EAChB,MAAc,EACd,EAAU;IAEV,OAAO,IAAI,CAAC,QAAQ,EAAE,YAAY,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAyB,UAAU,CAAC,OAAO,CAAC,GAAG;IAE/C,MAAM,GAAG,GAAG,GAAG,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAA+B,EAC/B,QAAgB;IAEhB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,IAAI,GAAG,4BAA4B,CACvC,QAAQ,EACR,UAAU,CAAC,MAAM,EACjB,UAAU,CAAC,EAAE,CACd,CAAC;IACF,yEAAyE;IACzE,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"completion-body.js","sourceRoot":"","sources":["../src/completion-body.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AACvD,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC;AACpD,MAAM,4BAA4B,GAAG,wBAAwB,CAAC;AAS9D;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAyB,UAAU,CAAC,OAAO,CAAC,GAAG;IAE/C,MAAM,GAAG,GAAG,GAAG,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,OAAO,gCAAgC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAA+B,EAC/B,QAAgB;IAEhB,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IACD,yEAAyE;IACzE,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,UAAU,EAAE,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;AAC3E,CAAC"}
package/dist/index.d.ts CHANGED
@@ -5,5 +5,6 @@ export * from './completion-body.js';
5
5
  export * from './socket-budget.js';
6
6
  export * from './turn-render.js';
7
7
  export * from './supervised-child.js';
8
+ export * from './transcript.js';
8
9
  export * from './unsupported-feature.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -5,5 +5,6 @@ export * from './completion-body.js';
5
5
  export * from './socket-budget.js';
6
6
  export * from './turn-render.js';
7
7
  export * from './supervised-child.js';
8
+ export * from './transcript.js';
8
9
  export * from './unsupported-feature.js';
9
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
package/dist/os.d.ts CHANGED
@@ -9,7 +9,9 @@
9
9
  */
10
10
  /** True when `pid` names a live process (EPERM counts as alive). */
11
11
  export declare function isProcessAlive(pid: number): boolean;
12
- /** Signal an entire process group; ESRCH/EPERM are swallowed. */
12
+ /** True when a detached process group still exists (EPERM counts as alive). */
13
+ export declare function isProcessGroupAlive(pgid: number): boolean;
14
+ /** Signal an entire process group; only an already-absent group is ignored. */
13
15
  export declare function killProcessGroup(pgid: number, signal: NodeJS.Signals | number): void;
14
16
  export interface EnsureOwnerOnlyDirOptions {
15
17
  /** Current-user uid probe override (tests). */
package/dist/os.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"os.d.ts","sourceRoot":"","sources":["../src/os.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAED,iEAAiE;AACjE,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAC9B,IAAI,CASN;AAED,MAAM,WAAW,yBAAyB;IACxC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
1
+ {"version":3,"file":"os.d.ts","sourceRoot":"","sources":["../src/os.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASnD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAWzD;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,GAC9B,IAAI,CASN;AAED,MAAM,WAAW,yBAAyB;IACxC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
package/dist/os.js CHANGED
@@ -21,7 +21,24 @@ export function isProcessAlive(pid) {
21
21
  return errno === 'EPERM';
22
22
  }
23
23
  }
24
- /** Signal an entire process group; ESRCH/EPERM are swallowed. */
24
+ /** True when a detached process group still exists (EPERM counts as alive). */
25
+ export function isProcessGroupAlive(pgid) {
26
+ if (!Number.isFinite(pgid) || pgid <= 0)
27
+ return false;
28
+ try {
29
+ process.kill(-pgid, 0);
30
+ return true;
31
+ }
32
+ catch (error) {
33
+ const errno = error.code;
34
+ if (errno === 'ESRCH')
35
+ return false;
36
+ if (errno === 'EPERM')
37
+ return true;
38
+ throw error;
39
+ }
40
+ }
41
+ /** Signal an entire process group; only an already-absent group is ignored. */
25
42
  export function killProcessGroup(pgid, signal) {
26
43
  if (!Number.isFinite(pgid) || pgid <= 0)
27
44
  return;
@@ -30,7 +47,7 @@ export function killProcessGroup(pgid, signal) {
30
47
  }
31
48
  catch (e) {
32
49
  const errno = e.code;
33
- if (errno === 'ESRCH' || errno === 'EPERM')
50
+ if (errno === 'ESRCH')
34
51
  return;
35
52
  throw e;
36
53
  }
package/dist/os.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"os.js","sourceRoot":"","sources":["../src/os.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE7E,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAI,CAA2B,CAAC,IAAI,CAAC;QAChD,OAAO,KAAK,KAAK,OAAO,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,MAA+B;IAE/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO;IAChD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAI,CAA2B,CAAC,IAAI,CAAC;QAChD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO;QACnD,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAOD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,UAAqC,EAAE;IAEvC,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,yCAAyC,CAC3F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,6CAA6C,IAAI,wBAAwB,IAAI,CAAC,GAAG,IAAI;YACnF,6BAA6B,MAAM,EAAE,GAAG,CAC3C,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;YAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"os.js","sourceRoot":"","sources":["../src/os.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"supervised-child.d.ts","sourceRoot":"","sources":["../src/supervised-child.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;CAC1C,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;CACzC,CAAC;AAEN,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;AACvD,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAE3C;;;;GAIG;AACH,qBAAa,eAAe;IASxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;gBAGtC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,sBAA2B;IAGvD,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI;IAKxC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAKpC,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAuCpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKP,MAAM;IAmBpB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,WAAW;CASpB"}
1
+ {"version":3,"file":"supervised-child.d.ts","sourceRoot":"","sources":["../src/supervised-child.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;CAC1C,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;CACzC,CAAC;AAEN,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;AACvD,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;AAE3C;;;;GAIG;AACH,qBAAa,eAAe;IASxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAT1B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,IAAI,CAAuB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;gBAGtC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,GAAE,sBAA2B;IAGvD,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI;IAKxC,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAKpC,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC;IAuCpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUP,MAAM;IA8BpB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,WAAW;CASpB"}
@@ -1,5 +1,5 @@
1
1
  import { fork, spawn, } from 'node:child_process';
2
- import { isProcessAlive, killProcessGroup } from './os.js';
2
+ import { isProcessGroupAlive, killProcessGroup } from './os.js';
3
3
  /**
4
4
  * Neutral owner for one detached child process group. Domain wrappers keep
5
5
  * readiness probes, transports, and cleanup policy; this class owns only
@@ -69,27 +69,34 @@ export class SupervisedChild {
69
69
  return child;
70
70
  }
71
71
  stop() {
72
- this.stopPromise ??= this.doStop();
73
- return this.stopPromise;
72
+ if (this.stopPromise !== null)
73
+ return this.stopPromise;
74
+ const attempt = this.doStop();
75
+ this.stopPromise = attempt;
76
+ void attempt.catch(() => {
77
+ if (this.stopPromise === attempt)
78
+ this.stopPromise = null;
79
+ });
80
+ return attempt;
74
81
  }
75
82
  async doStop() {
76
83
  this.stopping = true;
77
84
  const pid = this.pid_;
78
85
  if (pid !== null) {
79
- if (isProcessAlive(pid)) {
86
+ if (isProcessGroupAlive(pid)) {
80
87
  killProcessGroup(pid, 'SIGTERM');
81
- const deadline = Date.now() + (this.options.stopTimeoutMs ?? 1_000);
82
- const pollIntervalMs = this.options.pollIntervalMs ?? 25;
83
- while (Date.now() < deadline) {
84
- if (!isProcessAlive(pid))
85
- break;
86
- await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
87
- }
88
+ await waitForProcessGroupExit(pid, this.options.stopTimeoutMs ?? 1_000, this.options.pollIntervalMs ?? 25);
89
+ }
90
+ if (isProcessGroupAlive(pid)) {
91
+ killProcessGroup(pid, 'SIGKILL');
92
+ await waitForProcessGroupExit(pid, this.options.stopTimeoutMs ?? 1_000, this.options.pollIntervalMs ?? 25);
93
+ }
94
+ if (isProcessGroupAlive(pid)) {
95
+ throw new Error(`SupervisedChild.stop: process group ${pid} still exists after SIGKILL`);
88
96
  }
89
- // Always signal the group: a grandchild may outlive an exited leader.
90
- killProcessGroup(pid, 'SIGKILL');
91
97
  }
92
98
  this.child_ = null;
99
+ this.pid_ = null;
93
100
  }
94
101
  notifyExit(exit) {
95
102
  for (const handler of this.exitHandlers) {
@@ -112,6 +119,12 @@ export class SupervisedChild {
112
119
  }
113
120
  }
114
121
  }
122
+ async function waitForProcessGroupExit(pgid, timeoutMs, pollIntervalMs) {
123
+ const deadline = Date.now() + Math.max(0, timeoutMs);
124
+ while (isProcessGroupAlive(pgid) && Date.now() < deadline) {
125
+ await new Promise((resolve) => setTimeout(resolve, Math.max(1, pollIntervalMs)));
126
+ }
127
+ }
115
128
  function launchChild(launch) {
116
129
  if (launch.kind === 'fork') {
117
130
  return fork(launch.modulePath, [...(launch.args ?? [])], {
@@ -1 +1 @@
1
- {"version":3,"file":"supervised-child.js","sourceRoot":"","sources":["../src/supervised-child.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"supervised-child.js","sourceRoot":"","sources":["../src/supervised-child.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import type { AgentRuntimeTranscriptTurn } from '@excitedjs/dreamux-types';
3
+ export declare const TRANSCRIPT_MESSAGE_MAX_CHARS = 16384;
4
+ export declare const TRANSCRIPT_TOOL_NAME_MAX_CHARS = 256;
5
+ export declare const TRANSCRIPT_TOOL_VALUE_MAX_CHARS = 4096;
6
+ export declare const TRANSCRIPT_BLOCKS_PER_TURN_MAX = 64;
7
+ export declare const TRANSCRIPT_TURNS_MAX = 50;
8
+ export declare const TRANSCRIPT_DISCOVERY_MAX_ENTRIES = 20000;
9
+ export declare const TRANSCRIPT_DISCOVERY_MAX_ELAPSED_MS = 2000;
10
+ export interface TranscriptBudgetResult {
11
+ turnsNewestFirst: AgentRuntimeTranscriptTurn[];
12
+ consumed: number;
13
+ truncated: boolean;
14
+ }
15
+ export interface TranscriptScanBudget {
16
+ inspect(entries?: number): void;
17
+ }
18
+ export interface TranscriptPositionalReader {
19
+ read(buffer: Buffer, offset: number, length: number, position: number): Promise<{
20
+ bytesRead: number;
21
+ }>;
22
+ }
23
+ export declare function transcriptDigest(value: string | Uint8Array): string;
24
+ export declare function isTranscriptDigest(value: unknown): value is string;
25
+ export declare function isTranscriptTurnCount(value: unknown): value is number;
26
+ export declare function createTranscriptScanBudget(input: {
27
+ maxEntries?: number;
28
+ maxElapsedMs?: number;
29
+ now?: () => number;
30
+ limitError: () => Error;
31
+ }): TranscriptScanBudget;
32
+ export declare function readTranscriptBytesAt(reader: TranscriptPositionalReader, position: number, length: number, options?: {
33
+ maxChunkBytes?: number;
34
+ }): Promise<Buffer>;
35
+ export declare function isPathWithin(root: string, candidate: string): boolean;
36
+ export declare function renderTranscriptValue(value: unknown): string | null;
37
+ export declare function boundTranscriptTurn(turn: AgentRuntimeTranscriptTurn): {
38
+ turn: AgentRuntimeTranscriptTurn;
39
+ truncated: boolean;
40
+ };
41
+ /**
42
+ * Apply the fixed serialized `turns` budget to candidates ordered newest first.
43
+ * The newest candidate is always consumed and deterministically clipped when
44
+ * necessary; subsequent older candidates are consumed only whole.
45
+ */
46
+ export declare function budgetTranscriptTurns(candidatesNewestFirst: readonly AgentRuntimeTranscriptTurn[], budgetBytes: number): TranscriptBudgetResult;
47
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,OAAO,KAAK,EAEV,0BAA0B,EAC3B,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,4BAA4B,QAAS,CAAC;AACnD,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,+BAA+B,OAAQ,CAAC;AACrD,eAAO,MAAM,8BAA8B,KAAK,CAAC;AACjD,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,mCAAmC,OAAQ,CAAC;AAMzD,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,0BAA0B,EAAE,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CACF,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAEnE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAElE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAOrE;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,KAAK,CAAC;CACzB,GAAG,oBAAoB,CAgBvB;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,0BAA0B,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACvC,OAAO,CAAC,MAAM,CAAC,CAmCjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAMrE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,0BAA0B,GAC/B;IAAE,IAAI,EAAE,0BAA0B,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAgD1D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,qBAAqB,EAAE,SAAS,0BAA0B,EAAE,EAC5D,WAAW,EAAE,MAAM,GAClB,sBAAsB,CAyBxB"}
@@ -0,0 +1,246 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import { createHash } from 'node:crypto';
3
+ import { isAbsolute, relative, sep } from 'node:path';
4
+ export const TRANSCRIPT_MESSAGE_MAX_CHARS = 16_384;
5
+ export const TRANSCRIPT_TOOL_NAME_MAX_CHARS = 256;
6
+ export const TRANSCRIPT_TOOL_VALUE_MAX_CHARS = 4_096;
7
+ export const TRANSCRIPT_BLOCKS_PER_TURN_MAX = 64;
8
+ export const TRANSCRIPT_TURNS_MAX = 50;
9
+ export const TRANSCRIPT_DISCOVERY_MAX_ENTRIES = 20_000;
10
+ export const TRANSCRIPT_DISCOVERY_MAX_ELAPSED_MS = 2_000;
11
+ const REDACTED = '[REDACTED]';
12
+ const SECRET_FIELD = /(?:^|_)(?:api[_-]?key|authorization|cookie|credential|password|private[_-]?key|secret|session[_-]?token|token)(?:$|_)/i;
13
+ export function transcriptDigest(value) {
14
+ return createHash('sha256').update(value).digest('base64url');
15
+ }
16
+ export function isTranscriptDigest(value) {
17
+ return typeof value === 'string' && /^[A-Za-z0-9_-]{43}$/.test(value);
18
+ }
19
+ export function isTranscriptTurnCount(value) {
20
+ return (typeof value === 'number' &&
21
+ Number.isInteger(value) &&
22
+ value >= 1 &&
23
+ value <= TRANSCRIPT_TURNS_MAX);
24
+ }
25
+ export function createTranscriptScanBudget(input) {
26
+ const maxEntries = input.maxEntries ?? TRANSCRIPT_DISCOVERY_MAX_ENTRIES;
27
+ const now = input.now ?? Date.now;
28
+ const deadline = now() +
29
+ (input.maxElapsedMs ?? TRANSCRIPT_DISCOVERY_MAX_ELAPSED_MS);
30
+ let inspected = 0;
31
+ return {
32
+ inspect(entries = 1) {
33
+ inspected += entries;
34
+ if (inspected > maxEntries || now() > deadline) {
35
+ throw input.limitError();
36
+ }
37
+ },
38
+ };
39
+ }
40
+ export async function readTranscriptBytesAt(reader, position, length, options = {}) {
41
+ if (!Number.isSafeInteger(position) ||
42
+ position < 0 ||
43
+ !Number.isSafeInteger(length) ||
44
+ length < 0) {
45
+ throw new RangeError('transcript positional read requires non-negative integers');
46
+ }
47
+ const maxChunkBytes = options.maxChunkBytes ?? length;
48
+ if (!Number.isSafeInteger(maxChunkBytes) || maxChunkBytes <= 0) {
49
+ if (length === 0)
50
+ return Buffer.alloc(0);
51
+ throw new RangeError('transcript positional read chunk size must be positive');
52
+ }
53
+ const bytes = Buffer.alloc(length);
54
+ let offset = 0;
55
+ while (offset < length) {
56
+ const requested = Math.min(length - offset, maxChunkBytes);
57
+ const read = await reader.read(bytes, offset, requested, position + offset);
58
+ if (!Number.isSafeInteger(read.bytesRead) ||
59
+ read.bytesRead < 0 ||
60
+ read.bytesRead > requested) {
61
+ throw new Error('transcript positional reader returned an invalid byte count');
62
+ }
63
+ if (read.bytesRead === 0)
64
+ break;
65
+ offset += read.bytesRead;
66
+ }
67
+ return bytes.subarray(0, offset);
68
+ }
69
+ export function isPathWithin(root, candidate) {
70
+ const child = relative(root, candidate);
71
+ return (child === '' ||
72
+ (!child.startsWith(`..${sep}`) && child !== '..' && !isAbsolute(child)));
73
+ }
74
+ export function renderTranscriptValue(value) {
75
+ if (value === null || value === undefined)
76
+ return null;
77
+ if (typeof value === 'string')
78
+ return value;
79
+ return JSON.stringify(sortAndRedact(value));
80
+ }
81
+ export function boundTranscriptTurn(turn) {
82
+ let truncated = turn.blocks.length > TRANSCRIPT_BLOCKS_PER_TURN_MAX;
83
+ const blocks = turn.blocks
84
+ .slice(0, TRANSCRIPT_BLOCKS_PER_TURN_MAX)
85
+ .map((block) => {
86
+ if (block.kind === 'message') {
87
+ const text = clipCharacters(block.text, TRANSCRIPT_MESSAGE_MAX_CHARS);
88
+ truncated ||= text.truncated || block.truncated;
89
+ return {
90
+ kind: 'message',
91
+ role: block.role,
92
+ text: text.value,
93
+ truncated: block.truncated || text.truncated,
94
+ };
95
+ }
96
+ const input = block.input === null
97
+ ? null
98
+ : clipCharacters(block.input, TRANSCRIPT_TOOL_VALUE_MAX_CHARS);
99
+ const output = block.output === null
100
+ ? null
101
+ : clipCharacters(block.output, TRANSCRIPT_TOOL_VALUE_MAX_CHARS);
102
+ const name = clipCharacters(block.name, TRANSCRIPT_TOOL_NAME_MAX_CHARS);
103
+ truncated ||=
104
+ name.truncated ||
105
+ block.inputTruncated ||
106
+ block.outputTruncated ||
107
+ input?.truncated === true ||
108
+ output?.truncated === true;
109
+ return {
110
+ kind: 'tool',
111
+ name: name.value,
112
+ input: input?.value ?? null,
113
+ output: output?.value ?? null,
114
+ status: block.status,
115
+ inputTruncated: block.inputTruncated || input?.truncated === true,
116
+ outputTruncated: block.outputTruncated || output?.truncated === true,
117
+ };
118
+ });
119
+ return {
120
+ turn: {
121
+ startedAt: turn.startedAt,
122
+ endedAt: turn.endedAt,
123
+ blocks,
124
+ },
125
+ truncated,
126
+ };
127
+ }
128
+ /**
129
+ * Apply the fixed serialized `turns` budget to candidates ordered newest first.
130
+ * The newest candidate is always consumed and deterministically clipped when
131
+ * necessary; subsequent older candidates are consumed only whole.
132
+ */
133
+ export function budgetTranscriptTurns(candidatesNewestFirst, budgetBytes) {
134
+ if (!Number.isInteger(budgetBytes) || budgetBytes < 2) {
135
+ throw new Error('transcript output budget must be an integer of at least 2 bytes');
136
+ }
137
+ const turnsNewestFirst = [];
138
+ let truncated = false;
139
+ let consumed = 0;
140
+ for (const candidate of candidatesNewestFirst) {
141
+ const bounded = boundTranscriptTurn(candidate);
142
+ const next = [...turnsNewestFirst, bounded.turn];
143
+ if (serializedTurnsBytes(next) <= budgetBytes) {
144
+ turnsNewestFirst.push(bounded.turn);
145
+ consumed += 1;
146
+ truncated ||= bounded.truncated;
147
+ continue;
148
+ }
149
+ if (turnsNewestFirst.length > 0)
150
+ break;
151
+ turnsNewestFirst.push(clipTurnToBudget(bounded.turn, budgetBytes));
152
+ consumed += 1;
153
+ truncated = true;
154
+ break;
155
+ }
156
+ return { turnsNewestFirst, consumed, truncated };
157
+ }
158
+ function clipTurnToBudget(turn, budgetBytes) {
159
+ const mutable = turn.blocks.map((block) => ({
160
+ ...block,
161
+ }));
162
+ const result = () => ({
163
+ startedAt: turn.startedAt,
164
+ endedAt: turn.endedAt,
165
+ blocks: mutable,
166
+ });
167
+ while (mutable.length > 1 && serializedTurnsBytes([result()]) > budgetBytes) {
168
+ mutable.pop();
169
+ }
170
+ if (serializedTurnsBytes([result()]) <= budgetBytes)
171
+ return result();
172
+ const block = mutable[0];
173
+ if (block === undefined)
174
+ return result();
175
+ if (block.kind === 'message') {
176
+ block.text = clipStringToSerializedBudget(block.text, budgetBytes, (value) => {
177
+ block.text = value;
178
+ block.truncated = true;
179
+ return serializedTurnsBytes([result()]);
180
+ });
181
+ block.truncated = true;
182
+ return result();
183
+ }
184
+ for (const field of ['output', 'input', 'name']) {
185
+ const value = block[field];
186
+ if (value === null || value === '')
187
+ continue;
188
+ const clipped = clipStringToSerializedBudget(value, budgetBytes, (nextValue) => {
189
+ block[field] = nextValue;
190
+ if (field === 'input')
191
+ block.inputTruncated = true;
192
+ if (field === 'output')
193
+ block.outputTruncated = true;
194
+ return serializedTurnsBytes([result()]);
195
+ });
196
+ block[field] = clipped;
197
+ if (field === 'input')
198
+ block.inputTruncated = true;
199
+ if (field === 'output')
200
+ block.outputTruncated = true;
201
+ if (serializedTurnsBytes([result()]) <= budgetBytes)
202
+ return result();
203
+ }
204
+ return result();
205
+ }
206
+ function clipStringToSerializedBudget(input, budgetBytes, serializedBytes) {
207
+ let low = 0;
208
+ let high = [...input].length;
209
+ let best = '';
210
+ const characters = [...input];
211
+ while (low <= high) {
212
+ const middle = Math.floor((low + high) / 2);
213
+ const candidate = characters.slice(0, middle).join('');
214
+ if (serializedBytes(candidate) <= budgetBytes) {
215
+ best = candidate;
216
+ low = middle + 1;
217
+ }
218
+ else {
219
+ high = middle - 1;
220
+ }
221
+ }
222
+ return best;
223
+ }
224
+ function clipCharacters(input, limit) {
225
+ const characters = [...input];
226
+ return characters.length <= limit
227
+ ? { value: input, truncated: false }
228
+ : { value: characters.slice(0, limit).join(''), truncated: true };
229
+ }
230
+ function serializedTurnsBytes(turns) {
231
+ return Buffer.byteLength(JSON.stringify(turns), 'utf8');
232
+ }
233
+ function sortAndRedact(value, key) {
234
+ if (key !== undefined && SECRET_FIELD.test(key))
235
+ return REDACTED;
236
+ if (Array.isArray(value)) {
237
+ return value.map((entry) => sortAndRedact(entry));
238
+ }
239
+ if (value === null || typeof value !== 'object')
240
+ return value;
241
+ const record = value;
242
+ return Object.fromEntries(Object.keys(record)
243
+ .sort()
244
+ .map((entry) => [entry, sortAndRedact(record[entry], entry)]));
245
+ }
246
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@excitedjs/dreamux-utils",
3
- "version": "0.4.0-beta.168",
3
+ "version": "0.4.0",
4
4
  "description": "Pure shared utilities for Dreamux providers and host: neutral config-validation primitives, OS/filesystem helpers, completion-body resolution, and inbound-turn render helpers. Depends on @excitedjs/dreamux-types only, never on @excitedjs/dreamux core (issue excitedjs/dreamux#209).",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -27,7 +27,7 @@
27
27
  "LICENSE"
28
28
  ],
29
29
  "dependencies": {
30
- "@excitedjs/dreamux-types": "1.0.0-beta.168"
30
+ "@excitedjs/dreamux-types": "0.8.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^22.10.0",