aoaoe 0.14.0 → 0.15.0

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=daemon-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-state.test.d.ts","sourceRoot":"","sources":["../src/daemon-state.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,232 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ // buildSessionStates is the main pure-ish function we can test well.
4
+ // writeState / readState / interrupt functions depend on a fixed file path
5
+ // (~/.aoaoe/), so we test buildSessionStates thoroughly and test the
6
+ // interrupt/cleanup logic patterns.
7
+ // replicated from daemon-state.ts -- buildSessionStates is exported but calls
8
+ // parseTasks which is a real import. We can test it via the module.
9
+ describe("buildSessionStates", () => {
10
+ // we import dynamically so the module loads after any setup
11
+ function makeSession(overrides) {
12
+ return {
13
+ id: "abc12345-dead-beef-cafe-000000000001",
14
+ title: "test-agent",
15
+ path: "/tmp/test",
16
+ tool: "opencode",
17
+ status: "working",
18
+ tmux_name: "aoe_test-agent_abc12345",
19
+ ...overrides,
20
+ };
21
+ }
22
+ function makeSnapshot(overrides) {
23
+ return {
24
+ session: overrides?.session ?? makeSession(),
25
+ output: "$ working on stuff\n",
26
+ outputHash: "aabbccdd",
27
+ capturedAt: Date.now(),
28
+ ...overrides,
29
+ };
30
+ }
31
+ function makeObservation(snapshots) {
32
+ return {
33
+ timestamp: Date.now(),
34
+ sessions: snapshots,
35
+ changes: [],
36
+ };
37
+ }
38
+ it("returns empty array for empty observation", async () => {
39
+ const { buildSessionStates } = await import("./daemon-state.js");
40
+ const obs = makeObservation([]);
41
+ const result = buildSessionStates(obs);
42
+ assert.deepEqual(result, []);
43
+ });
44
+ it("maps session fields correctly", async () => {
45
+ const { buildSessionStates } = await import("./daemon-state.js");
46
+ const session = makeSession({ id: "s1", title: "my-proj", tool: "claude", status: "idle" });
47
+ const obs = makeObservation([makeSnapshot({ session, output: "last line\n" })]);
48
+ const result = buildSessionStates(obs);
49
+ assert.equal(result.length, 1);
50
+ assert.equal(result[0].id, "s1");
51
+ assert.equal(result[0].title, "my-proj");
52
+ assert.equal(result[0].tool, "claude");
53
+ assert.equal(result[0].status, "idle");
54
+ });
55
+ it("extracts last non-empty line as lastActivity", async () => {
56
+ const { buildSessionStates } = await import("./daemon-state.js");
57
+ const obs = makeObservation([
58
+ makeSnapshot({ output: "line1\nline2\n \n last meaningful\n \n\n" }),
59
+ ]);
60
+ const result = buildSessionStates(obs);
61
+ assert.equal(result[0].lastActivity, "last meaningful");
62
+ });
63
+ it("sets lastActivity to undefined for empty output", async () => {
64
+ const { buildSessionStates } = await import("./daemon-state.js");
65
+ const obs = makeObservation([
66
+ makeSnapshot({ output: "" }),
67
+ ]);
68
+ const result = buildSessionStates(obs);
69
+ assert.equal(result[0].lastActivity, undefined);
70
+ });
71
+ it("sets lastActivity to undefined for whitespace-only output", async () => {
72
+ const { buildSessionStates } = await import("./daemon-state.js");
73
+ const obs = makeObservation([
74
+ makeSnapshot({ output: " \n \n \n" }),
75
+ ]);
76
+ const result = buildSessionStates(obs);
77
+ assert.equal(result[0].lastActivity, undefined);
78
+ });
79
+ it("truncates long lastActivity to 100 chars", async () => {
80
+ const { buildSessionStates } = await import("./daemon-state.js");
81
+ const longLine = "x".repeat(150);
82
+ const obs = makeObservation([
83
+ makeSnapshot({ output: `first\n${longLine}\n` }),
84
+ ]);
85
+ const result = buildSessionStates(obs);
86
+ assert.ok(result[0].lastActivity.length <= 100);
87
+ assert.ok(result[0].lastActivity.endsWith("..."));
88
+ });
89
+ it("does not truncate lastActivity at exactly 100 chars", async () => {
90
+ const { buildSessionStates } = await import("./daemon-state.js");
91
+ const exactLine = "y".repeat(100);
92
+ const obs = makeObservation([
93
+ makeSnapshot({ output: `first\n${exactLine}\n` }),
94
+ ]);
95
+ const result = buildSessionStates(obs);
96
+ assert.equal(result[0].lastActivity, exactLine);
97
+ });
98
+ it("handles multiple sessions", async () => {
99
+ const { buildSessionStates } = await import("./daemon-state.js");
100
+ const obs = makeObservation([
101
+ makeSnapshot({ session: makeSession({ id: "s1", title: "proj-a" }), output: "a output\n" }),
102
+ makeSnapshot({ session: makeSession({ id: "s2", title: "proj-b" }), output: "b output\n" }),
103
+ makeSnapshot({ session: makeSession({ id: "s3", title: "proj-c" }), output: "c output\n" }),
104
+ ]);
105
+ const result = buildSessionStates(obs);
106
+ assert.equal(result.length, 3);
107
+ assert.equal(result[0].title, "proj-a");
108
+ assert.equal(result[1].title, "proj-b");
109
+ assert.equal(result[2].title, "proj-c");
110
+ });
111
+ it("parses TODO items from output into todoSummary", async () => {
112
+ const { buildSessionStates } = await import("./daemon-state.js");
113
+ const output = "Some output\n[✓] completed task\n[•] in progress task\n[ ] pending task\n";
114
+ const obs = makeObservation([makeSnapshot({ output })]);
115
+ const result = buildSessionStates(obs);
116
+ // todoSummary should be present when tasks are found
117
+ assert.ok(result[0].todoSummary !== undefined, "should have todoSummary when tasks exist");
118
+ assert.ok(typeof result[0].todoSummary === "string");
119
+ });
120
+ it("sets todoSummary to undefined when no tasks found", async () => {
121
+ const { buildSessionStates } = await import("./daemon-state.js");
122
+ const obs = makeObservation([makeSnapshot({ output: "just regular output\nno tasks here\n" })]);
123
+ const result = buildSessionStates(obs);
124
+ assert.equal(result[0].todoSummary, undefined);
125
+ });
126
+ });
127
+ describe("setSessionTask", () => {
128
+ it("stores task text for a session", async () => {
129
+ const { setSessionTask, buildSessionStates } = await import("./daemon-state.js");
130
+ const session = {
131
+ id: "task-test-session",
132
+ title: "task-proj",
133
+ path: "/tmp",
134
+ tool: "opencode",
135
+ status: "working",
136
+ tmux_name: "aoe_task-proj_task-tes",
137
+ };
138
+ setSessionTask("task-test-session", "implement feature X");
139
+ const obs = {
140
+ timestamp: Date.now(),
141
+ sessions: [{
142
+ session,
143
+ output: "working...\n",
144
+ outputHash: "h",
145
+ capturedAt: Date.now(),
146
+ }],
147
+ changes: [],
148
+ };
149
+ const states = buildSessionStates(obs);
150
+ assert.equal(states[0].currentTask, "implement feature X");
151
+ });
152
+ it("truncates long task text to 80 chars", async () => {
153
+ const { setSessionTask, buildSessionStates } = await import("./daemon-state.js");
154
+ const longTask = "a".repeat(100);
155
+ setSessionTask("trunc-session", longTask);
156
+ const session = {
157
+ id: "trunc-session",
158
+ title: "trunc",
159
+ path: "/tmp",
160
+ tool: "opencode",
161
+ status: "working",
162
+ tmux_name: "aoe_trunc_trunc-se",
163
+ };
164
+ const obs = {
165
+ timestamp: Date.now(),
166
+ sessions: [{
167
+ session,
168
+ output: "output\n",
169
+ outputHash: "h",
170
+ capturedAt: Date.now(),
171
+ }],
172
+ changes: [],
173
+ };
174
+ const states = buildSessionStates(obs);
175
+ assert.ok(states[0].currentTask.length <= 80);
176
+ assert.ok(states[0].currentTask.endsWith("..."));
177
+ });
178
+ });
179
+ describe("interrupt flag logic", () => {
180
+ // test the pattern: requestInterrupt creates a file, checkInterrupt reads it, clearInterrupt removes it
181
+ // these use the real ~/.aoaoe/ directory, so we test the logic patterns
182
+ it("checkInterrupt returns false when no interrupt file exists", async () => {
183
+ const { checkInterrupt, clearInterrupt } = await import("./daemon-state.js");
184
+ clearInterrupt(); // ensure clean state
185
+ assert.equal(checkInterrupt(), false);
186
+ });
187
+ it("requestInterrupt -> checkInterrupt -> clearInterrupt cycle works", async () => {
188
+ const { requestInterrupt, checkInterrupt, clearInterrupt } = await import("./daemon-state.js");
189
+ clearInterrupt(); // clean state
190
+ requestInterrupt();
191
+ assert.equal(checkInterrupt(), true, "should detect interrupt after request");
192
+ clearInterrupt();
193
+ assert.equal(checkInterrupt(), false, "should not detect interrupt after clear");
194
+ });
195
+ it("clearInterrupt is safe to call when no interrupt exists", async () => {
196
+ const { clearInterrupt, checkInterrupt } = await import("./daemon-state.js");
197
+ clearInterrupt(); // ensure clean
198
+ assert.doesNotThrow(() => clearInterrupt()); // second clear is safe
199
+ assert.equal(checkInterrupt(), false);
200
+ });
201
+ });
202
+ describe("writeState and readState", () => {
203
+ it("writeState followed by readState returns consistent state", async () => {
204
+ const { writeState, readState } = await import("./daemon-state.js");
205
+ writeState("polling", { pollCount: 42, sessionCount: 3 });
206
+ const state = readState();
207
+ assert.ok(state !== null);
208
+ assert.equal(state.phase, "polling");
209
+ assert.equal(state.pollCount, 42);
210
+ assert.equal(state.sessionCount, 3);
211
+ });
212
+ it("writeState updates phase and phaseStartedAt", async () => {
213
+ const { writeState, readState } = await import("./daemon-state.js");
214
+ const before = Date.now();
215
+ writeState("reasoning");
216
+ const state = readState();
217
+ assert.ok(state !== null);
218
+ assert.equal(state.phase, "reasoning");
219
+ assert.ok(state.phaseStartedAt >= before);
220
+ assert.ok(state.phaseStartedAt <= Date.now());
221
+ });
222
+ it("cleanupState removes state file", async () => {
223
+ const { writeState, readState, cleanupState } = await import("./daemon-state.js");
224
+ writeState("sleeping");
225
+ assert.ok(readState() !== null, "state should exist after write");
226
+ cleanupState();
227
+ // readState returns null when file doesn't exist
228
+ // (but it may have been recreated by another test, so just verify no throw)
229
+ assert.doesNotThrow(() => readState());
230
+ });
231
+ });
232
+ //# sourceMappingURL=daemon-state.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-state.test.js","sourceRoot":"","sources":["../src/daemon-state.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dashboard.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.test.d.ts","sourceRoot":"","sources":["../src/dashboard.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,252 @@
1
+ import { describe, it, beforeEach, afterEach } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ // dashboard.ts calls readState() + console.error(); we test the formatting
4
+ // logic by capturing stderr output. The function is pure aside from the
5
+ // readState + console.error side effects.
6
+ // helper factories
7
+ function makeSession(overrides) {
8
+ return {
9
+ id: "abc12345-dead-beef-cafe-000000000001",
10
+ title: "test-agent",
11
+ path: "/tmp/test",
12
+ tool: "opencode",
13
+ status: "working",
14
+ tmux_name: "aoe_test-agent_abc12345",
15
+ ...overrides,
16
+ };
17
+ }
18
+ function makeSnapshot(overrides) {
19
+ return {
20
+ session: overrides?.session ?? makeSession(),
21
+ output: "working on stuff...\n",
22
+ outputHash: "aabbccdd",
23
+ capturedAt: Date.now(),
24
+ ...overrides,
25
+ };
26
+ }
27
+ function makeObservation(snapshots) {
28
+ return {
29
+ timestamp: Date.now(),
30
+ sessions: snapshots,
31
+ changes: [],
32
+ };
33
+ }
34
+ function defaultConfig(overrides) {
35
+ return {
36
+ reasoner: "opencode",
37
+ pollIntervalMs: 10_000,
38
+ opencode: { port: 4097 },
39
+ claudeCode: { yolo: true, resume: true },
40
+ aoe: { profile: "default" },
41
+ policies: {
42
+ maxIdleBeforeNudgeMs: 120_000,
43
+ maxErrorsBeforeRestart: 3,
44
+ autoAnswerPermissions: true,
45
+ },
46
+ contextFiles: [],
47
+ sessionDirs: {},
48
+ captureLinesCount: 100,
49
+ verbose: false,
50
+ dryRun: false,
51
+ ...overrides,
52
+ };
53
+ }
54
+ function makeActionEntry(overrides) {
55
+ return {
56
+ timestamp: Date.now(),
57
+ action: { action: "send_input", session: "abc", text: "do stuff" },
58
+ success: true,
59
+ detail: "sent input to test-agent",
60
+ ...overrides,
61
+ };
62
+ }
63
+ describe("printDashboard", () => {
64
+ let captured;
65
+ const origError = console.error;
66
+ beforeEach(() => {
67
+ captured = [];
68
+ console.error = (...args) => {
69
+ captured.push(args.map(String).join(" "));
70
+ };
71
+ });
72
+ afterEach(() => {
73
+ console.error = origError;
74
+ });
75
+ it("prints header with poll count and time", async () => {
76
+ // dynamic import to allow mocking of readState
77
+ const { printDashboard } = await import("./dashboard.js");
78
+ const obs = makeObservation([]);
79
+ printDashboard(obs, [], 42, defaultConfig());
80
+ const output = captured.join("\n");
81
+ assert.ok(output.includes("poll #42"), "should contain poll count");
82
+ assert.ok(output.includes("aoaoe dashboard"), "should contain header");
83
+ });
84
+ it("shows 'no active sessions' when empty", async () => {
85
+ const { printDashboard } = await import("./dashboard.js");
86
+ const obs = makeObservation([]);
87
+ printDashboard(obs, [], 1, defaultConfig());
88
+ const output = captured.join("\n");
89
+ assert.ok(output.includes("no active sessions"), "should show empty state");
90
+ });
91
+ it("renders session rows with icon, tool, title, id", async () => {
92
+ const { printDashboard } = await import("./dashboard.js");
93
+ const snap = makeSnapshot({
94
+ session: makeSession({ status: "working", title: "my-project", id: "deadbeef12345678" }),
95
+ });
96
+ const obs = makeObservation([snap]);
97
+ printDashboard(obs, [], 5, defaultConfig());
98
+ const output = captured.join("\n");
99
+ assert.ok(output.includes("~"), "working status should show ~ icon");
100
+ assert.ok(output.includes("opencode"), "should show tool");
101
+ assert.ok(output.includes("my-project"), "should show title");
102
+ assert.ok(output.includes("deadbeef"), "should show first 8 chars of id");
103
+ });
104
+ it("shows DRY RUN banner when dryRun is true", async () => {
105
+ const { printDashboard } = await import("./dashboard.js");
106
+ const obs = makeObservation([]);
107
+ printDashboard(obs, [], 1, defaultConfig({ dryRun: true }));
108
+ const output = captured.join("\n");
109
+ assert.ok(output.includes("DRY RUN"), "should show dry run banner");
110
+ });
111
+ it("does not show DRY RUN banner when dryRun is false", async () => {
112
+ const { printDashboard } = await import("./dashboard.js");
113
+ const obs = makeObservation([]);
114
+ printDashboard(obs, [], 1, defaultConfig({ dryRun: false }));
115
+ const output = captured.join("\n");
116
+ assert.ok(!output.includes("DRY RUN"), "should not show dry run banner");
117
+ });
118
+ it("filters wait actions from recent actions", async () => {
119
+ const { printDashboard } = await import("./dashboard.js");
120
+ const obs = makeObservation([]);
121
+ const actions = [
122
+ makeActionEntry({ action: { action: "wait", reason: "all good" } }),
123
+ makeActionEntry({ action: { action: "send_input", session: "abc", text: "hi" }, detail: "sent to test" }),
124
+ ];
125
+ printDashboard(obs, actions, 1, defaultConfig());
126
+ const output = captured.join("\n");
127
+ assert.ok(output.includes("recent actions"), "should show recent actions section");
128
+ assert.ok(output.includes("send_input"), "should show non-wait action");
129
+ });
130
+ it("does not show recent actions section when all are wait", async () => {
131
+ const { printDashboard } = await import("./dashboard.js");
132
+ const obs = makeObservation([]);
133
+ const actions = [
134
+ makeActionEntry({ action: { action: "wait", reason: "idle" } }),
135
+ ];
136
+ printDashboard(obs, actions, 1, defaultConfig());
137
+ const output = captured.join("\n");
138
+ assert.ok(!output.includes("recent actions"), "should not show recent actions when all are wait");
139
+ });
140
+ it("shows success/failure icons for actions", async () => {
141
+ const { printDashboard } = await import("./dashboard.js");
142
+ const obs = makeObservation([]);
143
+ const actions = [
144
+ makeActionEntry({ success: true, detail: "ok", action: { action: "start_session", session: "s1" } }),
145
+ makeActionEntry({ success: false, detail: "failed", action: { action: "stop_session", session: "s2" } }),
146
+ ];
147
+ printDashboard(obs, actions, 1, defaultConfig());
148
+ const output = captured.join("\n");
149
+ assert.ok(output.includes("+ start_session"), "success should show +");
150
+ assert.ok(output.includes("! stop_session"), "failure should show !");
151
+ });
152
+ it("shows at most 5 recent meaningful actions", async () => {
153
+ const { printDashboard } = await import("./dashboard.js");
154
+ const obs = makeObservation([]);
155
+ const actions = Array.from({ length: 10 }, (_, i) => makeActionEntry({
156
+ action: { action: "send_input", session: `s${i}`, text: `msg${i}` },
157
+ detail: `action-${i}`,
158
+ }));
159
+ printDashboard(obs, actions, 1, defaultConfig());
160
+ const output = captured.join("\n");
161
+ // should show actions 5-9 (last 5)
162
+ assert.ok(output.includes("action-9"), "should show last action");
163
+ assert.ok(output.includes("action-5"), "should show 5th from end");
164
+ assert.ok(!output.includes("action-4"), "should NOT show 6th from end");
165
+ });
166
+ it("renders all status icons correctly", async () => {
167
+ const { printDashboard } = await import("./dashboard.js");
168
+ const statuses = ["working", "idle", "waiting", "done", "error", "stopped"];
169
+ const expectedIcons = ["~", ".", "?", "+", "!", "x"];
170
+ for (let i = 0; i < statuses.length; i++) {
171
+ captured = [];
172
+ const snap = makeSnapshot({
173
+ session: makeSession({ status: statuses[i], id: `id${i}`.padEnd(16, "0") }),
174
+ });
175
+ const obs = makeObservation([snap]);
176
+ printDashboard(obs, [], 1, defaultConfig());
177
+ const output = captured.join("\n");
178
+ // look for the icon in the session row (column before the pipe)
179
+ const lines = output.split("\n");
180
+ const sessionLine = lines.find((l) => l.includes(`id${i}`));
181
+ assert.ok(sessionLine, `should have a line for status ${statuses[i]}`);
182
+ assert.ok(sessionLine.includes(expectedIcons[i]), `status ${statuses[i]} should have icon ${expectedIcons[i]}, got line: ${sessionLine}`);
183
+ }
184
+ });
185
+ it("uses ? icon for unknown status", async () => {
186
+ const { printDashboard } = await import("./dashboard.js");
187
+ captured = [];
188
+ const snap = makeSnapshot({
189
+ session: makeSession({ status: "banana", id: "unkn1234" + "0".repeat(8) }),
190
+ });
191
+ const obs = makeObservation([snap]);
192
+ printDashboard(obs, [], 1, defaultConfig());
193
+ const output = captured.join("\n");
194
+ const sessionLine = output.split("\n").find((l) => l.includes("unkn1234"));
195
+ assert.ok(sessionLine, "should find the session line");
196
+ // the icon should be ? (default for unknown status)
197
+ assert.ok(sessionLine.trimStart().startsWith("?"), `unknown status should show ?, got: ${sessionLine}`);
198
+ });
199
+ it("truncates long titles to 20 chars", async () => {
200
+ const { printDashboard } = await import("./dashboard.js");
201
+ captured = [];
202
+ const longTitle = "a-very-long-session-title-that-exceeds-twenty";
203
+ const snap = makeSnapshot({
204
+ session: makeSession({ title: longTitle }),
205
+ });
206
+ const obs = makeObservation([snap]);
207
+ printDashboard(obs, [], 1, defaultConfig());
208
+ const output = captured.join("\n");
209
+ // title is padEnd(20).slice(0,20) so exactly 20 chars
210
+ assert.ok(!output.includes(longTitle), "full long title should not appear");
211
+ assert.ok(output.includes(longTitle.slice(0, 20)), "first 20 chars should appear");
212
+ });
213
+ it("multiple sessions render on separate lines", async () => {
214
+ const { printDashboard } = await import("./dashboard.js");
215
+ captured = [];
216
+ const snaps = [
217
+ makeSnapshot({ session: makeSession({ id: "s1".padEnd(16, "0"), title: "session-one" }) }),
218
+ makeSnapshot({ session: makeSession({ id: "s2".padEnd(16, "0"), title: "session-two" }) }),
219
+ ];
220
+ const obs = makeObservation(snaps);
221
+ printDashboard(obs, [], 1, defaultConfig());
222
+ const output = captured.join("\n");
223
+ assert.ok(output.includes("session-one"), "should show first session");
224
+ assert.ok(output.includes("session-two"), "should show second session");
225
+ });
226
+ });
227
+ // test the truncate helper used internally by dashboard (we replicate it here)
228
+ describe("truncate (logic)", () => {
229
+ function truncate(s, max) {
230
+ const line = s.replace(/\n/g, " ").trim();
231
+ return line.length > max ? line.slice(0, max - 3) + "..." : line;
232
+ }
233
+ it("returns short strings unchanged", () => {
234
+ assert.equal(truncate("hello", 30), "hello");
235
+ });
236
+ it("truncates long strings with ellipsis", () => {
237
+ const long = "a".repeat(50);
238
+ const result = truncate(long, 30);
239
+ assert.equal(result.length, 30);
240
+ assert.ok(result.endsWith("..."));
241
+ });
242
+ it("collapses newlines to spaces", () => {
243
+ assert.equal(truncate("line1\nline2\nline3", 30), "line1 line2 line3");
244
+ });
245
+ it("trims whitespace", () => {
246
+ assert.equal(truncate(" hello ", 30), "hello");
247
+ });
248
+ it("handles empty string", () => {
249
+ assert.equal(truncate("", 30), "");
250
+ });
251
+ });
252
+ //# sourceMappingURL=dashboard.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.test.js","sourceRoot":"","sources":["../src/dashboard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=input.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.test.d.ts","sourceRoot":"","sources":["../src/input.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,212 @@
1
+ import { describe, it, beforeEach } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { InputReader } from "./input.js";
4
+ // InputReader depends on process.stdin.isTTY for start(), but we can test
5
+ // the queue/drain/inject logic and command handling without a real TTY.
6
+ // The handleLine method is private, but we can simulate it via inject() +
7
+ // the public interface, or test the logic patterns directly.
8
+ describe("InputReader queue management", () => {
9
+ let reader;
10
+ beforeEach(() => {
11
+ reader = new InputReader();
12
+ // don't call start() -- it requires a TTY
13
+ });
14
+ it("drain returns empty array initially", () => {
15
+ const msgs = reader.drain();
16
+ assert.deepEqual(msgs, []);
17
+ });
18
+ it("inject adds message to queue", () => {
19
+ reader.inject("hello world");
20
+ const msgs = reader.drain();
21
+ assert.deepEqual(msgs, ["hello world"]);
22
+ });
23
+ it("drain clears the queue", () => {
24
+ reader.inject("msg1");
25
+ reader.inject("msg2");
26
+ const first = reader.drain();
27
+ assert.equal(first.length, 2);
28
+ const second = reader.drain();
29
+ assert.deepEqual(second, []);
30
+ });
31
+ it("inject preserves order (FIFO)", () => {
32
+ reader.inject("first");
33
+ reader.inject("second");
34
+ reader.inject("third");
35
+ const msgs = reader.drain();
36
+ assert.deepEqual(msgs, ["first", "second", "third"]);
37
+ });
38
+ it("multiple drain calls are safe", () => {
39
+ assert.deepEqual(reader.drain(), []);
40
+ assert.deepEqual(reader.drain(), []);
41
+ assert.deepEqual(reader.drain(), []);
42
+ });
43
+ it("inject works after drain", () => {
44
+ reader.inject("before");
45
+ reader.drain();
46
+ reader.inject("after");
47
+ const msgs = reader.drain();
48
+ assert.deepEqual(msgs, ["after"]);
49
+ });
50
+ });
51
+ describe("InputReader pause state", () => {
52
+ it("isPaused returns false initially", () => {
53
+ const reader = new InputReader();
54
+ assert.equal(reader.isPaused(), false);
55
+ });
56
+ // pause/resume is handled via private handleCommand, tested indirectly below
57
+ });
58
+ describe("InputReader stop", () => {
59
+ it("stop is safe to call without start", () => {
60
+ const reader = new InputReader();
61
+ assert.doesNotThrow(() => reader.stop());
62
+ });
63
+ it("stop is safe to call multiple times", () => {
64
+ const reader = new InputReader();
65
+ assert.doesNotThrow(() => {
66
+ reader.stop();
67
+ reader.stop();
68
+ });
69
+ });
70
+ });
71
+ // test handleCommand logic by replicating the switch statement
72
+ // (the actual method is private, but the logic is important to validate)
73
+ describe("handleCommand (logic)", () => {
74
+ // replicated from input.ts handleLine + handleCommand
75
+ function simulateHandleLine(queue, paused, line) {
76
+ if (!line)
77
+ return;
78
+ if (line.startsWith("/")) {
79
+ const [cmd] = line.split(/\s+/);
80
+ switch (cmd) {
81
+ case "/help":
82
+ // help just prints, no queue effect
83
+ break;
84
+ case "/pause":
85
+ paused.value = true;
86
+ break;
87
+ case "/resume":
88
+ paused.value = false;
89
+ break;
90
+ case "/status":
91
+ queue.push("__CMD_STATUS__");
92
+ break;
93
+ case "/dashboard":
94
+ queue.push("__CMD_DASHBOARD__");
95
+ break;
96
+ case "/verbose":
97
+ queue.push("__CMD_VERBOSE__");
98
+ break;
99
+ case "/interrupt":
100
+ queue.push("__CMD_INTERRUPT__");
101
+ break;
102
+ case "/tasks":
103
+ queue.push("__CMD_DASHBOARD__"); // reuse dashboard
104
+ break;
105
+ default:
106
+ // unknown command, no queue effect
107
+ break;
108
+ }
109
+ return;
110
+ }
111
+ queue.push(line);
112
+ }
113
+ it("empty line is ignored", () => {
114
+ const queue = [];
115
+ const paused = { value: false };
116
+ simulateHandleLine(queue, paused, "");
117
+ assert.deepEqual(queue, []);
118
+ });
119
+ it("regular text is queued as user message", () => {
120
+ const queue = [];
121
+ const paused = { value: false };
122
+ simulateHandleLine(queue, paused, "please check the tests");
123
+ assert.deepEqual(queue, ["please check the tests"]);
124
+ });
125
+ it("/pause sets paused to true", () => {
126
+ const queue = [];
127
+ const paused = { value: false };
128
+ simulateHandleLine(queue, paused, "/pause");
129
+ assert.equal(paused.value, true);
130
+ assert.deepEqual(queue, []); // no queue effect
131
+ });
132
+ it("/resume sets paused to false", () => {
133
+ const queue = [];
134
+ const paused = { value: true };
135
+ simulateHandleLine(queue, paused, "/resume");
136
+ assert.equal(paused.value, false);
137
+ });
138
+ it("/status queues __CMD_STATUS__", () => {
139
+ const queue = [];
140
+ const paused = { value: false };
141
+ simulateHandleLine(queue, paused, "/status");
142
+ assert.deepEqual(queue, ["__CMD_STATUS__"]);
143
+ });
144
+ it("/dashboard queues __CMD_DASHBOARD__", () => {
145
+ const queue = [];
146
+ const paused = { value: false };
147
+ simulateHandleLine(queue, paused, "/dashboard");
148
+ assert.deepEqual(queue, ["__CMD_DASHBOARD__"]);
149
+ });
150
+ it("/verbose queues __CMD_VERBOSE__", () => {
151
+ const queue = [];
152
+ const paused = { value: false };
153
+ simulateHandleLine(queue, paused, "/verbose");
154
+ assert.deepEqual(queue, ["__CMD_VERBOSE__"]);
155
+ });
156
+ it("/interrupt queues __CMD_INTERRUPT__", () => {
157
+ const queue = [];
158
+ const paused = { value: false };
159
+ simulateHandleLine(queue, paused, "/interrupt");
160
+ assert.deepEqual(queue, ["__CMD_INTERRUPT__"]);
161
+ });
162
+ it("/tasks queues __CMD_DASHBOARD__ (alias)", () => {
163
+ const queue = [];
164
+ const paused = { value: false };
165
+ simulateHandleLine(queue, paused, "/tasks");
166
+ assert.deepEqual(queue, ["__CMD_DASHBOARD__"]);
167
+ });
168
+ it("/help does not modify queue", () => {
169
+ const queue = [];
170
+ const paused = { value: false };
171
+ simulateHandleLine(queue, paused, "/help");
172
+ assert.deepEqual(queue, []);
173
+ });
174
+ it("unknown command does not modify queue", () => {
175
+ const queue = [];
176
+ const paused = { value: false };
177
+ simulateHandleLine(queue, paused, "/nonexistent");
178
+ assert.deepEqual(queue, []);
179
+ });
180
+ it("commands are case-sensitive (uppercase fails)", () => {
181
+ const queue = [];
182
+ const paused = { value: false };
183
+ simulateHandleLine(queue, paused, "/PAUSE");
184
+ assert.equal(paused.value, false); // should NOT pause
185
+ assert.deepEqual(queue, []); // unknown command, no queue effect
186
+ });
187
+ it("/pause and /resume toggle correctly", () => {
188
+ const queue = [];
189
+ const paused = { value: false };
190
+ simulateHandleLine(queue, paused, "/pause");
191
+ assert.equal(paused.value, true);
192
+ simulateHandleLine(queue, paused, "/resume");
193
+ assert.equal(paused.value, false);
194
+ simulateHandleLine(queue, paused, "/pause");
195
+ assert.equal(paused.value, true);
196
+ });
197
+ it("interleaved commands and messages", () => {
198
+ const queue = [];
199
+ const paused = { value: false };
200
+ simulateHandleLine(queue, paused, "check the build");
201
+ simulateHandleLine(queue, paused, "/status");
202
+ simulateHandleLine(queue, paused, "also fix the tests");
203
+ simulateHandleLine(queue, paused, "/dashboard");
204
+ assert.deepEqual(queue, [
205
+ "check the build",
206
+ "__CMD_STATUS__",
207
+ "also fix the tests",
208
+ "__CMD_DASHBOARD__",
209
+ ]);
210
+ });
211
+ });
212
+ //# sourceMappingURL=input.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.test.js","sourceRoot":"","sources":["../src/input.test.ts"],"names":[],"mappings":"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"}
package/dist/poller.d.ts CHANGED
@@ -14,5 +14,6 @@ export declare class Poller {
14
14
  export declare function computeTmuxName(id: string, title: string): string;
15
15
  export declare function sanitizeTmuxName(name: string): string;
16
16
  export declare function quickHash(s: string): string;
17
+ export declare function stripAnsi(s: string): string;
17
18
  export declare function extractNewLines(previous: string, current: string): string;
18
19
  //# sourceMappingURL=poller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAIX,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,iBAAiB,CAA2C;gBAExD,MAAM,EAAE,WAAW;IAIzB,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YA8BpB,YAAY;YAwCZ,gBAAgB;YAWhB,cAAc;YAqBd,eAAe;IAqB7B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,GAAG;CAKZ;AAMD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBzE"}
1
+ {"version":3,"file":"poller.d.ts","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAIX,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,iBAAiB,CAA2C;gBAExD,MAAM,EAAE,WAAW;IAIzB,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YA8BpB,YAAY;YAwCZ,gBAAgB;YAWhB,cAAc;YAqBd,eAAe;IAqB7B,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,GAAG;CAKZ;AAMD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjE;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAMD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C;AAGD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAqBzE"}
package/dist/poller.js CHANGED
@@ -111,8 +111,8 @@ export class Poller {
111
111
  // session might not exist in tmux (stopped, etc)
112
112
  return "";
113
113
  }
114
- // trim trailing blank lines that tmux pads
115
- return result.stdout.replace(/\n+$/, "");
114
+ // strip ANSI escape codes then trim trailing blank lines that tmux pads
115
+ return stripAnsi(result.stdout).replace(/\n+$/, "");
116
116
  }
