oh-my-codex 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +56 -23
  2. package/dist/cli/__tests__/doctor-team.test.d.ts +2 -0
  3. package/dist/cli/__tests__/doctor-team.test.d.ts.map +1 -0
  4. package/dist/cli/__tests__/doctor-team.test.js +151 -0
  5. package/dist/cli/__tests__/doctor-team.test.js.map +1 -0
  6. package/dist/cli/__tests__/index.test.js +31 -1
  7. package/dist/cli/__tests__/index.test.js.map +1 -1
  8. package/dist/cli/__tests__/session-scoped-runtime.test.js +2 -0
  9. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  10. package/dist/cli/__tests__/setup-gh-star.test.d.ts +2 -0
  11. package/dist/cli/__tests__/setup-gh-star.test.d.ts.map +1 -0
  12. package/dist/cli/__tests__/setup-gh-star.test.js +59 -0
  13. package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -0
  14. package/dist/cli/doctor.d.ts +1 -0
  15. package/dist/cli/doctor.d.ts.map +1 -1
  16. package/dist/cli/doctor.js +172 -1
  17. package/dist/cli/doctor.js.map +1 -1
  18. package/dist/cli/index.d.ts +2 -0
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +140 -2
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/setup.d.ts.map +1 -1
  23. package/dist/cli/setup.js +34 -0
  24. package/dist/cli/setup.js.map +1 -1
  25. package/dist/cli/team.d.ts +6 -0
  26. package/dist/cli/team.d.ts.map +1 -0
  27. package/dist/cli/team.js +140 -0
  28. package/dist/cli/team.js.map +1 -0
  29. package/dist/cli/tmux-hook.d.ts +1 -0
  30. package/dist/cli/tmux-hook.d.ts.map +1 -1
  31. package/dist/cli/tmux-hook.js +131 -24
  32. package/dist/cli/tmux-hook.js.map +1 -1
  33. package/dist/config/__tests__/generator-notify.test.js +79 -12
  34. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  35. package/dist/config/generator.d.ts.map +1 -1
  36. package/dist/config/generator.js +12 -5
  37. package/dist/config/generator.js.map +1 -1
  38. package/dist/hooks/__tests__/keyword-detector.test.d.ts +2 -0
  39. package/dist/hooks/__tests__/keyword-detector.test.d.ts.map +1 -0
  40. package/dist/hooks/__tests__/keyword-detector.test.js +39 -0
  41. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -0
  42. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts +2 -0
  43. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.d.ts.map +1 -0
  44. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +99 -0
  45. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -0
  46. package/dist/hooks/__tests__/tmux-hook-engine.test.js +36 -0
  47. package/dist/hooks/__tests__/tmux-hook-engine.test.js.map +1 -1
  48. package/dist/hooks/emulator.d.ts.map +1 -1
  49. package/dist/hooks/emulator.js +3 -0
  50. package/dist/hooks/emulator.js.map +1 -1
  51. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  52. package/dist/hooks/keyword-detector.js +2 -1
  53. package/dist/hooks/keyword-detector.js.map +1 -1
  54. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts +2 -0
  55. package/dist/mcp/__tests__/state-server-team-tools.test.d.ts.map +1 -0
  56. package/dist/mcp/__tests__/state-server-team-tools.test.js +128 -0
  57. package/dist/mcp/__tests__/state-server-team-tools.test.js.map +1 -0
  58. package/dist/mcp/__tests__/state-server.test.d.ts +2 -0
  59. package/dist/mcp/__tests__/state-server.test.d.ts.map +1 -0
  60. package/dist/mcp/__tests__/state-server.test.js +52 -0
  61. package/dist/mcp/__tests__/state-server.test.js.map +1 -0
  62. package/dist/mcp/state-server.d.ts +18 -1
  63. package/dist/mcp/state-server.d.ts.map +1 -1
  64. package/dist/mcp/state-server.js +752 -6
  65. package/dist/mcp/state-server.js.map +1 -1
  66. package/dist/team/__tests__/mcp-comm.test.d.ts +2 -0
  67. package/dist/team/__tests__/mcp-comm.test.d.ts.map +1 -0
  68. package/dist/team/__tests__/mcp-comm.test.js +93 -0
  69. package/dist/team/__tests__/mcp-comm.test.js.map +1 -0
  70. package/dist/team/__tests__/runtime.test.d.ts +2 -0
  71. package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
  72. package/dist/team/__tests__/runtime.test.js +271 -0
  73. package/dist/team/__tests__/runtime.test.js.map +1 -0
  74. package/dist/team/__tests__/state.test.d.ts +2 -0
  75. package/dist/team/__tests__/state.test.d.ts.map +1 -0
  76. package/dist/team/__tests__/state.test.js +556 -0
  77. package/dist/team/__tests__/state.test.js.map +1 -0
  78. package/dist/team/__tests__/tmux-session.test.d.ts +2 -0
  79. package/dist/team/__tests__/tmux-session.test.d.ts.map +1 -0
  80. package/dist/team/__tests__/tmux-session.test.js +140 -0
  81. package/dist/team/__tests__/tmux-session.test.js.map +1 -0
  82. package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
  83. package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
  84. package/dist/team/__tests__/worker-bootstrap.test.js +174 -0
  85. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
  86. package/dist/team/mcp-comm.d.ts +45 -0
  87. package/dist/team/mcp-comm.d.ts.map +1 -0
  88. package/dist/team/mcp-comm.js +26 -0
  89. package/dist/team/mcp-comm.js.map +1 -0
  90. package/dist/team/runtime.d.ts +72 -0
  91. package/dist/team/runtime.d.ts.map +1 -0
  92. package/dist/team/runtime.js +676 -0
  93. package/dist/team/runtime.js.map +1 -0
  94. package/dist/team/state.d.ts +217 -0
  95. package/dist/team/state.d.ts.map +1 -0
  96. package/dist/team/state.js +1114 -0
  97. package/dist/team/state.js.map +1 -0
  98. package/dist/team/team-ops.d.ts +48 -0
  99. package/dist/team/team-ops.d.ts.map +1 -0
  100. package/dist/team/team-ops.js +58 -0
  101. package/dist/team/team-ops.js.map +1 -0
  102. package/dist/team/tmux-session.d.ts +21 -0
  103. package/dist/team/tmux-session.d.ts.map +1 -0
  104. package/dist/team/tmux-session.js +425 -0
  105. package/dist/team/tmux-session.js.map +1 -0
  106. package/dist/team/worker-bootstrap.d.ts +39 -0
  107. package/dist/team/worker-bootstrap.d.ts.map +1 -0
  108. package/dist/team/worker-bootstrap.js +183 -0
  109. package/dist/team/worker-bootstrap.js.map +1 -0
  110. package/package.json +1 -1
  111. package/scripts/notify-hook.js +240 -78
  112. package/scripts/tmux-hook-engine.js +11 -2
  113. package/skills/cancel/SKILL.md +50 -55
  114. package/skills/hud/SKILL.md +5 -4
  115. package/skills/team/SKILL.md +171 -773
  116. package/skills/worker/SKILL.md +65 -0
  117. package/templates/AGENTS.md +2 -1
