@duetso/agent 0.1.20
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/LICENSE +189 -0
- package/README.md +315 -0
- package/dist/package.json +84 -0
- package/dist/src/cli.d.ts +23 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +754 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/core/serializer.d.ts +3 -0
- package/dist/src/core/serializer.d.ts.map +1 -0
- package/dist/src/core/serializer.js +22 -0
- package/dist/src/core/serializer.js.map +1 -0
- package/dist/src/core/structured-output.d.ts +13 -0
- package/dist/src/core/structured-output.d.ts.map +1 -0
- package/dist/src/core/structured-output.js +41 -0
- package/dist/src/core/structured-output.js.map +1 -0
- package/dist/src/guardrails/firewall.d.ts +7 -0
- package/dist/src/guardrails/firewall.d.ts.map +1 -0
- package/dist/src/guardrails/firewall.js +31 -0
- package/dist/src/guardrails/firewall.js.map +1 -0
- package/dist/src/guardrails/pattern.d.ts +13 -0
- package/dist/src/guardrails/pattern.d.ts.map +1 -0
- package/dist/src/guardrails/pattern.js +70 -0
- package/dist/src/guardrails/pattern.js.map +1 -0
- package/dist/src/guardrails/semantic.d.ts +14 -0
- package/dist/src/guardrails/semantic.d.ts.map +1 -0
- package/dist/src/guardrails/semantic.js +47 -0
- package/dist/src/guardrails/semantic.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/compact-json.d.ts +11 -0
- package/dist/src/lib/compact-json.d.ts.map +1 -0
- package/dist/src/lib/compact-json.js +36 -0
- package/dist/src/lib/compact-json.js.map +1 -0
- package/dist/src/lib/xml.d.ts +3 -0
- package/dist/src/lib/xml.d.ts.map +1 -0
- package/dist/src/lib/xml.js +9 -0
- package/dist/src/lib/xml.js.map +1 -0
- package/dist/src/memory/observation-groups.d.ts +15 -0
- package/dist/src/memory/observation-groups.d.ts.map +1 -0
- package/dist/src/memory/observation-groups.js +159 -0
- package/dist/src/memory/observation-groups.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts +27 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -0
- package/dist/src/memory/observational-prompts.js +237 -0
- package/dist/src/memory/observational-prompts.js.map +1 -0
- package/dist/src/memory/observational.d.ts +63 -0
- package/dist/src/memory/observational.d.ts.map +1 -0
- package/dist/src/memory/observational.js +605 -0
- package/dist/src/memory/observational.js.map +1 -0
- package/dist/src/memory/storage.d.ts +3 -0
- package/dist/src/memory/storage.d.ts.map +1 -0
- package/dist/src/memory/storage.js +127 -0
- package/dist/src/memory/storage.js.map +1 -0
- package/dist/src/memory/store.d.ts +13 -0
- package/dist/src/memory/store.d.ts.map +1 -0
- package/dist/src/memory/store.js +106 -0
- package/dist/src/memory/store.js.map +1 -0
- package/dist/src/model-resolution/duet-gateway.d.ts +35 -0
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -0
- package/dist/src/model-resolution/duet-gateway.js +56 -0
- package/dist/src/model-resolution/duet-gateway.js.map +1 -0
- package/dist/src/model-resolution/index.d.ts +31 -0
- package/dist/src/model-resolution/index.d.ts.map +1 -0
- package/dist/src/model-resolution/index.js +129 -0
- package/dist/src/model-resolution/index.js.map +1 -0
- package/dist/src/session/session-manager.d.ts +45 -0
- package/dist/src/session/session-manager.d.ts.map +1 -0
- package/dist/src/session/session-manager.js +94 -0
- package/dist/src/session/session-manager.js.map +1 -0
- package/dist/src/session/session.d.ts +113 -0
- package/dist/src/session/session.d.ts.map +1 -0
- package/dist/src/session/session.js +308 -0
- package/dist/src/session/session.js.map +1 -0
- package/dist/src/tui/app.d.ts +60 -0
- package/dist/src/tui/app.d.ts.map +1 -0
- package/dist/src/tui/app.js +742 -0
- package/dist/src/tui/app.js.map +1 -0
- package/dist/src/turn-runner/agent-events.d.ts +5 -0
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -0
- package/dist/src/turn-runner/agent-events.js +59 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -0
- package/dist/src/turn-runner/prompts.d.ts +13 -0
- package/dist/src/turn-runner/prompts.d.ts.map +1 -0
- package/dist/src/turn-runner/prompts.js +79 -0
- package/dist/src/turn-runner/prompts.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +32 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.js +168 -0
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -0
- package/dist/src/turn-runner/skill-context.d.ts +26 -0
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -0
- package/dist/src/turn-runner/skill-context.js +110 -0
- package/dist/src/turn-runner/skill-context.js.map +1 -0
- package/dist/src/turn-runner/skills.d.ts +35 -0
- package/dist/src/turn-runner/skills.d.ts.map +1 -0
- package/dist/src/turn-runner/skills.js +130 -0
- package/dist/src/turn-runner/skills.js.map +1 -0
- package/dist/src/turn-runner/state-machine-controller.d.ts +90 -0
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-controller.js +289 -0
- package/dist/src/turn-runner/state-machine-controller.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +27 -0
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-session.js +189 -0
- package/dist/src/turn-runner/state-machine-session.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +193 -0
- package/dist/src/turn-runner/tools.d.ts.map +1 -0
- package/dist/src/turn-runner/tools.js +509 -0
- package/dist/src/turn-runner/tools.js.map +1 -0
- package/dist/src/turn-runner/turn-runner.d.ts +160 -0
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -0
- package/dist/src/turn-runner/turn-runner.js +907 -0
- package/dist/src/turn-runner/turn-runner.js.map +1 -0
- package/dist/src/turn-runner/turn-state.d.ts +6 -0
- package/dist/src/turn-runner/turn-state.d.ts.map +1 -0
- package/dist/src/turn-runner/turn-state.js +32 -0
- package/dist/src/turn-runner/turn-state.js.map +1 -0
- package/dist/src/turn-runner/usage-accounting.d.ts +7 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -0
- package/dist/src/turn-runner/usage-accounting.js +49 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -0
- package/dist/src/types/agent.d.ts +15 -0
- package/dist/src/types/agent.d.ts.map +1 -0
- package/dist/src/types/agent.js +2 -0
- package/dist/src/types/agent.js.map +1 -0
- package/dist/src/types/config.d.ts +37 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +2 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/guardrails.d.ts +34 -0
- package/dist/src/types/guardrails.d.ts.map +1 -0
- package/dist/src/types/guardrails.js +2 -0
- package/dist/src/types/guardrails.js.map +1 -0
- package/dist/src/types/memory.d.ts +151 -0
- package/dist/src/types/memory.d.ts.map +1 -0
- package/dist/src/types/memory.js +2 -0
- package/dist/src/types/memory.js.map +1 -0
- package/dist/src/types/protocol.d.ts +426 -0
- package/dist/src/types/protocol.d.ts.map +1 -0
- package/dist/src/types/protocol.js +2 -0
- package/dist/src/types/protocol.js.map +1 -0
- package/dist/src/types/state-machine.d.ts +344 -0
- package/dist/src/types/state-machine.d.ts.map +1 -0
- package/dist/src/types/state-machine.js +2 -0
- package/dist/src/types/state-machine.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +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;AAEhE,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;AAuDD,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,CAMxB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAG3E;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,CAG1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,CAU7F"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join, resolve, sep } from "node:path";
|
|
5
|
+
import { loadSkills } from "@earendil-works/pi-coding-agent";
|
|
6
|
+
const SKILL_SHELL_EXPANSION_PATTERN = /!`([\s\S]*?)`/g;
|
|
7
|
+
const DEFAULT_SKILL_DIR_NAMES = [".duet", ".agents", ".claude"];
|
|
8
|
+
function buildSkillDiscoveryOptions(options, cwd) {
|
|
9
|
+
const effectiveCwd = options?.cwd ?? cwd;
|
|
10
|
+
const globalSkillRoots = options?.agentDir
|
|
11
|
+
? [options.agentDir]
|
|
12
|
+
: DEFAULT_SKILL_DIR_NAMES.map((dirName) => join(homedir(), dirName));
|
|
13
|
+
const includeDefaults = options?.includeDefaults ?? true;
|
|
14
|
+
return {
|
|
15
|
+
cwd: effectiveCwd,
|
|
16
|
+
agentDir: globalSkillRoots[0],
|
|
17
|
+
includeDefaults: false,
|
|
18
|
+
skillPaths: uniquePaths([
|
|
19
|
+
...(includeDefaults ? defaultSkillPaths(globalSkillRoots, effectiveCwd) : []),
|
|
20
|
+
...(options?.skillPaths ?? []),
|
|
21
|
+
]),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function defaultSkillPaths(globalSkillRoots, cwd) {
|
|
25
|
+
// Project before global so a project-local skill can shadow a same-named
|
|
26
|
+
// global one. Within each scope, .duet > .agents > .claude (first scanned
|
|
27
|
+
// wins on name collisions).
|
|
28
|
+
return [
|
|
29
|
+
...DEFAULT_SKILL_DIR_NAMES.map((dirName) => join(cwd, dirName, "skills")),
|
|
30
|
+
...globalSkillRoots.map((root) => join(root, "skills")),
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
function uniquePaths(paths) {
|
|
34
|
+
return Array.from(new Set(paths));
|
|
35
|
+
}
|
|
36
|
+
function expandSkillShellCommands(content, cwd) {
|
|
37
|
+
return content.replace(SKILL_SHELL_EXPANSION_PATTERN, (_match, command) => {
|
|
38
|
+
const output = execFileSync("bash", ["-lc", command], {
|
|
39
|
+
cwd,
|
|
40
|
+
encoding: "utf-8",
|
|
41
|
+
maxBuffer: 1024 * 1024,
|
|
42
|
+
timeout: 30_000,
|
|
43
|
+
});
|
|
44
|
+
return output.trimEnd();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function expandSkillMetadata(skill) {
|
|
48
|
+
return {
|
|
49
|
+
...skill,
|
|
50
|
+
description: expandSkillShellCommands(skill.description, skill.baseDir),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function prepareExplicitSkills(skills) {
|
|
54
|
+
return skills.map(expandSkillMetadata);
|
|
55
|
+
}
|
|
56
|
+
export function loadDiscoveredSkills(discoveryOptions, cwd) {
|
|
57
|
+
const { skills, diagnostics } = loadSkills(buildSkillDiscoveryOptions(discoveryOptions, cwd));
|
|
58
|
+
return {
|
|
59
|
+
skills: skills.map(expandSkillMetadata),
|
|
60
|
+
collisions: extractSkillCollisions(diagnostics),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Discover installed skills without running shell-expansion in their metadata.
|
|
65
|
+
* Intended for read-only listing (e.g. `duet skills`) where executing the
|
|
66
|
+
* skills' shell commands would be a side effect users don't want.
|
|
67
|
+
*/
|
|
68
|
+
export function discoverInstalledSkills(cwd) {
|
|
69
|
+
const { skills, diagnostics } = loadSkills(buildSkillDiscoveryOptions(undefined, cwd));
|
|
70
|
+
return { skills, collisions: extractSkillCollisions(diagnostics) };
|
|
71
|
+
}
|
|
72
|
+
function extractSkillCollisions(diagnostics) {
|
|
73
|
+
const collisions = [];
|
|
74
|
+
for (const diagnostic of diagnostics) {
|
|
75
|
+
const collision = diagnostic.collision;
|
|
76
|
+
if (diagnostic.type !== "collision" || !collision || collision.resourceType !== "skill") {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
collisions.push({
|
|
80
|
+
name: collision.name,
|
|
81
|
+
winnerPath: collision.winnerPath,
|
|
82
|
+
loserPath: collision.loserPath,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return collisions;
|
|
86
|
+
}
|
|
87
|
+
export function mergeSkillsByName(primary, secondary) {
|
|
88
|
+
const merged = [...primary];
|
|
89
|
+
const seenNames = new Set(primary.map((skill) => skill.name));
|
|
90
|
+
for (const skill of secondary) {
|
|
91
|
+
if (!seenNames.has(skill.name)) {
|
|
92
|
+
merged.push(skill);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return merged;
|
|
96
|
+
}
|
|
97
|
+
export function readSkillInstructions(skill) {
|
|
98
|
+
const content = readFileSync(skill.filePath, "utf-8");
|
|
99
|
+
return expandSkillShellCommands(content, skill.baseDir);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Resolve the effective scope of a skill based on which discovery root it
|
|
103
|
+
* actually lives under.
|
|
104
|
+
*
|
|
105
|
+
* pi-coding-agent only labels a single user dir + a single project dir as
|
|
106
|
+
* "user"/"project" — anything else routes to "temporary". duet-agent scans
|
|
107
|
+
* three roots (.duet, .agents, .claude) per scope, so we re-label here so
|
|
108
|
+
* downstream consumers get the truth instead of mostly-"temporary".
|
|
109
|
+
*/
|
|
110
|
+
export function resolveSkillScope(skill, cwd) {
|
|
111
|
+
const baseDir = resolve(skill.baseDir);
|
|
112
|
+
const home = homedir();
|
|
113
|
+
for (const dirName of DEFAULT_SKILL_DIR_NAMES) {
|
|
114
|
+
if (isUnderPath(baseDir, join(home, dirName, "skills")))
|
|
115
|
+
return "user";
|
|
116
|
+
}
|
|
117
|
+
for (const dirName of DEFAULT_SKILL_DIR_NAMES) {
|
|
118
|
+
if (isUnderPath(baseDir, join(cwd, dirName, "skills")))
|
|
119
|
+
return "project";
|
|
120
|
+
}
|
|
121
|
+
return "temporary";
|
|
122
|
+
}
|
|
123
|
+
function isUnderPath(target, root) {
|
|
124
|
+
const normalizedRoot = resolve(root);
|
|
125
|
+
if (target === normalizedRoot)
|
|
126
|
+
return true;
|
|
127
|
+
const prefix = normalizedRoot.endsWith(sep) ? normalizedRoot : `${normalizedRoot}${sep}`;
|
|
128
|
+
return target.startsWith(prefix);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/turn-runner/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { TurnQuestion, TurnRunnerTerminalStatus } from "../types/protocol.js";
|
|
2
|
+
import type { StateMachineAgentState, StateMachineDefinition, StateMachineSession } from "../types/state-machine.js";
|
|
3
|
+
import { type ShellPartialOutput } from "./shell-state-handle.js";
|
|
4
|
+
import { type StateMachineRunnerDecision } from "./tools.js";
|
|
5
|
+
export type StateMachineExecutionResult = {
|
|
6
|
+
type: "state_completed";
|
|
7
|
+
stateName: string;
|
|
8
|
+
output?: unknown;
|
|
9
|
+
} | {
|
|
10
|
+
type: "terminal";
|
|
11
|
+
status: TurnRunnerTerminalStatus;
|
|
12
|
+
result?: string;
|
|
13
|
+
error?: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: "ask";
|
|
16
|
+
questions: TurnQuestion[];
|
|
17
|
+
} | {
|
|
18
|
+
type: "sleep";
|
|
19
|
+
wakeAt: number;
|
|
20
|
+
} | {
|
|
21
|
+
type: "interrupted";
|
|
22
|
+
};
|
|
23
|
+
export type StateAgentResult = {
|
|
24
|
+
type: "complete";
|
|
25
|
+
result?: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: "ask";
|
|
28
|
+
questions: TurnQuestion[];
|
|
29
|
+
} | {
|
|
30
|
+
type: "failed";
|
|
31
|
+
error: string;
|
|
32
|
+
} | {
|
|
33
|
+
type: "interrupted";
|
|
34
|
+
};
|
|
35
|
+
export interface StateAgentHandle {
|
|
36
|
+
/** Starts the state agent from a fresh transcript owned by the host. */
|
|
37
|
+
prompt(): Promise<StateAgentResult>;
|
|
38
|
+
/** Aborts the in-process state agent; persisted state-agent messages are discarded. */
|
|
39
|
+
interrupt(): void;
|
|
40
|
+
/** Text-only partial output used for interruption history without persisting messages. */
|
|
41
|
+
partialAssistantText(): string | undefined;
|
|
42
|
+
}
|
|
43
|
+
export type ActiveStateOutput = {
|
|
44
|
+
state?: string;
|
|
45
|
+
kind: "agent";
|
|
46
|
+
output?: {
|
|
47
|
+
assistantText?: string;
|
|
48
|
+
};
|
|
49
|
+
} | {
|
|
50
|
+
state: string;
|
|
51
|
+
kind: "script" | "poll";
|
|
52
|
+
output?: ShellPartialOutput;
|
|
53
|
+
};
|
|
54
|
+
export interface StateMachineControllerConfig {
|
|
55
|
+
/** Default working directory used by script and poll-script states. */
|
|
56
|
+
cwd: string;
|
|
57
|
+
/** Builds a fresh transient state-agent handle for one agent state execution. */
|
|
58
|
+
createStateAgent(input: {
|
|
59
|
+
state: StateMachineAgentState;
|
|
60
|
+
prompt: string;
|
|
61
|
+
}): StateAgentHandle;
|
|
62
|
+
}
|
|
63
|
+
export declare class StateMachineController {
|
|
64
|
+
private readonly config;
|
|
65
|
+
private session?;
|
|
66
|
+
private activeRun?;
|
|
67
|
+
constructor(config: StateMachineControllerConfig);
|
|
68
|
+
hydrate(stateMachine: StateMachineSession | undefined): void;
|
|
69
|
+
getSession(): StateMachineSession | undefined;
|
|
70
|
+
hasActiveWork(): boolean;
|
|
71
|
+
getActiveOutput(): ActiveStateOutput | undefined;
|
|
72
|
+
startSession(input: {
|
|
73
|
+
prompt: string;
|
|
74
|
+
definition: StateMachineDefinition;
|
|
75
|
+
currentState: string;
|
|
76
|
+
}): void;
|
|
77
|
+
interrupt(reason?: string): void;
|
|
78
|
+
runDecision(decision: StateMachineRunnerDecision): Promise<StateMachineExecutionResult>;
|
|
79
|
+
wake(): Promise<StateMachineExecutionResult | undefined>;
|
|
80
|
+
private runAgentState;
|
|
81
|
+
private runScriptState;
|
|
82
|
+
private runPollState;
|
|
83
|
+
private runTimerState;
|
|
84
|
+
private runTerminalState;
|
|
85
|
+
private recordInterruptedState;
|
|
86
|
+
private interruptedOutput;
|
|
87
|
+
private interruptibleStateName;
|
|
88
|
+
private requireSession;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=state-machine-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine-controller.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { INTERRUPTED_STATE_MACHINE_STATE } from "../types/state-machine.js";
|
|
2
|
+
import { currentScheduledState, elapsedSinceStateStarted, findState, recordRunnerDecision, recordStateAskedUser, recordStateCompleted, recordStateFailed, recordStateInterrupted, recordStateMachineCompleted, recordStateStarted, recordStateSleep, createStateMachineSession, } from "./state-machine-session.js";
|
|
3
|
+
import { createShellStateHandle, parseJsonObject, parseStructuredOutput, renderTemplate, ShellCommandError, } from "./shell-state-handle.js";
|
|
4
|
+
import { applyStateOverride } from "./tools.js";
|
|
5
|
+
export class StateMachineController {
|
|
6
|
+
config;
|
|
7
|
+
session;
|
|
8
|
+
activeRun;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
}
|
|
12
|
+
hydrate(stateMachine) {
|
|
13
|
+
this.session = stateMachine;
|
|
14
|
+
}
|
|
15
|
+
getSession() {
|
|
16
|
+
return this.session;
|
|
17
|
+
}
|
|
18
|
+
hasActiveWork() {
|
|
19
|
+
return Boolean(this.activeRun);
|
|
20
|
+
}
|
|
21
|
+
getActiveOutput() {
|
|
22
|
+
const run = this.activeRun;
|
|
23
|
+
if (!run)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (run.kind === "agent") {
|
|
26
|
+
const assistantText = run.agent.partialAssistantText();
|
|
27
|
+
return assistantText
|
|
28
|
+
? { state: run.state, kind: "agent", output: { assistantText } }
|
|
29
|
+
: { state: run.state, kind: "agent" };
|
|
30
|
+
}
|
|
31
|
+
if (run.kind === "script") {
|
|
32
|
+
const output = run.shell.partialOutput();
|
|
33
|
+
return output
|
|
34
|
+
? { state: run.state, kind: "script", output }
|
|
35
|
+
: { state: run.state, kind: "script" };
|
|
36
|
+
}
|
|
37
|
+
const output = run.shell.partialOutput();
|
|
38
|
+
return output
|
|
39
|
+
? { state: run.state.name, kind: "poll", output }
|
|
40
|
+
: { state: run.state.name, kind: "poll" };
|
|
41
|
+
}
|
|
42
|
+
startSession(input) {
|
|
43
|
+
this.session = createStateMachineSession(input.prompt, input.definition, input.currentState);
|
|
44
|
+
}
|
|
45
|
+
interrupt(reason = "Interrupted") {
|
|
46
|
+
const run = this.activeRun;
|
|
47
|
+
if (!run)
|
|
48
|
+
return;
|
|
49
|
+
run.interruptedReason = reason;
|
|
50
|
+
const state = this.interruptibleStateName(run);
|
|
51
|
+
if (this.session && state) {
|
|
52
|
+
this.session = recordStateInterrupted(this.session, state, reason, this.interruptedOutput(run));
|
|
53
|
+
}
|
|
54
|
+
if (run.kind === "agent") {
|
|
55
|
+
run.agent.interrupt();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
run.shell.interrupt();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async runDecision(decision) {
|
|
62
|
+
if (this.hasActiveWork()) {
|
|
63
|
+
// Selecting a state while work is active is an intentional replacement.
|
|
64
|
+
// The parent can steer state-machine progress by selecting the same state
|
|
65
|
+
// with new input or by selecting a different state; transient work is
|
|
66
|
+
// aborted before the new state starts.
|
|
67
|
+
this.interrupt("Replaced by a newly selected state.");
|
|
68
|
+
}
|
|
69
|
+
const stateMachine = this.requireSession();
|
|
70
|
+
this.session = recordRunnerDecision(stateMachine, decision);
|
|
71
|
+
if (decision.kind === "fail") {
|
|
72
|
+
const state = this.session.currentState ?? "unknown";
|
|
73
|
+
this.session = recordStateFailed(this.session, state, decision.reason);
|
|
74
|
+
return { type: "terminal", status: "failed", error: decision.reason };
|
|
75
|
+
}
|
|
76
|
+
const selectedState = findState(this.session, decision.state);
|
|
77
|
+
if (!selectedState) {
|
|
78
|
+
const validStates = this.session.definition.states.map((state) => state.name);
|
|
79
|
+
const message = `Unknown state: ${decision.state}. Valid states: ${validStates.join(", ")}`;
|
|
80
|
+
this.session = recordStateFailed(this.session, this.session.currentState ?? decision.state, message);
|
|
81
|
+
return { type: "terminal", status: "failed", error: message };
|
|
82
|
+
}
|
|
83
|
+
const effectiveState = decision.kind === "run_state"
|
|
84
|
+
? applyStateOverride(selectedState, decision.override)
|
|
85
|
+
: selectedState;
|
|
86
|
+
this.session = recordStateStarted(this.session, effectiveState, decision.kind === "run_state" ? decision.input : undefined);
|
|
87
|
+
switch (effectiveState.kind) {
|
|
88
|
+
case "agent":
|
|
89
|
+
return this.runAgentState(effectiveState);
|
|
90
|
+
case "script":
|
|
91
|
+
return this.runScriptState(effectiveState);
|
|
92
|
+
case "poll":
|
|
93
|
+
return this.runPollState(effectiveState);
|
|
94
|
+
case "timer":
|
|
95
|
+
return this.runTimerState(effectiveState);
|
|
96
|
+
case "terminal":
|
|
97
|
+
return this.runTerminalState(effectiveState);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async wake() {
|
|
101
|
+
const state = currentScheduledState(this.session);
|
|
102
|
+
if (!state)
|
|
103
|
+
return undefined;
|
|
104
|
+
return state.kind === "poll" ? this.runPollState(state) : this.runTimerState(state, true);
|
|
105
|
+
}
|
|
106
|
+
async runAgentState(state) {
|
|
107
|
+
const prompt = renderTemplate(state.prompt, this.session?.currentInput ?? {});
|
|
108
|
+
const agent = this.config.createStateAgent({ state, prompt });
|
|
109
|
+
const run = { kind: "agent", state: state.name, agent };
|
|
110
|
+
this.activeRun = run;
|
|
111
|
+
try {
|
|
112
|
+
const terminal = await agent.prompt();
|
|
113
|
+
if (terminal.type === "ask") {
|
|
114
|
+
this.session = recordStateAskedUser(this.requireSession(), state.name, terminal.questions);
|
|
115
|
+
return { type: "ask", questions: terminal.questions };
|
|
116
|
+
}
|
|
117
|
+
if (terminal.type === "failed") {
|
|
118
|
+
this.session = recordStateFailed(this.requireSession(), state.name, terminal.error);
|
|
119
|
+
return { type: "terminal", status: "failed", error: terminal.error };
|
|
120
|
+
}
|
|
121
|
+
if (terminal.type === "interrupted") {
|
|
122
|
+
if (this.activeRun === run)
|
|
123
|
+
this.recordInterruptedState(run, state.name);
|
|
124
|
+
return { type: "interrupted" };
|
|
125
|
+
}
|
|
126
|
+
const output = { result: terminal.result };
|
|
127
|
+
this.session = recordStateCompleted(this.requireSession(), state.name, output);
|
|
128
|
+
return { type: "state_completed", stateName: state.name, output };
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
if (this.activeRun === run)
|
|
132
|
+
this.activeRun = undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async runScriptState(state) {
|
|
136
|
+
const command = renderTemplate(state.command, this.session?.currentInput ?? {});
|
|
137
|
+
const shell = createShellStateHandle({
|
|
138
|
+
command,
|
|
139
|
+
cwd: state.cwd ?? this.config.cwd,
|
|
140
|
+
timeoutMs: state.timeoutMs,
|
|
141
|
+
successCodes: state.successCodes,
|
|
142
|
+
});
|
|
143
|
+
const run = { kind: "script", state: state.name, shell };
|
|
144
|
+
this.activeRun = run;
|
|
145
|
+
try {
|
|
146
|
+
const shellOutput = await shell.run();
|
|
147
|
+
const rawOutput = normalizeStructuredShellOutput(shellOutput);
|
|
148
|
+
this.session = recordStateCompleted(this.requireSession(), state.name, rawOutput);
|
|
149
|
+
return { type: "state_completed", stateName: state.name, output: rawOutput };
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
if (run.interruptedReason) {
|
|
153
|
+
if (this.activeRun === run)
|
|
154
|
+
this.recordInterruptedState(run, state.name, shellPartialOutput(error));
|
|
155
|
+
return { type: "interrupted" };
|
|
156
|
+
}
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
this.session = recordStateFailed(this.requireSession(), state.name, message);
|
|
159
|
+
return { type: "terminal", status: "failed", error: message };
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
if (this.activeRun === run)
|
|
163
|
+
this.activeRun = undefined;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async runPollState(state) {
|
|
167
|
+
const elapsedMs = elapsedSinceStateStarted(this.session, state.name);
|
|
168
|
+
if (state.timeoutMs !== undefined && elapsedMs >= state.timeoutMs) {
|
|
169
|
+
const message = `Poll state "${state.name}" timed out after ${elapsedMs}ms.`;
|
|
170
|
+
this.session = recordStateFailed(this.requireSession(), state.name, message);
|
|
171
|
+
return { type: "terminal", status: "failed", error: message };
|
|
172
|
+
}
|
|
173
|
+
const command = renderTemplate(state.command, this.session?.currentInput ?? {});
|
|
174
|
+
const shell = createShellStateHandle({
|
|
175
|
+
command,
|
|
176
|
+
cwd: state.cwd ?? this.config.cwd,
|
|
177
|
+
successCodes: state.successCodes,
|
|
178
|
+
});
|
|
179
|
+
const run = { kind: "poll", state, shell };
|
|
180
|
+
this.activeRun = run;
|
|
181
|
+
try {
|
|
182
|
+
const shellOutput = await shell.run();
|
|
183
|
+
const output = parseJsonObject(shellOutput.stdout);
|
|
184
|
+
if (Object.keys(output).length === 0) {
|
|
185
|
+
const wakeAt = Date.now() + state.intervalMs;
|
|
186
|
+
this.session = recordStateSleep(this.requireSession(), state, wakeAt);
|
|
187
|
+
return { type: "sleep", wakeAt };
|
|
188
|
+
}
|
|
189
|
+
const rawOutput = normalizePollShellOutput(shellOutput, output);
|
|
190
|
+
this.session = recordStateCompleted(this.requireSession(), state.name, rawOutput);
|
|
191
|
+
return { type: "state_completed", stateName: state.name, output: rawOutput };
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
if (run.interruptedReason) {
|
|
195
|
+
if (this.activeRun === run)
|
|
196
|
+
this.recordInterruptedState(run, state.name, shellPartialOutput(error));
|
|
197
|
+
return { type: "interrupted" };
|
|
198
|
+
}
|
|
199
|
+
const wakeAt = Date.now() + state.intervalMs;
|
|
200
|
+
this.session = recordStateSleep(this.requireSession(), state, wakeAt);
|
|
201
|
+
return { type: "sleep", wakeAt };
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
if (this.activeRun === run)
|
|
205
|
+
this.activeRun = undefined;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
runTimerState(state, woke = false) {
|
|
209
|
+
if (!woke && state.wakeAt > Date.now()) {
|
|
210
|
+
this.session = recordStateSleep(this.requireSession(), state, state.wakeAt);
|
|
211
|
+
return { type: "sleep", wakeAt: state.wakeAt };
|
|
212
|
+
}
|
|
213
|
+
const output = {
|
|
214
|
+
elapsedMs: elapsedSinceStateStarted(this.session, state.name),
|
|
215
|
+
timestamp: Date.now(),
|
|
216
|
+
};
|
|
217
|
+
this.session = recordStateCompleted(this.requireSession(), state.name, output);
|
|
218
|
+
return { type: "state_completed", stateName: state.name, output };
|
|
219
|
+
}
|
|
220
|
+
async runTerminalState(state) {
|
|
221
|
+
const terminal = { state: state.name, status: state.status, reason: state.reason };
|
|
222
|
+
this.session = recordStateMachineCompleted(this.requireSession(), terminal);
|
|
223
|
+
return { type: "terminal", status: state.status, result: state.reason };
|
|
224
|
+
}
|
|
225
|
+
recordInterruptedState(run, stateName, output) {
|
|
226
|
+
const session = this.requireSession();
|
|
227
|
+
const last = session.history.at(-1);
|
|
228
|
+
if (session.currentState === INTERRUPTED_STATE_MACHINE_STATE &&
|
|
229
|
+
last?.type === "state_interrupted" &&
|
|
230
|
+
last.state === stateName) {
|
|
231
|
+
this.session = {
|
|
232
|
+
...session,
|
|
233
|
+
history: [
|
|
234
|
+
...session.history.slice(0, -1),
|
|
235
|
+
{
|
|
236
|
+
...last,
|
|
237
|
+
reason: run.interruptedReason ?? last.reason,
|
|
238
|
+
output: output ?? last.output,
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
updatedAt: Date.now(),
|
|
242
|
+
};
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
this.session = recordStateInterrupted(session, stateName, run.interruptedReason ?? "Interrupted", output);
|
|
246
|
+
}
|
|
247
|
+
interruptedOutput(run) {
|
|
248
|
+
if (run.kind === "agent") {
|
|
249
|
+
const assistantText = run.agent.partialAssistantText();
|
|
250
|
+
return assistantText ? { assistantText } : undefined;
|
|
251
|
+
}
|
|
252
|
+
return run.shell.partialOutput();
|
|
253
|
+
}
|
|
254
|
+
interruptibleStateName(run) {
|
|
255
|
+
if (run.kind === "agent")
|
|
256
|
+
return run.state;
|
|
257
|
+
if (run.kind === "script")
|
|
258
|
+
return run.state;
|
|
259
|
+
return run.state.name;
|
|
260
|
+
}
|
|
261
|
+
requireSession() {
|
|
262
|
+
if (!this.session) {
|
|
263
|
+
throw new Error("No state machine is active.");
|
|
264
|
+
}
|
|
265
|
+
return this.session;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function normalizeStructuredShellOutput(shellOutput) {
|
|
269
|
+
return {
|
|
270
|
+
...shellOutput,
|
|
271
|
+
stdout: shellOutput.stdout.trim(),
|
|
272
|
+
stderr: shellOutput.stderr.trim(),
|
|
273
|
+
parsed: parseStructuredOutput(shellOutput.stdout),
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function normalizePollShellOutput(shellOutput, parsed) {
|
|
277
|
+
return {
|
|
278
|
+
...shellOutput,
|
|
279
|
+
stdout: shellOutput.stdout.trim(),
|
|
280
|
+
stderr: shellOutput.stderr.trim(),
|
|
281
|
+
parsed,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function shellPartialOutput(error) {
|
|
285
|
+
if (!(error instanceof ShellCommandError))
|
|
286
|
+
return undefined;
|
|
287
|
+
return { stdout: error.output.stdout, stderr: error.output.stderr };
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=state-machine-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine-controller.js","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StateMachineDefinition, StateMachinePollState, StateMachineSession, StateMachineState, StateMachineTimerState } from "../types/state-machine.js";
|
|
2
|
+
import type { TurnQuestion } from "../types/protocol.js";
|
|
3
|
+
import type { StateMachineRunnerDecision } from "./tools.js";
|
|
4
|
+
export declare function createStateMachineSession(prompt: string, definition: StateMachineDefinition, currentState: string): StateMachineSession;
|
|
5
|
+
export declare function findState(stateMachine: StateMachineSession, name: string): StateMachineState | undefined;
|
|
6
|
+
export type StateMachineScheduledState = StateMachinePollState | StateMachineTimerState;
|
|
7
|
+
export declare function currentScheduledState(stateMachine: StateMachineSession | undefined): StateMachineScheduledState | undefined;
|
|
8
|
+
export declare function isWaitingOnScheduledState(stateMachine: StateMachineSession | undefined): boolean;
|
|
9
|
+
export declare function recordRunnerDecision(stateMachine: StateMachineSession, decision: StateMachineRunnerDecision): StateMachineSession;
|
|
10
|
+
export declare function recordStateStarted(stateMachine: StateMachineSession, state: StateMachineState, input?: Record<string, unknown>): StateMachineSession;
|
|
11
|
+
export declare function recordStateCompleted(stateMachine: StateMachineSession, state: string, output: unknown): StateMachineSession;
|
|
12
|
+
export declare function recordStateSleep(stateMachine: StateMachineSession, state: StateMachineScheduledState, wakeAt: number): StateMachineSession;
|
|
13
|
+
export declare function elapsedSinceStateStarted(stateMachine: StateMachineSession | undefined, state: string): number;
|
|
14
|
+
export declare function recordStateFailed(stateMachine: StateMachineSession, state: string, error: string): StateMachineSession;
|
|
15
|
+
export declare function recordStateInterrupted(stateMachine: StateMachineSession, state: string, reason?: string, output?: {
|
|
16
|
+
assistantText?: string;
|
|
17
|
+
} | {
|
|
18
|
+
stdout: string;
|
|
19
|
+
stderr: string;
|
|
20
|
+
}): StateMachineSession;
|
|
21
|
+
export declare function recordStateAskedUser(stateMachine: StateMachineSession, state: string, questions: TurnQuestion[]): StateMachineSession;
|
|
22
|
+
export declare function recordStateMachineCompleted(stateMachine: StateMachineSession, terminal: {
|
|
23
|
+
state: string;
|
|
24
|
+
status: "completed" | "failed" | "cancelled";
|
|
25
|
+
reason?: string;
|
|
26
|
+
}): StateMachineSession;
|
|
27
|
+
//# sourceMappingURL=state-machine-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine-session.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EAErB,mBAAmB,EAEnB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,GACnB,mBAAmB,CAUrB;AAED,wBAAgB,SAAS,CACvB,YAAY,EAAE,mBAAmB,EACjC,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED,MAAM,MAAM,0BAA0B,GAAG,qBAAqB,GAAG,sBAAsB,CAAC;AAExF,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAC5C,0BAA0B,GAAG,SAAS,CAOxC;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAEhG;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE,0BAA0B,GACnC,mBAAmB,CAMrB;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,iBAAiB,EACxB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,mBAAmB,CA8BrB;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,GACd,mBAAmB,CAYrB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,0BAA0B,EACjC,MAAM,EAAE,MAAM,GACb,mBAAmB,CAWrB;AAED,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,mBAAmB,GAAG,SAAS,EAC7C,KAAK,EAAE,MAAM,GACZ,MAAM,CASR;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAkBrB;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvE,mBAAmB,CAuBrB;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,mBAAmB,EACjC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,YAAY,EAAE,GACxB,mBAAmB,CAUrB;AAED,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,mBAAmB,EACjC,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzF,mBAAmB,CAWrB"}
|