@duetso/agent 0.1.133 → 0.1.136
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/README.md +2 -0
- package/dist/package.json +1 -1
- package/dist/src/cli/help.d.ts +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +41 -6
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/memory-reflect.d.ts +13 -0
- package/dist/src/cli/memory-reflect.d.ts.map +1 -0
- package/dist/src/cli/memory-reflect.js +165 -0
- package/dist/src/cli/memory-reflect.js.map +1 -0
- package/dist/src/cli/memory.d.ts.map +1 -1
- package/dist/src/cli/memory.js +8 -0
- package/dist/src/cli/memory.js.map +1 -1
- package/dist/src/cli/skills.d.ts +8 -4
- package/dist/src/cli/skills.d.ts.map +1 -1
- package/dist/src/cli/skills.js +21 -13
- package/dist/src/cli/skills.js.map +1 -1
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +1 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory/observational.d.ts +187 -0
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +248 -5
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/memory/storage.d.ts +16 -0
- package/dist/src/memory/storage.d.ts.map +1 -1
- package/dist/src/memory/storage.js +44 -0
- package/dist/src/memory/storage.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +1 -14
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/autocomplete.d.ts +0 -9
- package/dist/src/tui/autocomplete.d.ts.map +1 -1
- package/dist/src/tui/autocomplete.js +0 -13
- package/dist/src/tui/autocomplete.js.map +1 -1
- package/dist/src/tui/boot-screen.d.ts.map +1 -1
- package/dist/src/tui/boot-screen.js +0 -5
- package/dist/src/tui/boot-screen.js.map +1 -1
- package/dist/src/turn-runner/built-in-skills.d.ts +23 -0
- package/dist/src/turn-runner/built-in-skills.d.ts.map +1 -0
- package/dist/src/turn-runner/built-in-skills.js +75 -0
- package/dist/src/turn-runner/built-in-skills.js.map +1 -0
- package/dist/src/turn-runner/skills.d.ts +1 -1
- package/dist/src/turn-runner/skills.d.ts.map +1 -1
- package/dist/src/turn-runner/skills.js +16 -2
- package/dist/src/turn-runner/skills.js.map +1 -1
- package/dist/src/turn-runner/state-compaction.d.ts +49 -0
- package/dist/src/turn-runner/state-compaction.d.ts.map +1 -0
- package/dist/src/turn-runner/state-compaction.js +75 -0
- package/dist/src/turn-runner/state-compaction.js.map +1 -0
- package/dist/src/turn-runner/turn-runner.d.ts +8 -0
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +30 -1
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/types/config.d.ts +19 -0
- package/dist/src/types/config.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/src/tui/relay-command.d.ts +0 -14
- package/dist/src/tui/relay-command.d.ts.map +0 -1
- package/dist/src/tui/relay-command.js +0 -58
- package/dist/src/tui/relay-command.js.map +0 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import dedent from "dedent";
|
|
2
|
+
import { createSyntheticSourceInfo } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
/**
|
|
4
|
+
* Synthetic marker prefix for built-in skill `filePath`/`baseDir`. Real
|
|
5
|
+
* skills live under a discoverable `baseDir` on disk; built-ins ship
|
|
6
|
+
* inside the package, so the prefix is a virtual sentinel that keeps
|
|
7
|
+
* their paths from colliding with anything on the filesystem and gives
|
|
8
|
+
* humans a clear hint when they appear in logs or `duet skills` output.
|
|
9
|
+
* Built-in detection itself goes through the `BUILT_IN_BY_PATH` map, not
|
|
10
|
+
* a prefix match.
|
|
11
|
+
*/
|
|
12
|
+
const BUILTIN_PATH_PREFIX = "<duet-builtin>";
|
|
13
|
+
/**
|
|
14
|
+
* Body of the built-in `/relay` skill. Renders into the prompt verbatim
|
|
15
|
+
* inside the standard `<skill>` wrapper when the user types `/relay`
|
|
16
|
+
* anywhere in their message.
|
|
17
|
+
*/
|
|
18
|
+
const RELAY_INSTRUCTIONS = dedent `
|
|
19
|
+
The user requested relay mode for this prompt. Strongly prefer the
|
|
20
|
+
state-machine tools (\`create_state_machine_definition\` or
|
|
21
|
+
\`select_state_machine_state\`) over handling the work inline.
|
|
22
|
+
|
|
23
|
+
- If no state machine is active, create one with agent/script/poll/timer/terminal
|
|
24
|
+
states sized to the request.
|
|
25
|
+
- If a state machine is already active, select the next state instead of
|
|
26
|
+
replying directly.
|
|
27
|
+
- Only fall back to a plain answer when the request is genuinely a
|
|
28
|
+
one-shot question that cannot be expressed as a state.
|
|
29
|
+
`;
|
|
30
|
+
const RELAY_DESCRIPTION = "Inline anywhere in a prompt to nudge the agent into state-machine (relay) mode.";
|
|
31
|
+
function buildBuiltIn(name, description, instructions) {
|
|
32
|
+
const baseDir = `${BUILTIN_PATH_PREFIX}/${name}`;
|
|
33
|
+
const filePath = `${baseDir}/SKILL.md`;
|
|
34
|
+
return {
|
|
35
|
+
skill: {
|
|
36
|
+
name,
|
|
37
|
+
description,
|
|
38
|
+
filePath,
|
|
39
|
+
baseDir,
|
|
40
|
+
sourceInfo: createSyntheticSourceInfo(filePath, {
|
|
41
|
+
source: "duet:builtin",
|
|
42
|
+
scope: "user",
|
|
43
|
+
origin: "top-level",
|
|
44
|
+
baseDir,
|
|
45
|
+
}),
|
|
46
|
+
disableModelInvocation: false,
|
|
47
|
+
},
|
|
48
|
+
instructions,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Registry of built-in skills shipped with the turn runner. They appear
|
|
53
|
+
* in skill discovery alongside user/project skills and can be shadowed
|
|
54
|
+
* by a same-named skill installed under any discovery root.
|
|
55
|
+
*/
|
|
56
|
+
export const BUILT_IN_SKILLS = [
|
|
57
|
+
buildBuiltIn("relay", RELAY_DESCRIPTION, RELAY_INSTRUCTIONS),
|
|
58
|
+
];
|
|
59
|
+
const BUILT_IN_BY_PATH = new Map(BUILT_IN_SKILLS.map(({ skill, instructions }) => [skill.filePath, instructions]));
|
|
60
|
+
/**
|
|
61
|
+
* Return the in-memory SKILL.md body for a built-in skill, or `undefined`
|
|
62
|
+
* when the skill is not a built-in (so the caller can fall back to
|
|
63
|
+
* reading from disk).
|
|
64
|
+
*/
|
|
65
|
+
export function getBuiltInSkillInstructions(filePath) {
|
|
66
|
+
return BUILT_IN_BY_PATH.get(filePath);
|
|
67
|
+
}
|
|
68
|
+
export function isBuiltInSkill(skill) {
|
|
69
|
+
return BUILT_IN_BY_PATH.has(skill.filePath);
|
|
70
|
+
}
|
|
71
|
+
/** Snapshot of built-in skills as plain `Skill` records for merging into discovery results. */
|
|
72
|
+
export function listBuiltInSkills() {
|
|
73
|
+
return BUILT_IN_SKILLS.map(({ skill }) => skill);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=built-in-skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-in-skills.js","sourceRoot":"","sources":["../../../src/turn-runner/built-in-skills.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAE5E;;;;;;;;GAQG;AACH,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAS7C;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,MAAM,CAAA;;;;;;;;;;;CAWhC,CAAC;AAEF,MAAM,iBAAiB,GACrB,iFAAiF,CAAC;AAEpF,SAAS,YAAY,CAAC,IAAY,EAAE,WAAmB,EAAE,YAAoB;IAC3E,MAAM,OAAO,GAAG,GAAG,mBAAmB,IAAI,IAAI,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,GAAG,OAAO,WAAW,CAAC;IACvC,OAAO;QACL,KAAK,EAAE;YACL,IAAI;YACJ,WAAW;YACX,QAAQ;YACR,OAAO;YACP,UAAU,EAAE,yBAAyB,CAAC,QAAQ,EAAE;gBAC9C,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,WAAW;gBACnB,OAAO;aACR,CAAC;YACF,sBAAsB,EAAE,KAAK;SAC9B;QACD,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAA4B;IACtD,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,CAAC;CAC7D,CAAC;AAEF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CACjF,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAY;IACzC,OAAO,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,iBAAiB;IAC/B,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -31,5 +31,5 @@ export declare function readSkillInstructions(skill: Skill): string;
|
|
|
31
31
|
* three roots (.duet, .agents, .claude) per scope, so we re-label here so
|
|
32
32
|
* downstream consumers get the truth instead of mostly-"temporary".
|
|
33
33
|
*/
|
|
34
|
-
export declare function resolveSkillScope(skill: Skill, cwd: string): "user" | "project" | "temporary";
|
|
34
|
+
export declare function resolveSkillScope(skill: Skill, cwd: string): "user" | "project" | "temporary" | "builtin";
|
|
35
35
|
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAOhE,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B;AAsED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,CAEvE;AAED,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,qBAAqB,GAAG,SAAS,EACnD,GAAG,EAAE,MAAM,GACV,sBAAsB,CAQxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAM3E;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,KAAK,EAAE,GAAG,KAAK,EAAE,CASjG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAQ1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,GACV,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAW9C"}
|
|
@@ -3,6 +3,7 @@ import { readFileSync } from "node:fs";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join, resolve, sep } from "node:path";
|
|
5
5
|
import { loadSkills } from "@earendil-works/pi-coding-agent";
|
|
6
|
+
import { getBuiltInSkillInstructions, isBuiltInSkill, listBuiltInSkills, } from "./built-in-skills.js";
|
|
6
7
|
const SKILL_SHELL_EXPANSION_PATTERN = /!`([\s\S]*?)`/g;
|
|
7
8
|
const DEFAULT_SKILL_DIR_NAMES = [".duet", ".agents", ".claude"];
|
|
8
9
|
function buildSkillDiscoveryOptions(options, cwd) {
|
|
@@ -69,8 +70,10 @@ export function prepareExplicitSkills(skills) {
|
|
|
69
70
|
}
|
|
70
71
|
export function loadDiscoveredSkills(discoveryOptions, cwd) {
|
|
71
72
|
const { skills, diagnostics } = loadSkills(buildSkillDiscoveryOptions(discoveryOptions, cwd));
|
|
73
|
+
// User/project skills win on name collisions, so built-ins are merged
|
|
74
|
+
// last and silently dropped when shadowed.
|
|
72
75
|
return {
|
|
73
|
-
skills: skills.map(expandSkillMetadata),
|
|
76
|
+
skills: mergeSkillsByName(skills.map(expandSkillMetadata), listBuiltInSkills()),
|
|
74
77
|
collisions: extractSkillCollisions(diagnostics),
|
|
75
78
|
};
|
|
76
79
|
}
|
|
@@ -81,7 +84,10 @@ export function loadDiscoveredSkills(discoveryOptions, cwd) {
|
|
|
81
84
|
*/
|
|
82
85
|
export function discoverInstalledSkills(cwd) {
|
|
83
86
|
const { skills, diagnostics } = loadSkills(buildSkillDiscoveryOptions(undefined, cwd));
|
|
84
|
-
return {
|
|
87
|
+
return {
|
|
88
|
+
skills: mergeSkillsByName(skills, listBuiltInSkills()),
|
|
89
|
+
collisions: extractSkillCollisions(diagnostics),
|
|
90
|
+
};
|
|
85
91
|
}
|
|
86
92
|
function extractSkillCollisions(diagnostics) {
|
|
87
93
|
const collisions = [];
|
|
@@ -109,6 +115,12 @@ export function mergeSkillsByName(primary, secondary) {
|
|
|
109
115
|
return merged;
|
|
110
116
|
}
|
|
111
117
|
export function readSkillInstructions(skill) {
|
|
118
|
+
// Built-in skills ship inline with the package, so they have no on-disk
|
|
119
|
+
// SKILL.md to read. Their bodies are static and never contain shell
|
|
120
|
+
// expansions, so we return them verbatim.
|
|
121
|
+
const builtIn = getBuiltInSkillInstructions(skill.filePath);
|
|
122
|
+
if (builtIn !== undefined)
|
|
123
|
+
return builtIn;
|
|
112
124
|
const content = readFileSync(skill.filePath, "utf-8");
|
|
113
125
|
return expandSkillShellCommands(content, skill.baseDir);
|
|
114
126
|
}
|
|
@@ -122,6 +134,8 @@ export function readSkillInstructions(skill) {
|
|
|
122
134
|
* downstream consumers get the truth instead of mostly-"temporary".
|
|
123
135
|
*/
|
|
124
136
|
export function resolveSkillScope(skill, cwd) {
|
|
137
|
+
if (isBuiltInSkill(skill))
|
|
138
|
+
return "builtin";
|
|
125
139
|
const baseDir = resolve(skill.baseDir);
|
|
126
140
|
const home = homedir();
|
|
127
141
|
for (const dirName of DEFAULT_SKILL_DIR_NAMES) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/turn-runner/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/turn-runner/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { TurnState } from "../types/protocol.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default ceiling for auto state compaction, in bytes of serialized
|
|
4
|
+
* `TurnState`. Long-lived sessions accumulate tool calls and tool results
|
|
5
|
+
* forever; without a cap, every emit and every disk persist eventually drags
|
|
6
|
+
* on a multi-hundred-MB transcript.
|
|
7
|
+
*
|
|
8
|
+
* 100 MB is enough headroom for hours of dense tool-call work, small enough
|
|
9
|
+
* that emit/persist stay snappy on commodity hardware. Adjustable per-runner
|
|
10
|
+
* via `TurnRunnerConfig.autoStateCompaction.maxBytes`.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_STATE_MAX_BYTES: number;
|
|
13
|
+
/**
|
|
14
|
+
* Even when a single message exceeds the cap, keep at least this many
|
|
15
|
+
* messages so the next turn still has anchor context. The runner can recover
|
|
16
|
+
* from a truncated transcript, but not from an empty one.
|
|
17
|
+
*/
|
|
18
|
+
export declare const MIN_RETAINED_MESSAGES = 1;
|
|
19
|
+
export interface AutoStateCompactionOptions {
|
|
20
|
+
/** Hard ceiling for `JSON.stringify(state).length`. Defaults to 100 MB. */
|
|
21
|
+
maxBytes?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface CompactionResult {
|
|
24
|
+
state: TurnState;
|
|
25
|
+
evicted: number;
|
|
26
|
+
/** Serialized byte length after compaction, for caller logging/metrics. */
|
|
27
|
+
bytes: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns a new `TurnState` whose serialized size is at most `maxBytes`,
|
|
31
|
+
* evicting the oldest agent messages first. After each eviction, drops any
|
|
32
|
+
* leading `toolResult` or `assistant` message until the head is `user` — the
|
|
33
|
+
* only role every provider accepts at position 0.
|
|
34
|
+
*
|
|
35
|
+
* Front-eviction preserves tool-call / tool-result pairing by construction:
|
|
36
|
+
* tool results always follow their assistant call in source order, so
|
|
37
|
+
* dropping an assistant naturally drops its trailing results through the
|
|
38
|
+
* head-fix loop.
|
|
39
|
+
*
|
|
40
|
+
* Preserves the original state reference (no mutation) and every non-message
|
|
41
|
+
* field on `TurnState` and `state.agent` (`status`, `mode`, `options`,
|
|
42
|
+
* `stateMachine`, `todos`, `followUpQueue`, `queuedCommands`).
|
|
43
|
+
*
|
|
44
|
+
* Stops once `messages.length <= MIN_RETAINED_MESSAGES`. If the remainder
|
|
45
|
+
* still exceeds `maxBytes`, the caller persists/emits the oversize state: a
|
|
46
|
+
* truncated but recoverable transcript beats a wedged session.
|
|
47
|
+
*/
|
|
48
|
+
export declare function compactTurnState(state: TurnState, options?: AutoStateCompactionOptions): CompactionResult;
|
|
49
|
+
//# sourceMappingURL=state-compaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-compaction.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/state-compaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,QAAoB,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;CACf;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,0BAA+B,GACvC,gBAAgB,CA8BlB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default ceiling for auto state compaction, in bytes of serialized
|
|
3
|
+
* `TurnState`. Long-lived sessions accumulate tool calls and tool results
|
|
4
|
+
* forever; without a cap, every emit and every disk persist eventually drags
|
|
5
|
+
* on a multi-hundred-MB transcript.
|
|
6
|
+
*
|
|
7
|
+
* 100 MB is enough headroom for hours of dense tool-call work, small enough
|
|
8
|
+
* that emit/persist stay snappy on commodity hardware. Adjustable per-runner
|
|
9
|
+
* via `TurnRunnerConfig.autoStateCompaction.maxBytes`.
|
|
10
|
+
*/
|
|
11
|
+
export const DEFAULT_STATE_MAX_BYTES = 100 * 1024 * 1024;
|
|
12
|
+
/**
|
|
13
|
+
* Even when a single message exceeds the cap, keep at least this many
|
|
14
|
+
* messages so the next turn still has anchor context. The runner can recover
|
|
15
|
+
* from a truncated transcript, but not from an empty one.
|
|
16
|
+
*/
|
|
17
|
+
export const MIN_RETAINED_MESSAGES = 1;
|
|
18
|
+
/**
|
|
19
|
+
* Anthropic and OpenAI both reject conversations whose first message isn't
|
|
20
|
+
* `user`. Front-eviction can leave a `toolResult` (orphaned without its
|
|
21
|
+
* assistant call) or an `assistant` message at the head, both of which wedge
|
|
22
|
+
* the next turn on resume.
|
|
23
|
+
*/
|
|
24
|
+
function isInvalidHead(message) {
|
|
25
|
+
if (!message || !("role" in message))
|
|
26
|
+
return false;
|
|
27
|
+
return message.role === "toolResult" || message.role === "assistant";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns a new `TurnState` whose serialized size is at most `maxBytes`,
|
|
31
|
+
* evicting the oldest agent messages first. After each eviction, drops any
|
|
32
|
+
* leading `toolResult` or `assistant` message until the head is `user` — the
|
|
33
|
+
* only role every provider accepts at position 0.
|
|
34
|
+
*
|
|
35
|
+
* Front-eviction preserves tool-call / tool-result pairing by construction:
|
|
36
|
+
* tool results always follow their assistant call in source order, so
|
|
37
|
+
* dropping an assistant naturally drops its trailing results through the
|
|
38
|
+
* head-fix loop.
|
|
39
|
+
*
|
|
40
|
+
* Preserves the original state reference (no mutation) and every non-message
|
|
41
|
+
* field on `TurnState` and `state.agent` (`status`, `mode`, `options`,
|
|
42
|
+
* `stateMachine`, `todos`, `followUpQueue`, `queuedCommands`).
|
|
43
|
+
*
|
|
44
|
+
* Stops once `messages.length <= MIN_RETAINED_MESSAGES`. If the remainder
|
|
45
|
+
* still exceeds `maxBytes`, the caller persists/emits the oversize state: a
|
|
46
|
+
* truncated but recoverable transcript beats a wedged session.
|
|
47
|
+
*/
|
|
48
|
+
export function compactTurnState(state, options = {}) {
|
|
49
|
+
const maxBytes = options.maxBytes ?? DEFAULT_STATE_MAX_BYTES;
|
|
50
|
+
let serialized = JSON.stringify(state);
|
|
51
|
+
if (serialized.length <= maxBytes) {
|
|
52
|
+
return { state, evicted: 0, bytes: serialized.length };
|
|
53
|
+
}
|
|
54
|
+
const messages = state.agent?.messages;
|
|
55
|
+
if (!messages || messages.length === 0) {
|
|
56
|
+
// Non-message bloat (e.g. enormous queuedCommands). Nothing this layer
|
|
57
|
+
// can do.
|
|
58
|
+
return { state, evicted: 0, bytes: serialized.length };
|
|
59
|
+
}
|
|
60
|
+
const trimmed = [...messages];
|
|
61
|
+
let current = state;
|
|
62
|
+
let evicted = 0;
|
|
63
|
+
while (serialized.length > maxBytes && trimmed.length > MIN_RETAINED_MESSAGES) {
|
|
64
|
+
trimmed.shift();
|
|
65
|
+
evicted += 1;
|
|
66
|
+
while (trimmed.length > MIN_RETAINED_MESSAGES && isInvalidHead(trimmed[0])) {
|
|
67
|
+
trimmed.shift();
|
|
68
|
+
evicted += 1;
|
|
69
|
+
}
|
|
70
|
+
current = { ...current, agent: { ...current.agent, messages: trimmed } };
|
|
71
|
+
serialized = JSON.stringify(current);
|
|
72
|
+
}
|
|
73
|
+
return { state: current, evicted, bytes: serialized.length };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=state-compaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-compaction.js","sourceRoot":"","sources":["../../../src/turn-runner/state-compaction.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAcvC;;;;;GAKG;AACH,SAAS,aAAa,CAAC,OAAiC;IACtD,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,UAAsC,EAAE;IAExC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,uBAAuB,CAAC;IAC7D,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;QAClC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;IACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,uEAAuE;QACvE,UAAU;QACV,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,OAAO,GAAmB,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,GAAc,KAAK,CAAC;IAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,UAAU,CAAC,MAAM,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC9E,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,CAAC;QACb,OAAO,OAAO,CAAC,MAAM,GAAG,qBAAqB,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,CAAC;QACf,CAAC;QACD,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;QACzE,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -205,6 +205,14 @@ export declare class TurnRunner {
|
|
|
205
205
|
private requireRunnerState;
|
|
206
206
|
getState(): TurnState | undefined;
|
|
207
207
|
private snapshotState;
|
|
208
|
+
/**
|
|
209
|
+
* Caps the size of every state that leaves the runner via emit/return/
|
|
210
|
+
* getState. Runs only when `TurnRunnerConfig.autoStateCompaction` is
|
|
211
|
+
* enabled — the single choke point ensures persistence layers, terminal
|
|
212
|
+
* payloads, and external observers all see the same trimmed state.
|
|
213
|
+
*/
|
|
214
|
+
private applyAutoStateCompaction;
|
|
215
|
+
private resolveCompactionOptions;
|
|
208
216
|
private setState;
|
|
209
217
|
private snapshotActiveAgentState;
|
|
210
218
|
private getFollowUpQueue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/turn-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,KAAK,EACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"turn-runner.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/turn-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { createEmbeddingClient } from "../memory/embedding.js";
|
|
|
9
9
|
import { loadStoredMemory } from "../memory/storage.js";
|
|
10
10
|
import { MemoryContextCache } from "../memory/store.js";
|
|
11
11
|
import { DEFAULT_CLI_MEMORY_MODEL, DEFAULT_CLI_MODEL, resolveModelName, } from "../model-resolution/resolver.js";
|
|
12
|
+
import { compactTurnState } from "./state-compaction.js";
|
|
12
13
|
import { agentEventToTurnEvents, agentMessageText } from "./agent-events.js";
|
|
13
14
|
import { createStateMachineSystemPromptLayer } from "./prompts.js";
|
|
14
15
|
import { applyEvictionHorizon, calculateWireTokens, createInitialHorizon, findEvictionHorizon, } from "./wire-shaping.js";
|
|
@@ -788,7 +789,7 @@ export class TurnRunner {
|
|
|
788
789
|
messages: this.parentAgent.state.messages,
|
|
789
790
|
}
|
|
790
791
|
: state.agent;
|
|
791
|
-
|
|
792
|
+
const snapshot = {
|
|
792
793
|
...state,
|
|
793
794
|
agent: parentAgent,
|
|
794
795
|
stateMachine: this.stateMachineController.getSession(),
|
|
@@ -796,6 +797,34 @@ export class TurnRunner {
|
|
|
796
797
|
followUpQueue: copyOptionalArray(state.followUpQueue ?? this.state?.followUpQueue),
|
|
797
798
|
queuedCommands: copyOptionalArray(state.queuedCommands ?? this.state?.queuedCommands),
|
|
798
799
|
};
|
|
800
|
+
return this.applyAutoStateCompaction(snapshot);
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Caps the size of every state that leaves the runner via emit/return/
|
|
804
|
+
* getState. Runs only when `TurnRunnerConfig.autoStateCompaction` is
|
|
805
|
+
* enabled — the single choke point ensures persistence layers, terminal
|
|
806
|
+
* payloads, and external observers all see the same trimmed state.
|
|
807
|
+
*/
|
|
808
|
+
applyAutoStateCompaction(state) {
|
|
809
|
+
const options = this.resolveCompactionOptions();
|
|
810
|
+
if (!options)
|
|
811
|
+
return state;
|
|
812
|
+
const { state: capped, evicted, bytes } = compactTurnState(state, options);
|
|
813
|
+
if (evicted > 0) {
|
|
814
|
+
console.warn(`[duet-agent] turn state exceeded auto-compaction ceiling; evicted ${evicted} oldest message(s) (now ${bytes} bytes) for session ${this.config.sessionId ?? "<unknown>"}`);
|
|
815
|
+
}
|
|
816
|
+
return capped;
|
|
817
|
+
}
|
|
818
|
+
resolveCompactionOptions() {
|
|
819
|
+
// On by default: `undefined` and `true` both enable the 100 MB ceiling so
|
|
820
|
+
// unbounded `state.json` growth can't wedge persistence. Only an explicit
|
|
821
|
+
// `false` disables compaction.
|
|
822
|
+
const setting = this.config.autoStateCompaction;
|
|
823
|
+
if (setting === false)
|
|
824
|
+
return undefined;
|
|
825
|
+
if (setting === undefined || setting === true)
|
|
826
|
+
return {};
|
|
827
|
+
return setting;
|
|
799
828
|
}
|
|
800
829
|
setState(state) {
|
|
801
830
|
this.state = this.snapshotState(state);
|