@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.
- 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 +13 -10
- 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-db.d.ts.map +1 -1
- package/dist/src/cli/memory-db.js +9 -5
- package/dist/src/cli/memory-db.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/train/archive.d.ts +3 -0
- package/dist/src/train/archive.d.ts.map +1 -1
- package/dist/src/train/archive.js +7 -3
- package/dist/src/train/archive.js.map +1 -1
- package/dist/src/train/types.d.ts +7 -2
- package/dist/src/train/types.d.ts.map +1 -1
- 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
|
@@ -0,0 +1,443 @@
|
|
|
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, createStateMachineSession, currentScheduledState, elapsedSinceStateStarted, findState, MISCONFIGURED_POLL_GATE_THRESHOLD, persistStateDefinition, recordRunnerDecision, recordStateCompleted, recordStateFailed, recordStateInterrupted, recordStateMachineCompleted, recordStateMachineReactivated, recordStateSleep, recordStateStarted, } from "./state-machine-session.js";
|
|
7
|
+
export { consecutivePollGateSuccesses, MISCONFIGURED_POLL_GATE_THRESHOLD, repeatedSelectionLoopCount, repeatedStateSelectionStreak, REPEATED_SELECTION_LOOP_THRESHOLD, REPEATED_SELECTION_LOOP_WINDOW_MS, } from "./state-machine-session.js";
|
|
8
|
+
export function hydrate(stateMachine) {
|
|
9
|
+
return stateMachine;
|
|
10
|
+
}
|
|
11
|
+
export function getSession(stateMachine) {
|
|
12
|
+
return stateMachine;
|
|
13
|
+
}
|
|
14
|
+
export function startSession(input) {
|
|
15
|
+
return createStateMachineSession(input.prompt, input.definition, input.currentState);
|
|
16
|
+
}
|
|
17
|
+
export function markTerminalAcknowledged(session) {
|
|
18
|
+
if (!session.terminal || session.terminalAcknowledged)
|
|
19
|
+
return session;
|
|
20
|
+
return {
|
|
21
|
+
...session,
|
|
22
|
+
terminalAcknowledged: true,
|
|
23
|
+
updatedAt: Date.now(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function failActiveSession(session, state, error) {
|
|
27
|
+
return {
|
|
28
|
+
session: recordStateFailed(session, state, error),
|
|
29
|
+
outcome: { type: "terminal", status: "error", error },
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function supersede(session, reason) {
|
|
33
|
+
return recordStateMachineCompleted(session, {
|
|
34
|
+
state: session.currentState ?? "",
|
|
35
|
+
status: "cancelled",
|
|
36
|
+
reason,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export function planDecision(stateMachine, decision, now = Date.now()) {
|
|
40
|
+
let session = recordRunnerDecision(stateMachine, decision);
|
|
41
|
+
const selectedState = findState(session, decision.state);
|
|
42
|
+
if (!selectedState) {
|
|
43
|
+
const validStates = session.definition.states.map((state) => state.name);
|
|
44
|
+
const message = `Unknown state: ${decision.state}. Valid states: ${validStates.join(", ")}`;
|
|
45
|
+
session = recordStateFailed(session, session.currentState ?? decision.state, message);
|
|
46
|
+
return {
|
|
47
|
+
session,
|
|
48
|
+
work: {
|
|
49
|
+
terminal: {
|
|
50
|
+
status: "error",
|
|
51
|
+
error: message,
|
|
52
|
+
stateName: session.currentState ?? decision.state,
|
|
53
|
+
ledger: "recorded",
|
|
54
|
+
notifyStarted: false,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const isTerminal = selectedState.kind === "terminal";
|
|
60
|
+
if (!isTerminal && session.terminal) {
|
|
61
|
+
session = recordStateMachineReactivated(session, selectedState.name);
|
|
62
|
+
}
|
|
63
|
+
const effectiveState = isTerminal
|
|
64
|
+
? selectedState
|
|
65
|
+
: applyStateOverride(selectedState, decision.override);
|
|
66
|
+
const shouldPersistOverride = !isTerminal &&
|
|
67
|
+
decision.override !== undefined &&
|
|
68
|
+
decision.persistOverride !== false &&
|
|
69
|
+
effectiveState !== selectedState;
|
|
70
|
+
if (shouldPersistOverride) {
|
|
71
|
+
session = persistStateDefinition(session, effectiveState);
|
|
72
|
+
}
|
|
73
|
+
session = recordStateStarted(session, effectiveState, isTerminal ? undefined : decision.input);
|
|
74
|
+
switch (effectiveState.kind) {
|
|
75
|
+
case "agent":
|
|
76
|
+
return {
|
|
77
|
+
session,
|
|
78
|
+
work: {
|
|
79
|
+
run: {
|
|
80
|
+
subagent: subagentSpec(effectiveState, session.currentInput),
|
|
81
|
+
stateName: effectiveState.name,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
case "script":
|
|
86
|
+
return {
|
|
87
|
+
session,
|
|
88
|
+
work: {
|
|
89
|
+
run: {
|
|
90
|
+
shell: {
|
|
91
|
+
command: renderTemplate(effectiveState.command, session.currentInput ?? {}),
|
|
92
|
+
cwd: effectiveState.cwd,
|
|
93
|
+
timeoutMs: effectiveState.timeoutMs,
|
|
94
|
+
successCodes: effectiveState.successCodes,
|
|
95
|
+
},
|
|
96
|
+
stateName: effectiveState.name,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
case "poll": {
|
|
101
|
+
const elapsedMs = elapsedSinceStateStarted(session, effectiveState.name);
|
|
102
|
+
if (effectiveState.timeoutMs !== undefined && elapsedMs >= effectiveState.timeoutMs) {
|
|
103
|
+
const message = `Poll state "${effectiveState.name}" timed out after ${elapsedMs}ms.`;
|
|
104
|
+
return {
|
|
105
|
+
session,
|
|
106
|
+
work: {
|
|
107
|
+
terminal: {
|
|
108
|
+
status: "error",
|
|
109
|
+
error: message,
|
|
110
|
+
stateName: effectiveState.name,
|
|
111
|
+
ledger: "failed",
|
|
112
|
+
notifyStarted: true,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
session,
|
|
119
|
+
work: {
|
|
120
|
+
run: {
|
|
121
|
+
shell: {
|
|
122
|
+
command: renderTemplate(effectiveState.command, session.currentInput ?? {}),
|
|
123
|
+
cwd: effectiveState.cwd,
|
|
124
|
+
successCodes: effectiveState.successCodes,
|
|
125
|
+
},
|
|
126
|
+
stateName: effectiveState.name,
|
|
127
|
+
pollPolicy: { intervalMs: effectiveState.intervalMs },
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
case "timer": {
|
|
133
|
+
const wakeAt = resolveTimerWakeAt(effectiveState, session, now);
|
|
134
|
+
return { session, work: { schedule: { wakeAt, stateName: effectiveState.name } } };
|
|
135
|
+
}
|
|
136
|
+
case "park":
|
|
137
|
+
return { session, work: { park: { stateName: effectiveState.name } } };
|
|
138
|
+
case "terminal": {
|
|
139
|
+
const reason = decision.reason ?? effectiveState.reason;
|
|
140
|
+
return {
|
|
141
|
+
session,
|
|
142
|
+
work: {
|
|
143
|
+
terminal: {
|
|
144
|
+
status: effectiveState.status,
|
|
145
|
+
result: reason,
|
|
146
|
+
stateName: effectiveState.name,
|
|
147
|
+
ledger: "completed",
|
|
148
|
+
notifyStarted: true,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export function planWake(stateMachine, now = Date.now()) {
|
|
156
|
+
const state = currentScheduledState(stateMachine);
|
|
157
|
+
if (!state || !stateMachine)
|
|
158
|
+
return undefined;
|
|
159
|
+
if (state.kind === "poll") {
|
|
160
|
+
const elapsedMs = elapsedSinceStateStarted(stateMachine, state.name);
|
|
161
|
+
if (state.timeoutMs !== undefined && elapsedMs >= state.timeoutMs) {
|
|
162
|
+
const message = `Poll state "${state.name}" timed out after ${elapsedMs}ms.`;
|
|
163
|
+
return {
|
|
164
|
+
session: stateMachine,
|
|
165
|
+
work: {
|
|
166
|
+
terminal: {
|
|
167
|
+
status: "error",
|
|
168
|
+
error: message,
|
|
169
|
+
stateName: state.name,
|
|
170
|
+
ledger: "failed",
|
|
171
|
+
notifyStarted: false,
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
session: stateMachine,
|
|
178
|
+
work: {
|
|
179
|
+
run: {
|
|
180
|
+
shell: {
|
|
181
|
+
command: renderTemplate(state.command, stateMachine.currentInput ?? {}),
|
|
182
|
+
cwd: state.cwd,
|
|
183
|
+
successCodes: state.successCodes,
|
|
184
|
+
},
|
|
185
|
+
stateName: state.name,
|
|
186
|
+
pollPolicy: { intervalMs: state.intervalMs },
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
resolveTimerWakeAt(state, stateMachine, now);
|
|
192
|
+
return {
|
|
193
|
+
session: stateMachine,
|
|
194
|
+
// A wake command means the persisted timer has fired. The turn loop's
|
|
195
|
+
// schedule branch completes immediately when wakeAt is not in the future;
|
|
196
|
+
// preserve the old `runTimerState(state, true)` behavior even if the
|
|
197
|
+
// caller's clock arrives a few milliseconds before the stored deadline.
|
|
198
|
+
work: { schedule: { wakeAt: now, stateName: state.name } },
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
export function recordScheduled(stateMachine, stateName, wakeAt) {
|
|
202
|
+
const state = findState(stateMachine, stateName);
|
|
203
|
+
if (!state || (state.kind !== "poll" && state.kind !== "timer")) {
|
|
204
|
+
throw new Error(`Scheduled state "${stateName}" is missing from the active definition.`);
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
session: recordStateSleep(stateMachine, state, wakeAt),
|
|
208
|
+
outcome: { type: "sleep", wakeAt },
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
export function recordPlannedTerminal(stateMachine, terminal) {
|
|
212
|
+
const outcome = {
|
|
213
|
+
type: "terminal",
|
|
214
|
+
status: terminal.status,
|
|
215
|
+
...(terminal.result !== undefined ? { result: terminal.result } : {}),
|
|
216
|
+
...(terminal.error !== undefined ? { error: terminal.error } : {}),
|
|
217
|
+
};
|
|
218
|
+
if (terminal.ledger === "recorded")
|
|
219
|
+
return { session: stateMachine, outcome };
|
|
220
|
+
if (terminal.ledger === "failed") {
|
|
221
|
+
return {
|
|
222
|
+
session: recordStateFailed(stateMachine, terminal.stateName, terminal.error ?? "Failed"),
|
|
223
|
+
outcome,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
session: recordStateMachineCompleted(stateMachine, {
|
|
228
|
+
state: terminal.stateName,
|
|
229
|
+
status: terminal.status === "error" ? "failed" : terminal.status,
|
|
230
|
+
reason: terminal.result,
|
|
231
|
+
}),
|
|
232
|
+
outcome,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
export function recordSettled(stateMachine, stateName, kind, result, partial, now = Date.now()) {
|
|
236
|
+
if (result.type === "complete") {
|
|
237
|
+
const output = { result: result.result };
|
|
238
|
+
return {
|
|
239
|
+
session: recordStateCompleted(stateMachine, stateName, output),
|
|
240
|
+
outcome: { type: "state_completed", stateName, output },
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
if (result.type === "interrupted") {
|
|
244
|
+
const session = recordInterrupted(stateMachine, stateName, ("reason" in result ? result.reason : undefined) ?? "Interrupted", partial);
|
|
245
|
+
return { session, outcome: { type: "interrupted" } };
|
|
246
|
+
}
|
|
247
|
+
if (result.type === "failed") {
|
|
248
|
+
if (kind === "poll") {
|
|
249
|
+
const state = findState(stateMachine, stateName);
|
|
250
|
+
if (!state || state.kind !== "poll") {
|
|
251
|
+
throw new Error(`Poll state "${stateName}" is missing from the active definition.`);
|
|
252
|
+
}
|
|
253
|
+
const wakeAt = now + parseDurationToMs(state.intervalMs, `poll "${stateName}" intervalMs`);
|
|
254
|
+
return {
|
|
255
|
+
session: recordStateSleep(stateMachine, state, wakeAt),
|
|
256
|
+
outcome: { type: "sleep", wakeAt },
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
session: recordStateFailed(stateMachine, stateName, result.error),
|
|
261
|
+
outcome: { type: "terminal", status: "error", error: result.error },
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
if (kind === "timer") {
|
|
265
|
+
return {
|
|
266
|
+
session: recordStateCompleted(stateMachine, stateName, result.output),
|
|
267
|
+
outcome: { type: "state_completed", stateName, output: result.output },
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
if (!isShellCommandOutput(result.output)) {
|
|
271
|
+
throw new Error(`${kind} state "${stateName}" settled without shell output.`);
|
|
272
|
+
}
|
|
273
|
+
const output = kind === "poll"
|
|
274
|
+
? normalizePollShellOutput(result.output, stateName)
|
|
275
|
+
: normalizeStructuredShellOutput(result.output, stateName);
|
|
276
|
+
if (kind === "poll") {
|
|
277
|
+
const successStreak = consecutivePollGateSuccesses(stateMachine, stateName) + 1;
|
|
278
|
+
if (successStreak >= MISCONFIGURED_POLL_GATE_THRESHOLD) {
|
|
279
|
+
const message = misconfiguredPollGateMessage(stateName, successStreak);
|
|
280
|
+
return {
|
|
281
|
+
session: recordStateFailed(stateMachine, stateName, message),
|
|
282
|
+
outcome: { type: "terminal", status: "error", error: message },
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
session: recordStateCompleted(stateMachine, stateName, output),
|
|
288
|
+
outcome: { type: "state_completed", stateName, output },
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function subagentSpec(state, input) {
|
|
292
|
+
return {
|
|
293
|
+
prompt: renderTemplate(state.prompt, input ?? {}),
|
|
294
|
+
...(state.systemPrompt ? { systemPrompt: state.systemPrompt } : {}),
|
|
295
|
+
...(state.allowedSkills ? { allowedSkills: state.allowedSkills } : {}),
|
|
296
|
+
...(state.cwd ? { cwd: state.cwd } : {}),
|
|
297
|
+
...(state.model ? { model: state.model } : {}),
|
|
298
|
+
...(state.thinkingLevel ? { thinkingLevel: state.thinkingLevel } : {}),
|
|
299
|
+
...(state.forkContext ? { forkContext: true } : {}),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
export function applyStateOverride(state, override) {
|
|
303
|
+
if (!override || override.kind !== state.kind)
|
|
304
|
+
return state;
|
|
305
|
+
const merged = { ...state, ...override.state };
|
|
306
|
+
if (merged.kind === "timer" && override.kind === "timer") {
|
|
307
|
+
const overrideState = override.state;
|
|
308
|
+
if ("wakeAt" in overrideState && overrideState.wakeAt !== undefined) {
|
|
309
|
+
delete merged.wakeAfterMs;
|
|
310
|
+
}
|
|
311
|
+
else if ("wakeAfterMs" in overrideState && overrideState.wakeAfterMs !== undefined) {
|
|
312
|
+
delete merged.wakeAt;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return merged;
|
|
316
|
+
}
|
|
317
|
+
function resolveTimerWakeAt(state, session, now) {
|
|
318
|
+
if (state.wakeAt !== undefined) {
|
|
319
|
+
return parseWakeAtToMs(state.wakeAt, `timer "${state.name}" wakeAt`);
|
|
320
|
+
}
|
|
321
|
+
if (state.wakeAfterMs === undefined) {
|
|
322
|
+
throw new Error(`Timer state "${state.name}" must specify wakeAt or wakeAfterMs.`);
|
|
323
|
+
}
|
|
324
|
+
const wakeAfterMs = parseDurationToMs(state.wakeAfterMs, `timer "${state.name}" wakeAfterMs`);
|
|
325
|
+
const startedAt = session.progress?.states[state.name]?.startedAt ?? now;
|
|
326
|
+
return startedAt + wakeAfterMs;
|
|
327
|
+
}
|
|
328
|
+
export function renderTemplate(template, input) {
|
|
329
|
+
return template.replace(/\{\{\s*input\.([A-Za-z0-9_.-]+)\s*\}\}/g, (_match, path) => {
|
|
330
|
+
const value = path.split(".").reduce((current, key) => {
|
|
331
|
+
if (!current || typeof current !== "object")
|
|
332
|
+
return undefined;
|
|
333
|
+
return current[key];
|
|
334
|
+
}, input);
|
|
335
|
+
return value === undefined || value === null
|
|
336
|
+
? ""
|
|
337
|
+
: typeof value === "string"
|
|
338
|
+
? value
|
|
339
|
+
: JSON.stringify(value);
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
function normalizeStructuredShellOutput(shellOutput, stateName) {
|
|
343
|
+
const stdout = shellOutput.stdout.trim();
|
|
344
|
+
const stderr = shellOutput.stderr.trim();
|
|
345
|
+
const cappedStdout = capStreamForPrompt(stdout, stateName, "stdout");
|
|
346
|
+
const parsed = parseStructuredOutput(stdout);
|
|
347
|
+
return {
|
|
348
|
+
...shellOutput,
|
|
349
|
+
stdout: cappedStdout,
|
|
350
|
+
stderr: capStreamForPrompt(stderr, stateName, "stderr"),
|
|
351
|
+
parsed: parsed.result === stdout ? { result: cappedStdout } : parsed,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function normalizePollShellOutput(shellOutput, stateName) {
|
|
355
|
+
return {
|
|
356
|
+
...shellOutput,
|
|
357
|
+
stdout: capStreamForPrompt(shellOutput.stdout.trim(), stateName, "stdout"),
|
|
358
|
+
stderr: capStreamForPrompt(shellOutput.stderr.trim(), stateName, "stderr"),
|
|
359
|
+
parsed: parseJsonObject(shellOutput.stdout),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
const MAX_STATE_OUTPUT_STREAM_CHARS = 16_000;
|
|
363
|
+
function capStreamForPrompt(stream, stateName, label) {
|
|
364
|
+
if (stream.length <= MAX_STATE_OUTPUT_STREAM_CHARS)
|
|
365
|
+
return stream;
|
|
366
|
+
const overflowPath = writeOverflowFile(stream, stateName, label);
|
|
367
|
+
const headChars = Math.floor(MAX_STATE_OUTPUT_STREAM_CHARS * 0.3);
|
|
368
|
+
const tailChars = MAX_STATE_OUTPUT_STREAM_CHARS - headChars;
|
|
369
|
+
const head = stream.slice(0, headChars);
|
|
370
|
+
const tail = stream.slice(stream.length - tailChars);
|
|
371
|
+
const omitted = stream.length - headChars - tailChars;
|
|
372
|
+
return (`${head}\n\n` +
|
|
373
|
+
`…[${label} truncated for the orchestrator: ${omitted} of ${stream.length} ` +
|
|
374
|
+
`characters omitted. Full ${label} written to ${overflowPath} — read that file ` +
|
|
375
|
+
`(or hand its path to a downstream state) if you need the complete output.]…\n\n` +
|
|
376
|
+
`${tail}`);
|
|
377
|
+
}
|
|
378
|
+
function writeOverflowFile(content, stateName, label) {
|
|
379
|
+
const dir = join(tmpdir(), "duet-relay-output");
|
|
380
|
+
mkdirSync(dir, { recursive: true });
|
|
381
|
+
const safeState = stateName.replace(/[^A-Za-z0-9_.-]/g, "_");
|
|
382
|
+
const file = join(dir, `${safeState}-${label}-${Date.now()}.log`);
|
|
383
|
+
writeFileSync(file, content, "utf8");
|
|
384
|
+
return file;
|
|
385
|
+
}
|
|
386
|
+
export function parseStructuredOutput(stdout) {
|
|
387
|
+
const trimmed = stdout.trim();
|
|
388
|
+
if (!trimmed)
|
|
389
|
+
return {};
|
|
390
|
+
try {
|
|
391
|
+
const parsed = JSON.parse(trimmed);
|
|
392
|
+
return typeof parsed === "object" && parsed !== null
|
|
393
|
+
? parsed
|
|
394
|
+
: { result: parsed };
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
return { result: trimmed };
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
export function parseJsonObject(text) {
|
|
401
|
+
const trimmed = text.trim();
|
|
402
|
+
if (!trimmed)
|
|
403
|
+
return {};
|
|
404
|
+
try {
|
|
405
|
+
const parsed = JSON.parse(trimmed);
|
|
406
|
+
return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
|
|
407
|
+
? parsed
|
|
408
|
+
: {};
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return {};
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
function isShellCommandOutput(output) {
|
|
415
|
+
return (typeof output === "object" &&
|
|
416
|
+
output !== null &&
|
|
417
|
+
"stdout" in output &&
|
|
418
|
+
"stderr" in output &&
|
|
419
|
+
"exitCode" in output);
|
|
420
|
+
}
|
|
421
|
+
function recordInterrupted(session, stateName, reason, output) {
|
|
422
|
+
const last = session.history.at(-1);
|
|
423
|
+
if (session.currentState === INTERRUPTED_STATE_MACHINE_STATE &&
|
|
424
|
+
last?.type === "state_interrupted" &&
|
|
425
|
+
last.state === stateName) {
|
|
426
|
+
return {
|
|
427
|
+
...session,
|
|
428
|
+
history: [
|
|
429
|
+
...session.history.slice(0, -1),
|
|
430
|
+
{ ...last, reason: reason ?? last.reason, output: output ?? last.output },
|
|
431
|
+
],
|
|
432
|
+
updatedAt: Date.now(),
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
return recordStateInterrupted(session, stateName, reason, output);
|
|
436
|
+
}
|
|
437
|
+
function misconfiguredPollGateMessage(stateName, successStreak) {
|
|
438
|
+
return (`Poll state "${stateName}" completed successfully ${successStreak} times in a row with no state change in between. ` +
|
|
439
|
+
"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; " +
|
|
440
|
+
'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. ' +
|
|
441
|
+
"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.");
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=state-machine-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-machine-decisions.js","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { StateMachineDefinition, StateMachinePollState, StateMachineSession, StateMachineState, StateMachineTimerState } from "../types/state-machine.js";
|
|
2
|
-
import type { TurnQuestion } from "../types/protocol.js";
|
|
1
|
+
import type { StateMachineDefinition, StateMachineParkState, StateMachinePollState, StateMachineSession, StateMachineState, StateMachineTimerState } from "../types/state-machine.js";
|
|
3
2
|
import type { StateMachineRunnerDecision } from "./tools.js";
|
|
4
3
|
/**
|
|
5
4
|
* Hard cap on retained `StateMachineSession.history` entries. Long-lived
|
|
@@ -16,22 +15,8 @@ export declare function findState(stateMachine: StateMachineSession, name: strin
|
|
|
16
15
|
export type StateMachineScheduledState = StateMachinePollState | StateMachineTimerState;
|
|
17
16
|
export declare function currentScheduledState(stateMachine: StateMachineSession | undefined): StateMachineScheduledState | undefined;
|
|
18
17
|
export declare function isWaitingOnScheduledState(stateMachine: StateMachineSession | undefined): boolean;
|
|
19
|
-
/**
|
|
20
|
-
|
|
21
|
-
* suspended at that state — i.e. scanning history from the tail, the first
|
|
22
|
-
* state-lifecycle event is `state_asked_user`, with no later state start,
|
|
23
|
-
* completion, failure, interruption, or terminal.
|
|
24
|
-
*
|
|
25
|
-
* When this holds, the parent owes a `select_state_machine_state` to advance
|
|
26
|
-
* the machine: the user's answer comes back as an ordinary parent prompt, and
|
|
27
|
-
* if the parent replies in text without selecting a state the machine would
|
|
28
|
-
* silently stall at the asking state. The turn runner uses this to enforce the
|
|
29
|
-
* transition the same way it does after a state completes. Bookkeeping events
|
|
30
|
-
* that don't move the machine (`runner_decided`, `state_definition_updated`,
|
|
31
|
-
* `state_machine_started`) are skipped as noise; a real lifecycle move ends
|
|
32
|
-
* the wait.
|
|
33
|
-
*/
|
|
34
|
-
export declare function isAwaitingUserAnswer(stateMachine: StateMachineSession | undefined): boolean;
|
|
18
|
+
/** The active inert park, if the machine currently holds without execution or a wake. */
|
|
19
|
+
export declare function currentParkState(stateMachine: StateMachineSession | undefined): StateMachineParkState | undefined;
|
|
35
20
|
export declare function recordRunnerDecision(stateMachine: StateMachineSession, decision: StateMachineRunnerDecision): StateMachineSession;
|
|
36
21
|
/**
|
|
37
22
|
* Replace one state in the active definition with a merged version,
|
|
@@ -64,7 +49,7 @@ export declare const MISCONFIGURED_POLL_GATE_THRESHOLD = 3;
|
|
|
64
49
|
* streak. The only way to accumulate consecutive same-poll completions is an
|
|
65
50
|
* always-exit-0 command (e.g. `echo waiting for review`) being re-selected as
|
|
66
51
|
* the same gate, which is exactly the hot-loop we want to surface. The
|
|
67
|
-
* current in-flight success is not yet recorded when the
|
|
52
|
+
* current in-flight success is not yet recorded when the turn loop calls
|
|
68
53
|
* this, so the returned count reflects only prior completions.
|
|
69
54
|
*/
|
|
70
55
|
export declare function consecutivePollGateSuccesses(stateMachine: StateMachineSession, pollName: string): number;
|
|
@@ -74,8 +59,9 @@ export declare function consecutivePollGateSuccesses(stateMachine: StateMachineS
|
|
|
74
59
|
* between — before the runner injects a loop warning into the next decision
|
|
75
60
|
* prompt. Set above a normal retry-with-correction streak (re-running a state
|
|
76
61
|
* two or three times with a fixed `override.prompt` is legitimate) so the
|
|
77
|
-
* warning targets idle "holding" loops where the parent re-selects
|
|
78
|
-
* "keep waiting"
|
|
62
|
+
* warning targets idle "holding" loops where the parent re-selects executable
|
|
63
|
+
* work to "keep waiting" rather than productive retries. Park states are
|
|
64
|
+
* exempt because re-selecting the same park is a legal no-work hold.
|
|
79
65
|
*/
|
|
80
66
|
export declare const REPEATED_SELECTION_LOOP_THRESHOLD = 5;
|
|
81
67
|
/**
|
|
@@ -95,11 +81,10 @@ export declare const REPEATED_SELECTION_LOOP_WINDOW_MS: number;
|
|
|
95
81
|
* "holding" state again and again to "keep waiting" — a no-op, since selecting a
|
|
96
82
|
* state runs it immediately rather than suspending the machine. Unlike
|
|
97
83
|
* `consecutivePollGateSuccesses` (which counts completions of an always-true
|
|
98
|
-
* poll), this counts `state_started` events for
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* other work never accumulates.
|
|
84
|
+
* poll), this telemetry counts `state_started` events for every state kind;
|
|
85
|
+
* the trip policy separately exempts park. A lifecycle event naming a
|
|
86
|
+
* *different* state means the machine actually moved on, so the streak resets
|
|
87
|
+
* and a normal plan that revisits a state after doing other work never accumulates.
|
|
103
88
|
*/
|
|
104
89
|
export declare function repeatedStateSelectionStreak(stateMachine: StateMachineSession, stateName: string): {
|
|
105
90
|
count: number;
|
|
@@ -111,7 +96,8 @@ export declare function repeatedStateSelectionStreak(stateMachine: StateMachineS
|
|
|
111
96
|
* read as an idle hot loop, or undefined otherwise. This is the single source of
|
|
112
97
|
* truth for the trip condition — the turn runner uses the returned count to word
|
|
113
98
|
* its loop-warning reminder, and tests assert against this same function rather
|
|
114
|
-
* than re-deriving the threshold/window comparison.
|
|
99
|
+
* than re-deriving the threshold/window comparison. Park always returns
|
|
100
|
+
* undefined because repeated park selection deliberately performs no work.
|
|
115
101
|
*/
|
|
116
102
|
export declare function repeatedSelectionLoopCount(stateMachine: StateMachineSession, stateName: string): number | undefined;
|
|
117
103
|
export declare function elapsedSinceStateStarted(stateMachine: StateMachineSession | undefined, state: string): number;
|
|
@@ -122,7 +108,6 @@ export declare function recordStateInterrupted(stateMachine: StateMachineSession
|
|
|
122
108
|
stdout: string;
|
|
123
109
|
stderr: string;
|
|
124
110
|
}): StateMachineSession;
|
|
125
|
-
export declare function recordStateAskedUser(stateMachine: StateMachineSession, state: string, questions: TurnQuestion[]): StateMachineSession;
|
|
126
111
|
export declare function recordStateMachineCompleted(stateMachine: StateMachineSession, terminal: {
|
|
127
112
|
state: string;
|
|
128
113
|
status: "completed" | "failed" | "cancelled";
|
|
@@ -1 +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,EAGnB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"state-machine-session.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/state-machine-session.ts"],"names":[],"mappings":"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"}
|