117
117
  diffSnapshots(current) {
118
118
  const changes = [];
@@ -162,6 +162,14 @@ export function sanitizeTmuxName(name) {
162
162
  export function quickHash(s) {
163
163
  return createHash("sha256").update(s).digest("hex").slice(0, 16);
164
164
  }
165
+ // strip ANSI escape sequences (CSI, OSC, simple escapes) so they don't break
166
+ // hash-based change detection or anchor-based line diffing.
167
+ // covers: CSI (\x1b[...X), OSC (\x1b]...ST), and simple two-char escapes (\x1bX)
168
+ // also strips \x9b (8-bit CSI) sequences
169
+ export function stripAnsi(s) {
170
+ // eslint-disable-next-line no-control-regex
171
+ return s.replace(/[\x1b\x9b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[^[\]()#;?0-9A-ORZcf-nqry=><~]/g, "");
172
+ }
165
173
  // extract lines in `current` that weren't in `previous`
166
174
  export function extractNewLines(previous, current) {
167
175
  const prevLines = previous.split("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"poller.js","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"poller.js","sourceRoot":"","sources":["../src/poller.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { describe, it } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { computeTmuxName, sanitizeTmuxName, quickHash, extractNewLines, } from "./poller.js";
3
+ import { computeTmuxName, sanitizeTmuxName, quickHash, extractNewLines, stripAnsi, } from "./poller.js";
4
4
  describe("sanitizeTmuxName", () => {
5
5
  it("passes through alphanumeric and dashes/underscores", () => {
6
6
  assert.equal(sanitizeTmuxName("my-agent_01"), "my-agent_01");
@@ -58,6 +58,47 @@ describe("quickHash", () => {
58
58
  assert.match(hash, /^[0-9a-f]{16}$/);
59
59
  });
60
60
  });
61
+ describe("stripAnsi", () => {
62
+ it("removes CSI color codes", () => {
63
+ assert.equal(stripAnsi("\x1b[31mred text\x1b[0m"), "red text");
64
+ });
65
+ it("removes CSI bold/underline", () => {
66
+ assert.equal(stripAnsi("\x1b[1mbold\x1b[22m \x1b[4munderline\x1b[24m"), "bold underline");
67
+ });
68
+ it("removes cursor movement sequences", () => {
69
+ assert.equal(stripAnsi("\x1b[2Ahello\x1b[K"), "hello");
70
+ });
71
+ it("removes 256-color and truecolor codes", () => {
72
+ assert.equal(stripAnsi("\x1b[38;5;196mred\x1b[0m"), "red");
73
+ assert.equal(stripAnsi("\x1b[38;2;255;0;0mred\x1b[0m"), "red");
74
+ });
75
+ it("removes OSC sequences (title setting)", () => {
76
+ assert.equal(stripAnsi("\x1b]0;window title\x07text"), "text");
77
+ });
78
+ it("removes OSC with ST terminator", () => {
79
+ assert.equal(stripAnsi("\x1b]0;title\x1b\\text"), "text");
80
+ });
81
+ it("returns plain text unchanged", () => {
82
+ assert.equal(stripAnsi("hello world"), "hello world");
83
+ });
84
+ it("handles empty string", () => {
85
+ assert.equal(stripAnsi(""), "");
86
+ });
87
+ it("handles multiple escape sequences in one line", () => {
88
+ assert.equal(stripAnsi("\x1b[1m\x1b[32m✓\x1b[0m test passed \x1b[90m(0.5ms)\x1b[0m"), "✓ test passed (0.5ms)");
89
+ });
90
+ it("handles progress bar spinners", () => {
91
+ // typical spinner: \r + cursor move + overwrite
92
+ const spinner = "\x1b[2K\x1b[1G⠋ Loading...\x1b[2K\x1b[1G⠙ Loading...";
93
+ assert.equal(stripAnsi(spinner), "⠋ Loading...⠙ Loading...");
94
+ });
95
+ it("strips 8-bit CSI (0x9b) sequences", () => {
96
+ assert.equal(stripAnsi("\x9b31mred\x9b0m"), "red");
97
+ });
98
+ it("preserves newlines and meaningful whitespace", () => {
99
+ assert.equal(stripAnsi("\x1b[32mline1\x1b[0m\nline2\n indented"), "line1\nline2\n indented");
100
+ });
101
+ });
61
102
  describe("extractNewLines", () => {
62
103
  it("extracts lines after the overlap anchor", () => {
63
104
  const previous = "line 1\nline 2\nline 3";
@@ -1 +1 @@
1
- {"version":3,"file":"poller.test.js","sourceRoot":"","sources":["../src/poller.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"poller.test.js","sourceRoot":"","sources":["../src/poller.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claude-code.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.test.d.ts","sourceRoot":"","sources":["../../src/reasoner/claude-code.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ // ClaudeCodeReasoner.buildArgs and tryExtractSessionId are private, so we
4
+ // replicate the pure logic here for unit testing. If the logic drifts,
5
+ // integration tests will catch it.
6
+ function defaultConfig(overrides) {
7
+ return {
8
+ reasoner: "claude-code",
9
+ pollIntervalMs: 10_000,
10
+ opencode: { port: 4097 },
11
+ claudeCode: { yolo: false, resume: false },
12
+ aoe: { profile: "default" },
13
+ policies: {
14
+ maxIdleBeforeNudgeMs: 120_000,
15
+ maxErrorsBeforeRestart: 3,
16
+ autoAnswerPermissions: true,
17
+ },
18
+ contextFiles: [],
19
+ sessionDirs: {},
20
+ captureLinesCount: 100,
21
+ verbose: false,
22
+ dryRun: false,
23
+ ...overrides,
24
+ };
25
+ }
26
+ // replicated from claude-code.ts buildArgs (private method)
27
+ function buildArgs(prompt, config, systemPrompt, sessionId) {
28
+ const args = ["--print"];
29
+ args.push("--output-format", "text");
30
+ args.push("--append-system-prompt", systemPrompt);
31
+ if (config.claudeCode.model) {
32
+ args.push("--model", config.claudeCode.model);
33
+ }
34
+ if (config.claudeCode.yolo) {
35
+ args.push("--dangerously-skip-permissions");
36
+ }
37
+ if (config.claudeCode.resume && sessionId) {
38
+ args.push("--resume", sessionId);
39
+ }
40
+ args.push(prompt);
41
+ return args;
42
+ }
43
+ // replicated from claude-code.ts tryExtractSessionId (private method)
44
+ function tryExtractSessionId(output) {
45
+ const match = output.match(/session[_\s]?(?:id)?[:\s]+([a-f0-9-]+)/i);
46
+ return match ? match[1] : null;
47
+ }
48
+ describe("buildArgs", () => {
49
+ const systemPrompt = "You are a supervisor.";
50
+ it("always includes --print and --output-format text", () => {
51
+ const args = buildArgs("hello", defaultConfig(), systemPrompt, null);
52
+ assert.ok(args.includes("--print"));
53
+ const fmtIdx = args.indexOf("--output-format");
54
+ assert.ok(fmtIdx >= 0);
55
+ assert.equal(args[fmtIdx + 1], "text");
56
+ });
57
+ it("always includes system prompt", () => {
58
+ const args = buildArgs("hello", defaultConfig(), systemPrompt, null);
59
+ const idx = args.indexOf("--append-system-prompt");
60
+ assert.ok(idx >= 0);
61
+ assert.equal(args[idx + 1], systemPrompt);
62
+ });
63
+ it("includes model when configured", () => {
64
+ const config = defaultConfig({ claudeCode: { model: "claude-sonnet-4-20250514", yolo: false, resume: false } });
65
+ const args = buildArgs("hello", config, systemPrompt, null);
66
+ const idx = args.indexOf("--model");
67
+ assert.ok(idx >= 0);
68
+ assert.equal(args[idx + 1], "claude-sonnet-4-20250514");
69
+ });
70
+ it("omits model when not configured", () => {
71
+ const config = defaultConfig({ claudeCode: { yolo: false, resume: false } });
72
+ const args = buildArgs("hello", config, systemPrompt, null);
73
+ assert.ok(!args.includes("--model"));
74
+ });
75
+ it("includes --dangerously-skip-permissions when yolo is true", () => {
76
+ const config = defaultConfig({ claudeCode: { yolo: true, resume: false } });
77
+ const args = buildArgs("hello", config, systemPrompt, null);
78
+ assert.ok(args.includes("--dangerously-skip-permissions"));
79
+ });
80
+ it("omits --dangerously-skip-permissions when yolo is false", () => {
81
+ const config = defaultConfig({ claudeCode: { yolo: false, resume: false } });
82
+ const args = buildArgs("hello", config, systemPrompt, null);
83
+ assert.ok(!args.includes("--dangerously-skip-permissions"));
84
+ });
85
+ it("includes --resume with session ID when resume is true and session exists", () => {
86
+ const config = defaultConfig({ claudeCode: { yolo: false, resume: true } });
87
+ const args = buildArgs("hello", config, systemPrompt, "abc-123-def");
88
+ const idx = args.indexOf("--resume");
89
+ assert.ok(idx >= 0);
90
+ assert.equal(args[idx + 1], "abc-123-def");
91
+ });
92
+ it("omits --resume when resume is true but no session ID", () => {
93
+ const config = defaultConfig({ claudeCode: { yolo: false, resume: true } });
94
+ const args = buildArgs("hello", config, systemPrompt, null);
95
+ assert.ok(!args.includes("--resume"));
96
+ });
97
+ it("omits --resume when resume is false even with session ID", () => {
98
+ const config = defaultConfig({ claudeCode: { yolo: false, resume: false } });
99
+ const args = buildArgs("hello", config, systemPrompt, "abc-123-def");
100
+ assert.ok(!args.includes("--resume"));
101
+ });
102
+ it("prompt is always the last argument", () => {
103
+ const config = defaultConfig({ claudeCode: { model: "m", yolo: true, resume: true } });
104
+ const args = buildArgs("observe and decide", config, systemPrompt, "sess-1");
105
+ assert.equal(args[args.length - 1], "observe and decide");
106
+ });
107
+ it("builds full arg list with all options", () => {
108
+ const config = defaultConfig({ claudeCode: { model: "opus-4", yolo: true, resume: true } });
109
+ const args = buildArgs("prompt text", config, systemPrompt, "sess-1");
110
+ assert.deepEqual(args, [
111
+ "--print",
112
+ "--output-format", "text",
113
+ "--append-system-prompt", systemPrompt,
114
+ "--model", "opus-4",
115
+ "--dangerously-skip-permissions",
116
+ "--resume", "sess-1",
117
+ "prompt text",
118
+ ]);
119
+ });
120
+ });
121
+ describe("tryExtractSessionId", () => {
122
+ it("extracts session_id with colon separator", () => {
123
+ assert.equal(tryExtractSessionId("session_id: abc-123-def"), "abc-123-def");
124
+ });
125
+ it("extracts session id with space separator", () => {
126
+ assert.equal(tryExtractSessionId("session id: 1a2b3c4d"), "1a2b3c4d");
127
+ });
128
+ it("extracts session: format", () => {
129
+ assert.equal(tryExtractSessionId("Session: abcdef12-3456-7890"), "abcdef12-3456-7890");
130
+ });
131
+ it("extracts from multiline output", () => {
132
+ const output = "Starting claude...\nSession_id: deadbeef\nThinking...";
133
+ assert.equal(tryExtractSessionId(output), "deadbeef");
134
+ });
135
+ it("is case-insensitive", () => {
136
+ assert.equal(tryExtractSessionId("SESSION_ID: aabbccdd"), "aabbccdd");
137
+ assert.equal(tryExtractSessionId("Session: 112233"), "112233");
138
+ });
139
+ it("returns null when no session ID found", () => {
140
+ assert.equal(tryExtractSessionId("no session info here"), null);
141
+ });
142
+ it("returns null for empty string", () => {
143
+ assert.equal(tryExtractSessionId(""), null);
144
+ });
145
+ it("extracts UUID-style session IDs", () => {
146
+ const result = tryExtractSessionId("session: 550e8400-e29b-41d4-a716-446655440000");
147
+ assert.equal(result, "550e8400-e29b-41d4-a716-446655440000");
148
+ });
149
+ it("extracts from stderr + stdout combined output", () => {
150
+ const output = "Loading model...\nsession_id: beef1234\n{\"action\":\"wait\"}";
151
+ assert.equal(tryExtractSessionId(output), "beef1234");
152
+ });
153
+ });
154
+ //# sourceMappingURL=claude-code.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.test.js","sourceRoot":"","sources":["../../src/reasoner/claude-code.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reasoner-factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoner-factory.test.d.ts","sourceRoot":"","sources":["../../src/reasoner/reasoner-factory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { createReasoner, OpencodeReasoner, ClaudeCodeReasoner } from "./index.js";
4
+ function defaultConfig(overrides) {
5
+ return {
6
+ reasoner: "opencode",
7
+ pollIntervalMs: 10_000,
8
+ opencode: { port: 4097 },
9
+ claudeCode: { yolo: true, resume: true },
10
+ aoe: { profile: "default" },
11
+ policies: {
12
+ maxIdleBeforeNudgeMs: 120_000,
13
+ maxErrorsBeforeRestart: 3,
14
+ autoAnswerPermissions: true,
15
+ },
16
+ contextFiles: [],
17
+ sessionDirs: {},
18
+ captureLinesCount: 100,
19
+ verbose: false,
20
+ dryRun: false,
21
+ ...overrides,
22
+ };
23
+ }
24
+ describe("createReasoner", () => {
25
+ it("creates OpencodeReasoner for 'opencode' backend", () => {
26
+ const config = defaultConfig({ reasoner: "opencode" });
27
+ const reasoner = createReasoner(config);
28
+ assert.ok(reasoner instanceof OpencodeReasoner);
29
+ });
30
+ it("creates ClaudeCodeReasoner for 'claude-code' backend", () => {
31
+ const config = defaultConfig({ reasoner: "claude-code" });
32
+ const reasoner = createReasoner(config);
33
+ assert.ok(reasoner instanceof ClaudeCodeReasoner);
34
+ });
35
+ it("throws for unknown backend", () => {
36
+ const config = defaultConfig();
37
+ // force an invalid value
38
+ config.reasoner = "gpt-4";
39
+ assert.throws(() => createReasoner(config), (err) => err.message.includes("unknown reasoner backend"));
40
+ });
41
+ it("passes globalContext to OpencodeReasoner", () => {
42
+ const config = defaultConfig({ reasoner: "opencode" });
43
+ // just verifying it doesn't throw with context
44
+ const reasoner = createReasoner(config, "# AGENTS.md\nSome context");
45
+ assert.ok(reasoner instanceof OpencodeReasoner);
46
+ });
47
+ it("passes globalContext to ClaudeCodeReasoner", () => {
48
+ const config = defaultConfig({ reasoner: "claude-code" });
49
+ const reasoner = createReasoner(config, "# AGENTS.md\nSome context");
50
+ assert.ok(reasoner instanceof ClaudeCodeReasoner);
51
+ });
52
+ it("works with undefined globalContext", () => {
53
+ const config = defaultConfig({ reasoner: "opencode" });
54
+ const reasoner = createReasoner(config, undefined);
55
+ assert.ok(reasoner instanceof OpencodeReasoner);
56
+ });
57
+ it("returns object with Reasoner interface methods", () => {
58
+ const config = defaultConfig({ reasoner: "opencode" });
59
+ const reasoner = createReasoner(config);
60
+ assert.equal(typeof reasoner.init, "function");
61
+ assert.equal(typeof reasoner.decide, "function");
62
+ assert.equal(typeof reasoner.shutdown, "function");
63
+ });
64
+ });
65
+ //# sourceMappingURL=reasoner-factory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reasoner-factory.test.js","sourceRoot":"","sources":["../../src/reasoner/reasoner-factory.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aoaoe",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "Autonomous supervisor for agent-of-empires sessions using OpenCode or Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",