@duetso/agent 0.2.1 → 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.
Files changed (244) hide show
  1. package/README.md +19 -11
  2. package/dist/package.json +4 -4
  3. package/dist/src/cli/config.d.ts +10 -0
  4. package/dist/src/cli/config.d.ts.map +1 -0
  5. package/dist/src/cli/config.js +24 -0
  6. package/dist/src/cli/config.js.map +1 -0
  7. package/dist/src/cli/help.d.ts.map +1 -1
  8. package/dist/src/cli/help.js +13 -10
  9. package/dist/src/cli/help.js.map +1 -1
  10. package/dist/src/cli/inline-slash.d.ts +2 -1
  11. package/dist/src/cli/inline-slash.d.ts.map +1 -1
  12. package/dist/src/cli/inline-slash.js +14 -5
  13. package/dist/src/cli/inline-slash.js.map +1 -1
  14. package/dist/src/cli/memory-db.d.ts.map +1 -1
  15. package/dist/src/cli/memory-db.js +9 -5
  16. package/dist/src/cli/memory-db.js.map +1 -1
  17. package/dist/src/cli/memory-query.d.ts +1 -1
  18. package/dist/src/cli/model.d.ts +1 -1
  19. package/dist/src/cli/model.d.ts.map +1 -1
  20. package/dist/src/cli/model.js +1 -1
  21. package/dist/src/cli/model.js.map +1 -1
  22. package/dist/src/cli/route.d.ts +84 -0
  23. package/dist/src/cli/route.d.ts.map +1 -0
  24. package/dist/src/cli/route.js +261 -0
  25. package/dist/src/cli/route.js.map +1 -0
  26. package/dist/src/cli/rpc.d.ts +43 -2
  27. package/dist/src/cli/rpc.d.ts.map +1 -1
  28. package/dist/src/cli/rpc.js +176 -23
  29. package/dist/src/cli/rpc.js.map +1 -1
  30. package/dist/src/cli/run.d.ts +8 -1
  31. package/dist/src/cli/run.d.ts.map +1 -1
  32. package/dist/src/cli/run.js +24 -7
  33. package/dist/src/cli/run.js.map +1 -1
  34. package/dist/src/cli/shared.d.ts +4 -3
  35. package/dist/src/cli/shared.d.ts.map +1 -1
  36. package/dist/src/cli/shared.js +3 -4
  37. package/dist/src/cli/shared.js.map +1 -1
  38. package/dist/src/cli/shutdown.d.ts +4 -2
  39. package/dist/src/cli/shutdown.d.ts.map +1 -1
  40. package/dist/src/cli/shutdown.js +4 -2
  41. package/dist/src/cli/shutdown.js.map +1 -1
  42. package/dist/src/cli.d.ts +2 -0
  43. package/dist/src/cli.d.ts.map +1 -1
  44. package/dist/src/cli.js +12 -0
  45. package/dist/src/cli.js.map +1 -1
  46. package/dist/src/core/structured-output.d.ts +2 -0
  47. package/dist/src/core/structured-output.d.ts.map +1 -1
  48. package/dist/src/core/structured-output.js +1 -0
  49. package/dist/src/core/structured-output.js.map +1 -1
  50. package/dist/src/lib/system-reminder.d.ts +14 -0
  51. package/dist/src/lib/system-reminder.d.ts.map +1 -0
  52. package/dist/src/lib/system-reminder.js +53 -0
  53. package/dist/src/lib/system-reminder.js.map +1 -0
  54. package/dist/src/lib/walk-ancestors.d.ts +9 -0
  55. package/dist/src/lib/walk-ancestors.d.ts.map +1 -0
  56. package/dist/src/lib/walk-ancestors.js +28 -0
  57. package/dist/src/lib/walk-ancestors.js.map +1 -0
  58. package/dist/src/memory/observational-prompts.d.ts.map +1 -1
  59. package/dist/src/memory/observational-prompts.js +2 -1
  60. package/dist/src/memory/observational-prompts.js.map +1 -1
  61. package/dist/src/memory/observational.d.ts +31 -4
  62. package/dist/src/memory/observational.d.ts.map +1 -1
  63. package/dist/src/memory/observational.js +43 -4
  64. package/dist/src/memory/observational.js.map +1 -1
  65. package/dist/src/model-resolution/catalog.d.ts +2 -2
  66. package/dist/src/model-resolution/catalog.d.ts.map +1 -1
  67. package/dist/src/model-resolution/catalog.js +61 -33
  68. package/dist/src/model-resolution/catalog.js.map +1 -1
  69. package/dist/src/model-resolution/duet-gateway.d.ts +3 -3
  70. package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
  71. package/dist/src/model-resolution/duet-gateway.js +119 -19
  72. package/dist/src/model-resolution/duet-gateway.js.map +1 -1
  73. package/dist/src/model-resolution/model-gateway.d.ts.map +1 -0
  74. package/dist/src/{cli → model-resolution}/model-gateway.js +10 -6
  75. package/dist/src/model-resolution/model-gateway.js.map +1 -0
  76. package/dist/src/model-resolution/resolver.d.ts +11 -4
  77. package/dist/src/model-resolution/resolver.d.ts.map +1 -1
  78. package/dist/src/model-resolution/resolver.js +39 -8
  79. package/dist/src/model-resolution/resolver.js.map +1 -1
  80. package/dist/src/model-routing/advisor-transcript.d.ts +36 -0
  81. package/dist/src/model-routing/advisor-transcript.d.ts.map +1 -0
  82. package/dist/src/model-routing/advisor-transcript.js +103 -0
  83. package/dist/src/model-routing/advisor-transcript.js.map +1 -0
  84. package/dist/src/model-routing/advisor.d.ts +27 -0
  85. package/dist/src/model-routing/advisor.d.ts.map +1 -0
  86. package/dist/src/model-routing/advisor.js +20 -0
  87. package/dist/src/model-routing/advisor.js.map +1 -0
  88. package/dist/src/model-routing/classifier.d.ts +57 -0
  89. package/dist/src/model-routing/classifier.d.ts.map +1 -0
  90. package/dist/src/model-routing/classifier.js +63 -0
  91. package/dist/src/model-routing/classifier.js.map +1 -0
  92. package/dist/src/model-routing/loader.d.ts +48 -0
  93. package/dist/src/model-routing/loader.d.ts.map +1 -0
  94. package/dist/src/model-routing/loader.js +79 -0
  95. package/dist/src/model-routing/loader.js.map +1 -0
  96. package/dist/src/model-routing/prompts.d.ts +22 -0
  97. package/dist/src/model-routing/prompts.d.ts.map +1 -0
  98. package/dist/src/model-routing/prompts.js +87 -0
  99. package/dist/src/model-routing/prompts.js.map +1 -0
  100. package/dist/src/model-routing/resolve.d.ts +40 -0
  101. package/dist/src/model-routing/resolve.d.ts.map +1 -0
  102. package/dist/src/model-routing/resolve.js +76 -0
  103. package/dist/src/model-routing/resolve.js.map +1 -0
  104. package/dist/src/model-routing/router.d.ts +149 -0
  105. package/dist/src/model-routing/router.d.ts.map +1 -0
  106. package/dist/src/model-routing/router.js +235 -0
  107. package/dist/src/model-routing/router.js.map +1 -0
  108. package/dist/src/model-routing/step-triggers.d.ts +27 -0
  109. package/dist/src/model-routing/step-triggers.d.ts.map +1 -0
  110. package/dist/src/model-routing/step-triggers.js +20 -0
  111. package/dist/src/model-routing/step-triggers.js.map +1 -0
  112. package/dist/src/model-routing/table.d.ts +126 -0
  113. package/dist/src/model-routing/table.d.ts.map +1 -0
  114. package/dist/src/model-routing/table.js +351 -0
  115. package/dist/src/model-routing/table.js.map +1 -0
  116. package/dist/src/session/session.d.ts +40 -23
  117. package/dist/src/session/session.d.ts.map +1 -1
  118. package/dist/src/session/session.js +173 -97
  119. package/dist/src/session/session.js.map +1 -1
  120. package/dist/src/tasks/quiescence.d.ts +13 -0
  121. package/dist/src/tasks/quiescence.d.ts.map +1 -0
  122. package/dist/src/tasks/quiescence.js +11 -0
  123. package/dist/src/tasks/quiescence.js.map +1 -0
  124. package/dist/src/tasks/task-manager.d.ts +101 -0
  125. package/dist/src/tasks/task-manager.d.ts.map +1 -0
  126. package/dist/src/tasks/task-manager.js +311 -0
  127. package/dist/src/tasks/task-manager.js.map +1 -0
  128. package/dist/src/tasks/types.d.ts +85 -0
  129. package/dist/src/tasks/types.d.ts.map +1 -0
  130. package/dist/src/tasks/types.js +2 -0
  131. package/dist/src/tasks/types.js.map +1 -0
  132. package/dist/src/train/archive.d.ts +3 -0
  133. package/dist/src/train/archive.d.ts.map +1 -1
  134. package/dist/src/train/archive.js +7 -3
  135. package/dist/src/train/archive.js.map +1 -1
  136. package/dist/src/train/types.d.ts +7 -2
  137. package/dist/src/train/types.d.ts.map +1 -1
  138. package/dist/src/tui/app.d.ts +1 -1
  139. package/dist/src/tui/app.d.ts.map +1 -1
  140. package/dist/src/tui/app.js +12 -2
  141. package/dist/src/tui/app.js.map +1 -1
  142. package/dist/src/tui/initial-prompt.d.ts.map +1 -1
  143. package/dist/src/tui/initial-prompt.js +0 -3
  144. package/dist/src/tui/initial-prompt.js.map +1 -1
  145. package/dist/src/tui/session-subscription.d.ts +3 -0
  146. package/dist/src/tui/session-subscription.d.ts.map +1 -1
  147. package/dist/src/tui/session-subscription.js +29 -5
  148. package/dist/src/tui/session-subscription.js.map +1 -1
  149. package/dist/src/tui/sidebar.d.ts +3 -0
  150. package/dist/src/tui/sidebar.d.ts.map +1 -1
  151. package/dist/src/tui/sidebar.js +19 -3
  152. package/dist/src/tui/sidebar.js.map +1 -1
  153. package/dist/src/tui/slash-commands.d.ts +12 -9
  154. package/dist/src/tui/slash-commands.d.ts.map +1 -1
  155. package/dist/src/tui/slash-commands.js +48 -10
  156. package/dist/src/tui/slash-commands.js.map +1 -1
  157. package/dist/src/tui/status-controller.d.ts +14 -9
  158. package/dist/src/tui/status-controller.d.ts.map +1 -1
  159. package/dist/src/tui/status-controller.js +26 -7
  160. package/dist/src/tui/status-controller.js.map +1 -1
  161. package/dist/src/tui/task-lane-renderer.d.ts +30 -0
  162. package/dist/src/tui/task-lane-renderer.d.ts.map +1 -0
  163. package/dist/src/tui/task-lane-renderer.js +93 -0
  164. package/dist/src/tui/task-lane-renderer.js.map +1 -0
  165. package/dist/src/tui/task-tree.d.ts +47 -0
  166. package/dist/src/tui/task-tree.d.ts.map +1 -0
  167. package/dist/src/tui/task-tree.js +190 -0
  168. package/dist/src/tui/task-tree.js.map +1 -0
  169. package/dist/src/tui/tool-formatters.js +3 -0
  170. package/dist/src/tui/tool-formatters.js.map +1 -1
  171. package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
  172. package/dist/src/turn-runner/agent-events.js +1 -0
  173. package/dist/src/turn-runner/agent-events.js.map +1 -1
  174. package/dist/src/turn-runner/duration.d.ts +2 -2
  175. package/dist/src/turn-runner/duration.js +3 -3
  176. package/dist/src/turn-runner/duration.js.map +1 -1
  177. package/dist/src/turn-runner/prompts.d.ts +5 -1
  178. package/dist/src/turn-runner/prompts.d.ts.map +1 -1
  179. package/dist/src/turn-runner/prompts.js +30 -6
  180. package/dist/src/turn-runner/prompts.js.map +1 -1
  181. package/dist/src/turn-runner/runtime-clock.d.ts +20 -0
  182. package/dist/src/turn-runner/runtime-clock.d.ts.map +1 -0
  183. package/dist/src/turn-runner/runtime-clock.js +38 -0
  184. package/dist/src/turn-runner/runtime-clock.js.map +1 -0
  185. package/dist/src/turn-runner/shell-state-handle.d.ts +0 -3
  186. package/dist/src/turn-runner/shell-state-handle.d.ts.map +1 -1
  187. package/dist/src/turn-runner/shell-state-handle.js +5 -55
  188. package/dist/src/turn-runner/shell-state-handle.js.map +1 -1
  189. package/dist/src/turn-runner/skill-context.d.ts +6 -7
  190. package/dist/src/turn-runner/skill-context.d.ts.map +1 -1
  191. package/dist/src/turn-runner/skill-context.js +10 -10
  192. package/dist/src/turn-runner/skill-context.js.map +1 -1
  193. package/dist/src/turn-runner/skills.d.ts.map +1 -1
  194. package/dist/src/turn-runner/skills.js +2 -22
  195. package/dist/src/turn-runner/skills.js.map +1 -1
  196. package/dist/src/turn-runner/state-compaction.d.ts +7 -5
  197. package/dist/src/turn-runner/state-compaction.d.ts.map +1 -1
  198. package/dist/src/turn-runner/state-compaction.js +69 -10
  199. package/dist/src/turn-runner/state-compaction.js.map +1 -1
  200. package/dist/src/turn-runner/state-machine-decisions.d.ts +135 -0
  201. package/dist/src/turn-runner/state-machine-decisions.d.ts.map +1 -0
  202. package/dist/src/turn-runner/state-machine-decisions.js +443 -0
  203. package/dist/src/turn-runner/state-machine-decisions.js.map +1 -0
  204. package/dist/src/turn-runner/state-machine-session.d.ts +13 -28
  205. package/dist/src/turn-runner/state-machine-session.d.ts.map +1 -1
  206. package/dist/src/turn-runner/state-machine-session.js +18 -55
  207. package/dist/src/turn-runner/state-machine-session.js.map +1 -1
  208. package/dist/src/turn-runner/subagent.d.ts +156 -0
  209. package/dist/src/turn-runner/subagent.d.ts.map +1 -0
  210. package/dist/src/turn-runner/subagent.js +164 -0
  211. package/dist/src/turn-runner/subagent.js.map +1 -0
  212. package/dist/src/turn-runner/task-tools.d.ts +76 -0
  213. package/dist/src/turn-runner/task-tools.d.ts.map +1 -0
  214. package/dist/src/turn-runner/task-tools.js +370 -0
  215. package/dist/src/turn-runner/task-tools.js.map +1 -0
  216. package/dist/src/turn-runner/tools.d.ts +65 -17
  217. package/dist/src/turn-runner/tools.d.ts.map +1 -1
  218. package/dist/src/turn-runner/tools.js +173 -59
  219. package/dist/src/turn-runner/tools.js.map +1 -1
  220. package/dist/src/turn-runner/turn-runner.d.ts +198 -134
  221. package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
  222. package/dist/src/turn-runner/turn-runner.js +1302 -713
  223. package/dist/src/turn-runner/turn-runner.js.map +1 -1
  224. package/dist/src/turn-runner/usage-accounting.d.ts +4 -0
  225. package/dist/src/turn-runner/usage-accounting.d.ts.map +1 -1
  226. package/dist/src/turn-runner/usage-accounting.js +19 -0
  227. package/dist/src/turn-runner/usage-accounting.js.map +1 -1
  228. package/dist/src/types/config.d.ts +9 -1
  229. package/dist/src/types/config.d.ts.map +1 -1
  230. package/dist/src/types/config.js +2 -1
  231. package/dist/src/types/config.js.map +1 -1
  232. package/dist/src/types/protocol.d.ts +110 -30
  233. package/dist/src/types/protocol.d.ts.map +1 -1
  234. package/dist/src/types/state-machine.d.ts +10 -12
  235. package/dist/src/types/state-machine.d.ts.map +1 -1
  236. package/dist/src/types/state-machine.js.map +1 -1
  237. package/package.json +4 -4
  238. package/dist/src/cli/model-gateway.d.ts.map +0 -1
  239. package/dist/src/cli/model-gateway.js.map +0 -1
  240. package/dist/src/turn-runner/state-machine-controller.d.ts +0 -140
  241. package/dist/src/turn-runner/state-machine-controller.d.ts.map +0 -1
  242. package/dist/src/turn-runner/state-machine-controller.js +0 -501
  243. package/dist/src/turn-runner/state-machine-controller.js.map +0 -1
  244. /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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"}