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.
Files changed (89) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +7 -0
  4. package/dist/cli/__tests__/cleanup.test.js +15 -0
  5. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  6. package/dist/cli/__tests__/index.test.js +147 -2
  7. package/dist/cli/__tests__/index.test.js.map +1 -1
  8. package/dist/cli/__tests__/launch-fallback.test.js +95 -1
  9. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  10. package/dist/cli/cleanup.d.ts.map +1 -1
  11. package/dist/cli/cleanup.js +6 -3
  12. package/dist/cli/cleanup.js.map +1 -1
  13. package/dist/cli/index.d.ts +18 -1
  14. package/dist/cli/index.d.ts.map +1 -1
  15. package/dist/cli/index.js +178 -23
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/hooks/__tests__/agents-overlay.test.js +18 -0
  18. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  19. package/dist/hooks/__tests__/keyword-detector.test.js +156 -1
  20. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  21. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +56 -2
  22. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  23. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  24. package/dist/hooks/agents-overlay.js +25 -3
  25. package/dist/hooks/agents-overlay.js.map +1 -1
  26. package/dist/hooks/keyword-detector.d.ts +5 -1
  27. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  28. package/dist/hooks/keyword-detector.js +104 -6
  29. package/dist/hooks/keyword-detector.js.map +1 -1
  30. package/dist/hud/__tests__/render.test.js +6 -0
  31. package/dist/hud/__tests__/render.test.js.map +1 -1
  32. package/dist/hud/__tests__/state.test.js +55 -1
  33. package/dist/hud/__tests__/state.test.js.map +1 -1
  34. package/dist/hud/render.d.ts.map +1 -1
  35. package/dist/hud/render.js +8 -3
  36. package/dist/hud/render.js.map +1 -1
  37. package/dist/hud/state.d.ts.map +1 -1
  38. package/dist/hud/state.js +71 -9
  39. package/dist/hud/state.js.map +1 -1
  40. package/dist/hud/types.d.ts +2 -2
  41. package/dist/hud/types.d.ts.map +1 -1
  42. package/dist/mcp/__tests__/state-server.test.js +82 -0
  43. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  44. package/dist/mcp/state-server.d.ts +4 -4
  45. package/dist/mcp/state-server.d.ts.map +1 -1
  46. package/dist/mcp/state-server.js +35 -0
  47. package/dist/mcp/state-server.js.map +1 -1
  48. package/dist/scripts/__tests__/codex-native-hook.test.js +336 -6
  49. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  50. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  51. package/dist/scripts/codex-native-hook.js +221 -23
  52. package/dist/scripts/codex-native-hook.js.map +1 -1
  53. package/dist/scripts/notify-fallback-watcher.js +60 -3
  54. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  55. package/dist/state/__tests__/skill-active.test.d.ts +2 -0
  56. package/dist/state/__tests__/skill-active.test.d.ts.map +1 -0
  57. package/dist/state/__tests__/skill-active.test.js +84 -0
  58. package/dist/state/__tests__/skill-active.test.js.map +1 -0
  59. package/dist/state/skill-active.d.ts +55 -0
  60. package/dist/state/skill-active.d.ts.map +1 -0
  61. package/dist/state/skill-active.js +179 -0
  62. package/dist/state/skill-active.js.map +1 -0
  63. package/dist/team/__tests__/runtime-cli.test.js +85 -0
  64. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  65. package/dist/team/__tests__/runtime.test.js +241 -7
  66. package/dist/team/__tests__/runtime.test.js.map +1 -1
  67. package/dist/team/__tests__/state.test.js +7 -0
  68. package/dist/team/__tests__/state.test.js.map +1 -1
  69. package/dist/team/__tests__/tmux-session.test.js +143 -0
  70. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  71. package/dist/team/runtime-cli.d.ts +15 -0
  72. package/dist/team/runtime-cli.d.ts.map +1 -1
  73. package/dist/team/runtime-cli.js +37 -20
  74. package/dist/team/runtime-cli.js.map +1 -1
  75. package/dist/team/runtime.d.ts +1 -0
  76. package/dist/team/runtime.d.ts.map +1 -1
  77. package/dist/team/runtime.js +16 -8
  78. package/dist/team/runtime.js.map +1 -1
  79. package/dist/team/state/mailbox.d.ts.map +1 -1
  80. package/dist/team/state/mailbox.js +6 -0
  81. package/dist/team/state/mailbox.js.map +1 -1
  82. package/dist/team/tmux-session.d.ts.map +1 -1
  83. package/dist/team/tmux-session.js +32 -4
  84. package/dist/team/tmux-session.js.map +1 -1
  85. package/package.json +1 -1
  86. package/prompts/information-architect.md +15 -102
  87. package/src/scripts/__tests__/codex-native-hook.test.ts +421 -6
  88. package/src/scripts/codex-native-hook.ts +287 -25
  89. 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 activeRuntime = runtime;
450
- if (activeRuntime) {
451
- await shutdownTeam(activeRuntime.teamName, cwd, { force: true }).catch(() => { });
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 activeRuntime = runtime;
1198
- if (activeRuntime) {
1199
- await shutdownTeam(activeRuntime.teamName, cwd, { force: true }).catch(() => { });
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'