oh-my-codex 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +14 -14
- package/dist/agents/definitions.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +60 -5
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/index.d.ts +20 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +171 -63
- package/dist/cli/index.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +142 -1
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts +10 -0
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +116 -25
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hud/__tests__/state.test.d.ts +2 -0
- package/dist/hud/__tests__/state.test.d.ts.map +1 -0
- package/dist/hud/__tests__/state.test.js +32 -0
- package/dist/hud/__tests__/state.test.js.map +1 -0
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +6 -1
- package/dist/hud/state.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +29 -2
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +22 -1
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/orchestrator.d.ts.map +1 -1
- package/dist/team/orchestrator.js +2 -1
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/runtime.d.ts +2 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +40 -8
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +110 -33
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/package.json +1 -1
- package/prompts/deep-executor.md +11 -102
- package/prompts/executor.md +102 -63
- package/skills/team/SKILL.md +16 -0
- package/skills/worker/SKILL.md +1 -0
- package/templates/AGENTS.md +36 -3
package/README.md
CHANGED
|
@@ -175,6 +175,7 @@ Important rule: do not shutdown while tasks are still `in_progress` unless abort
|
|
|
175
175
|
|
|
176
176
|
Examples:
|
|
177
177
|
- Agents: `architect`, `planner`, `executor`, `debugger`, `verifier`, `security-reviewer`
|
|
178
|
+
- `deep-executor` is deprecated; use `executor` for complex implementation tasks.
|
|
178
179
|
- Skills: `autopilot`, `plan`, `team`, `ralph`, `ultrawork`, `ultrapilot`, `research`, `cancel`
|
|
179
180
|
|
|
180
181
|
## Project Layout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;AAgBD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAgN7D,CAAC;AAEF,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,eAAe,EAAE,CAE5F;AAED,0BAA0B;AAC1B,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
* Each agent has a name, description, default model tier, and tool access pattern.
|
|
4
4
|
* Prompt content is loaded from the prompts/ directory at runtime.
|
|
5
5
|
*/
|
|
6
|
+
const EXECUTOR_AGENT = {
|
|
7
|
+
name: 'executor',
|
|
8
|
+
description: 'Code implementation, refactoring, feature work',
|
|
9
|
+
model: 'sonnet',
|
|
10
|
+
tools: 'execution',
|
|
11
|
+
category: 'build',
|
|
12
|
+
};
|
|
13
|
+
const DEEP_EXECUTOR_ALIAS_AGENT = {
|
|
14
|
+
...EXECUTOR_AGENT,
|
|
15
|
+
name: 'deep-executor',
|
|
16
|
+
description: '[Deprecated] Backward-compatible alias of executor',
|
|
17
|
+
};
|
|
6
18
|
export const AGENT_DEFINITIONS = {
|
|
7
19
|
// Build/Analysis Lane
|
|
8
20
|
'explore': {
|
|
@@ -40,20 +52,8 @@ export const AGENT_DEFINITIONS = {
|
|
|
40
52
|
tools: 'analysis',
|
|
41
53
|
category: 'build',
|
|
42
54
|
},
|
|
43
|
-
'executor':
|
|
44
|
-
|
|
45
|
-
description: 'Code implementation, refactoring, feature work',
|
|
46
|
-
model: 'sonnet',
|
|
47
|
-
tools: 'execution',
|
|
48
|
-
category: 'build',
|
|
49
|
-
},
|
|
50
|
-
'deep-executor': {
|
|
51
|
-
name: 'deep-executor',
|
|
52
|
-
description: 'Complex autonomous goal-oriented tasks',
|
|
53
|
-
model: 'opus',
|
|
54
|
-
tools: 'execution',
|
|
55
|
-
category: 'build',
|
|
56
|
-
},
|
|
55
|
+
'executor': EXECUTOR_AGENT,
|
|
56
|
+
'deep-executor': DEEP_EXECUTOR_ALIAS_AGENT,
|
|
57
57
|
'verifier': {
|
|
58
58
|
name: 'verifier',
|
|
59
59
|
description: 'Completion evidence, claim validation, test adequacy',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,CAAC,MAAM,iBAAiB,GAAoC;IAChE,sBAAsB;IACtB,SAAS,EAAE;QACT,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,OAAO;KAClB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+DAA+D;QAC5E,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,OAAO;KAClB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,OAAO;KAClB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,+DAA+D;QAC5E,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,OAAO;KAClB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,8DAA8D;QAC3E,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,OAAO;KAClB;IACD,UAAU,EAAE
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it } from 'node:test';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
|
-
import { normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxSessionName, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, } from '../index.js';
|
|
3
|
+
import { normalizeCodexLaunchArgs, buildTmuxShellCommand, buildTmuxSessionName, resolveCliInvocation, resolveCodexLaunchPolicy, parseTmuxPaneSnapshot, findHudWatchPaneIds, buildHudPaneCleanupTargets, readTopLevelTomlString, upsertTopLevelTomlString, collectInheritableTeamWorkerArgs, resolveTeamWorkerLaunchArgsEnv, injectModelInstructionsBypassArgs, } from '../index.js';
|
|
4
4
|
describe('normalizeCodexLaunchArgs', () => {
|
|
5
5
|
it('maps --madmax to codex bypass flag', () => {
|
|
6
6
|
assert.deepEqual(normalizeCodexLaunchArgs(['--madmax']), ['--dangerously-bypass-approvals-and-sandbox']);
|
|
@@ -38,6 +38,42 @@ describe('normalizeCodexLaunchArgs', () => {
|
|
|
38
38
|
assert.deepEqual(normalizeCodexLaunchArgs(['--xhigh', '--madmax']), ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"']);
|
|
39
39
|
});
|
|
40
40
|
});
|
|
41
|
+
describe('resolveCliInvocation', () => {
|
|
42
|
+
it('resolves --help to the help command instead of launch', () => {
|
|
43
|
+
assert.deepEqual(resolveCliInvocation(['--help']), {
|
|
44
|
+
command: 'help',
|
|
45
|
+
launchArgs: [],
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it('keeps unknown long flags as launch passthrough args', () => {
|
|
49
|
+
assert.deepEqual(resolveCliInvocation(['--model', 'gpt-5']), {
|
|
50
|
+
command: 'launch',
|
|
51
|
+
launchArgs: ['--model', 'gpt-5'],
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('resolveCodexLaunchPolicy', () => {
|
|
56
|
+
it('launches directly when outside tmux', () => {
|
|
57
|
+
assert.equal(resolveCodexLaunchPolicy({}), 'direct');
|
|
58
|
+
});
|
|
59
|
+
it('uses tmux-aware launch path when already inside tmux', () => {
|
|
60
|
+
assert.equal(resolveCodexLaunchPolicy({ TMUX: '/tmp/tmux-1000/default,123,0' }), 'inside-tmux');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('tmux HUD pane helpers', () => {
|
|
64
|
+
it('findHudWatchPaneIds detects stale HUD watch panes and excludes current pane', () => {
|
|
65
|
+
const panes = parseTmuxPaneSnapshot([
|
|
66
|
+
'%1\tzsh\tzsh',
|
|
67
|
+
'%2\tnode\tnode /tmp/bin/omx.js hud --watch',
|
|
68
|
+
'%3\tnode\tnode /tmp/bin/omx.js hud --watch',
|
|
69
|
+
'%4\tcodex\tcodex --model gpt-5',
|
|
70
|
+
].join('\n'));
|
|
71
|
+
assert.deepEqual(findHudWatchPaneIds(panes, '%2'), ['%3']);
|
|
72
|
+
});
|
|
73
|
+
it('buildHudPaneCleanupTargets de-dupes pane ids and includes created pane', () => {
|
|
74
|
+
assert.deepEqual(buildHudPaneCleanupTargets(['%3', '%3', 'invalid'], '%4'), ['%3', '%4']);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
41
77
|
describe('buildTmuxShellCommand', () => {
|
|
42
78
|
it('preserves quoted config values for tmux shell-command execution', () => {
|
|
43
79
|
assert.equal(buildTmuxShellCommand('codex', ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"']), `'codex' '--dangerously-bypass-approvals-and-sandbox' '-c' 'model_reasoning_effort="xhigh"'`);
|
|
@@ -56,15 +92,30 @@ describe('buildTmuxSessionName', () => {
|
|
|
56
92
|
});
|
|
57
93
|
});
|
|
58
94
|
describe('team worker launch arg inheritance helpers', () => {
|
|
59
|
-
it('collectInheritableTeamWorkerArgs extracts bypass and
|
|
60
|
-
assert.deepEqual(collectInheritableTeamWorkerArgs(['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"', '--model', 'gpt-5']), ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"']);
|
|
95
|
+
it('collectInheritableTeamWorkerArgs extracts bypass, reasoning, and model overrides', () => {
|
|
96
|
+
assert.deepEqual(collectInheritableTeamWorkerArgs(['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"', '--model', 'gpt-5']), ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"', '--model', 'gpt-5']);
|
|
61
97
|
});
|
|
62
|
-
it('
|
|
63
|
-
assert.
|
|
98
|
+
it('collectInheritableTeamWorkerArgs supports --model=<value> syntax', () => {
|
|
99
|
+
assert.deepEqual(collectInheritableTeamWorkerArgs(['--model=gpt-5.3-codex-spark']), ['--model', 'gpt-5.3-codex-spark']);
|
|
100
|
+
});
|
|
101
|
+
it('resolveTeamWorkerLaunchArgsEnv merges and normalizes with de-dupe + last reasoning/model wins', () => {
|
|
102
|
+
assert.equal(resolveTeamWorkerLaunchArgsEnv('--dangerously-bypass-approvals-and-sandbox -c model_reasoning_effort="high" --model old-a --no-alt-screen --model=old-b', ['-c', 'model_reasoning_effort="xhigh"', '--dangerously-bypass-approvals-and-sandbox', '--model', 'gpt-5'], true), '--no-alt-screen --dangerously-bypass-approvals-and-sandbox -c model_reasoning_effort="xhigh" --model old-b');
|
|
64
103
|
});
|
|
65
104
|
it('resolveTeamWorkerLaunchArgsEnv can opt out of leader inheritance', () => {
|
|
66
105
|
assert.equal(resolveTeamWorkerLaunchArgsEnv('--no-alt-screen', ['--dangerously-bypass-approvals-and-sandbox', '-c', 'model_reasoning_effort="xhigh"'], false), '--no-alt-screen');
|
|
67
106
|
});
|
|
107
|
+
it('resolveTeamWorkerLaunchArgsEnv uses inherited model when env model is absent', () => {
|
|
108
|
+
assert.equal(resolveTeamWorkerLaunchArgsEnv('--no-alt-screen', ['--model=gpt-5.3-codex-spark'], true), '--no-alt-screen --model gpt-5.3-codex-spark');
|
|
109
|
+
});
|
|
110
|
+
it('resolveTeamWorkerLaunchArgsEnv uses default model when env and inherited models are absent', () => {
|
|
111
|
+
assert.equal(resolveTeamWorkerLaunchArgsEnv('--no-alt-screen', ['--dangerously-bypass-approvals-and-sandbox'], true, 'gpt-5.3-codex-spark'), '--no-alt-screen --dangerously-bypass-approvals-and-sandbox --model gpt-5.3-codex-spark');
|
|
112
|
+
});
|
|
113
|
+
it('resolveTeamWorkerLaunchArgsEnv keeps exactly one final model with precedence env > inherited > default', () => {
|
|
114
|
+
assert.equal(resolveTeamWorkerLaunchArgsEnv('--model env-model --model=env-model-final', ['--model', 'inherited-model'], true, 'fallback-model'), '--model env-model-final');
|
|
115
|
+
});
|
|
116
|
+
it('resolveTeamWorkerLaunchArgsEnv prefers inherited model over default when env model is absent', () => {
|
|
117
|
+
assert.equal(resolveTeamWorkerLaunchArgsEnv('--no-alt-screen', ['--model', 'inherited-model'], true, 'fallback-model'), '--no-alt-screen --model inherited-model');
|
|
118
|
+
});
|
|
68
119
|
});
|
|
69
120
|
describe('readTopLevelTomlString', () => {
|
|
70
121
|
it('reads a top-level string value', () => {
|
|
@@ -93,6 +144,10 @@ describe('injectModelInstructionsBypassArgs', () => {
|
|
|
93
144
|
const args = injectModelInstructionsBypassArgs('/tmp/my-project', [], { OMX_MODEL_INSTRUCTIONS_FILE: '/tmp/alt instructions.md' });
|
|
94
145
|
assert.deepEqual(args, ['-c', 'model_instructions_file="/tmp/alt instructions.md"']);
|
|
95
146
|
});
|
|
147
|
+
it('uses session-scoped default model_instructions_file when provided', () => {
|
|
148
|
+
const args = injectModelInstructionsBypassArgs('/tmp/my-project', ['--model', 'gpt-5'], {}, '/tmp/my-project/.omx/state/sessions/session-1/AGENTS.md');
|
|
149
|
+
assert.deepEqual(args, ['--model', 'gpt-5', '-c', 'model_instructions_file="/tmp/my-project/.omx/state/sessions/session-1/AGENTS.md"']);
|
|
150
|
+
});
|
|
96
151
|
});
|
|
97
152
|
describe('upsertTopLevelTomlString', () => {
|
|
98
153
|
it('replaces an existing top-level key', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/index.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/cli/__tests__/index.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -2,13 +2,31 @@
|
|
|
2
2
|
* oh-my-codex CLI
|
|
3
3
|
* Multi-agent orchestration for OpenAI Codex CLI
|
|
4
4
|
*/
|
|
5
|
+
type CliCommand = 'launch' | 'setup' | 'doctor' | 'team' | 'version' | 'tmux-hook' | 'hud' | 'status' | 'cancel' | 'help' | 'reasoning' | string;
|
|
6
|
+
export interface ResolvedCliInvocation {
|
|
7
|
+
command: CliCommand;
|
|
8
|
+
launchArgs: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveCliInvocation(args: string[]): ResolvedCliInvocation;
|
|
11
|
+
export type CodexLaunchPolicy = 'inside-tmux' | 'direct';
|
|
12
|
+
export declare function resolveCodexLaunchPolicy(env?: NodeJS.ProcessEnv): CodexLaunchPolicy;
|
|
13
|
+
interface TmuxPaneSnapshot {
|
|
14
|
+
paneId: string;
|
|
15
|
+
currentCommand: string;
|
|
16
|
+
startCommand: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseTmuxPaneSnapshot(output: string): TmuxPaneSnapshot[];
|
|
19
|
+
export declare function isHudWatchPane(pane: TmuxPaneSnapshot): boolean;
|
|
20
|
+
export declare function findHudWatchPaneIds(panes: TmuxPaneSnapshot[], currentPaneId?: string): string[];
|
|
21
|
+
export declare function buildHudPaneCleanupTargets(existingPaneIds: string[], createdPaneId: string | null): string[];
|
|
5
22
|
export declare function main(args: string[]): Promise<void>;
|
|
6
23
|
export declare function normalizeCodexLaunchArgs(args: string[]): string[];
|
|
7
|
-
export declare function injectModelInstructionsBypassArgs(cwd: string, args: string[], env?: NodeJS.ProcessEnv): string[];
|
|
24
|
+
export declare function injectModelInstructionsBypassArgs(cwd: string, args: string[], env?: NodeJS.ProcessEnv, defaultFilePath?: string): string[];
|
|
8
25
|
export declare function collectInheritableTeamWorkerArgs(codexArgs: string[]): string[];
|
|
9
|
-
export declare function resolveTeamWorkerLaunchArgsEnv(existingRaw: string | undefined, codexArgs: string[], inheritLeaderFlags?: boolean): string | null;
|
|
26
|
+
export declare function resolveTeamWorkerLaunchArgsEnv(existingRaw: string | undefined, codexArgs: string[], inheritLeaderFlags?: boolean, defaultModel?: string): string | null;
|
|
10
27
|
export declare function readTopLevelTomlString(content: string, key: string): string | null;
|
|
11
28
|
export declare function upsertTopLevelTomlString(content: string, key: string, value: string): string;
|
|
12
29
|
export declare function buildTmuxSessionName(cwd: string, sessionId: string): string;
|
|
13
30
|
export declare function buildTmuxShellCommand(command: string, args: string[]): string;
|
|
31
|
+
export {};
|
|
14
32
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyEH,KAAK,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAEjJ,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,UAAU,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,qBAAqB,CAY1E;AAED,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEzD,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,iBAAiB,CAEhG;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAcxE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAK9D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/F;AAED,wBAAgB,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAM5G;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgExD;AAgGD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CA2CjE;AAsCD,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,EAAE,CAIV;AA2ED,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQ9E;AAeD,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,kBAAkB,UAAO,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAef;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBlF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAyC5F;AAsBD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAgB3E;AAoJD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7E"}
|
package/dist/cli/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { hudCommand } from '../hud/index.js';
|
|
|
13
13
|
import { teamCommand } from './team.js';
|
|
14
14
|
import { getAllScopedStateDirs, getBaseStateDir, getStateDir } from '../mcp/state-paths.js';
|
|
15
15
|
import { maybeCheckAndPromptUpdate } from './update.js';
|
|
16
|
-
import { generateOverlay,
|
|
16
|
+
import { generateOverlay, writeSessionModelInstructionsFile, removeSessionModelInstructionsFile, sessionModelInstructionsPath, } from '../hooks/agents-overlay.js';
|
|
17
17
|
import { readSessionState, isSessionStale, writeSessionStart, writeSessionEnd, resetSessionMetrics, } from '../hooks/session.js';
|
|
18
18
|
import { getPackageRoot } from '../utils/package.js';
|
|
19
19
|
import { codexConfigPath } from '../utils/paths.js';
|
|
@@ -21,7 +21,7 @@ const HELP = `
|
|
|
21
21
|
oh-my-codex (omx) - Multi-agent orchestration for Codex CLI
|
|
22
22
|
|
|
23
23
|
Usage:
|
|
24
|
-
omx Launch Codex CLI
|
|
24
|
+
omx Launch Codex CLI (HUD auto-attaches only when already inside tmux)
|
|
25
25
|
omx setup Install skills, prompts, MCP servers, and AGENTS.md
|
|
26
26
|
omx doctor Check installation health
|
|
27
27
|
omx doctor --team Check team/swarm runtime health diagnostics
|
|
@@ -48,6 +48,7 @@ Options:
|
|
|
48
48
|
`;
|
|
49
49
|
const MADMAX_FLAG = '--madmax';
|
|
50
50
|
const CODEX_BYPASS_FLAG = '--dangerously-bypass-approvals-and-sandbox';
|
|
51
|
+
const MODEL_FLAG = '--model';
|
|
51
52
|
const HIGH_REASONING_FLAG = '--high';
|
|
52
53
|
const XHIGH_REASONING_FLAG = '--xhigh';
|
|
53
54
|
const CONFIG_FLAG = '-c';
|
|
@@ -61,15 +62,62 @@ const OMX_MODEL_INSTRUCTIONS_FILE_ENV = 'OMX_MODEL_INSTRUCTIONS_FILE';
|
|
|
61
62
|
const REASONING_MODES = ['low', 'medium', 'high', 'xhigh'];
|
|
62
63
|
const REASONING_MODE_SET = new Set(REASONING_MODES);
|
|
63
64
|
const REASONING_USAGE = 'Usage: omx reasoning <low|medium|high|xhigh>';
|
|
65
|
+
export function resolveCliInvocation(args) {
|
|
66
|
+
const firstArg = args[0];
|
|
67
|
+
if (firstArg === '--help' || firstArg === '-h') {
|
|
68
|
+
return { command: 'help', launchArgs: [] };
|
|
69
|
+
}
|
|
70
|
+
if (!firstArg || firstArg.startsWith('--')) {
|
|
71
|
+
return { command: 'launch', launchArgs: firstArg ? args : [] };
|
|
72
|
+
}
|
|
73
|
+
if (firstArg === 'launch') {
|
|
74
|
+
return { command: 'launch', launchArgs: args.slice(1) };
|
|
75
|
+
}
|
|
76
|
+
return { command: firstArg, launchArgs: [] };
|
|
77
|
+
}
|
|
78
|
+
export function resolveCodexLaunchPolicy(env = process.env) {
|
|
79
|
+
return env.TMUX ? 'inside-tmux' : 'direct';
|
|
80
|
+
}
|
|
81
|
+
export function parseTmuxPaneSnapshot(output) {
|
|
82
|
+
return output
|
|
83
|
+
.split('\n')
|
|
84
|
+
.map((line) => line.trim())
|
|
85
|
+
.filter(Boolean)
|
|
86
|
+
.map((line) => {
|
|
87
|
+
const [paneId = '', currentCommand = '', ...startCommandParts] = line.split('\t');
|
|
88
|
+
return {
|
|
89
|
+
paneId: paneId.trim(),
|
|
90
|
+
currentCommand: currentCommand.trim(),
|
|
91
|
+
startCommand: startCommandParts.join('\t').trim(),
|
|
92
|
+
};
|
|
93
|
+
})
|
|
94
|
+
.filter((pane) => pane.paneId.startsWith('%'));
|
|
95
|
+
}
|
|
96
|
+
export function isHudWatchPane(pane) {
|
|
97
|
+
const command = `${pane.startCommand} ${pane.currentCommand}`.toLowerCase();
|
|
98
|
+
return /\bhud\b/.test(command)
|
|
99
|
+
&& /--watch\b/.test(command)
|
|
100
|
+
&& (/\bomx(?:\.js)?\b/.test(command) || /\bnode\b/.test(command));
|
|
101
|
+
}
|
|
102
|
+
export function findHudWatchPaneIds(panes, currentPaneId) {
|
|
103
|
+
return panes
|
|
104
|
+
.filter((pane) => pane.paneId !== currentPaneId)
|
|
105
|
+
.filter((pane) => isHudWatchPane(pane))
|
|
106
|
+
.map((pane) => pane.paneId);
|
|
107
|
+
}
|
|
108
|
+
export function buildHudPaneCleanupTargets(existingPaneIds, createdPaneId) {
|
|
109
|
+
const targets = new Set(existingPaneIds.filter((id) => id.startsWith('%')));
|
|
110
|
+
if (createdPaneId && createdPaneId.startsWith('%')) {
|
|
111
|
+
targets.add(createdPaneId);
|
|
112
|
+
}
|
|
113
|
+
return [...targets];
|
|
114
|
+
}
|
|
64
115
|
export async function main(args) {
|
|
65
116
|
const knownCommands = new Set([
|
|
66
117
|
'launch', 'setup', 'doctor', 'team', 'version', 'tmux-hook', 'hud', 'status', 'cancel', 'help', '--help', '-h',
|
|
67
118
|
]);
|
|
68
119
|
const firstArg = args[0];
|
|
69
|
-
const command
|
|
70
|
-
const launchArgs = command === 'launch'
|
|
71
|
-
? (firstArg && firstArg.startsWith('--') ? args : args.slice(1))
|
|
72
|
-
: [];
|
|
120
|
+
const { command, launchArgs } = resolveCliInvocation(args);
|
|
73
121
|
const flags = new Set(args.filter(a => a.startsWith('--')));
|
|
74
122
|
const options = {
|
|
75
123
|
force: flags.has('--force'),
|
|
@@ -209,7 +257,7 @@ async function launchWithHud(args) {
|
|
|
209
257
|
}
|
|
210
258
|
// ── Phase 2: run ────────────────────────────────────────────────────────
|
|
211
259
|
try {
|
|
212
|
-
runCodex(cwd, normalizedArgs);
|
|
260
|
+
runCodex(cwd, normalizedArgs, sessionId);
|
|
213
261
|
}
|
|
214
262
|
finally {
|
|
215
263
|
// ── Phase 3: postLaunch ─────────────────────────────────────────────
|
|
@@ -279,16 +327,16 @@ function hasModelInstructionsOverride(args) {
|
|
|
279
327
|
function shouldBypassDefaultSystemPrompt(env) {
|
|
280
328
|
return env[OMX_BYPASS_DEFAULT_SYSTEM_PROMPT_ENV] !== '0';
|
|
281
329
|
}
|
|
282
|
-
function buildModelInstructionsOverride(cwd, env) {
|
|
283
|
-
const filePath = env[OMX_MODEL_INSTRUCTIONS_FILE_ENV] || join(cwd, 'AGENTS.md');
|
|
330
|
+
function buildModelInstructionsOverride(cwd, env, defaultFilePath) {
|
|
331
|
+
const filePath = env[OMX_MODEL_INSTRUCTIONS_FILE_ENV] || defaultFilePath || join(cwd, 'AGENTS.md');
|
|
284
332
|
return `${MODEL_INSTRUCTIONS_FILE_KEY}="${escapeTomlString(filePath)}"`;
|
|
285
333
|
}
|
|
286
|
-
export function injectModelInstructionsBypassArgs(cwd, args, env = process.env) {
|
|
334
|
+
export function injectModelInstructionsBypassArgs(cwd, args, env = process.env, defaultFilePath) {
|
|
287
335
|
if (!shouldBypassDefaultSystemPrompt(env))
|
|
288
336
|
return [...args];
|
|
289
337
|
if (hasModelInstructionsOverride(args))
|
|
290
338
|
return [...args];
|
|
291
|
-
return [...args, CONFIG_FLAG, buildModelInstructionsOverride(cwd, env)];
|
|
339
|
+
return [...args, CONFIG_FLAG, buildModelInstructionsOverride(cwd, env, defaultFilePath)];
|
|
292
340
|
}
|
|
293
341
|
function splitWorkerLaunchArgs(raw) {
|
|
294
342
|
if (!raw || raw.trim() === '')
|
|
@@ -298,38 +346,37 @@ function splitWorkerLaunchArgs(raw) {
|
|
|
298
346
|
.map((s) => s.trim())
|
|
299
347
|
.filter(Boolean);
|
|
300
348
|
}
|
|
301
|
-
|
|
349
|
+
function isValidModelValue(value) {
|
|
350
|
+
return value.trim().length > 0 && !value.startsWith('-');
|
|
351
|
+
}
|
|
352
|
+
function parseTeamWorkerLaunchArgs(args) {
|
|
353
|
+
const passthrough = [];
|
|
302
354
|
let wantsBypass = false;
|
|
303
355
|
let reasoningOverride = null;
|
|
304
|
-
|
|
305
|
-
|
|
356
|
+
let modelOverride = null;
|
|
357
|
+
for (let i = 0; i < args.length; i++) {
|
|
358
|
+
const arg = args[i];
|
|
306
359
|
if (arg === CODEX_BYPASS_FLAG || arg === MADMAX_FLAG) {
|
|
307
360
|
wantsBypass = true;
|
|
308
361
|
continue;
|
|
309
362
|
}
|
|
310
|
-
if (arg ===
|
|
311
|
-
const maybeValue =
|
|
312
|
-
if (typeof maybeValue === 'string' &&
|
|
313
|
-
|
|
363
|
+
if (arg === MODEL_FLAG) {
|
|
364
|
+
const maybeValue = args[i + 1];
|
|
365
|
+
if (typeof maybeValue === 'string' && isValidModelValue(maybeValue)) {
|
|
366
|
+
modelOverride = maybeValue.trim();
|
|
314
367
|
i += 1;
|
|
368
|
+
continue;
|
|
315
369
|
}
|
|
370
|
+
passthrough.push(arg);
|
|
371
|
+
continue;
|
|
316
372
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
325
|
-
function normalizeTeamWorkerLaunchArgs(args) {
|
|
326
|
-
const passthrough = [];
|
|
327
|
-
let wantsBypass = false;
|
|
328
|
-
let reasoningOverride = null;
|
|
329
|
-
for (let i = 0; i < args.length; i++) {
|
|
330
|
-
const arg = args[i];
|
|
331
|
-
if (arg === CODEX_BYPASS_FLAG || arg === MADMAX_FLAG) {
|
|
332
|
-
wantsBypass = true;
|
|
373
|
+
if (arg.startsWith(`${MODEL_FLAG}=`)) {
|
|
374
|
+
const inlineValue = arg.slice(`${MODEL_FLAG}=`.length).trim();
|
|
375
|
+
if (isValidModelValue(inlineValue)) {
|
|
376
|
+
modelOverride = inlineValue;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
passthrough.push(arg);
|
|
333
380
|
continue;
|
|
334
381
|
}
|
|
335
382
|
if (arg === CONFIG_FLAG) {
|
|
@@ -342,17 +389,47 @@ function normalizeTeamWorkerLaunchArgs(args) {
|
|
|
342
389
|
}
|
|
343
390
|
passthrough.push(arg);
|
|
344
391
|
}
|
|
345
|
-
|
|
346
|
-
passthrough
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
392
|
+
return {
|
|
393
|
+
passthrough,
|
|
394
|
+
wantsBypass,
|
|
395
|
+
reasoningOverride,
|
|
396
|
+
modelOverride,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
export function collectInheritableTeamWorkerArgs(codexArgs) {
|
|
400
|
+
const parsed = parseTeamWorkerLaunchArgs(codexArgs);
|
|
401
|
+
const inherited = [];
|
|
402
|
+
if (parsed.wantsBypass)
|
|
403
|
+
inherited.push(CODEX_BYPASS_FLAG);
|
|
404
|
+
if (parsed.reasoningOverride)
|
|
405
|
+
inherited.push(CONFIG_FLAG, parsed.reasoningOverride);
|
|
406
|
+
if (parsed.modelOverride)
|
|
407
|
+
inherited.push(MODEL_FLAG, parsed.modelOverride);
|
|
408
|
+
return inherited;
|
|
409
|
+
}
|
|
410
|
+
function normalizeTeamWorkerLaunchArgs(args, preferredModel) {
|
|
411
|
+
const parsed = parseTeamWorkerLaunchArgs(args);
|
|
412
|
+
const normalized = [...parsed.passthrough];
|
|
413
|
+
if (parsed.wantsBypass)
|
|
414
|
+
normalized.push(CODEX_BYPASS_FLAG);
|
|
415
|
+
if (parsed.reasoningOverride)
|
|
416
|
+
normalized.push(CONFIG_FLAG, parsed.reasoningOverride);
|
|
417
|
+
const selectedModel = preferredModel ?? parsed.modelOverride ?? undefined;
|
|
418
|
+
if (selectedModel)
|
|
419
|
+
normalized.push(MODEL_FLAG, selectedModel);
|
|
420
|
+
return normalized;
|
|
421
|
+
}
|
|
422
|
+
export function resolveTeamWorkerLaunchArgsEnv(existingRaw, codexArgs, inheritLeaderFlags = true, defaultModel) {
|
|
423
|
+
const envArgs = splitWorkerLaunchArgs(existingRaw);
|
|
424
|
+
const inheritedArgs = inheritLeaderFlags ? collectInheritableTeamWorkerArgs(codexArgs) : [];
|
|
425
|
+
const allArgs = [...envArgs, ...inheritedArgs];
|
|
426
|
+
const envModel = parseTeamWorkerLaunchArgs(envArgs).modelOverride;
|
|
427
|
+
const inheritedModel = parseTeamWorkerLaunchArgs(inheritedArgs).modelOverride;
|
|
428
|
+
const fallbackModel = typeof defaultModel === 'string' && defaultModel.trim().length > 0
|
|
429
|
+
? defaultModel.trim()
|
|
430
|
+
: undefined;
|
|
431
|
+
const selectedModel = envModel ?? inheritedModel ?? fallbackModel;
|
|
432
|
+
const normalized = normalizeTeamWorkerLaunchArgs(allArgs, selectedModel ?? undefined);
|
|
356
433
|
if (normalized.length === 0)
|
|
357
434
|
return null;
|
|
358
435
|
return normalized.join(' ');
|
|
@@ -457,16 +534,15 @@ export function buildTmuxSessionName(cwd, sessionId) {
|
|
|
457
534
|
/**
|
|
458
535
|
* preLaunch: Prepare environment before Codex starts.
|
|
459
536
|
* 1. Orphan cleanup (stale session from a crashed launch)
|
|
460
|
-
* 2. Generate +
|
|
537
|
+
* 2. Generate runtime overlay + write session-scoped model instructions file
|
|
461
538
|
* 3. Write session.json
|
|
462
539
|
*/
|
|
463
540
|
async function preLaunch(cwd, sessionId) {
|
|
464
541
|
// 1. Orphan cleanup
|
|
465
542
|
const existingSession = await readSessionState(cwd);
|
|
466
543
|
if (existingSession && isSessionStale(existingSession)) {
|
|
467
|
-
const agentsMdPath = join(cwd, 'AGENTS.md');
|
|
468
544
|
try {
|
|
469
|
-
await
|
|
545
|
+
await removeSessionModelInstructionsFile(cwd, existingSession.session_id);
|
|
470
546
|
}
|
|
471
547
|
catch { /* best effort */ }
|
|
472
548
|
const { unlink } = await import('fs/promises');
|
|
@@ -475,10 +551,9 @@ async function preLaunch(cwd, sessionId) {
|
|
|
475
551
|
}
|
|
476
552
|
catch { /* best effort */ }
|
|
477
553
|
}
|
|
478
|
-
// 2. Generate +
|
|
479
|
-
const agentsMdPath = join(cwd, 'AGENTS.md');
|
|
554
|
+
// 2. Generate runtime overlay + write session-scoped model instructions file
|
|
480
555
|
const overlay = await generateOverlay(cwd, sessionId);
|
|
481
|
-
await
|
|
556
|
+
await writeSessionModelInstructionsFile(cwd, sessionId, overlay);
|
|
482
557
|
// 3. Write session state
|
|
483
558
|
await resetSessionMetrics(cwd);
|
|
484
559
|
await writeSessionStart(cwd, sessionId);
|
|
@@ -494,34 +569,45 @@ async function preLaunch(cwd, sessionId) {
|
|
|
494
569
|
* runCodex: Launch Codex CLI (blocks until exit).
|
|
495
570
|
* All 3 paths (new tmux, existing tmux, no tmux) block via execSync/execFileSync.
|
|
496
571
|
*/
|
|
497
|
-
function runCodex(cwd, args) {
|
|
498
|
-
const launchArgs = injectModelInstructionsBypassArgs(cwd, args);
|
|
572
|
+
function runCodex(cwd, args, sessionId) {
|
|
573
|
+
const launchArgs = injectModelInstructionsBypassArgs(cwd, args, process.env, sessionModelInstructionsPath(cwd, sessionId));
|
|
499
574
|
const omxBin = process.argv[1];
|
|
500
|
-
const codexCmd = buildTmuxShellCommand('codex', launchArgs);
|
|
501
575
|
const hudCmd = buildTmuxShellCommand('node', [omxBin, 'hud', '--watch']);
|
|
502
576
|
const inheritLeaderFlags = process.env[TEAM_INHERIT_LEADER_FLAGS_ENV] !== '0';
|
|
503
577
|
const workerLaunchArgs = resolveTeamWorkerLaunchArgsEnv(process.env[TEAM_WORKER_LAUNCH_ARGS_ENV], launchArgs, inheritLeaderFlags);
|
|
504
578
|
const codexEnv = workerLaunchArgs
|
|
505
579
|
? { ...process.env, [TEAM_WORKER_LAUNCH_ARGS_ENV]: workerLaunchArgs }
|
|
506
580
|
: process.env;
|
|
507
|
-
if (process.env
|
|
581
|
+
if (resolveCodexLaunchPolicy(process.env) === 'inside-tmux') {
|
|
508
582
|
// Already in tmux: launch codex in current pane, HUD in bottom split
|
|
583
|
+
const currentPaneId = process.env.TMUX_PANE;
|
|
584
|
+
const staleHudPaneIds = listHudWatchPaneIdsInCurrentWindow(currentPaneId);
|
|
585
|
+
for (const paneId of staleHudPaneIds) {
|
|
586
|
+
killTmuxPane(paneId);
|
|
587
|
+
}
|
|
588
|
+
let hudPaneId = null;
|
|
509
589
|
try {
|
|
510
|
-
|
|
590
|
+
hudPaneId = createHudWatchPane(cwd, hudCmd);
|
|
511
591
|
}
|
|
512
592
|
catch {
|
|
513
593
|
// HUD split failed, continue without it
|
|
514
594
|
}
|
|
515
|
-
// execFileSync imported at top level
|
|
516
595
|
try {
|
|
517
596
|
execFileSync('codex', launchArgs, { cwd, stdio: 'inherit', env: codexEnv });
|
|
518
597
|
}
|
|
519
598
|
catch {
|
|
520
599
|
// Codex exited
|
|
521
600
|
}
|
|
601
|
+
finally {
|
|
602
|
+
const cleanupPaneIds = buildHudPaneCleanupTargets(listHudWatchPaneIdsInCurrentWindow(currentPaneId), hudPaneId);
|
|
603
|
+
for (const paneId of cleanupPaneIds) {
|
|
604
|
+
killTmuxPane(paneId);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
522
607
|
}
|
|
523
608
|
else {
|
|
524
609
|
// Not in tmux: create a new tmux session with codex + HUD pane
|
|
610
|
+
const codexCmd = buildTmuxShellCommand('codex', launchArgs);
|
|
525
611
|
const tmuxSessionId = `omx-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
526
612
|
const sessionName = buildTmuxSessionName(cwd, tmuxSessionId);
|
|
527
613
|
try {
|
|
@@ -538,9 +624,7 @@ function runCodex(cwd, args) {
|
|
|
538
624
|
], { stdio: 'inherit' });
|
|
539
625
|
}
|
|
540
626
|
catch {
|
|
541
|
-
// tmux not available, just run codex directly
|
|
542
|
-
console.log('tmux not available, launching codex without HUD...');
|
|
543
|
-
// execFileSync imported at top level
|
|
627
|
+
// tmux not available or failed, just run codex directly
|
|
544
628
|
try {
|
|
545
629
|
execFileSync('codex', launchArgs, { cwd, stdio: 'inherit', env: codexEnv });
|
|
546
630
|
}
|
|
@@ -550,6 +634,30 @@ function runCodex(cwd, args) {
|
|
|
550
634
|
}
|
|
551
635
|
}
|
|
552
636
|
}
|
|
637
|
+
function listHudWatchPaneIdsInCurrentWindow(currentPaneId) {
|
|
638
|
+
try {
|
|
639
|
+
const output = execFileSync('tmux', ['list-panes', '-F', '#{pane_id}\t#{pane_current_command}\t#{pane_start_command}'], { encoding: 'utf-8' });
|
|
640
|
+
return findHudWatchPaneIds(parseTmuxPaneSnapshot(output), currentPaneId);
|
|
641
|
+
}
|
|
642
|
+
catch {
|
|
643
|
+
return [];
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
function createHudWatchPane(cwd, hudCmd) {
|
|
647
|
+
const output = execFileSync('tmux', ['split-window', '-v', '-l', '4', '-d', '-c', cwd, '-P', '-F', '#{pane_id}', hudCmd], { encoding: 'utf-8' });
|
|
648
|
+
const paneId = output.split('\n')[0]?.trim() || '';
|
|
649
|
+
return paneId.startsWith('%') ? paneId : null;
|
|
650
|
+
}
|
|
651
|
+
function killTmuxPane(paneId) {
|
|
652
|
+
if (!paneId.startsWith('%'))
|
|
653
|
+
return;
|
|
654
|
+
try {
|
|
655
|
+
execFileSync('tmux', ['kill-pane', '-t', paneId], { stdio: 'ignore' });
|
|
656
|
+
}
|
|
657
|
+
catch {
|
|
658
|
+
// Pane may already be gone; ignore.
|
|
659
|
+
}
|
|
660
|
+
}
|
|
553
661
|
export function buildTmuxShellCommand(command, args) {
|
|
554
662
|
return [quoteShellArg(command), ...args.map(quoteShellArg)].join(' ');
|
|
555
663
|
}
|
|
@@ -575,12 +683,12 @@ async function postLaunch(cwd, sessionId) {
|
|
|
575
683
|
catch {
|
|
576
684
|
// Non-fatal
|
|
577
685
|
}
|
|
578
|
-
// 1.
|
|
686
|
+
// 1. Remove session-scoped model instructions file
|
|
579
687
|
try {
|
|
580
|
-
await
|
|
688
|
+
await removeSessionModelInstructionsFile(cwd, sessionId);
|
|
581
689
|
}
|
|
582
690
|
catch (err) {
|
|
583
|
-
console.error(`[omx] postLaunch:
|
|
691
|
+
console.error(`[omx] postLaunch: model instructions cleanup failed: ${err instanceof Error ? err.message : err}`);
|
|
584
692
|
}
|
|
585
693
|
// 2. Archive session (write history, delete session.json)
|
|
586
694
|
try {
|