@duetso/agent 0.2.2 → 0.2.3
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 +19 -11
- package/dist/package.json +4 -4
- package/dist/src/cli/config.d.ts +10 -0
- package/dist/src/cli/config.d.ts.map +1 -0
- package/dist/src/cli/config.js +24 -0
- package/dist/src/cli/config.js.map +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +11 -9
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/inline-slash.d.ts +2 -1
- package/dist/src/cli/inline-slash.d.ts.map +1 -1
- package/dist/src/cli/inline-slash.js +14 -5
- package/dist/src/cli/inline-slash.js.map +1 -1
- package/dist/src/cli/memory-query.d.ts +1 -1
- package/dist/src/cli/model.d.ts +1 -1
- package/dist/src/cli/model.d.ts.map +1 -1
- package/dist/src/cli/model.js +1 -1
- package/dist/src/cli/model.js.map +1 -1
- package/dist/src/cli/route.d.ts +84 -0
- package/dist/src/cli/route.d.ts.map +1 -0
- package/dist/src/cli/route.js +261 -0
- package/dist/src/cli/route.js.map +1 -0
- package/dist/src/cli/rpc.d.ts +43 -2
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +176 -23
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts +8 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +24 -7
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/shared.d.ts +4 -3
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +3 -4
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/cli/shutdown.d.ts +4 -2
- package/dist/src/cli/shutdown.d.ts.map +1 -1
- package/dist/src/cli/shutdown.js +4 -2
- package/dist/src/cli/shutdown.js.map +1 -1
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +12 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/core/structured-output.d.ts +2 -0
- package/dist/src/core/structured-output.d.ts.map +1 -1
- package/dist/src/core/structured-output.js +1 -0
- package/dist/src/core/structured-output.js.map +1 -1
- package/dist/src/lib/system-reminder.d.ts +14 -0
- package/dist/src/lib/system-reminder.d.ts.map +1 -0
- package/dist/src/lib/system-reminder.js +53 -0
- package/dist/src/lib/system-reminder.js.map +1 -0
- package/dist/src/lib/walk-ancestors.d.ts +9 -0
- package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
- package/dist/src/lib/walk-ancestors.js +28 -0
- package/dist/src/lib/walk-ancestors.js.map +1 -0
- package/dist/src/memory/observational-prompts.d.ts.map +1 -1
- package/dist/src/memory/observational-prompts.js +2 -1
- package/dist/src/memory/observational-prompts.js.map +1 -1
- package/dist/src/memory/observational.d.ts +31 -4
- package/dist/src/memory/observational.d.ts.map +1 -1
- package/dist/src/memory/observational.js +43 -4
- package/dist/src/memory/observational.js.map +1 -1
- package/dist/src/model-resolution/catalog.d.ts +2 -2
- package/dist/src/model-resolution/catalog.d.ts.map +1 -1
- package/dist/src/model-resolution/catalog.js +61 -33
- package/dist/src/model-resolution/catalog.js.map +1 -1
- package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
- package/dist/src/model-resolution/duet-gateway.js +119 -19
- package/dist/src/model-resolution/duet-gateway.js.map +1 -1
- package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
- package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
- package/dist/src/model-resolution/model-gateway.js.map +1 -0
- package/dist/src/model-resolution/resolver.d.ts +11 -4
- package/dist/src/model-resolution/resolver.d.ts.map +1 -1
- package/dist/src/model-resolution/resolver.js +39 -8
- package/dist/src/model-resolution/resolver.js.map +1 -1
- package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
- package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
- package/dist/src/model-routing/advisor-transcript.js +103 -0
- package/dist/src/model-routing/advisor-transcript.js.map +1 -0
- package/dist/src/model-routing/advisor.d.ts +27 -0
- package/dist/src/model-routing/advisor.d.ts.map +1 -0
- package/dist/src/model-routing/advisor.js +20 -0
- package/dist/src/model-routing/advisor.js.map +1 -0
- package/dist/src/model-routing/classifier.d.ts +57 -0
- package/dist/src/model-routing/classifier.d.ts.map +1 -0
- package/dist/src/model-routing/classifier.js +63 -0
- package/dist/src/model-routing/classifier.js.map +1 -0
- package/dist/src/model-routing/loader.d.ts +48 -0
- package/dist/src/model-routing/loader.d.ts.map +1 -0
- package/dist/src/model-routing/loader.js +79 -0
- package/dist/src/model-routing/loader.js.map +1 -0
- package/dist/src/model-routing/prompts.d.ts +22 -0
- package/dist/src/model-routing/prompts.d.ts.map +1 -0
- package/dist/src/model-routing/prompts.js +87 -0
- package/dist/src/model-routing/prompts.js.map +1 -0
- package/dist/src/model-routing/resolve.d.ts +40 -0
- package/dist/src/model-routing/resolve.d.ts.map +1 -0
- package/dist/src/model-routing/resolve.js +76 -0
- package/dist/src/model-routing/resolve.js.map +1 -0
- package/dist/src/model-routing/router.d.ts +149 -0
- package/dist/src/model-routing/router.d.ts.map +1 -0
- package/dist/src/model-routing/router.js +235 -0
- package/dist/src/model-routing/router.js.map +1 -0
- package/dist/src/model-routing/step-triggers.d.ts +27 -0
- package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
- package/dist/src/model-routing/step-triggers.js +20 -0
- package/dist/src/model-routing/step-triggers.js.map +1 -0
- package/dist/src/model-routing/table.d.ts +126 -0
- package/dist/src/model-routing/table.d.ts.map +1 -0
- package/dist/src/model-routing/table.js +351 -0
- package/dist/src/model-routing/table.js.map +1 -0
- package/dist/src/session/session.d.ts +40 -23
- package/dist/src/session/session.d.ts.map +1 -1
- package/dist/src/session/session.js +173 -97
- package/dist/src/session/session.js.map +1 -1
- package/dist/src/tasks/quiescence.d.ts +13 -0
- package/dist/src/tasks/quiescence.d.ts.map +1 -0
- package/dist/src/tasks/quiescence.js +11 -0
- package/dist/src/tasks/quiescence.js.map +1 -0
- package/dist/src/tasks/task-manager.d.ts +101 -0
- package/dist/src/tasks/task-manager.d.ts.map +1 -0
- package/dist/src/tasks/task-manager.js +311 -0
- package/dist/src/tasks/task-manager.js.map +1 -0
- package/dist/src/tasks/types.d.ts +85 -0
- package/dist/src/tasks/types.d.ts.map +1 -0
- package/dist/src/tasks/types.js +2 -0
- package/dist/src/tasks/types.js.map +1 -0
- package/dist/src/tui/app.d.ts +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +12 -2
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/initial-prompt.d.ts.map +1 -1
- package/dist/src/tui/initial-prompt.js +0 -3
- package/dist/src/tui/initial-prompt.js.map +1 -1
- package/dist/src/tui/session-subscription.d.ts +3 -0
- package/dist/src/tui/session-subscription.d.ts.map +1 -1
- package/dist/src/tui/session-subscription.js +29 -5
- package/dist/src/tui/session-subscription.js.map +1 -1
- package/dist/src/tui/sidebar.d.ts +3 -0
- package/dist/src/tui/sidebar.d.ts.map +1 -1
- package/dist/src/tui/sidebar.js +19 -3
- package/dist/src/tui/sidebar.js.map +1 -1
- package/dist/src/tui/slash-commands.d.ts +12 -9
- package/dist/src/tui/slash-commands.d.ts.map +1 -1
- package/dist/src/tui/slash-commands.js +48 -10
- package/dist/src/tui/slash-commands.js.map +1 -1
- package/dist/src/tui/status-controller.d.ts +14 -9
- package/dist/src/tui/status-controller.d.ts.map +1 -1
- package/dist/src/tui/status-controller.js +26 -7
- package/dist/src/tui/status-controller.js.map +1 -1
- package/dist/src/tui/task-lane-renderer.d.ts +30 -0
- package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
- package/dist/src/tui/task-lane-renderer.js +93 -0
- package/dist/src/tui/task-lane-renderer.js.map +1 -0
- package/dist/src/tui/task-tree.d.ts +47 -0
- package/dist/src/tui/task-tree.d.ts.map +1 -0
- package/dist/src/tui/task-tree.js +190 -0
- package/dist/src/tui/task-tree.js.map +1 -0
- package/dist/src/tui/tool-formatters.js +3 -0
- package/dist/src/tui/tool-formatters.js.map +1 -1
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.js +1 -0
- package/dist/src/turn-runner/agent-events.js.map +1 -1
- package/dist/src/turn-runner/duration.d.ts +2 -2
- package/dist/src/turn-runner/duration.js +3 -3
- package/dist/src/turn-runner/duration.js.map +1 -1
- package/dist/src/turn-runner/prompts.d.ts +5 -1
- package/dist/src/turn-runner/prompts.d.ts.map +1 -1
- package/dist/src/turn-runner/prompts.js +30 -6
- package/dist/src/turn-runner/prompts.js.map +1 -1
- package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
- package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
- package/dist/src/turn-runner/runtime-clock.js +38 -0
- package/dist/src/turn-runner/runtime-clock.js.map +1 -0
- package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
- package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
- package/dist/src/turn-runner/shell-state-handle.js +5 -55
- package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
- package/dist/src/turn-runner/skill-context.d.ts +6 -7
- package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
- package/dist/src/turn-runner/skill-context.js +10 -10
- package/dist/src/turn-runner/skill-context.js.map +1 -1
- package/dist/src/turn-runner/skills.d.ts.map +1 -1
- package/dist/src/turn-runner/skills.js +2 -22
- package/dist/src/turn-runner/skills.js.map +1 -1
- package/dist/src/turn-runner/state-compaction.d.ts +7 -5
- package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
- package/dist/src/turn-runner/state-compaction.js +69 -10
- package/dist/src/turn-runner/state-compaction.js.map +1 -1
- package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
- package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
- package/dist/src/turn-runner/state-machine-decisions.js +443 -0
- package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
- package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
- package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
- package/dist/src/turn-runner/state-machine-session.js +18 -55
- package/dist/src/turn-runner/state-machine-session.js.map +1 -1
- package/dist/src/turn-runner/subagent.d.ts +156 -0
- package/dist/src/turn-runner/subagent.d.ts.map +1 -0
- package/dist/src/turn-runner/subagent.js +164 -0
- package/dist/src/turn-runner/subagent.js.map +1 -0
- package/dist/src/turn-runner/task-tools.d.ts +76 -0
- package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
- package/dist/src/turn-runner/task-tools.js +370 -0
- package/dist/src/turn-runner/task-tools.js.map +1 -0
- package/dist/src/turn-runner/tools.d.ts +65 -17
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +173 -59
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +198 -134
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +1302 -713
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
- package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
- package/dist/src/turn-runner/usage-accounting.js +19 -0
- package/dist/src/turn-runner/usage-accounting.js.map +1 -1
- package/dist/src/types/config.d.ts +9 -1
- package/dist/src/types/config.d.ts.map +1 -1
- package/dist/src/types/config.js +2 -1
- package/dist/src/types/config.js.map +1 -1
- package/dist/src/types/protocol.d.ts +110 -30
- package/dist/src/types/protocol.d.ts.map +1 -1
- package/dist/src/types/state-machine.d.ts +10 -12
- package/dist/src/types/state-machine.d.ts.map +1 -1
- package/dist/src/types/state-machine.js.map +1 -1
- package/package.json +4 -4
- package/dist/src/cli/model-gateway.d.ts.map +0 -1
- package/dist/src/cli/model-gateway.js.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
- package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
- package/dist/src/turn-runner/state-machine-controller.js +0 -501
- package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
- /package/dist/src/{cli → model-resolution}/model-gateway.d.ts +0 -0
|
@@ -1,501 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { INTERRUPTED_STATE_MACHINE_STATE } from "../types/state-machine.js";
|
|
5
|
-
import { parseDurationToMs, parseWakeAtToMs } from "./duration.js";
|
|
6
|
-
import { consecutivePollGateSuccesses, currentScheduledState, elapsedSinceStateStarted, findState, MISCONFIGURED_POLL_GATE_THRESHOLD, recordRunnerDecision, recordStateAskedUser, recordStateCompleted, recordStateFailed, recordStateInterrupted, recordStateMachineCompleted, recordStateMachineReactivated, recordStateStarted, recordStateSleep, createStateMachineSession, persistStateDefinition, } from "./state-machine-session.js";
|
|
7
|
-
import { createShellStateHandle, parseJsonObject, parseStructuredOutput, renderTemplate, ShellCommandError, } from "./shell-state-handle.js";
|
|
8
|
-
import { applyStateOverride, resolveStateCwd } from "./tools.js";
|
|
9
|
-
export class StateMachineController {
|
|
10
|
-
config;
|
|
11
|
-
session;
|
|
12
|
-
activeRun;
|
|
13
|
-
constructor(config) {
|
|
14
|
-
this.config = config;
|
|
15
|
-
}
|
|
16
|
-
hydrate(stateMachine) {
|
|
17
|
-
this.session = stateMachine;
|
|
18
|
-
}
|
|
19
|
-
getSession() {
|
|
20
|
-
return this.session;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Mark the current terminal as having been surfaced to the parent
|
|
24
|
-
* runner. The turn runner sets this flag before kicking off the
|
|
25
|
-
* inline acknowledgment turn so the same `session.terminal` cannot
|
|
26
|
-
* be acknowledged twice — if the parent (mis)routes back into the
|
|
27
|
-
* controller during the acknowledgment turn and the controller
|
|
28
|
-
* re-records a terminal on this same session, the second drive will
|
|
29
|
-
* find the flag set and skip.
|
|
30
|
-
*
|
|
31
|
-
* Note that this flag is per-session: a new state machine created
|
|
32
|
-
* during the acknowledgment turn lives on a brand-new session built
|
|
33
|
-
* by `createStateMachineSession`, so it gets its own acknowledgment
|
|
34
|
-
* when it terminates.
|
|
35
|
-
*/
|
|
36
|
-
markTerminalAcknowledged() {
|
|
37
|
-
if (!this.session?.terminal || this.session.terminalAcknowledged)
|
|
38
|
-
return;
|
|
39
|
-
this.session = {
|
|
40
|
-
...this.session,
|
|
41
|
-
terminalAcknowledged: true,
|
|
42
|
-
updatedAt: Date.now(),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Records a runtime failure on the active session and returns the matching
|
|
47
|
-
* `error` terminal. Used by the turn runner when a protocol violation cannot
|
|
48
|
-
* be recovered (e.g. the parent exhausted its re-prompt budget without
|
|
49
|
-
* calling select_state_machine_state). Recording it here — rather than
|
|
50
|
-
* returning a terminal the runner never persists — keeps the failure on
|
|
51
|
-
* `session.terminal.reason` so the terminal acknowledgment turn and the
|
|
52
|
-
* board/relay see the same outcome the turn event reports.
|
|
53
|
-
*/
|
|
54
|
-
failActiveSession(state, error) {
|
|
55
|
-
this.session = recordStateFailed(this.requireSession(), state, error);
|
|
56
|
-
return { type: "terminal", status: "error", error };
|
|
57
|
-
}
|
|
58
|
-
hasActiveWork() {
|
|
59
|
-
return Boolean(this.activeRun);
|
|
60
|
-
}
|
|
61
|
-
getActiveOutput() {
|
|
62
|
-
const run = this.activeRun;
|
|
63
|
-
if (!run)
|
|
64
|
-
return undefined;
|
|
65
|
-
if (run.kind === "agent") {
|
|
66
|
-
const assistantText = run.agent.partialAssistantText();
|
|
67
|
-
return assistantText
|
|
68
|
-
? { state: run.state, kind: "agent", output: { assistantText } }
|
|
69
|
-
: { state: run.state, kind: "agent" };
|
|
70
|
-
}
|
|
71
|
-
if (run.kind === "script") {
|
|
72
|
-
const output = run.shell.partialOutput();
|
|
73
|
-
return output
|
|
74
|
-
? { state: run.state, kind: "script", output }
|
|
75
|
-
: { state: run.state, kind: "script" };
|
|
76
|
-
}
|
|
77
|
-
const output = run.shell.partialOutput();
|
|
78
|
-
return output
|
|
79
|
-
? { state: run.state.name, kind: "poll", output }
|
|
80
|
-
: { state: run.state.name, kind: "poll" };
|
|
81
|
-
}
|
|
82
|
-
startSession(input) {
|
|
83
|
-
this.session = createStateMachineSession(input.prompt, input.definition, input.currentState);
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Supersedes the active session because the parent is replacing it with a
|
|
87
|
-
* brand-new state machine (a create_state_machine_definition with
|
|
88
|
-
* replaceActive: true issued while a machine is still running). Records a
|
|
89
|
-
* `cancelled` terminal and broadcasts the final snapshot so the superseded
|
|
90
|
-
* machine's board/relay card resolves instead of dangling at its last running
|
|
91
|
-
* state; the caller follows with `startSession` to install the replacement.
|
|
92
|
-
* Any in-flight state work is aborted first. No-op when there is no active,
|
|
93
|
-
* non-terminal session.
|
|
94
|
-
*/
|
|
95
|
-
supersedeActiveSession(reason) {
|
|
96
|
-
const session = this.session;
|
|
97
|
-
if (!session || session.terminal)
|
|
98
|
-
return;
|
|
99
|
-
// interrupt() may rewrite this.session (recording an interrupted state for
|
|
100
|
-
// in-flight work), so read the current session after it, not the captured
|
|
101
|
-
// pre-interrupt reference.
|
|
102
|
-
this.interrupt("Replaced by a new state machine.");
|
|
103
|
-
const current = this.requireSession();
|
|
104
|
-
this.session = recordStateMachineCompleted(current, {
|
|
105
|
-
state: current.currentState ?? "",
|
|
106
|
-
status: "cancelled",
|
|
107
|
-
reason,
|
|
108
|
-
});
|
|
109
|
-
this.config.onSessionChanged?.(this.session);
|
|
110
|
-
}
|
|
111
|
-
interrupt(reason = "Interrupted") {
|
|
112
|
-
const run = this.activeRun;
|
|
113
|
-
if (!run)
|
|
114
|
-
return;
|
|
115
|
-
const state = this.interruptibleStateName(run);
|
|
116
|
-
if (this.session && state) {
|
|
117
|
-
this.session = recordStateInterrupted(this.session, state, reason, this.interruptedOutput(run));
|
|
118
|
-
}
|
|
119
|
-
// The handle owns interrupt classification: `interrupt(reason)` causes
|
|
120
|
-
// its `prompt()` / `run()` to settle as interrupted with this reason.
|
|
121
|
-
if (run.kind === "agent") {
|
|
122
|
-
run.agent.interrupt(reason);
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
run.shell.interrupt(reason);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
async runDecision(decision) {
|
|
129
|
-
const previous = this.activeRun;
|
|
130
|
-
if (previous) {
|
|
131
|
-
// Selecting a state while work is active is an intentional replacement.
|
|
132
|
-
// The parent can steer state-machine progress by selecting the same state
|
|
133
|
-
// with new input or by selecting a different state; transient work is
|
|
134
|
-
// aborted before the new state starts.
|
|
135
|
-
this.interrupt("Replaced by a newly selected state.");
|
|
136
|
-
// Wait for the old run to actually finish tearing down before we
|
|
137
|
-
// construct the replacement. Without this, the orphaned sub-agent (or
|
|
138
|
-
// shell) keeps running concurrently with the new one and its events
|
|
139
|
-
// leak into the same turn after the parent already declared replacement.
|
|
140
|
-
await previous.finished;
|
|
141
|
-
}
|
|
142
|
-
const stateMachine = this.requireSession();
|
|
143
|
-
this.session = recordRunnerDecision(stateMachine, decision);
|
|
144
|
-
const selectedState = findState(this.session, decision.state);
|
|
145
|
-
if (!selectedState) {
|
|
146
|
-
const validStates = this.session.definition.states.map((state) => state.name);
|
|
147
|
-
const message = `Unknown state: ${decision.state}. Valid states: ${validStates.join(", ")}`;
|
|
148
|
-
this.session = recordStateFailed(this.session, this.session.currentState ?? decision.state, message);
|
|
149
|
-
return { type: "terminal", status: "error", error: message };
|
|
150
|
-
}
|
|
151
|
-
// Terminal states ignore overrides/inputs — they just record their
|
|
152
|
-
// status and any caller-supplied reason. Every other state kind
|
|
153
|
-
// honors the override + input so the caller can steer the next run.
|
|
154
|
-
const isTerminal = selectedState.kind === "terminal";
|
|
155
|
-
// A non-terminal selection on an already-terminal session is an explicit
|
|
156
|
-
// user-driven resume; recordStateMachineReactivated clears the prior
|
|
157
|
-
// terminal so the machine runs live again before the new state starts.
|
|
158
|
-
if (!isTerminal && this.session.terminal) {
|
|
159
|
-
this.session = recordStateMachineReactivated(this.session, selectedState.name);
|
|
160
|
-
}
|
|
161
|
-
const effectiveState = isTerminal
|
|
162
|
-
? selectedState
|
|
163
|
-
: applyStateOverride(selectedState, decision.override);
|
|
164
|
-
// Persist the override into the active definition by default so that
|
|
165
|
-
// future runs of the same state pick up the tuned prompt/command/
|
|
166
|
-
// schedule. The orchestrator opts out with persistOverride: false when
|
|
167
|
-
// it wants to probe a variation without committing it. Skip the
|
|
168
|
-
// persist when the override is a no-op (effectiveState === selectedState)
|
|
169
|
-
// because applyStateOverride returns the original reference when there
|
|
170
|
-
// was nothing to merge — in that case there is no drift to record.
|
|
171
|
-
const shouldPersistOverride = !isTerminal &&
|
|
172
|
-
decision.override !== undefined &&
|
|
173
|
-
decision.persistOverride !== false &&
|
|
174
|
-
effectiveState !== selectedState;
|
|
175
|
-
if (shouldPersistOverride) {
|
|
176
|
-
this.session = persistStateDefinition(this.session, effectiveState);
|
|
177
|
-
}
|
|
178
|
-
this.session = recordStateStarted(this.session, effectiveState, isTerminal ? undefined : decision.input);
|
|
179
|
-
this.config.onSessionChanged?.(this.session);
|
|
180
|
-
switch (effectiveState.kind) {
|
|
181
|
-
case "agent":
|
|
182
|
-
return this.runAgentState(effectiveState);
|
|
183
|
-
case "script":
|
|
184
|
-
return this.runScriptState(effectiveState);
|
|
185
|
-
case "poll":
|
|
186
|
-
return this.runPollState(effectiveState);
|
|
187
|
-
case "timer":
|
|
188
|
-
return this.runTimerState(effectiveState);
|
|
189
|
-
case "terminal":
|
|
190
|
-
return this.runTerminalState(effectiveState, decision.reason);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
async wake() {
|
|
194
|
-
const state = currentScheduledState(this.session);
|
|
195
|
-
if (!state)
|
|
196
|
-
return undefined;
|
|
197
|
-
return state.kind === "poll" ? this.runPollState(state) : this.runTimerState(state, true);
|
|
198
|
-
}
|
|
199
|
-
async runAgentState(state) {
|
|
200
|
-
const prompt = renderTemplate(state.prompt, this.session?.currentInput ?? {});
|
|
201
|
-
const agent = this.config.createStateAgent({ state, prompt });
|
|
202
|
-
const finished = createDeferredVoid();
|
|
203
|
-
const run = {
|
|
204
|
-
kind: "agent",
|
|
205
|
-
state: state.name,
|
|
206
|
-
agent,
|
|
207
|
-
finished: finished.promise,
|
|
208
|
-
};
|
|
209
|
-
this.activeRun = run;
|
|
210
|
-
try {
|
|
211
|
-
const terminal = await agent.prompt();
|
|
212
|
-
if (terminal.type === "interrupted") {
|
|
213
|
-
this.recordInterruptedState(run, state.name);
|
|
214
|
-
return { type: "interrupted" };
|
|
215
|
-
}
|
|
216
|
-
if (terminal.type === "ask") {
|
|
217
|
-
this.session = recordStateAskedUser(this.requireSession(), state.name, terminal.questions);
|
|
218
|
-
return { type: "ask", questions: terminal.questions };
|
|
219
|
-
}
|
|
220
|
-
if (terminal.type === "failed") {
|
|
221
|
-
this.session = recordStateFailed(this.requireSession(), state.name, terminal.error);
|
|
222
|
-
return { type: "terminal", status: "error", error: terminal.error };
|
|
223
|
-
}
|
|
224
|
-
const output = { result: terminal.result };
|
|
225
|
-
this.session = recordStateCompleted(this.requireSession(), state.name, output);
|
|
226
|
-
return { type: "state_completed", stateName: state.name, output };
|
|
227
|
-
}
|
|
228
|
-
finally {
|
|
229
|
-
if (this.activeRun === run)
|
|
230
|
-
this.activeRun = undefined;
|
|
231
|
-
finished.resolve();
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
async runScriptState(state) {
|
|
235
|
-
const command = renderTemplate(state.command, this.session?.currentInput ?? {});
|
|
236
|
-
const shell = createShellStateHandle({
|
|
237
|
-
command,
|
|
238
|
-
cwd: resolveStateCwd(state.cwd, this.config.cwd),
|
|
239
|
-
timeoutMs: state.timeoutMs,
|
|
240
|
-
successCodes: state.successCodes,
|
|
241
|
-
});
|
|
242
|
-
const finished = createDeferredVoid();
|
|
243
|
-
const run = {
|
|
244
|
-
kind: "script",
|
|
245
|
-
state: state.name,
|
|
246
|
-
shell,
|
|
247
|
-
finished: finished.promise,
|
|
248
|
-
};
|
|
249
|
-
this.activeRun = run;
|
|
250
|
-
try {
|
|
251
|
-
const shellOutput = await shell.run();
|
|
252
|
-
const rawOutput = normalizeStructuredShellOutput(shellOutput, state.name);
|
|
253
|
-
this.session = recordStateCompleted(this.requireSession(), state.name, rawOutput);
|
|
254
|
-
return { type: "state_completed", stateName: state.name, output: rawOutput };
|
|
255
|
-
}
|
|
256
|
-
catch (error) {
|
|
257
|
-
if (shell.interruptedReason() !== undefined) {
|
|
258
|
-
this.recordInterruptedState(run, state.name, shellPartialOutput(error));
|
|
259
|
-
return { type: "interrupted" };
|
|
260
|
-
}
|
|
261
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
262
|
-
this.session = recordStateFailed(this.requireSession(), state.name, message);
|
|
263
|
-
return { type: "terminal", status: "error", error: message };
|
|
264
|
-
}
|
|
265
|
-
finally {
|
|
266
|
-
if (this.activeRun === run)
|
|
267
|
-
this.activeRun = undefined;
|
|
268
|
-
finished.resolve();
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
async runPollState(state) {
|
|
272
|
-
const elapsedMs = elapsedSinceStateStarted(this.session, state.name);
|
|
273
|
-
if (state.timeoutMs !== undefined && elapsedMs >= state.timeoutMs) {
|
|
274
|
-
const message = `Poll state "${state.name}" timed out after ${elapsedMs}ms.`;
|
|
275
|
-
this.session = recordStateFailed(this.requireSession(), state.name, message);
|
|
276
|
-
return { type: "terminal", status: "error", error: message };
|
|
277
|
-
}
|
|
278
|
-
const command = renderTemplate(state.command, this.session?.currentInput ?? {});
|
|
279
|
-
const shell = createShellStateHandle({
|
|
280
|
-
command,
|
|
281
|
-
cwd: resolveStateCwd(state.cwd, this.config.cwd),
|
|
282
|
-
successCodes: state.successCodes,
|
|
283
|
-
});
|
|
284
|
-
const finished = createDeferredVoid();
|
|
285
|
-
const run = { kind: "poll", state, shell, finished: finished.promise };
|
|
286
|
-
this.activeRun = run;
|
|
287
|
-
try {
|
|
288
|
-
// Poll success is determined purely by the script's exit code being
|
|
289
|
-
// in `successCodes` (default [0]). `shell.run()` resolves when the
|
|
290
|
-
// exit code is in the success set and rejects otherwise, so reaching
|
|
291
|
-
// this branch means "this poll attempt found a result." Stdout is
|
|
292
|
-
// parsed as JSON when possible for convenience, but the result of
|
|
293
|
-
// that parse does NOT affect whether the poll completes.
|
|
294
|
-
const shellOutput = await shell.run();
|
|
295
|
-
const rawOutput = normalizePollShellOutput(shellOutput, state.name);
|
|
296
|
-
// Guard against a misconfigured poll gate that exits success on every
|
|
297
|
-
// tick: it is read as "condition met" and handed back to the orchestrator,
|
|
298
|
-
// which re-selects it and hot-loops without ever honoring intervalMs.
|
|
299
|
-
// Enough back-to-back successes of the same poll is the signature of an
|
|
300
|
-
// always-true gate (the `echo`/`exit 0` human-wait footgun), so fail fast
|
|
301
|
-
// with an actionable message instead of spinning. See
|
|
302
|
-
// consecutivePollGateSuccesses for why healthy polls cannot reach the
|
|
303
|
-
// threshold. The current success is not recorded yet, hence the +1.
|
|
304
|
-
const successStreak = consecutivePollGateSuccesses(this.requireSession(), state.name) + 1;
|
|
305
|
-
if (successStreak >= MISCONFIGURED_POLL_GATE_THRESHOLD) {
|
|
306
|
-
const message = misconfiguredPollGateMessage(state.name, successStreak);
|
|
307
|
-
this.session = recordStateFailed(this.requireSession(), state.name, message);
|
|
308
|
-
return { type: "terminal", status: "error", error: message };
|
|
309
|
-
}
|
|
310
|
-
this.session = recordStateCompleted(this.requireSession(), state.name, rawOutput);
|
|
311
|
-
return { type: "state_completed", stateName: state.name, output: rawOutput };
|
|
312
|
-
}
|
|
313
|
-
catch (error) {
|
|
314
|
-
if (shell.interruptedReason() !== undefined) {
|
|
315
|
-
this.recordInterruptedState(run, state.name, shellPartialOutput(error));
|
|
316
|
-
return { type: "interrupted" };
|
|
317
|
-
}
|
|
318
|
-
// Exit code not in `successCodes` (or shell error) → keep polling.
|
|
319
|
-
const wakeAt = Date.now() + parseDurationToMs(state.intervalMs, `poll "${state.name}" intervalMs`);
|
|
320
|
-
this.session = recordStateSleep(this.requireSession(), state, wakeAt);
|
|
321
|
-
return { type: "sleep", wakeAt };
|
|
322
|
-
}
|
|
323
|
-
finally {
|
|
324
|
-
if (this.activeRun === run)
|
|
325
|
-
this.activeRun = undefined;
|
|
326
|
-
finished.resolve();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
runTimerState(state, woke = false) {
|
|
330
|
-
const wakeAt = resolveTimerWakeAt(state, this.session);
|
|
331
|
-
if (!woke && wakeAt > Date.now()) {
|
|
332
|
-
this.session = recordStateSleep(this.requireSession(), state, wakeAt);
|
|
333
|
-
return { type: "sleep", wakeAt };
|
|
334
|
-
}
|
|
335
|
-
const output = {
|
|
336
|
-
elapsedMs: elapsedSinceStateStarted(this.session, state.name),
|
|
337
|
-
timestamp: Date.now(),
|
|
338
|
-
};
|
|
339
|
-
this.session = recordStateCompleted(this.requireSession(), state.name, output);
|
|
340
|
-
return { type: "state_completed", stateName: state.name, output };
|
|
341
|
-
}
|
|
342
|
-
async runTerminalState(state, decisionReason) {
|
|
343
|
-
// Caller-supplied reason wins over the state's default — that lets the
|
|
344
|
-
// model pass a specific failure explanation when selecting `failed`,
|
|
345
|
-
// without losing the static `reason` on bespoke terminals when no
|
|
346
|
-
// override is provided.
|
|
347
|
-
const reason = decisionReason ?? state.reason;
|
|
348
|
-
const terminal = { state: state.name, status: state.status, reason };
|
|
349
|
-
this.session = recordStateMachineCompleted(this.requireSession(), terminal);
|
|
350
|
-
return { type: "terminal", status: state.status, result: reason };
|
|
351
|
-
}
|
|
352
|
-
recordInterruptedState(run, stateName, output) {
|
|
353
|
-
const session = this.requireSession();
|
|
354
|
-
const reason = runInterruptedReason(run);
|
|
355
|
-
const last = session.history.at(-1);
|
|
356
|
-
if (session.currentState === INTERRUPTED_STATE_MACHINE_STATE &&
|
|
357
|
-
last?.type === "state_interrupted" &&
|
|
358
|
-
last.state === stateName) {
|
|
359
|
-
this.session = {
|
|
360
|
-
...session,
|
|
361
|
-
history: [
|
|
362
|
-
...session.history.slice(0, -1),
|
|
363
|
-
{
|
|
364
|
-
...last,
|
|
365
|
-
reason: reason ?? last.reason,
|
|
366
|
-
output: output ?? last.output,
|
|
367
|
-
},
|
|
368
|
-
],
|
|
369
|
-
updatedAt: Date.now(),
|
|
370
|
-
};
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
this.session = recordStateInterrupted(session, stateName, reason ?? "Interrupted", output);
|
|
374
|
-
}
|
|
375
|
-
interruptedOutput(run) {
|
|
376
|
-
if (run.kind === "agent") {
|
|
377
|
-
const assistantText = run.agent.partialAssistantText();
|
|
378
|
-
return assistantText ? { assistantText } : undefined;
|
|
379
|
-
}
|
|
380
|
-
return run.shell.partialOutput();
|
|
381
|
-
}
|
|
382
|
-
interruptibleStateName(run) {
|
|
383
|
-
if (run.kind === "agent")
|
|
384
|
-
return run.state;
|
|
385
|
-
if (run.kind === "script")
|
|
386
|
-
return run.state;
|
|
387
|
-
return run.state.name;
|
|
388
|
-
}
|
|
389
|
-
requireSession() {
|
|
390
|
-
if (!this.session) {
|
|
391
|
-
throw new Error("No state machine is active.");
|
|
392
|
-
}
|
|
393
|
-
return this.session;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
// Timer states accept either an absolute `wakeAt` or a relative `wakeAfterMs`.
|
|
397
|
-
// Each may be a raw millisecond number or a human-readable string (ISO 8601
|
|
398
|
-
// for `wakeAt`, `ms`-style duration for `wakeAfterMs`). Relative timers are
|
|
399
|
-
// resolved against the moment the parent selected the state — captured as
|
|
400
|
-
// `startedAt` in progress — so the wake stays stable across sleep/wake cycles
|
|
401
|
-
// even though the controller re-enters the state.
|
|
402
|
-
function resolveTimerWakeAt(state, session) {
|
|
403
|
-
if (state.wakeAt !== undefined) {
|
|
404
|
-
return parseWakeAtToMs(state.wakeAt, `timer "${state.name}" wakeAt`);
|
|
405
|
-
}
|
|
406
|
-
if (state.wakeAfterMs === undefined) {
|
|
407
|
-
throw new Error(`Timer state "${state.name}" must specify wakeAt or wakeAfterMs.`);
|
|
408
|
-
}
|
|
409
|
-
const wakeAfterMs = parseDurationToMs(state.wakeAfterMs, `timer "${state.name}" wakeAfterMs`);
|
|
410
|
-
const startedAt = session?.progress?.states[state.name]?.startedAt ?? Date.now();
|
|
411
|
-
return startedAt + wakeAfterMs;
|
|
412
|
-
}
|
|
413
|
-
function normalizeStructuredShellOutput(shellOutput, stateName) {
|
|
414
|
-
const stdout = shellOutput.stdout.trim();
|
|
415
|
-
const stderr = shellOutput.stderr.trim();
|
|
416
|
-
const cappedStdout = capStreamForPrompt(stdout, stateName, "stdout");
|
|
417
|
-
// `parseStructuredOutput` returns the original text under `result` for
|
|
418
|
-
// non-JSON stdout, so an uncapped fallback would smuggle the full firehose
|
|
419
|
-
// back into the prompt through `parsed` even after we capped `stdout`.
|
|
420
|
-
// Detect that exact fallback (`result` is the full trimmed stdout) and reuse
|
|
421
|
-
// the already-capped string; genuine JSON output is small and passes through.
|
|
422
|
-
const parsed = parseStructuredOutput(stdout);
|
|
423
|
-
return {
|
|
424
|
-
...shellOutput,
|
|
425
|
-
stdout: cappedStdout,
|
|
426
|
-
stderr: capStreamForPrompt(stderr, stateName, "stderr"),
|
|
427
|
-
parsed: parsed.result === stdout ? { result: cappedStdout } : parsed,
|
|
428
|
-
};
|
|
429
|
-
}
|
|
430
|
-
function normalizePollShellOutput(shellOutput, stateName) {
|
|
431
|
-
return {
|
|
432
|
-
...shellOutput,
|
|
433
|
-
stdout: capStreamForPrompt(shellOutput.stdout.trim(), stateName, "stdout"),
|
|
434
|
-
stderr: capStreamForPrompt(shellOutput.stderr.trim(), stateName, "stderr"),
|
|
435
|
-
// Poll `parsed` only keeps JSON objects (`{}` otherwise), so it can never
|
|
436
|
-
// re-inject raw text the way the structured fallback can — no cap needed.
|
|
437
|
-
parsed: parseJsonObject(shellOutput.stdout),
|
|
438
|
-
};
|
|
439
|
-
}
|
|
440
|
-
/**
|
|
441
|
-
* Maximum characters of a single script/poll output stream (stdout or stderr)
|
|
442
|
-
* that the controller will inline into the orchestrator's state-completion
|
|
443
|
-
* wake prompt. A state that pipes a whole test log or build transcript back
|
|
444
|
-
* through stdout can otherwise bloat the decision turn to tens of thousands of
|
|
445
|
-
* tokens, which both wastes context and makes the decision request fragile
|
|
446
|
-
* enough to abort and loop. The orchestrator only needs enough to route; the
|
|
447
|
-
* consuming agent state reads the full artifact from disk.
|
|
448
|
-
*/
|
|
449
|
-
const MAX_STATE_OUTPUT_STREAM_CHARS = 16_000;
|
|
450
|
-
/**
|
|
451
|
-
* Caps one output stream for the wake prompt. Below the limit the stream is
|
|
452
|
-
* returned unchanged. Above it, the full stream is written to a file under the
|
|
453
|
-
* OS temp dir and the inlined value is replaced with a head+tail excerpt plus a
|
|
454
|
-
* pointer to that file, so the orchestrator (or a downstream state) can read
|
|
455
|
-
* the complete output on demand without it ever entering the prompt verbatim.
|
|
456
|
-
*/
|
|
457
|
-
function capStreamForPrompt(stream, stateName, label) {
|
|
458
|
-
if (stream.length <= MAX_STATE_OUTPUT_STREAM_CHARS)
|
|
459
|
-
return stream;
|
|
460
|
-
const overflowPath = writeOverflowFile(stream, stateName, label);
|
|
461
|
-
const headChars = Math.floor(MAX_STATE_OUTPUT_STREAM_CHARS * 0.3);
|
|
462
|
-
const tailChars = MAX_STATE_OUTPUT_STREAM_CHARS - headChars;
|
|
463
|
-
const head = stream.slice(0, headChars);
|
|
464
|
-
const tail = stream.slice(stream.length - tailChars);
|
|
465
|
-
const omitted = stream.length - headChars - tailChars;
|
|
466
|
-
return (`${head}\n\n` +
|
|
467
|
-
`…[${label} truncated for the orchestrator: ${omitted} of ${stream.length} ` +
|
|
468
|
-
`characters omitted. Full ${label} written to ${overflowPath} — read that file ` +
|
|
469
|
-
`(or hand its path to a downstream state) if you need the complete output.]…\n\n` +
|
|
470
|
-
`${tail}`);
|
|
471
|
-
}
|
|
472
|
-
function writeOverflowFile(content, stateName, label) {
|
|
473
|
-
const dir = join(tmpdir(), "duet-relay-output");
|
|
474
|
-
mkdirSync(dir, { recursive: true });
|
|
475
|
-
const safeState = stateName.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
476
|
-
const file = join(dir, `${safeState}-${label}-${Date.now()}.log`);
|
|
477
|
-
writeFileSync(file, content, "utf8");
|
|
478
|
-
return file;
|
|
479
|
-
}
|
|
480
|
-
function misconfiguredPollGateMessage(stateName, successStreak) {
|
|
481
|
-
return (`Poll state "${stateName}" completed successfully ${successStreak} times in a row with no state change in between. ` +
|
|
482
|
-
"A poll's command must exit success ONLY when the awaited condition is actually met and exit non-success otherwise, so intervalMs can space out re-checks; " +
|
|
483
|
-
'a command that exits 0 on every tick (e.g. `echo waiting for review`) is read as "condition met" and hot-loops the relay instead of waiting. ' +
|
|
484
|
-
"If this gate is waiting on a human approval or reply, model it as an agent state that asks the user a question and stops — the reply wakes the relay — rather than as a poll.");
|
|
485
|
-
}
|
|
486
|
-
function shellPartialOutput(error) {
|
|
487
|
-
if (!(error instanceof ShellCommandError))
|
|
488
|
-
return undefined;
|
|
489
|
-
return { stdout: error.output.stdout, stderr: error.output.stderr };
|
|
490
|
-
}
|
|
491
|
-
function runInterruptedReason(run) {
|
|
492
|
-
return run.kind === "agent" ? run.agent.interruptedReason() : run.shell.interruptedReason();
|
|
493
|
-
}
|
|
494
|
-
function createDeferredVoid() {
|
|
495
|
-
let resolve = () => { };
|
|
496
|
-
const promise = new Promise((innerResolve) => {
|
|
497
|
-
resolve = innerResolve;
|
|
498
|
-
});
|
|
499
|
-
return { promise, resolve };
|
|
500
|
-
}
|
|
501
|
-
//# sourceMappingURL=state-machine-controller.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-machine-controller.js","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-controller.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|