@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.
- package/dist/completion-body.d.ts +0 -13
- package/dist/completion-body.d.ts.map +1 -1
- package/dist/completion-body.js +23 -22
- package/dist/completion-body.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/os.d.ts +3 -1
- package/dist/os.d.ts.map +1 -1
- package/dist/os.js +19 -2
- package/dist/os.js.map +1 -1
- package/dist/supervised-child.d.ts.map +1 -1
- package/dist/supervised-child.js +26 -13
- package/dist/supervised-child.js.map +1 -1
- package/dist/transcript.d.ts +47 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +246 -0
- package/dist/transcript.js.map +1 -0
- package/package.json +2 -2
|
@@ -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;
|
|
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"}
|
package/dist/completion-body.js
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* no Dreamux layout contract — only the safe filename shape inside that
|
|
12
12
|
* directory.
|
|
13
13
|
*/
|
|
14
|
-
import {
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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,
|
|
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
package/dist/index.d.ts.map
CHANGED
|
@@ -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
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
|
-
/**
|
|
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,
|
|
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
|
-
/**
|
|
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'
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/supervised-child.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fork, spawn, } from 'node:child_process';
|
|
2
|
-
import {
|
|
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
|
|
73
|
-
|
|
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 (
|
|
86
|
+
if (isProcessGroupAlive(pid)) {
|
|
80
87
|
killProcessGroup(pid, 'SIGTERM');
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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":"AAAA,OAAO,EACL,IAAI,EACJ,KAAK,GAIN,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,
|
|
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
|
|
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": "
|
|
30
|
+
"@excitedjs/dreamux-types": "0.8.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^22.10.0",
|