oh-my-codex 0.12.0 → 0.12.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/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/README.md +7 -0
- package/dist/cli/__tests__/cleanup.test.js +15 -0
- package/dist/cli/__tests__/cleanup.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +147 -2
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +95 -1
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/cleanup.d.ts.map +1 -1
- package/dist/cli/cleanup.js +6 -3
- package/dist/cli/cleanup.js.map +1 -1
- package/dist/cli/index.d.ts +18 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +178 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +18 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/keyword-detector.test.js +156 -1
- package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js +56 -2
- package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +25 -3
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts +5 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +104 -6
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/hud/__tests__/render.test.js +6 -0
- package/dist/hud/__tests__/render.test.js.map +1 -1
- package/dist/hud/__tests__/state.test.js +55 -1
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +8 -3
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +71 -9
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +2 -2
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/mcp/__tests__/state-server.test.js +82 -0
- package/dist/mcp/__tests__/state-server.test.js.map +1 -1
- package/dist/mcp/state-server.d.ts +4 -4
- package/dist/mcp/state-server.d.ts.map +1 -1
- package/dist/mcp/state-server.js +35 -0
- package/dist/mcp/state-server.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +336 -6
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +221 -23
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-fallback-watcher.js +60 -3
- package/dist/scripts/notify-fallback-watcher.js.map +1 -1
- package/dist/state/__tests__/skill-active.test.d.ts +2 -0
- package/dist/state/__tests__/skill-active.test.d.ts.map +1 -0
- package/dist/state/__tests__/skill-active.test.js +84 -0
- package/dist/state/__tests__/skill-active.test.js.map +1 -0
- package/dist/state/skill-active.d.ts +55 -0
- package/dist/state/skill-active.d.ts.map +1 -0
- package/dist/state/skill-active.js +179 -0
- package/dist/state/skill-active.js.map +1 -0
- package/dist/team/__tests__/runtime-cli.test.js +85 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +241 -7
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/state.test.js +7 -0
- package/dist/team/__tests__/state.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +143 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +15 -0
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +37 -20
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +16 -8
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state/mailbox.d.ts.map +1 -1
- package/dist/team/state/mailbox.js +6 -0
- package/dist/team/state/mailbox.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +32 -4
- package/dist/team/tmux-session.js.map +1 -1
- package/package.json +1 -1
- package/prompts/information-architect.md +15 -102
- package/src/scripts/__tests__/codex-native-hook.test.ts +421 -6
- package/src/scripts/codex-native-hook.ts +287 -25
- package/src/scripts/notify-fallback-watcher.ts +62 -5
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'fs/promises';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { omxStateDir } from '../utils/paths.js';
|
|
5
|
+
export const SKILL_ACTIVE_STATE_MODE = 'skill-active';
|
|
6
|
+
export const SKILL_ACTIVE_STATE_FILE = `${SKILL_ACTIVE_STATE_MODE}-state.json`;
|
|
7
|
+
export const CANONICAL_WORKFLOW_SKILLS = [
|
|
8
|
+
'autopilot',
|
|
9
|
+
'team',
|
|
10
|
+
'ralph',
|
|
11
|
+
'ultrawork',
|
|
12
|
+
'ultraqa',
|
|
13
|
+
'ralplan',
|
|
14
|
+
'deep-interview',
|
|
15
|
+
];
|
|
16
|
+
function safeString(value) {
|
|
17
|
+
return typeof value === 'string' ? value : '';
|
|
18
|
+
}
|
|
19
|
+
function filterEntriesForSession(entries, sessionId) {
|
|
20
|
+
const normalizedSessionId = safeString(sessionId).trim();
|
|
21
|
+
if (!normalizedSessionId)
|
|
22
|
+
return entries;
|
|
23
|
+
return entries.filter((entry) => safeString(entry.session_id).trim() === normalizedSessionId);
|
|
24
|
+
}
|
|
25
|
+
function normalizeSkillActiveEntry(raw) {
|
|
26
|
+
if (!raw || typeof raw !== 'object')
|
|
27
|
+
return null;
|
|
28
|
+
const skill = safeString(raw.skill).trim();
|
|
29
|
+
if (!skill)
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
...raw,
|
|
33
|
+
skill,
|
|
34
|
+
phase: safeString(raw.phase).trim() || undefined,
|
|
35
|
+
active: raw.active !== false,
|
|
36
|
+
activated_at: safeString(raw.activated_at).trim() || undefined,
|
|
37
|
+
updated_at: safeString(raw.updated_at).trim() || undefined,
|
|
38
|
+
session_id: safeString(raw.session_id).trim() || undefined,
|
|
39
|
+
thread_id: safeString(raw.thread_id).trim() || undefined,
|
|
40
|
+
turn_id: safeString(raw.turn_id).trim() || undefined,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function listActiveSkills(raw) {
|
|
44
|
+
if (!raw || typeof raw !== 'object')
|
|
45
|
+
return [];
|
|
46
|
+
const state = raw;
|
|
47
|
+
const deduped = new Map();
|
|
48
|
+
if (Array.isArray(state.active_skills)) {
|
|
49
|
+
for (const candidate of state.active_skills) {
|
|
50
|
+
const normalized = normalizeSkillActiveEntry(candidate);
|
|
51
|
+
if (!normalized || normalized.active === false)
|
|
52
|
+
continue;
|
|
53
|
+
deduped.set(normalized.skill, normalized);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const topLevelSkill = safeString(state.skill).trim();
|
|
57
|
+
if (deduped.size === 0 && state.active === true && topLevelSkill) {
|
|
58
|
+
deduped.set(topLevelSkill, {
|
|
59
|
+
skill: topLevelSkill,
|
|
60
|
+
phase: safeString(state.phase).trim() || undefined,
|
|
61
|
+
active: true,
|
|
62
|
+
activated_at: safeString(state.activated_at).trim() || undefined,
|
|
63
|
+
updated_at: safeString(state.updated_at).trim() || undefined,
|
|
64
|
+
session_id: safeString(state.session_id).trim() || undefined,
|
|
65
|
+
thread_id: safeString(state.thread_id).trim() || undefined,
|
|
66
|
+
turn_id: safeString(state.turn_id).trim() || undefined,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return [...deduped.values()];
|
|
70
|
+
}
|
|
71
|
+
export function normalizeSkillActiveState(raw) {
|
|
72
|
+
if (!raw || typeof raw !== 'object')
|
|
73
|
+
return null;
|
|
74
|
+
const state = raw;
|
|
75
|
+
const activeSkills = listActiveSkills(state);
|
|
76
|
+
const primary = activeSkills.find((entry) => entry.skill === safeString(state.skill).trim()) ?? activeSkills[0];
|
|
77
|
+
const skill = safeString(state.skill).trim() || primary?.skill || '';
|
|
78
|
+
if (!skill && activeSkills.length === 0)
|
|
79
|
+
return null;
|
|
80
|
+
return {
|
|
81
|
+
...state,
|
|
82
|
+
version: typeof state.version === 'number' ? state.version : 1,
|
|
83
|
+
active: typeof state.active === 'boolean' ? state.active : activeSkills.length > 0,
|
|
84
|
+
skill,
|
|
85
|
+
keyword: safeString(state.keyword).trim(),
|
|
86
|
+
phase: safeString(state.phase).trim() || primary?.phase || '',
|
|
87
|
+
activated_at: safeString(state.activated_at).trim() || primary?.activated_at || '',
|
|
88
|
+
updated_at: safeString(state.updated_at).trim() || primary?.updated_at || '',
|
|
89
|
+
source: safeString(state.source).trim() || undefined,
|
|
90
|
+
session_id: safeString(state.session_id).trim() || primary?.session_id || undefined,
|
|
91
|
+
thread_id: safeString(state.thread_id).trim() || primary?.thread_id || undefined,
|
|
92
|
+
turn_id: safeString(state.turn_id).trim() || primary?.turn_id || undefined,
|
|
93
|
+
active_skills: activeSkills.length > 0 ? activeSkills : undefined,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function getSkillActiveStatePaths(cwd, sessionId) {
|
|
97
|
+
const rootPath = join(omxStateDir(cwd), SKILL_ACTIVE_STATE_FILE);
|
|
98
|
+
const normalizedSession = safeString(sessionId).trim();
|
|
99
|
+
if (!normalizedSession)
|
|
100
|
+
return { rootPath };
|
|
101
|
+
return {
|
|
102
|
+
rootPath,
|
|
103
|
+
sessionPath: join(omxStateDir(cwd), 'sessions', normalizedSession, SKILL_ACTIVE_STATE_FILE),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export async function readSkillActiveState(path) {
|
|
107
|
+
try {
|
|
108
|
+
return normalizeSkillActiveState(JSON.parse(await readFile(path, 'utf-8')));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export async function writeSkillActiveStateCopies(cwd, state, sessionId) {
|
|
115
|
+
const { rootPath, sessionPath } = getSkillActiveStatePaths(cwd, sessionId);
|
|
116
|
+
const payload = JSON.stringify(state, null, 2);
|
|
117
|
+
await mkdir(dirname(rootPath), { recursive: true });
|
|
118
|
+
await writeFile(rootPath, payload);
|
|
119
|
+
if (sessionPath) {
|
|
120
|
+
await mkdir(dirname(sessionPath), { recursive: true });
|
|
121
|
+
await writeFile(sessionPath, payload);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function readVisibleSkillActiveState(cwd, sessionId) {
|
|
125
|
+
const { rootPath, sessionPath } = getSkillActiveStatePaths(cwd, sessionId);
|
|
126
|
+
if (sessionPath && existsSync(sessionPath)) {
|
|
127
|
+
return readSkillActiveState(sessionPath);
|
|
128
|
+
}
|
|
129
|
+
if (sessionPath)
|
|
130
|
+
return null;
|
|
131
|
+
if (!existsSync(rootPath))
|
|
132
|
+
return null;
|
|
133
|
+
return readSkillActiveState(rootPath);
|
|
134
|
+
}
|
|
135
|
+
export function tracksCanonicalWorkflowSkill(mode) {
|
|
136
|
+
return CANONICAL_WORKFLOW_SKILLS.includes(mode);
|
|
137
|
+
}
|
|
138
|
+
export async function syncCanonicalSkillStateForMode(options) {
|
|
139
|
+
const { cwd, mode, active, currentPhase, sessionId, threadId, turnId, nowIso = new Date().toISOString(), source = 'state-server', } = options;
|
|
140
|
+
if (!tracksCanonicalWorkflowSkill(mode))
|
|
141
|
+
return;
|
|
142
|
+
const { rootPath } = getSkillActiveStatePaths(cwd, sessionId);
|
|
143
|
+
const existing = await readSkillActiveState(rootPath);
|
|
144
|
+
if (!existing && !active)
|
|
145
|
+
return;
|
|
146
|
+
const entries = filterEntriesForSession(listActiveSkills(existing ?? {}), sessionId);
|
|
147
|
+
const filtered = entries.filter((entry) => entry.skill !== mode);
|
|
148
|
+
if (active) {
|
|
149
|
+
filtered.push({
|
|
150
|
+
skill: mode,
|
|
151
|
+
phase: safeString(currentPhase).trim() || undefined,
|
|
152
|
+
active: true,
|
|
153
|
+
activated_at: entries.find((entry) => entry.skill === mode)?.activated_at || nowIso,
|
|
154
|
+
updated_at: nowIso,
|
|
155
|
+
session_id: safeString(sessionId).trim() || undefined,
|
|
156
|
+
thread_id: safeString(threadId).trim() || undefined,
|
|
157
|
+
turn_id: safeString(turnId).trim() || undefined,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const currentPrimary = safeString(existing?.skill).trim();
|
|
161
|
+
const primaryEntry = filtered.find((entry) => entry.skill === currentPrimary) ?? filtered[0];
|
|
162
|
+
const nextState = {
|
|
163
|
+
...(existing ?? {}),
|
|
164
|
+
version: 1,
|
|
165
|
+
active: filtered.length > 0,
|
|
166
|
+
skill: primaryEntry?.skill || currentPrimary || mode,
|
|
167
|
+
keyword: safeString(existing?.keyword).trim(),
|
|
168
|
+
phase: primaryEntry?.phase || safeString(currentPhase).trim() || safeString(existing?.phase).trim(),
|
|
169
|
+
activated_at: primaryEntry?.activated_at || safeString(existing?.activated_at).trim() || nowIso,
|
|
170
|
+
updated_at: nowIso,
|
|
171
|
+
source: safeString(existing?.source).trim() || source,
|
|
172
|
+
session_id: safeString(sessionId).trim() || safeString(existing?.session_id).trim() || undefined,
|
|
173
|
+
thread_id: safeString(threadId).trim() || safeString(existing?.thread_id).trim() || undefined,
|
|
174
|
+
turn_id: safeString(turnId).trim() || safeString(existing?.turn_id).trim() || undefined,
|
|
175
|
+
active_skills: filtered.length > 0 ? filtered : [],
|
|
176
|
+
};
|
|
177
|
+
await writeSkillActiveStateCopies(cwd, nextState, sessionId);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=skill-active.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-active.js","sourceRoot":"","sources":["../../src/state/skill-active.ts"],"names":[],"mappings":"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"}
|
|
@@ -140,6 +140,91 @@ describe('runtime-cli helpers', () => {
|
|
|
140
140
|
await rm(cwd, { recursive: true, force: true });
|
|
141
141
|
}
|
|
142
142
|
});
|
|
143
|
+
it('preserves team state when building terminal output for completed teams', async () => {
|
|
144
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-cli-preserve-complete-'));
|
|
145
|
+
try {
|
|
146
|
+
await initTeamState('runtime-cli-preserve-complete', 'task', 'executor', 1, cwd);
|
|
147
|
+
await createTask('runtime-cli-preserve-complete', {
|
|
148
|
+
subject: 'done task',
|
|
149
|
+
description: 'already complete',
|
|
150
|
+
status: 'completed',
|
|
151
|
+
owner: 'worker-1',
|
|
152
|
+
result: 'PASS: complete without shutdown',
|
|
153
|
+
}, cwd);
|
|
154
|
+
const teamRoot = join(cwd, '.omx', 'state', 'team', 'runtime-cli-preserve-complete');
|
|
155
|
+
assert.equal(existsSync(teamRoot), true);
|
|
156
|
+
const runtimeCli = await loadRuntimeCliModule();
|
|
157
|
+
const result = runtimeCli.buildTerminalCliResult(runtimeCli.resolveRuntimeCliStateRoot(cwd), 'runtime-cli-preserve-complete', 'complete', 1, Date.now() - 1_000);
|
|
158
|
+
assert.equal(existsSync(teamRoot), true);
|
|
159
|
+
assert.equal(result.exitCode, 0);
|
|
160
|
+
assert.equal(result.output.status, 'completed');
|
|
161
|
+
assert.equal(result.output.teamName, 'runtime-cli-preserve-complete');
|
|
162
|
+
assert.deepEqual(result.output.taskResults, [{
|
|
163
|
+
taskId: '1',
|
|
164
|
+
status: 'completed',
|
|
165
|
+
summary: 'PASS: complete without shutdown',
|
|
166
|
+
}]);
|
|
167
|
+
assert.match(result.notice, /preserving team state/i);
|
|
168
|
+
assert.match(result.notice, /omx team shutdown runtime-cli-preserve-complete/);
|
|
169
|
+
}
|
|
170
|
+
finally {
|
|
171
|
+
await rm(cwd, { recursive: true, force: true });
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
it('preserves team state when building terminal output for failed teams', async () => {
|
|
175
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-cli-preserve-failed-'));
|
|
176
|
+
try {
|
|
177
|
+
await initTeamState('runtime-cli-preserve-failed', 'task', 'executor', 1, cwd);
|
|
178
|
+
await createTask('runtime-cli-preserve-failed', {
|
|
179
|
+
subject: 'failed task',
|
|
180
|
+
description: 'needs postmortem',
|
|
181
|
+
status: 'failed',
|
|
182
|
+
owner: 'worker-1',
|
|
183
|
+
result: 'FAIL: worker crashed',
|
|
184
|
+
}, cwd);
|
|
185
|
+
const teamRoot = join(cwd, '.omx', 'state', 'team', 'runtime-cli-preserve-failed');
|
|
186
|
+
assert.equal(existsSync(teamRoot), true);
|
|
187
|
+
const runtimeCli = await loadRuntimeCliModule();
|
|
188
|
+
const result = runtimeCli.buildTerminalCliResult(runtimeCli.resolveRuntimeCliStateRoot(cwd), 'runtime-cli-preserve-failed', 'failed', 1, Date.now() - 1_000);
|
|
189
|
+
assert.equal(existsSync(teamRoot), true);
|
|
190
|
+
assert.equal(result.exitCode, 1);
|
|
191
|
+
assert.equal(result.output.status, 'failed');
|
|
192
|
+
assert.equal(result.output.teamName, 'runtime-cli-preserve-failed');
|
|
193
|
+
assert.deepEqual(result.output.taskResults, [{
|
|
194
|
+
taskId: '1',
|
|
195
|
+
status: 'failed',
|
|
196
|
+
summary: 'FAIL: worker crashed',
|
|
197
|
+
}]);
|
|
198
|
+
assert.match(result.notice, /preserving team state/i);
|
|
199
|
+
assert.match(result.notice, /omx team shutdown runtime-cli-preserve-failed/);
|
|
200
|
+
}
|
|
201
|
+
finally {
|
|
202
|
+
await rm(cwd, { recursive: true, force: true });
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
it('reports cancelled terminal phases without deleting team state', async () => {
|
|
206
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-cli-preserve-cancelled-'));
|
|
207
|
+
try {
|
|
208
|
+
await initTeamState('runtime-cli-preserve-cancelled', 'task', 'executor', 1, cwd);
|
|
209
|
+
await createTask('runtime-cli-preserve-cancelled', {
|
|
210
|
+
subject: 'cancelled task',
|
|
211
|
+
description: 'team stopped for inspection',
|
|
212
|
+
status: 'blocked',
|
|
213
|
+
}, cwd);
|
|
214
|
+
const teamRoot = join(cwd, '.omx', 'state', 'team', 'runtime-cli-preserve-cancelled');
|
|
215
|
+
assert.equal(existsSync(teamRoot), true);
|
|
216
|
+
const runtimeCli = await loadRuntimeCliModule();
|
|
217
|
+
const result = runtimeCli.buildTerminalCliResult(runtimeCli.resolveRuntimeCliStateRoot(cwd), 'runtime-cli-preserve-cancelled', 'cancelled', 1, Date.now() - 1_000);
|
|
218
|
+
assert.equal(existsSync(teamRoot), true);
|
|
219
|
+
assert.equal(result.exitCode, 1);
|
|
220
|
+
assert.equal(result.output.status, 'failed');
|
|
221
|
+
assert.match(result.notice, /phase=cancelled/);
|
|
222
|
+
assert.match(result.notice, /omx team shutdown runtime-cli-preserve-cancelled/);
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
await rm(cwd, { recursive: true, force: true });
|
|
226
|
+
}
|
|
227
|
+
});
|
|
143
228
|
});
|
|
144
229
|
it('does not treat leader pane as a worker pane for dead-worker detection', async () => {
|
|
145
230
|
const runtimeCli = await loadRuntimeCliModule();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cli.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/runtime-cli.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime-cli.test.js","sourceRoot":"","sources":["../../../src/team/__tests__/runtime-cli.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { tmpdir } from 'os';
|
|
|
7
7
|
import { existsSync } from 'fs';
|
|
8
8
|
import { HUD_TMUX_TEAM_HEIGHT_LINES } from '../../hud/constants.js';
|
|
9
9
|
import { initTeamState, createTask, readTeamConfig, saveTeamConfig, listMailboxMessages, listDispatchRequests, transitionDispatchRequest, updateWorkerHeartbeat, writeAtomic, readTask, readMonitorSnapshot, claimTask, transitionTaskStatus, writeWorkerStatus, } from '../state.js';
|
|
10
|
-
import { monitorTeam, shutdownTeam, resumeTeam, startTeam, assignTask, sendWorkerMessage, applyCreatedInteractiveSessionToConfig, resolveWorkerLaunchArgsFromEnv, waitForWorkerStartupEvidence, waitForClaudeStartupEvidence, } from '../runtime.js';
|
|
10
|
+
import { monitorTeam, shutdownTeam, resumeTeam, startTeam, assignTask, sendWorkerMessage, applyCreatedInteractiveSessionToConfig, resolveWorkerLaunchArgsFromEnv, shouldPrekillInteractiveShutdownProcessTrees, waitForWorkerStartupEvidence, waitForClaudeStartupEvidence, } from '../runtime.js';
|
|
11
11
|
import { resolveTeamLowComplexityDefaultModel } from '../model-contract.js';
|
|
12
12
|
import { readTeamEvents } from '../state/events.js';
|
|
13
13
|
async function initRepo() {
|
|
@@ -147,6 +147,41 @@ async function withMockTmuxFixture(options, run) {
|
|
|
147
147
|
await rm(fakeBinDir, { recursive: true, force: true });
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
|
+
async function withNativeWindowsPlatform(run) {
|
|
151
|
+
const prevMsystem = process.env.MSYSTEM;
|
|
152
|
+
const prevOstype = process.env.OSTYPE;
|
|
153
|
+
const prevWsl = process.env.WSL_DISTRO_NAME;
|
|
154
|
+
const prevWslInterop = process.env.WSL_INTEROP;
|
|
155
|
+
const origPlatform = Object.getOwnPropertyDescriptor(process, 'platform');
|
|
156
|
+
try {
|
|
157
|
+
delete process.env.MSYSTEM;
|
|
158
|
+
delete process.env.OSTYPE;
|
|
159
|
+
delete process.env.WSL_DISTRO_NAME;
|
|
160
|
+
delete process.env.WSL_INTEROP;
|
|
161
|
+
Object.defineProperty(process, 'platform', { value: 'win32', configurable: true });
|
|
162
|
+
return await run();
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
if (origPlatform)
|
|
166
|
+
Object.defineProperty(process, 'platform', origPlatform);
|
|
167
|
+
if (typeof prevMsystem === 'string')
|
|
168
|
+
process.env.MSYSTEM = prevMsystem;
|
|
169
|
+
else
|
|
170
|
+
delete process.env.MSYSTEM;
|
|
171
|
+
if (typeof prevOstype === 'string')
|
|
172
|
+
process.env.OSTYPE = prevOstype;
|
|
173
|
+
else
|
|
174
|
+
delete process.env.OSTYPE;
|
|
175
|
+
if (typeof prevWsl === 'string')
|
|
176
|
+
process.env.WSL_DISTRO_NAME = prevWsl;
|
|
177
|
+
else
|
|
178
|
+
delete process.env.WSL_DISTRO_NAME;
|
|
179
|
+
if (typeof prevWslInterop === 'string')
|
|
180
|
+
process.env.WSL_INTEROP = prevWslInterop;
|
|
181
|
+
else
|
|
182
|
+
delete process.env.WSL_INTEROP;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
150
185
|
const ORIGINAL_OMX_TEAM_STATE_ROOT = process.env.OMX_TEAM_STATE_ROOT;
|
|
151
186
|
beforeEach(() => {
|
|
152
187
|
delete process.env.OMX_TEAM_STATE_ROOT;
|
|
@@ -446,9 +481,9 @@ sleep 5
|
|
|
446
481
|
runtime = null;
|
|
447
482
|
}
|
|
448
483
|
finally {
|
|
449
|
-
const
|
|
450
|
-
if (
|
|
451
|
-
await shutdownTeam(
|
|
484
|
+
const runtimeToShutdown = runtime;
|
|
485
|
+
if (runtimeToShutdown) {
|
|
486
|
+
await shutdownTeam(runtimeToShutdown.teamName, cwd, { force: true }).catch(() => { });
|
|
452
487
|
}
|
|
453
488
|
if (typeof prevPath === 'string')
|
|
454
489
|
process.env.PATH = prevPath;
|
|
@@ -496,6 +531,13 @@ sleep 5
|
|
|
496
531
|
await rm(cwd, { recursive: true, force: true });
|
|
497
532
|
}
|
|
498
533
|
});
|
|
534
|
+
it('skips interactive worker process-tree prekill on native Windows split-pane sessions', async () => {
|
|
535
|
+
await withNativeWindowsPlatform(async () => {
|
|
536
|
+
assert.equal(shouldPrekillInteractiveShutdownProcessTrees('leader:0'), false);
|
|
537
|
+
assert.equal(shouldPrekillInteractiveShutdownProcessTrees('omx-team-alpha'), true);
|
|
538
|
+
});
|
|
539
|
+
assert.equal(shouldPrekillInteractiveShutdownProcessTrees('leader:0'), true);
|
|
540
|
+
});
|
|
499
541
|
it('startTeam accepts native Windows tmux clients even when TMUX env vars are absent', async () => {
|
|
500
542
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-win32-no-env-'));
|
|
501
543
|
const prevTmux = process.env.TMUX;
|
|
@@ -655,6 +697,122 @@ esac
|
|
|
655
697
|
await rm(cwd, { recursive: true, force: true });
|
|
656
698
|
}
|
|
657
699
|
});
|
|
700
|
+
it('startTeam captures interactive worker pid from the resolved pane id', async () => {
|
|
701
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-pane-pid-'));
|
|
702
|
+
const prevTmux = process.env.TMUX;
|
|
703
|
+
const prevTmuxPane = process.env.TMUX_PANE;
|
|
704
|
+
const prevLaunchMode = process.env.OMX_TEAM_WORKER_LAUNCH_MODE;
|
|
705
|
+
const prevWorkerCli = process.env.OMX_TEAM_WORKER_CLI;
|
|
706
|
+
const prevSkipReadyWait = process.env.OMX_TEAM_SKIP_READY_WAIT;
|
|
707
|
+
let runtime = null;
|
|
708
|
+
try {
|
|
709
|
+
await withMockTmuxFixture({
|
|
710
|
+
dirPrefix: 'omx-runtime-pane-pid-bin-',
|
|
711
|
+
tmuxScript: (tmuxLogPath) => `#!/bin/sh
|
|
712
|
+
set -eu
|
|
713
|
+
printf '%s\n' "$*" >> "${tmuxLogPath}"
|
|
714
|
+
case "\${1:-}" in
|
|
715
|
+
-V)
|
|
716
|
+
echo "tmux 3.4"
|
|
717
|
+
exit 0
|
|
718
|
+
;;
|
|
719
|
+
display-message)
|
|
720
|
+
case "$*" in
|
|
721
|
+
*"#{window_width}"*)
|
|
722
|
+
echo "120"
|
|
723
|
+
;;
|
|
724
|
+
*)
|
|
725
|
+
echo "leader:0 %1"
|
|
726
|
+
;;
|
|
727
|
+
esac
|
|
728
|
+
exit 0
|
|
729
|
+
;;
|
|
730
|
+
list-panes)
|
|
731
|
+
case "$*" in
|
|
732
|
+
*"pane_current_command"*)
|
|
733
|
+
printf "%%1\tnode\t'codex'\n"
|
|
734
|
+
;;
|
|
735
|
+
*"#{pane_dead} #{pane_pid}"*)
|
|
736
|
+
echo "1 999999"
|
|
737
|
+
;;
|
|
738
|
+
*"-t %2"*"#{pane_pid}"*)
|
|
739
|
+
echo "2222"
|
|
740
|
+
;;
|
|
741
|
+
*"-t %3"*"#{pane_pid}"*)
|
|
742
|
+
echo "3333"
|
|
743
|
+
;;
|
|
744
|
+
*"#{pane_pid}"*)
|
|
745
|
+
echo "1111"
|
|
746
|
+
;;
|
|
747
|
+
*)
|
|
748
|
+
exit 0
|
|
749
|
+
;;
|
|
750
|
+
esac
|
|
751
|
+
exit 0
|
|
752
|
+
;;
|
|
753
|
+
split-window)
|
|
754
|
+
case "$*" in
|
|
755
|
+
*" -h "*)
|
|
756
|
+
echo "%2"
|
|
757
|
+
;;
|
|
758
|
+
*)
|
|
759
|
+
echo "%3"
|
|
760
|
+
;;
|
|
761
|
+
esac
|
|
762
|
+
exit 0
|
|
763
|
+
;;
|
|
764
|
+
set-hook|run-shell|select-layout|set-window-option|select-pane|send-keys|kill-pane|kill-session)
|
|
765
|
+
exit 0
|
|
766
|
+
;;
|
|
767
|
+
*)
|
|
768
|
+
exit 0
|
|
769
|
+
;;
|
|
770
|
+
esac
|
|
771
|
+
`,
|
|
772
|
+
binaries: [{ name: 'codex', content: '#!/bin/sh\nexit 0\n' }],
|
|
773
|
+
}, async () => {
|
|
774
|
+
delete process.env.TMUX;
|
|
775
|
+
process.env.TMUX_PANE = '%1';
|
|
776
|
+
process.env.OMX_TEAM_WORKER_LAUNCH_MODE = 'interactive';
|
|
777
|
+
process.env.OMX_TEAM_WORKER_CLI = 'codex';
|
|
778
|
+
process.env.OMX_TEAM_SKIP_READY_WAIT = '1';
|
|
779
|
+
runtime = await withoutTeamWorkerEnv(() => startTeam('team-pane-pid', 'interactive pane pid capture', 'executor', 1, [{ subject: 's', description: 'd', owner: 'worker-1' }], cwd));
|
|
780
|
+
assert.equal(runtime.config.workers[0]?.pane_id, '%2');
|
|
781
|
+
assert.equal(runtime.config.workers[0]?.pid, 2222);
|
|
782
|
+
const identityPath = join(cwd, '.omx', 'state', 'team', runtime.teamName, 'workers', 'worker-1', 'identity.json');
|
|
783
|
+
const identity = JSON.parse(await readFile(identityPath, 'utf-8'));
|
|
784
|
+
assert.equal(identity.pane_id, '%2');
|
|
785
|
+
assert.equal(identity.pid, 2222);
|
|
786
|
+
});
|
|
787
|
+
}
|
|
788
|
+
finally {
|
|
789
|
+
const runtimeToShutdown = runtime;
|
|
790
|
+
if (runtimeToShutdown) {
|
|
791
|
+
await shutdownTeam(runtimeToShutdown.teamName, cwd, { force: true }).catch(() => { });
|
|
792
|
+
}
|
|
793
|
+
if (typeof prevTmux === 'string')
|
|
794
|
+
process.env.TMUX = prevTmux;
|
|
795
|
+
else
|
|
796
|
+
delete process.env.TMUX;
|
|
797
|
+
if (typeof prevTmuxPane === 'string')
|
|
798
|
+
process.env.TMUX_PANE = prevTmuxPane;
|
|
799
|
+
else
|
|
800
|
+
delete process.env.TMUX_PANE;
|
|
801
|
+
if (typeof prevLaunchMode === 'string')
|
|
802
|
+
process.env.OMX_TEAM_WORKER_LAUNCH_MODE = prevLaunchMode;
|
|
803
|
+
else
|
|
804
|
+
delete process.env.OMX_TEAM_WORKER_LAUNCH_MODE;
|
|
805
|
+
if (typeof prevWorkerCli === 'string')
|
|
806
|
+
process.env.OMX_TEAM_WORKER_CLI = prevWorkerCli;
|
|
807
|
+
else
|
|
808
|
+
delete process.env.OMX_TEAM_WORKER_CLI;
|
|
809
|
+
if (typeof prevSkipReadyWait === 'string')
|
|
810
|
+
process.env.OMX_TEAM_SKIP_READY_WAIT = prevSkipReadyWait;
|
|
811
|
+
else
|
|
812
|
+
delete process.env.OMX_TEAM_SKIP_READY_WAIT;
|
|
813
|
+
await rm(cwd, { recursive: true, force: true });
|
|
814
|
+
}
|
|
815
|
+
});
|
|
658
816
|
it('startTeam saves interactive pane ids before readiness waits in source order', async () => {
|
|
659
817
|
const source = await readFile(join(process.cwd(), 'src', 'team', 'runtime.ts'), 'utf-8');
|
|
660
818
|
const applyIndex = source.indexOf('applyCreatedInteractiveSessionToConfig(config, createdSession, workerPaneIds);');
|
|
@@ -1194,9 +1352,9 @@ exit 0
|
|
|
1194
1352
|
});
|
|
1195
1353
|
}
|
|
1196
1354
|
finally {
|
|
1197
|
-
const
|
|
1198
|
-
if (
|
|
1199
|
-
await shutdownTeam(
|
|
1355
|
+
const runtimeToShutdown = runtime;
|
|
1356
|
+
if (runtimeToShutdown) {
|
|
1357
|
+
await shutdownTeam(runtimeToShutdown.teamName, cwd, { force: true }).catch(() => { });
|
|
1200
1358
|
}
|
|
1201
1359
|
if (typeof previousTmux === 'string')
|
|
1202
1360
|
process.env.TMUX = previousTmux;
|
|
@@ -2779,6 +2937,80 @@ esac
|
|
|
2779
2937
|
await rm(cwd, { recursive: true, force: true });
|
|
2780
2938
|
}
|
|
2781
2939
|
});
|
|
2940
|
+
it('shutdownTeam skips prekill and keeps the leader pane alive on native Windows split-pane shutdown', async () => {
|
|
2941
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-shutdown-win32-split-'));
|
|
2942
|
+
try {
|
|
2943
|
+
await withNativeWindowsPlatform(async () => {
|
|
2944
|
+
await withMockTmuxFixture({
|
|
2945
|
+
dirPrefix: 'omx-runtime-shutdown-win32-split-bin-',
|
|
2946
|
+
tmuxScript: (tmuxLogPath) => `#!/bin/sh
|
|
2947
|
+
set -eu
|
|
2948
|
+
printf '%s\\n' "$*" >> "${tmuxLogPath}"
|
|
2949
|
+
case "$1" in
|
|
2950
|
+
-V)
|
|
2951
|
+
echo "tmux 3.4"
|
|
2952
|
+
exit 0
|
|
2953
|
+
;;
|
|
2954
|
+
list-panes)
|
|
2955
|
+
case "$*" in
|
|
2956
|
+
*"-F #{pane_dead} #{pane_pid}"*)
|
|
2957
|
+
exit 1
|
|
2958
|
+
;;
|
|
2959
|
+
*"-t leader:0 -F #{pane_id}"*"#{pane_current_command}"*)
|
|
2960
|
+
printf "%%11\\tpwsh\\tpwsh\\n%%12\\tnode\\tnode /tmp/bin/omx.js hud --watch\\n%%13\\tcodex\\tcodex\\n%%14\\tcodex\\tcodex\\n"
|
|
2961
|
+
exit 0
|
|
2962
|
+
;;
|
|
2963
|
+
*)
|
|
2964
|
+
exit 1
|
|
2965
|
+
;;
|
|
2966
|
+
esac
|
|
2967
|
+
;;
|
|
2968
|
+
split-window)
|
|
2969
|
+
printf '%%44\\n'
|
|
2970
|
+
exit 0
|
|
2971
|
+
;;
|
|
2972
|
+
kill-pane|resize-pane|select-pane)
|
|
2973
|
+
exit 0
|
|
2974
|
+
;;
|
|
2975
|
+
*)
|
|
2976
|
+
exit 0
|
|
2977
|
+
;;
|
|
2978
|
+
esac
|
|
2979
|
+
`,
|
|
2980
|
+
}, async ({ tmuxLogPath }) => {
|
|
2981
|
+
await initTeamState('team-shutdown-win32-split', 'shutdown win32 split test', 'executor', 2, cwd);
|
|
2982
|
+
const config = await readTeamConfig('team-shutdown-win32-split', cwd);
|
|
2983
|
+
assert.ok(config);
|
|
2984
|
+
if (!config)
|
|
2985
|
+
return;
|
|
2986
|
+
config.tmux_session = 'leader:0';
|
|
2987
|
+
config.leader_pane_id = '%11';
|
|
2988
|
+
config.hud_pane_id = '%12';
|
|
2989
|
+
config.workers[0].pane_id = '%13';
|
|
2990
|
+
config.workers[1].pane_id = '%14';
|
|
2991
|
+
await saveTeamConfig(config, cwd);
|
|
2992
|
+
await shutdownTeam('team-shutdown-win32-split', cwd, { force: true });
|
|
2993
|
+
const teamRoot = join(cwd, '.omx', 'state', 'team', 'team-shutdown-win32-split');
|
|
2994
|
+
assert.equal(existsSync(teamRoot), false);
|
|
2995
|
+
assert.equal(await readMonitorSnapshot('team-shutdown-win32-split', cwd), null);
|
|
2996
|
+
const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
|
|
2997
|
+
assert.doesNotMatch(tmuxLog, /list-panes -t %13 -F #\{pane_pid\}/);
|
|
2998
|
+
assert.doesNotMatch(tmuxLog, /list-panes -t %14 -F #\{pane_pid\}/);
|
|
2999
|
+
assert.doesNotMatch(tmuxLog, /kill-pane -t %11/);
|
|
3000
|
+
assert.doesNotMatch(tmuxLog, /kill-session -t leader:0/);
|
|
3001
|
+
assert.match(tmuxLog, /kill-pane -t %12/);
|
|
3002
|
+
assert.match(tmuxLog, /kill-pane -t %13/);
|
|
3003
|
+
assert.match(tmuxLog, /kill-pane -t %14/);
|
|
3004
|
+
assert.match(tmuxLog, new RegExp(`split-window -v -l ${HUD_TMUX_TEAM_HEIGHT_LINES} -t %11 -d -P -F #\\{pane_id\\}`));
|
|
3005
|
+
assert.match(tmuxLog, new RegExp(`resize-pane -t %44 -y ${HUD_TMUX_TEAM_HEIGHT_LINES}`));
|
|
3006
|
+
assert.match(tmuxLog, /select-pane -t %11/);
|
|
3007
|
+
});
|
|
3008
|
+
});
|
|
3009
|
+
}
|
|
3010
|
+
finally {
|
|
3011
|
+
await rm(cwd, { recursive: true, force: true });
|
|
3012
|
+
}
|
|
3013
|
+
});
|
|
2782
3014
|
it('shutdownTeam restores a standalone HUD pane after tearing down the team HUD', async () => {
|
|
2783
3015
|
const cwd = await mkdtemp(join(tmpdir(), 'omx-runtime-shutdown-restore-hud-'));
|
|
2784
3016
|
try {
|
|
@@ -3258,6 +3490,7 @@ esac
|
|
|
3258
3490
|
if (!cfg)
|
|
3259
3491
|
throw new Error('missing team config');
|
|
3260
3492
|
cfg.leader_pane_id = '%55';
|
|
3493
|
+
cfg.team_state_root = '/tmp/custom-team-state-root';
|
|
3261
3494
|
await saveTeamConfig(cfg, cwd);
|
|
3262
3495
|
const manifestPath = teamStateTestPath(cwd, 'team', 'team-leader-inject', 'manifest.v2.json');
|
|
3263
3496
|
const manifest = JSON.parse(await readFile(manifestPath, 'utf-8'));
|
|
@@ -3273,6 +3506,7 @@ esac
|
|
|
3273
3506
|
const latest = requests[requests.length - 1];
|
|
3274
3507
|
assert.equal(latest?.status, 'notified');
|
|
3275
3508
|
assert.equal(latest?.last_reason, 'fallback_confirmed:leader_mailbox_notified');
|
|
3509
|
+
assert.match(latest?.trigger_message ?? '', /Read \/tmp\/custom-team-state-root\/team\/team-leader-inject\/mailbox\/leader-fixed\.json; new msg from worker-1\./);
|
|
3276
3510
|
const deliveryLog = await readTeamDeliveryLog(cwd);
|
|
3277
3511
|
const runtimeEntries = deliveryLog.filter((entry) => entry.event === 'dispatch_result'
|
|
3278
3512
|
&& entry.source === 'team.runtime'
|