@@ -0,0 +1,425 @@
1
+ import { spawnSync } from 'child_process';
2
+ const INJECTION_MARKER = '[OMX_TMUX_INJECT]';
3
+ const CODEX_BYPASS_FLAG = '--dangerously-bypass-approvals-and-sandbox';
4
+ const MADMAX_FLAG = '--madmax';
5
+ function runTmux(args) {
6
+ const result = spawnSync('tmux', args, { encoding: 'utf-8' });
7
+ if (result.error) {
8
+ return { ok: false, stderr: result.error.message };
9
+ }
10
+ if (result.status !== 0) {
11
+ return { ok: false, stderr: (result.stderr || '').trim() || `tmux exited ${result.status}` };
12
+ }
13
+ return { ok: true, stdout: (result.stdout || '').trim() };
14
+ }
15
+ function baseSessionName(target) {
16
+ return target.split(':')[0] || target;
17
+ }
18
+ function listPanes(target) {
19
+ const result = runTmux(['list-panes', '-t', target, '-F', '#{pane_id}\t#{pane_current_command}\t#{pane_start_command}']);
20
+ if (!result.ok)
21
+ return [];
22
+ return result.stdout
23
+ .split('\n')
24
+ .map((line) => line.trim())
25
+ .filter((line) => line.length > 0)
26
+ .map((line) => {
27
+ const [paneId = '', currentCommand = '', startCommand = ''] = line.split('\t');
28
+ return { paneId, currentCommand, startCommand };
29
+ })
30
+ .filter((pane) => pane.paneId.startsWith('%'));
31
+ }
32
+ function isHudWatchPane(pane) {
33
+ const start = pane.startCommand || '';
34
+ return /\bomx\b.*\bhud\b.*--watch/i.test(start);
35
+ }
36
+ function findHudPaneIds(target, leaderPaneId) {
37
+ const panes = listPanes(target);
38
+ return panes
39
+ .filter((pane) => pane.paneId !== leaderPaneId)
40
+ .filter((pane) => isHudWatchPane(pane))
41
+ .map((pane) => pane.paneId);
42
+ }
43
+ function sleepSeconds(seconds) {
44
+ // shelling out keeps implementation consistent with the project's pattern
45
+ spawnSync('sleep', [String(seconds)], { encoding: 'utf-8' });
46
+ }
47
+ function sleepFractionalSeconds(seconds) {
48
+ if (!Number.isFinite(seconds) || seconds <= 0)
49
+ return;
50
+ spawnSync('sleep', [String(seconds)], { encoding: 'utf-8' });
51
+ }
52
+ function shellQuoteSingle(value) {
53
+ return `'${value.replace(/'/g, `'\\''`)}'`;
54
+ }
55
+ function buildWorkerLaunchSpec(shellPath) {
56
+ if (shellPath && /\/zsh$/i.test(shellPath)) {
57
+ return { shell: shellPath, rcFile: '~/.zshrc' };
58
+ }
59
+ if (shellPath && /\/bash$/i.test(shellPath)) {
60
+ return { shell: shellPath, rcFile: '~/.bashrc' };
61
+ }
62
+ if (shellPath && shellPath.trim() !== '') {
63
+ return { shell: shellPath, rcFile: null };
64
+ }
65
+ return { shell: '/bin/sh', rcFile: null };
66
+ }
67
+ function resolveWorkerLaunchArgs(extraArgs = []) {
68
+ const merged = [...extraArgs];
69
+ const wantsBypass = process.argv.includes(CODEX_BYPASS_FLAG) || process.argv.includes(MADMAX_FLAG);
70
+ if (wantsBypass && !merged.includes(CODEX_BYPASS_FLAG)) {
71
+ merged.push(CODEX_BYPASS_FLAG);
72
+ }
73
+ return merged;
74
+ }
75
+ export function buildWorkerStartupCommand(teamName, workerIndex, launchArgs = []) {
76
+ const spec = buildWorkerLaunchSpec(process.env.SHELL);
77
+ const fullLaunchArgs = resolveWorkerLaunchArgs(launchArgs);
78
+ const codexArgs = fullLaunchArgs.map(shellQuoteSingle).join(' ');
79
+ const codexInvocation = codexArgs.length > 0 ? `exec codex ${codexArgs}` : 'exec codex';
80
+ const rcPrefix = spec.rcFile ? `if [ -f ${spec.rcFile} ]; then source ${spec.rcFile}; fi; ` : '';
81
+ const inner = `${rcPrefix}${codexInvocation}`;
82
+ return `env OMX_TEAM_WORKER=${teamName}/worker-${workerIndex} ${shellQuoteSingle(spec.shell)} -lc ${shellQuoteSingle(inner)}`;
83
+ }
84
+ // Sanitize team name: lowercase, alphanumeric + hyphens, max 30 chars
85
+ export function sanitizeTeamName(name) {
86
+ const lowered = name.toLowerCase();
87
+ const replaced = lowered
88
+ .replace(/[^a-z0-9]+/g, '-')
89
+ .replace(/-+/g, '-')
90
+ .replace(/^-/, '')
91
+ .replace(/-$/, '');
92
+ const truncated = replaced.slice(0, 30).replace(/-$/, '');
93
+ if (truncated.trim() === '') {
94
+ throw new Error('sanitizeTeamName: empty after sanitization');
95
+ }
96
+ return truncated;
97
+ }
98
+ // Check if tmux is available
99
+ export function isTmuxAvailable() {
100
+ const result = spawnSync('tmux', ['-V'], { encoding: 'utf-8' });
101
+ if (result.error)
102
+ return false;
103
+ return result.status === 0;
104
+ }
105
+ // Create tmux session with N worker windows
106
+ // Split the current tmux leader window into worker panes.
107
+ // Returns TeamSession or throws if tmux not available
108
+ export function createTeamSession(teamName, workerCount, cwd, workerLaunchArgs = []) {
109
+ if (!isTmuxAvailable()) {
110
+ throw new Error('tmux is not available');
111
+ }
112
+ if (!Number.isInteger(workerCount) || workerCount < 1) {
113
+ throw new Error(`workerCount must be >= 1 (got ${workerCount})`);
114
+ }
115
+ if (!process.env.TMUX) {
116
+ throw new Error('team mode requires running inside tmux leader pane');
117
+ }
118
+ const safeTeamName = sanitizeTeamName(teamName);
119
+ const context = runTmux(['display-message', '-p', '#S:#I #{pane_id}']);
120
+ if (!context.ok) {
121
+ throw new Error(`failed to detect current tmux target: ${context.stderr}`);
122
+ }
123
+ const [sessionAndWindow = '', leaderPaneId = ''] = context.stdout.split(' ');
124
+ const [sessionName, windowIndex] = (sessionAndWindow || '').split(':');
125
+ if (!sessionName || !windowIndex || !leaderPaneId || !leaderPaneId.startsWith('%')) {
126
+ throw new Error(`failed to parse current tmux target: ${context.stdout}`);
127
+ }
128
+ const teamTarget = `${sessionName}:${windowIndex}`;
129
+ const initialHudPaneIds = findHudPaneIds(teamTarget, leaderPaneId);
130
+ // Team mode prioritizes leader + worker visibility. Remove HUD panes in this window
131
+ // to keep a clean "leader left / workers right" layout.
132
+ for (const hudPaneId of initialHudPaneIds) {
133
+ runTmux(['kill-pane', '-t', hudPaneId]);
134
+ }
135
+ const workerPaneIds = [];
136
+ let rightStackRootPaneId = null;
137
+ for (let i = 1; i <= workerCount; i++) {
138
+ const cmd = buildWorkerStartupCommand(safeTeamName, i, workerLaunchArgs);
139
+ // First split creates the right side from leader. Remaining splits stack on the right.
140
+ const splitDirection = i === 1 ? '-h' : '-v';
141
+ const splitTarget = i === 1 ? leaderPaneId : (rightStackRootPaneId ?? leaderPaneId);
142
+ const split = runTmux([
143
+ 'split-window',
144
+ splitDirection,
145
+ '-t',
146
+ splitTarget,
147
+ '-d',
148
+ '-P',
149
+ '-F',
150
+ '#{pane_id}',
151
+ '-c',
152
+ cwd,
153
+ cmd,
154
+ ]);
155
+ if (!split.ok) {
156
+ throw new Error(`failed to create worker pane ${i}: ${split.stderr}`);
157
+ }
158
+ const paneId = split.stdout.split('\n')[0]?.trim();
159
+ if (!paneId || !paneId.startsWith('%')) {
160
+ throw new Error(`failed to capture worker pane id for worker ${i}`);
161
+ }
162
+ workerPaneIds.push(paneId);
163
+ if (i === 1)
164
+ rightStackRootPaneId = paneId;
165
+ }
166
+ // Keep leader as full left/main pane; workers stay stacked on the right.
167
+ runTmux(['select-layout', '-t', teamTarget, 'main-vertical']);
168
+ // Force leader pane to use half the window width.
169
+ const windowWidthResult = runTmux(['display-message', '-p', '-t', teamTarget, '#{window_width}']);
170
+ if (windowWidthResult.ok) {
171
+ const width = Number.parseInt(windowWidthResult.stdout.split('\n')[0]?.trim() || '', 10);
172
+ if (Number.isFinite(width) && width >= 40) {
173
+ const half = String(Math.floor(width / 2));
174
+ runTmux(['set-window-option', '-t', teamTarget, 'main-pane-width', half]);
175
+ runTmux(['select-layout', '-t', teamTarget, 'main-vertical']);
176
+ }
177
+ }
178
+ // Re-create a single HUD pane under the leader column for team visibility.
179
+ // Keep this after layout sizing so HUD does not get mixed into worker stack.
180
+ const omxEntry = process.argv[1];
181
+ if (omxEntry && omxEntry.trim() !== '') {
182
+ const hudCmd = `node ${shellQuoteSingle(omxEntry)} hud --watch`;
183
+ runTmux(['split-window', '-v', '-l', '4', '-t', leaderPaneId, '-d', '-c', cwd, hudCmd]);
184
+ }
185
+ runTmux(['select-pane', '-t', leaderPaneId]);
186
+ sleepSeconds(0.5);
187
+ return { name: teamTarget, workerCount, cwd, workerPaneIds };
188
+ }
189
+ function paneTarget(sessionName, workerIndex, workerPaneId) {
190
+ if (workerPaneId && workerPaneId.startsWith('%'))
191
+ return workerPaneId;
192
+ if (sessionName.includes(':')) {
193
+ return `${sessionName}.${workerIndex}`;
194
+ }
195
+ return `${sessionName}:${workerIndex}`;
196
+ }
197
+ function paneLooksReady(captured) {
198
+ const content = captured.trimEnd();
199
+ if (content === '')
200
+ return false;
201
+ const lines = content
202
+ .split('\n')
203
+ .map(l => l.replace(/\r/g, ''))
204
+ .map(l => l.trimEnd())
205
+ .filter(l => l.trim() !== '');
206
+ const lastLine = lines.length > 0 ? lines[lines.length - 1] : '';
207
+ if (/^\s*[›>]\s*/.test(lastLine))
208
+ return true;
209
+ // Codex TUI often renders a status bar/footer instead of a raw shell prompt.
210
+ // Treat common Codex UI markers as "ready enough" for inbox-trigger dispatch.
211
+ const hasCodexPromptLine = lines.some((line) => /^\s*›\s*/u.test(line));
212
+ const hasCodexStatus = lines.some((line) => /\bgpt-[\w.-]+\b/i.test(line) || /\b\d+% left\b/i.test(line));
213
+ if (hasCodexPromptLine || hasCodexStatus)
214
+ return true;
215
+ return false;
216
+ }
217
+ function paneHasTrustPrompt(captured) {
218
+ const lines = captured
219
+ .split('\n')
220
+ .map((line) => line.replace(/\r/g, '').trim())
221
+ .filter((line) => line.length > 0);
222
+ const tail = lines.slice(-12);
223
+ const hasQuestion = tail.some((line) => /Do you trust the contents of this directory\?/i.test(line));
224
+ const hasActiveChoices = tail.some((line) => /Yes,\s*continue|No,\s*quit|Press enter to continue/i.test(line));
225
+ return hasQuestion && hasActiveChoices;
226
+ }
227
+ // Poll tmux capture-pane for Codex prompt indicator (> or similar)
228
+ // Uses exponential backoff: 1s, 2s, 4s, 8s (total ~15s)
229
+ // Returns true if ready, false on timeout
230
+ export function waitForWorkerReady(sessionName, workerIndex, timeoutMs = 15000, workerPaneId) {
231
+ const initialBackoffMs = 300;
232
+ const maxBackoffMs = 8000;
233
+ const startedAt = Date.now();
234
+ let blockedByTrustPrompt = false;
235
+ const sendRobustEnter = () => {
236
+ const target = paneTarget(sessionName, workerIndex, workerPaneId);
237
+ // Trust + follow-up splash can require two submits in Codex TUI.
238
+ runTmux(['send-keys', '-t', target, 'Enter']);
239
+ sleepFractionalSeconds(0.12);
240
+ runTmux(['send-keys', '-t', target, 'Enter']);
241
+ };
242
+ const check = () => {
243
+ const result = runTmux(['capture-pane', '-t', paneTarget(sessionName, workerIndex, workerPaneId), '-p']);
244
+ if (!result.ok)
245
+ return false;
246
+ if (paneHasTrustPrompt(result.stdout)) {
247
+ // Default-on for team workers: they are spawned explicitly by the leader in the same cwd.
248
+ // Opt-out by setting OMX_TEAM_AUTO_TRUST=0.
249
+ if (process.env.OMX_TEAM_AUTO_TRUST !== '0') {
250
+ sendRobustEnter();
251
+ return false;
252
+ }
253
+ blockedByTrustPrompt = true;
254
+ return false;
255
+ }
256
+ return paneLooksReady(result.stdout);
257
+ };
258
+ let delayMs = initialBackoffMs;
259
+ while (Date.now() - startedAt < timeoutMs) {
260
+ if (check())
261
+ return true;
262
+ if (blockedByTrustPrompt)
263
+ return false;
264
+ const remaining = timeoutMs - (Date.now() - startedAt);
265
+ if (remaining <= 0)
266
+ break;
267
+ sleepSeconds(Math.max(0, Math.min(delayMs, remaining)) / 1000);
268
+ delayMs = Math.min(maxBackoffMs, delayMs * 2);
269
+ }
270
+ return false;
271
+ }
272
+ function paneTailContainsLiteralLine(target, text) {
273
+ const result = runTmux(['capture-pane', '-t', target, '-p', '-S', '-80']);
274
+ if (!result.ok)
275
+ return false;
276
+ return normalizeTmuxCapture(result.stdout).includes(normalizeTmuxCapture(text));
277
+ }
278
+ export function normalizeTmuxCapture(value) {
279
+ return value
280
+ .replace(/\r/g, '')
281
+ .replace(/\s+/g, ' ')
282
+ .trim();
283
+ }
284
+ // Send SHORT text (<200 chars) to worker via tmux send-keys
285
+ // Validates: text < 200 chars, no injection marker
286
+ // Throws on violation
287
+ export function sendToWorker(sessionName, workerIndex, text, workerPaneId) {
288
+ if (text.length >= 200) {
289
+ throw new Error('sendToWorker: text must be < 200 characters');
290
+ }
291
+ if (text.includes(INJECTION_MARKER)) {
292
+ throw new Error('sendToWorker: injection marker is not allowed');
293
+ }
294
+ const target = paneTarget(sessionName, workerIndex, workerPaneId);
295
+ // Guard: if the trust prompt is still present, advance it first so our trigger text
296
+ // doesn't get typed into the trust screen and ignored.
297
+ const captured = runTmux(['capture-pane', '-t', target, '-p', '-S', '-80']);
298
+ if (captured.ok && paneHasTrustPrompt(captured.stdout)) {
299
+ runTmux(['send-keys', '-t', target, 'Enter']);
300
+ sleepFractionalSeconds(0.12);
301
+ runTmux(['send-keys', '-t', target, 'Enter']);
302
+ sleepFractionalSeconds(0.2);
303
+ }
304
+ const send = runTmux(['send-keys', '-t', target, '-l', '--', text]);
305
+ if (!send.ok) {
306
+ throw new Error(`sendToWorker: failed to send text: ${send.stderr}`);
307
+ }
308
+ // Submit deterministically: Enter twice with short sleep between presses.
309
+ // Repeat a few rounds only if the literal input line is still visible.
310
+ const submitRounds = 6;
311
+ for (let round = 0; round < submitRounds; round++) {
312
+ const first = runTmux(['send-keys', '-t', target, 'Enter']);
313
+ if (!first.ok)
314
+ throw new Error(`sendToWorker: failed to send Enter: ${first.stderr}`);
315
+ sleepFractionalSeconds(0.12);
316
+ const second = runTmux(['send-keys', '-t', target, 'Enter']);
317
+ if (!second.ok)
318
+ throw new Error(`sendToWorker: failed to send Enter: ${second.stderr}`);
319
+ sleepFractionalSeconds(0.14);
320
+ if (!paneTailContainsLiteralLine(target, text))
321
+ return;
322
+ sleepFractionalSeconds(0.14);
323
+ }
324
+ // Fail-open by default: Codex may keep the last submitted line visible even after executing it.
325
+ // If you need strictness for debugging, set OMX_TEAM_STRICT_SUBMIT=1.
326
+ const strict = process.env.OMX_TEAM_STRICT_SUBMIT === '1';
327
+ if (strict) {
328
+ throw new Error('sendToWorker: submit_failed (trigger text still visible after retries)');
329
+ }
330
+ // One last best-effort double-enter nudge, then continue.
331
+ runTmux(['send-keys', '-t', target, 'Enter']);
332
+ sleepFractionalSeconds(0.12);
333
+ runTmux(['send-keys', '-t', target, 'Enter']);
334
+ }
335
+ export function notifyLeaderStatus(sessionName, message) {
336
+ if (!isTmuxAvailable())
337
+ return false;
338
+ const trimmed = message.trim();
339
+ if (!trimmed)
340
+ return false;
341
+ const capped = trimmed.length > 180 ? `${trimmed.slice(0, 177)}...` : trimmed;
342
+ const result = runTmux(['display-message', '-t', sessionName, '--', capped]);
343
+ return result.ok;
344
+ }
345
+ // Get PID of the shell process in a worker's tmux pane
346
+ export function getWorkerPanePid(sessionName, workerIndex, workerPaneId) {
347
+ const result = runTmux(['list-panes', '-t', paneTarget(sessionName, workerIndex, workerPaneId), '-F', '#{pane_pid}']);
348
+ if (!result.ok)
349
+ return null;
350
+ const firstLine = result.stdout.split('\n')[0]?.trim();
351
+ if (!firstLine)
352
+ return null;
353
+ const pid = Number.parseInt(firstLine, 10);
354
+ if (!Number.isFinite(pid))
355
+ return null;
356
+ return pid;
357
+ }
358
+ // Check if worker's tmux pane has a running process
359
+ export function isWorkerAlive(sessionName, workerIndex, workerPaneId) {
360
+ const result = runTmux([
361
+ 'list-panes',
362
+ '-t', paneTarget(sessionName, workerIndex, workerPaneId),
363
+ '-F',
364
+ '#{pane_dead} #{pane_pid}',
365
+ ]);
366
+ if (!result.ok)
367
+ return false;
368
+ const line = result.stdout.split('\n')[0]?.trim();
369
+ if (!line)
370
+ return false;
371
+ const parts = line.split(/\s+/);
372
+ if (parts.length < 2)
373
+ return false;
374
+ const paneDead = parts[0];
375
+ const pid = Number.parseInt(parts[1], 10);
376
+ if (paneDead === '1')
377
+ return false;
378
+ if (!Number.isFinite(pid))
379
+ return false;
380
+ try {
381
+ process.kill(pid, 0);
382
+ return true;
383
+ }
384
+ catch {
385
+ return false;
386
+ }
387
+ }
388
+ // Kill a specific worker: send C-c, then C-d, then kill-pane if still alive
389
+ export function killWorker(sessionName, workerIndex, workerPaneId) {
390
+ runTmux(['send-keys', '-t', paneTarget(sessionName, workerIndex, workerPaneId), 'C-c']);
391
+ sleepSeconds(1);
392
+ if (isWorkerAlive(sessionName, workerIndex, workerPaneId)) {
393
+ runTmux(['send-keys', '-t', paneTarget(sessionName, workerIndex, workerPaneId), 'C-d']);
394
+ sleepSeconds(1);
395
+ }
396
+ if (isWorkerAlive(sessionName, workerIndex, workerPaneId)) {
397
+ runTmux(['kill-pane', '-t', paneTarget(sessionName, workerIndex, workerPaneId)]);
398
+ }
399
+ }
400
+ export function killWorkerByPaneId(workerPaneId) {
401
+ if (!workerPaneId.startsWith('%'))
402
+ return;
403
+ runTmux(['kill-pane', '-t', workerPaneId]);
404
+ }
405
+ // Kill entire tmux session. Tolerates already-dead sessions.
406
+ export function destroyTeamSession(sessionName) {
407
+ try {
408
+ runTmux(['kill-session', '-t', sessionName]);
409
+ }
410
+ catch {
411
+ // tolerate
412
+ }
413
+ }
414
+ // List all tmux sessions matching omx-team-* pattern
415
+ export function listTeamSessions() {
416
+ const result = runTmux(['list-sessions', '-F', '#{session_name}']);
417
+ if (!result.ok)
418
+ return [];
419
+ return result.stdout
420
+ .split('\n')
421
+ .map(line => line.trim())
422
+ .filter(Boolean)
423
+ .map(baseSessionName);
424
+ }
425
+ //# sourceMappingURL=tmux-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux-session.js","sourceRoot":"","sources":["../../src/team/tmux-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { TeamTask } from './state.js';
2
+ /**
3
+ * Generate generic AGENTS.md overlay for team workers.
4
+ * This is the SAME for all workers -- no per-worker identity.
5
+ * Per-worker context goes in the inbox file.
6
+ */
7
+ export declare function generateWorkerOverlay(teamName: string): string;
8
+ /**
9
+ * Apply worker overlay to AGENTS.md. Idempotent -- strips existing overlay first.
10
+ */
11
+ export declare function applyWorkerOverlay(agentsMdPath: string, overlay: string): Promise<void>;
12
+ /**
13
+ * Strip worker overlay from AGENTS.md content. Idempotent.
14
+ */
15
+ export declare function stripWorkerOverlay(agentsMdPath: string): Promise<void>;
16
+ /**
17
+ * Generate initial inbox file content for worker bootstrap.
18
+ * This is written to .omx/state/team/{team}/workers/{worker}/inbox.md by the lead.
19
+ */
20
+ export declare function generateInitialInbox(workerName: string, teamName: string, agentType: string, tasks: TeamTask[]): string;
21
+ /**
22
+ * Generate inbox content for a follow-up task assignment.
23
+ */
24
+ export declare function generateTaskAssignmentInbox(workerName: string, teamName: string, taskId: string, taskDescription: string): string;
25
+ /**
26
+ * Generate inbox content for shutdown.
27
+ */
28
+ export declare function generateShutdownInbox(teamName: string, workerName: string): string;
29
+ /**
30
+ * Generate the SHORT send-keys trigger message.
31
+ * Always < 200 characters, ASCII-safe.
32
+ */
33
+ export declare function generateTriggerMessage(workerName: string, teamName: string): string;
34
+ /**
35
+ * Generate a SHORT trigger for mailbox notifications.
36
+ * Always < 200 characters, ASCII-safe.
37
+ */
38
+ export declare function generateMailboxTriggerMessage(workerName: string, teamName: string, count: number): string;
39
+ //# sourceMappingURL=worker-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-bootstrap.d.ts","sourceRoot":"","sources":["../../src/team/worker-bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB9D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB7F;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW5E;AAWD;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,QAAQ,EAAE,GAChB,MAAM,CAwCR;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACtB,MAAM,CAoBR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBlF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzG"}