oh-my-codex 0.4.0 → 0.4.2
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.es.md +36 -0
- package/README.ja.md +36 -0
- package/README.ko.md +36 -0
- package/README.md +13 -1
- package/README.pt.md +36 -0
- package/README.ru.md +36 -0
- package/README.vi.md +36 -0
- package/README.zh.md +39 -0
- package/bin/omx.js +2 -1
- package/dist/config/__tests__/generator-notify.test.js +3 -3
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/generator.d.ts +1 -1
- package/dist/config/generator.js +8 -8
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +427 -0
- package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts +2 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +432 -0
- package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -0
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +3 -0
- package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
- package/dist/hooks/emulator.d.ts +1 -1
- package/dist/hooks/emulator.js +5 -5
- package/dist/hooks/emulator.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js +152 -0
- package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/events.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/events.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/events.test.js +117 -0
- package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/loader.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/loader.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/loader.test.js +229 -0
- package/dist/hooks/extensibility/__tests__/loader.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/logging.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/logging.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/logging.test.js +74 -0
- package/dist/hooks/extensibility/__tests__/logging.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +202 -0
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.js +117 -0
- package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -0
- package/dist/hooks/extensibility/__tests__/sdk.test.d.ts +2 -0
- package/dist/hooks/extensibility/__tests__/sdk.test.d.ts.map +1 -0
- package/dist/hooks/extensibility/__tests__/sdk.test.js +277 -0
- package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -0
- package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk.js +10 -2
- package/dist/hooks/extensibility/sdk.js.map +1 -1
- package/dist/hud/__tests__/colors.test.d.ts +2 -0
- package/dist/hud/__tests__/colors.test.d.ts.map +1 -0
- package/dist/hud/__tests__/colors.test.js +194 -0
- package/dist/hud/__tests__/colors.test.js.map +1 -0
- package/dist/hud/__tests__/render.test.d.ts +2 -0
- package/dist/hud/__tests__/render.test.d.ts.map +1 -0
- package/dist/hud/__tests__/render.test.js +449 -0
- package/dist/hud/__tests__/render.test.js.map +1 -0
- package/dist/hud/__tests__/types.test.d.ts +2 -0
- package/dist/hud/__tests__/types.test.d.ts.map +1 -0
- package/dist/hud/__tests__/types.test.js +17 -0
- package/dist/hud/__tests__/types.test.js.map +1 -0
- package/dist/team/__tests__/tmux-session.test.js +15 -1
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/orchestrator.d.ts +1 -1
- package/dist/team/orchestrator.js +1 -1
- package/dist/team/tmux-session.d.ts +8 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +28 -7
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/utils/__tests__/package.test.d.ts +2 -0
- package/dist/utils/__tests__/package.test.d.ts.map +1 -0
- package/dist/utils/__tests__/package.test.js +21 -0
- package/dist/utils/__tests__/package.test.js.map +1 -0
- package/dist/utils/__tests__/paths.test.d.ts +2 -0
- package/dist/utils/__tests__/paths.test.d.ts.map +1 -0
- package/dist/utils/__tests__/paths.test.js +117 -0
- package/dist/utils/__tests__/paths.test.js.map +1 -0
- package/dist/verification/__tests__/verifier.test.d.ts +2 -0
- package/dist/verification/__tests__/verifier.test.d.ts.map +1 -0
- package/dist/verification/__tests__/verifier.test.js +94 -0
- package/dist/verification/__tests__/verifier.test.js.map +1 -0
- package/package.json +1 -1
- package/scripts/notify-hook.js +346 -1
- package/templates/AGENTS.md +1 -1
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { chmod, mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
const NOTIFY_HOOK_SCRIPT = new URL('../../../scripts/notify-hook.js', import.meta.url);
|
|
9
|
+
async function withTempWorkingDir(run) {
|
|
10
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-notify-all-idle-'));
|
|
11
|
+
try {
|
|
12
|
+
await run(cwd);
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
await rm(cwd, { recursive: true, force: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function writeJson(path, value) {
|
|
19
|
+
await mkdir(join(path, '..'), { recursive: true });
|
|
20
|
+
await writeFile(path, JSON.stringify(value, null, 2));
|
|
21
|
+
}
|
|
22
|
+
function buildFakeTmux(tmuxLogPath) {
|
|
23
|
+
return `#!/usr/bin/env bash
|
|
24
|
+
set -eu
|
|
25
|
+
echo "$@" >> "${tmuxLogPath}"
|
|
26
|
+
cmd="$1"
|
|
27
|
+
shift || true
|
|
28
|
+
if [[ "$cmd" == "display-message" ]]; then
|
|
29
|
+
exit 0
|
|
30
|
+
fi
|
|
31
|
+
if [[ "$cmd" == "send-keys" ]]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
if [[ "$cmd" == "list-panes" ]]; then
|
|
35
|
+
echo "%1 12345"
|
|
36
|
+
exit 0
|
|
37
|
+
fi
|
|
38
|
+
exit 0
|
|
39
|
+
`;
|
|
40
|
+
}
|
|
41
|
+
function runNotifyHookAsWorker(cwd, fakeBinDir, workerEnv, extraEnv = {}) {
|
|
42
|
+
const payload = {
|
|
43
|
+
cwd,
|
|
44
|
+
type: 'agent-turn-complete',
|
|
45
|
+
'thread-id': 'thread-worker',
|
|
46
|
+
'turn-id': `turn-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
47
|
+
'input-messages': ['working'],
|
|
48
|
+
'last-assistant-message': 'task done',
|
|
49
|
+
};
|
|
50
|
+
return spawnSync(process.execPath, [NOTIFY_HOOK_SCRIPT.pathname, JSON.stringify(payload)], {
|
|
51
|
+
encoding: 'utf8',
|
|
52
|
+
env: {
|
|
53
|
+
...process.env,
|
|
54
|
+
PATH: `${fakeBinDir}:${process.env.PATH || ''}`,
|
|
55
|
+
OMX_TEAM_WORKER: workerEnv,
|
|
56
|
+
OMX_TEAM_ALL_IDLE_COOLDOWN_MS: '500', // short cooldown for tests
|
|
57
|
+
TMUX: '',
|
|
58
|
+
TMUX_PANE: '',
|
|
59
|
+
...extraEnv,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
describe('notify-hook all-workers-idle notification', () => {
|
|
64
|
+
it('sends notification to leader when all workers are idle', async () => {
|
|
65
|
+
await withTempWorkingDir(async (cwd) => {
|
|
66
|
+
const omxDir = join(cwd, '.omx');
|
|
67
|
+
const stateDir = join(omxDir, 'state');
|
|
68
|
+
const logsDir = join(omxDir, 'logs');
|
|
69
|
+
const teamName = 'myteam';
|
|
70
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
71
|
+
const workersDir = join(teamDir, 'workers');
|
|
72
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
73
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
74
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
75
|
+
await mkdir(logsDir, { recursive: true });
|
|
76
|
+
await mkdir(workersDir, { recursive: true });
|
|
77
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
78
|
+
// Team config with 2 workers
|
|
79
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
80
|
+
name: teamName,
|
|
81
|
+
tmux_session: 'devsess:0',
|
|
82
|
+
workers: [
|
|
83
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
84
|
+
{ name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
|
|
85
|
+
],
|
|
86
|
+
});
|
|
87
|
+
// Both workers are idle
|
|
88
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
89
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
90
|
+
state: 'idle',
|
|
91
|
+
updated_at: new Date().toISOString(),
|
|
92
|
+
});
|
|
93
|
+
await mkdir(join(workersDir, 'worker-2'), { recursive: true });
|
|
94
|
+
await writeJson(join(workersDir, 'worker-2', 'status.json'), {
|
|
95
|
+
state: 'idle',
|
|
96
|
+
updated_at: new Date().toISOString(),
|
|
97
|
+
});
|
|
98
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
99
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
100
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
101
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
102
|
+
assert.ok(existsSync(tmuxLogPath), 'tmux should have been called');
|
|
103
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
104
|
+
assert.match(tmuxLog, /send-keys/, 'should use send-keys to notify leader');
|
|
105
|
+
assert.match(tmuxLog, /-t devsess:0/, 'should target the leader tmux session');
|
|
106
|
+
assert.match(tmuxLog, /\[OMX\] All 2 workers idle/, 'should include all-workers-idle message');
|
|
107
|
+
assert.match(tmuxLog, /\[OMX_TMUX_INJECT\]/, 'should include injection marker');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
it('does not notify when some workers are still working', async () => {
|
|
111
|
+
await withTempWorkingDir(async (cwd) => {
|
|
112
|
+
const omxDir = join(cwd, '.omx');
|
|
113
|
+
const stateDir = join(omxDir, 'state');
|
|
114
|
+
const logsDir = join(omxDir, 'logs');
|
|
115
|
+
const teamName = 'busy-team';
|
|
116
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
117
|
+
const workersDir = join(teamDir, 'workers');
|
|
118
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
119
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
120
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
121
|
+
await mkdir(logsDir, { recursive: true });
|
|
122
|
+
await mkdir(workersDir, { recursive: true });
|
|
123
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
124
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
125
|
+
name: teamName,
|
|
126
|
+
tmux_session: 'devsess:0',
|
|
127
|
+
workers: [
|
|
128
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
129
|
+
{ name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
// worker-1 is idle, worker-2 is still working
|
|
133
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
134
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
135
|
+
state: 'idle',
|
|
136
|
+
updated_at: new Date().toISOString(),
|
|
137
|
+
});
|
|
138
|
+
await mkdir(join(workersDir, 'worker-2'), { recursive: true });
|
|
139
|
+
await writeJson(join(workersDir, 'worker-2', 'status.json'), {
|
|
140
|
+
state: 'working',
|
|
141
|
+
updated_at: new Date().toISOString(),
|
|
142
|
+
});
|
|
143
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
144
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
145
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
146
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
147
|
+
// Should not send the all-workers-idle notification
|
|
148
|
+
if (existsSync(tmuxLogPath)) {
|
|
149
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
150
|
+
assert.doesNotMatch(tmuxLog, /\[OMX\] All .* idle/, 'should NOT send all-idle message when some workers are busy');
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
it('does not notify when current worker is not idle', async () => {
|
|
155
|
+
await withTempWorkingDir(async (cwd) => {
|
|
156
|
+
const omxDir = join(cwd, '.omx');
|
|
157
|
+
const stateDir = join(omxDir, 'state');
|
|
158
|
+
const logsDir = join(omxDir, 'logs');
|
|
159
|
+
const teamName = 'active-team';
|
|
160
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
161
|
+
const workersDir = join(teamDir, 'workers');
|
|
162
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
163
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
164
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
165
|
+
await mkdir(logsDir, { recursive: true });
|
|
166
|
+
await mkdir(workersDir, { recursive: true });
|
|
167
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
168
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
169
|
+
name: teamName,
|
|
170
|
+
tmux_session: 'devsess:1',
|
|
171
|
+
workers: [
|
|
172
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
173
|
+
],
|
|
174
|
+
});
|
|
175
|
+
// worker-1 is working (not idle) - should not trigger
|
|
176
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
177
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
178
|
+
state: 'working',
|
|
179
|
+
updated_at: new Date().toISOString(),
|
|
180
|
+
});
|
|
181
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
182
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
183
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
184
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
185
|
+
if (existsSync(tmuxLogPath)) {
|
|
186
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
187
|
+
assert.doesNotMatch(tmuxLog, /\[OMX\] All .* idle/);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
it('respects cooldown: does not send repeated notifications', async () => {
|
|
192
|
+
await withTempWorkingDir(async (cwd) => {
|
|
193
|
+
const omxDir = join(cwd, '.omx');
|
|
194
|
+
const stateDir = join(omxDir, 'state');
|
|
195
|
+
const logsDir = join(omxDir, 'logs');
|
|
196
|
+
const teamName = 'cooldown-team';
|
|
197
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
198
|
+
const workersDir = join(teamDir, 'workers');
|
|
199
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
200
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
201
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
202
|
+
await mkdir(logsDir, { recursive: true });
|
|
203
|
+
await mkdir(workersDir, { recursive: true });
|
|
204
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
205
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
206
|
+
name: teamName,
|
|
207
|
+
tmux_session: 'devsess:2',
|
|
208
|
+
workers: [
|
|
209
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
210
|
+
],
|
|
211
|
+
});
|
|
212
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
213
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
214
|
+
state: 'idle',
|
|
215
|
+
updated_at: new Date().toISOString(),
|
|
216
|
+
});
|
|
217
|
+
// Pre-populate cooldown state with a recent notification
|
|
218
|
+
await writeJson(join(teamDir, 'all-workers-idle.json'), {
|
|
219
|
+
last_notified_at_ms: Date.now() - 100, // 100ms ago — well within cooldown
|
|
220
|
+
last_notified_at: new Date().toISOString(),
|
|
221
|
+
worker_count: 1,
|
|
222
|
+
});
|
|
223
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
224
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
225
|
+
// Use a long cooldown (10 minutes) so the 100ms-old entry blocks the notification
|
|
226
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`, {
|
|
227
|
+
OMX_TEAM_ALL_IDLE_COOLDOWN_MS: '600000',
|
|
228
|
+
});
|
|
229
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
230
|
+
if (existsSync(tmuxLogPath)) {
|
|
231
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
232
|
+
assert.doesNotMatch(tmuxLog, /\[OMX\] All .* idle/, 'cooldown should block repeated notification');
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
it('writes all_workers_idle event to events.ndjson', async () => {
|
|
237
|
+
await withTempWorkingDir(async (cwd) => {
|
|
238
|
+
const omxDir = join(cwd, '.omx');
|
|
239
|
+
const stateDir = join(omxDir, 'state');
|
|
240
|
+
const logsDir = join(omxDir, 'logs');
|
|
241
|
+
const teamName = 'event-team';
|
|
242
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
243
|
+
const workersDir = join(teamDir, 'workers');
|
|
244
|
+
const eventsDir = join(teamDir, 'events');
|
|
245
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
246
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
247
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
248
|
+
await mkdir(logsDir, { recursive: true });
|
|
249
|
+
await mkdir(workersDir, { recursive: true });
|
|
250
|
+
await mkdir(eventsDir, { recursive: true });
|
|
251
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
252
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
253
|
+
name: teamName,
|
|
254
|
+
tmux_session: 'omx-team-event',
|
|
255
|
+
workers: [
|
|
256
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
257
|
+
{ name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
|
|
258
|
+
],
|
|
259
|
+
});
|
|
260
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
261
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
262
|
+
state: 'idle',
|
|
263
|
+
updated_at: new Date().toISOString(),
|
|
264
|
+
});
|
|
265
|
+
await mkdir(join(workersDir, 'worker-2'), { recursive: true });
|
|
266
|
+
await writeJson(join(workersDir, 'worker-2', 'status.json'), {
|
|
267
|
+
state: 'idle',
|
|
268
|
+
updated_at: new Date().toISOString(),
|
|
269
|
+
});
|
|
270
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
271
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
272
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
273
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
274
|
+
const eventsPath = join(eventsDir, 'events.ndjson');
|
|
275
|
+
assert.ok(existsSync(eventsPath), 'events.ndjson should exist after notification');
|
|
276
|
+
const content = await readFile(eventsPath, 'utf-8');
|
|
277
|
+
const events = content.trim().split('\n').map(line => JSON.parse(line));
|
|
278
|
+
const idleEvent = events.find((e) => e.type === 'all_workers_idle');
|
|
279
|
+
assert.ok(idleEvent, 'should have an all_workers_idle event');
|
|
280
|
+
assert.equal(idleEvent.team, teamName);
|
|
281
|
+
assert.equal(idleEvent.worker, 'worker-1');
|
|
282
|
+
assert.equal(idleEvent.worker_count, 2);
|
|
283
|
+
assert.ok(idleEvent.event_id, 'event should have an event_id');
|
|
284
|
+
assert.ok(idleEvent.created_at, 'event should have a created_at timestamp');
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
it('does not fire for leader (non-team-worker) context', async () => {
|
|
288
|
+
await withTempWorkingDir(async (cwd) => {
|
|
289
|
+
const omxDir = join(cwd, '.omx');
|
|
290
|
+
const stateDir = join(omxDir, 'state');
|
|
291
|
+
const logsDir = join(omxDir, 'logs');
|
|
292
|
+
const teamName = 'leader-test';
|
|
293
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
294
|
+
const workersDir = join(teamDir, 'workers');
|
|
295
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
296
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
297
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
298
|
+
await mkdir(logsDir, { recursive: true });
|
|
299
|
+
await mkdir(workersDir, { recursive: true });
|
|
300
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
301
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
302
|
+
name: teamName,
|
|
303
|
+
tmux_session: 'devsess:3',
|
|
304
|
+
workers: [
|
|
305
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
306
|
+
],
|
|
307
|
+
});
|
|
308
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
309
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
310
|
+
state: 'idle',
|
|
311
|
+
updated_at: new Date().toISOString(),
|
|
312
|
+
});
|
|
313
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
314
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
315
|
+
// Run as LEADER (no OMX_TEAM_WORKER env var)
|
|
316
|
+
const payload = {
|
|
317
|
+
cwd,
|
|
318
|
+
type: 'agent-turn-complete',
|
|
319
|
+
'thread-id': 'thread-leader',
|
|
320
|
+
'turn-id': `turn-${Date.now()}`,
|
|
321
|
+
'input-messages': ['leader turn'],
|
|
322
|
+
'last-assistant-message': 'done',
|
|
323
|
+
};
|
|
324
|
+
const result = spawnSync(process.execPath, [NOTIFY_HOOK_SCRIPT.pathname, JSON.stringify(payload)], {
|
|
325
|
+
encoding: 'utf8',
|
|
326
|
+
env: {
|
|
327
|
+
...process.env,
|
|
328
|
+
PATH: `${fakeBinDir}:${process.env.PATH || ''}`,
|
|
329
|
+
OMX_TEAM_WORKER: '', // empty = not a worker
|
|
330
|
+
TMUX: '',
|
|
331
|
+
TMUX_PANE: '',
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
335
|
+
if (existsSync(tmuxLogPath)) {
|
|
336
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
337
|
+
assert.doesNotMatch(tmuxLog, /\[OMX\] All .* idle/, 'leader context should not send all-idle notification');
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
it('handles single worker team correctly with singular message', async () => {
|
|
342
|
+
await withTempWorkingDir(async (cwd) => {
|
|
343
|
+
const omxDir = join(cwd, '.omx');
|
|
344
|
+
const stateDir = join(omxDir, 'state');
|
|
345
|
+
const logsDir = join(omxDir, 'logs');
|
|
346
|
+
const teamName = 'solo-team';
|
|
347
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
348
|
+
const workersDir = join(teamDir, 'workers');
|
|
349
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
350
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
351
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
352
|
+
await mkdir(logsDir, { recursive: true });
|
|
353
|
+
await mkdir(workersDir, { recursive: true });
|
|
354
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
355
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
356
|
+
name: teamName,
|
|
357
|
+
tmux_session: 'solo-session:0',
|
|
358
|
+
workers: [
|
|
359
|
+
{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
|
|
360
|
+
],
|
|
361
|
+
});
|
|
362
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
363
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
364
|
+
state: 'idle',
|
|
365
|
+
updated_at: new Date().toISOString(),
|
|
366
|
+
});
|
|
367
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
368
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
369
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
370
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
371
|
+
assert.ok(existsSync(tmuxLogPath), 'tmux should have been called');
|
|
372
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
373
|
+
assert.match(tmuxLog, /\[OMX\] All 1 worker idle/, 'single worker uses singular form');
|
|
374
|
+
assert.doesNotMatch(tmuxLog, /All 1 workers idle/, 'should not use plural for single worker');
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
it('uses manifest.v2.json over config.json when both present', async () => {
|
|
378
|
+
await withTempWorkingDir(async (cwd) => {
|
|
379
|
+
const omxDir = join(cwd, '.omx');
|
|
380
|
+
const stateDir = join(omxDir, 'state');
|
|
381
|
+
const logsDir = join(omxDir, 'logs');
|
|
382
|
+
const teamName = 'manifest-team';
|
|
383
|
+
const teamDir = join(stateDir, 'team', teamName);
|
|
384
|
+
const workersDir = join(teamDir, 'workers');
|
|
385
|
+
const fakeBinDir = join(cwd, 'fake-bin');
|
|
386
|
+
const fakeTmuxPath = join(fakeBinDir, 'tmux');
|
|
387
|
+
const tmuxLogPath = join(cwd, 'tmux.log');
|
|
388
|
+
await mkdir(logsDir, { recursive: true });
|
|
389
|
+
await mkdir(workersDir, { recursive: true });
|
|
390
|
+
await mkdir(fakeBinDir, { recursive: true });
|
|
391
|
+
// Write BOTH config.json and manifest.v2.json
|
|
392
|
+
// They differ in tmux_session — manifest should win
|
|
393
|
+
await writeJson(join(teamDir, 'config.json'), {
|
|
394
|
+
name: teamName,
|
|
395
|
+
tmux_session: 'wrong-session:0',
|
|
396
|
+
workers: [{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] }],
|
|
397
|
+
});
|
|
398
|
+
await writeJson(join(teamDir, 'manifest.v2.json'), {
|
|
399
|
+
schema_version: 2,
|
|
400
|
+
name: teamName,
|
|
401
|
+
task: 'test',
|
|
402
|
+
leader: { session_id: '', worker_id: 'leader-fixed', role: 'coordinator' },
|
|
403
|
+
policy: { display_mode: 'auto', delegation_only: false, plan_approval_required: false, nested_teams_allowed: false, one_team_per_leader_session: true, cleanup_requires_all_workers_inactive: true },
|
|
404
|
+
permissions_snapshot: { approval_mode: 'unknown', sandbox_mode: 'unknown', network_access: true },
|
|
405
|
+
tmux_session: 'correct-session:1',
|
|
406
|
+
worker_count: 1,
|
|
407
|
+
workers: [{ name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] }],
|
|
408
|
+
next_task_id: 1,
|
|
409
|
+
created_at: new Date().toISOString(),
|
|
410
|
+
});
|
|
411
|
+
await mkdir(join(workersDir, 'worker-1'), { recursive: true });
|
|
412
|
+
await writeJson(join(workersDir, 'worker-1', 'status.json'), {
|
|
413
|
+
state: 'idle',
|
|
414
|
+
updated_at: new Date().toISOString(),
|
|
415
|
+
});
|
|
416
|
+
await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
|
|
417
|
+
await chmod(fakeTmuxPath, 0o755);
|
|
418
|
+
const result = runNotifyHookAsWorker(cwd, fakeBinDir, `${teamName}/worker-1`);
|
|
419
|
+
assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
|
|
420
|
+
assert.ok(existsSync(tmuxLogPath), 'tmux should have been called');
|
|
421
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
422
|
+
assert.match(tmuxLog, /-t correct-session:1/, 'should use tmux_session from manifest.v2.json');
|
|
423
|
+
assert.doesNotMatch(tmuxLog, /wrong-session/, 'should not use tmux_session from config.json');
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
//# sourceMappingURL=notify-hook-all-workers-idle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-hook-all-workers-idle.test.js","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-all-workers-idle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-hook-auto-nudge.test.d.ts","sourceRoot":"","sources":["../../../src/hooks/__tests__/notify-hook-auto-nudge.test.ts"],"names":[],"mappings":""}
|