oh-my-codex 0.16.0 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +5 -5
- package/Cargo.toml +1 -1
- package/crates/omx-explore/src/main.rs +434 -28
- package/dist/agents/__tests__/native-config.test.js +50 -0
- package/dist/agents/__tests__/native-config.test.js.map +1 -1
- package/dist/agents/native-config.d.ts.map +1 -1
- package/dist/agents/native-config.js +3 -2
- package/dist/agents/native-config.js.map +1 -1
- package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -0
- package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
- package/dist/cli/__tests__/explore.test.js +118 -1
- package/dist/cli/__tests__/explore.test.js.map +1 -1
- package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
- package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
- package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
- package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
- package/dist/cli/__tests__/index.test.js +182 -18
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +88 -2
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/ralph.test.js +62 -0
- package/dist/cli/__tests__/ralph.test.js.map +1 -1
- package/dist/cli/__tests__/setup-install-mode.test.js +45 -0
- package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +465 -12
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +40 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/explore.d.ts.map +1 -1
- package/dist/cli/explore.js +208 -8
- package/dist/cli/explore.js.map +1 -1
- package/dist/cli/index.d.ts +11 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +124 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ralph.d.ts.map +1 -1
- package/dist/cli/ralph.js +37 -3
- package/dist/cli/ralph.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +93 -4
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +1 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +42 -7
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/ultragoal.d.ts +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +6 -3
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/config/__tests__/codex-hooks.test.js +5 -0
- package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
- package/dist/config/__tests__/models.test.js +18 -1
- package/dist/config/__tests__/models.test.js.map +1 -1
- package/dist/config/codex-hooks.d.ts.map +1 -1
- package/dist/config/codex-hooks.js +4 -1
- package/dist/config/codex-hooks.js.map +1 -1
- package/dist/config/models.d.ts +6 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +37 -0
- package/dist/config/models.js.map +1 -1
- package/dist/exec/followup.d.ts +1 -0
- package/dist/exec/followup.d.ts.map +1 -1
- package/dist/exec/followup.js +9 -3
- package/dist/exec/followup.js.map +1 -1
- package/dist/hooks/__tests__/anti-slop-workflow.test.js +19 -0
- package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js +19 -2
- package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +40 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
- package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
- package/dist/hooks/__tests__/session.test.js +32 -0
- package/dist/hooks/__tests__/session.test.js.map +1 -1
- package/dist/hooks/codebase-map.d.ts.map +1 -1
- package/dist/hooks/codebase-map.js +3 -2
- package/dist/hooks/codebase-map.js.map +1 -1
- package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
- package/dist/hooks/extensibility/dispatcher.js +6 -4
- package/dist/hooks/extensibility/dispatcher.js.map +1 -1
- package/dist/hooks/extensibility/logging.d.ts.map +1 -1
- package/dist/hooks/extensibility/logging.js +3 -2
- package/dist/hooks/extensibility/logging.js.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
- package/dist/hooks/extensibility/sdk/paths.js +4 -3
- package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
- package/dist/hooks/session.d.ts.map +1 -1
- package/dist/hooks/session.js +22 -12
- package/dist/hooks/session.js.map +1 -1
- package/dist/hud/__tests__/hud-tmux-injection.test.js +8 -7
- package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +1 -1
- package/dist/hud/__tests__/state.test.js +24 -0
- package/dist/hud/__tests__/state.test.js.map +1 -1
- package/dist/hud/index.js +1 -1
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +22 -8
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/tmux.js +1 -1
- package/dist/hud/tmux.js.map +1 -1
- package/dist/imagegen/continuation.d.ts +44 -0
- package/dist/imagegen/continuation.d.ts.map +1 -0
- package/dist/imagegen/continuation.js +220 -0
- package/dist/imagegen/continuation.js.map +1 -0
- package/dist/mcp/__tests__/bootstrap.test.js +47 -2
- package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js +49 -1
- package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
- package/dist/mcp/bootstrap.d.ts +2 -0
- package/dist/mcp/bootstrap.d.ts.map +1 -1
- package/dist/mcp/bootstrap.js +95 -15
- package/dist/mcp/bootstrap.js.map +1 -1
- package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
- package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
- package/dist/mcp/lifecycle-telemetry.js +95 -0
- package/dist/mcp/lifecycle-telemetry.js.map +1 -0
- package/dist/pipeline/__tests__/stages.test.js +274 -5
- package/dist/pipeline/__tests__/stages.test.js.map +1 -1
- package/dist/pipeline/stages/team-exec.d.ts +2 -0
- package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
- package/dist/pipeline/stages/team-exec.js +51 -26
- package/dist/pipeline/stages/team-exec.js.map +1 -1
- package/dist/planning/__tests__/artifacts.test.js +138 -3
- package/dist/planning/__tests__/artifacts.test.js.map +1 -1
- package/dist/planning/__tests__/context-pack-status.test.d.ts +2 -0
- package/dist/planning/__tests__/context-pack-status.test.d.ts.map +1 -0
- package/dist/planning/__tests__/context-pack-status.test.js +271 -0
- package/dist/planning/__tests__/context-pack-status.test.js.map +1 -0
- package/dist/planning/artifacts.d.ts +12 -1
- package/dist/planning/artifacts.d.ts.map +1 -1
- package/dist/planning/artifacts.js +32 -9
- package/dist/planning/artifacts.js.map +1 -1
- package/dist/planning/context-pack-status.d.ts +42 -0
- package/dist/planning/context-pack-status.d.ts.map +1 -0
- package/dist/planning/context-pack-status.js +479 -0
- package/dist/planning/context-pack-status.js.map +1 -0
- package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
- package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
- package/dist/runtime/__tests__/process-tree.test.js +107 -0
- package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
- package/dist/runtime/process-tree.d.ts +28 -0
- package/dist/runtime/process-tree.d.ts.map +1 -0
- package/dist/runtime/process-tree.js +230 -0
- package/dist/runtime/process-tree.js.map +1 -0
- package/dist/scripts/__tests__/codex-native-hook.test.js +205 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
- package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
- package/dist/scripts/__tests__/notify-state-io.test.js +40 -0
- package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +111 -7
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
- package/dist/scripts/notify-hook/managed-tmux.js +6 -9
- package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
- package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
- package/dist/scripts/notify-hook/process-runner.js +4 -1
- package/dist/scripts/notify-hook/process-runner.js.map +1 -1
- package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
- package/dist/scripts/notify-hook/state-io.js +4 -7
- package/dist/scripts/notify-hook/state-io.js.map +1 -1
- package/dist/scripts/notify-hook.js +25 -3
- package/dist/scripts/notify-hook.js.map +1 -1
- package/dist/scripts/verify-native-agents.d.ts.map +1 -1
- package/dist/scripts/verify-native-agents.js +3 -1
- package/dist/scripts/verify-native-agents.js.map +1 -1
- package/dist/sidecar/__tests__/tmux.test.js +1 -1
- package/dist/sidecar/__tests__/tmux.test.js.map +1 -1
- package/dist/sidecar/tmux.js +1 -1
- package/dist/sidecar/tmux.js.map +1 -1
- package/dist/state/__tests__/workflow-transition.test.js +45 -1
- package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
- package/dist/state/workflow-transition-reconcile.js +2 -2
- package/dist/state/workflow-transition-reconcile.js.map +1 -1
- package/dist/state/workflow-transition.js +2 -2
- package/dist/state/workflow-transition.js.map +1 -1
- package/dist/team/__tests__/approved-execution.test.js +96 -0
- package/dist/team/__tests__/approved-execution.test.js.map +1 -1
- package/dist/team/__tests__/followup-planner.test.js +16 -0
- package/dist/team/__tests__/followup-planner.test.js.map +1 -1
- package/dist/team/__tests__/model-contract.test.js +16 -0
- package/dist/team/__tests__/model-contract.test.js.map +1 -1
- package/dist/team/__tests__/repo-aware-decomposition.test.js +20 -0
- package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
- package/dist/team/__tests__/runtime-cli.test.js +16 -0
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +209 -11
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/scaling.test.js +110 -0
- package/dist/team/__tests__/scaling.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +9 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/worker-runtime-identity.test.js +6 -0
- package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
- package/dist/team/approved-execution.d.ts +13 -0
- package/dist/team/approved-execution.d.ts.map +1 -1
- package/dist/team/approved-execution.js +40 -22
- package/dist/team/approved-execution.js.map +1 -1
- package/dist/team/followup-planner.d.ts +1 -0
- package/dist/team/followup-planner.d.ts.map +1 -1
- package/dist/team/followup-planner.js +9 -9
- package/dist/team/followup-planner.js.map +1 -1
- package/dist/team/model-contract.d.ts +1 -1
- package/dist/team/model-contract.d.ts.map +1 -1
- package/dist/team/model-contract.js +4 -3
- package/dist/team/model-contract.js.map +1 -1
- package/dist/team/repo-aware-decomposition.d.ts +1 -0
- package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
- package/dist/team/repo-aware-decomposition.js +5 -1
- package/dist/team/repo-aware-decomposition.js.map +1 -1
- package/dist/team/runtime-cli.d.ts +4 -0
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +14 -1
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime.d.ts +1 -0
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +46 -16
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/scaling.d.ts.map +1 -1
- package/dist/team/scaling.js +13 -6
- package/dist/team/scaling.js.map +1 -1
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +7 -0
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/ultragoal/__tests__/artifacts.test.js +51 -0
- package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
- package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
- package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js +23 -0
- package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
- package/dist/ultragoal/artifacts.d.ts +2 -2
- package/dist/ultragoal/artifacts.d.ts.map +1 -1
- package/dist/ultragoal/artifacts.js +37 -1
- package/dist/ultragoal/artifacts.js.map +1 -1
- package/dist/verification/__tests__/ci-rust-gates.test.js +44 -14
- package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +9 -0
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +25 -2
- package/plugins/oh-my-codex/skills/plan/SKILL.md +7 -4
- package/plugins/oh-my-codex/skills/ralplan/SKILL.md +13 -3
- package/plugins/oh-my-codex/skills/team/SKILL.md +2 -2
- package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +8 -0
- package/prompts/planner.md +1 -1
- package/skills/ai-slop-cleaner/SKILL.md +9 -0
- package/skills/deep-interview/SKILL.md +25 -2
- package/skills/plan/SKILL.md +7 -4
- package/skills/ralplan/SKILL.md +13 -3
- package/skills/team/SKILL.md +2 -2
- package/skills/visual-ralph/SKILL.md +8 -0
- package/src/scripts/__tests__/codex-native-hook.test.ts +231 -1
- package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
- package/src/scripts/codex-native-hook.ts +129 -14
- package/src/scripts/notify-hook/managed-tmux.ts +6 -7
- package/src/scripts/notify-hook/process-runner.ts +4 -1
- package/src/scripts/notify-hook/state-io.ts +5 -7
- package/src/scripts/notify-hook.ts +26 -3
- package/src/scripts/verify-native-agents.ts +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-state-io.test.d.ts","sourceRoot":"","sources":["../../../src/scripts/__tests__/notify-state-io.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { getScopedStatePath, readScopedJsonIfExists, resolveScopedStateDir, writeScopedJson, } from '../notify-hook/state-io.js';
|
|
7
|
+
describe('notify-hook state I/O session authority', () => {
|
|
8
|
+
it('uses an explicit session id before the current session pointer', async () => {
|
|
9
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-notify-state-io-'));
|
|
10
|
+
try {
|
|
11
|
+
const stateDir = join(wd, '.omx', 'state');
|
|
12
|
+
await mkdir(join(stateDir, 'sessions', 'sess-current'), { recursive: true });
|
|
13
|
+
await mkdir(join(stateDir, 'sessions', 'sess-explicit'), { recursive: true });
|
|
14
|
+
await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-current', cwd: wd }, null, 2), 'utf-8');
|
|
15
|
+
assert.equal(await resolveScopedStateDir(stateDir, 'sess-explicit'), join(stateDir, 'sessions', 'sess-explicit'));
|
|
16
|
+
assert.equal(await getScopedStatePath(stateDir, 'hud-state.json', 'sess-explicit'), join(stateDir, 'sessions', 'sess-explicit', 'hud-state.json'));
|
|
17
|
+
await writeScopedJson(stateDir, 'hud-state.json', 'sess-explicit', { turn_count: 3 });
|
|
18
|
+
const explicitHud = JSON.parse(await readFile(join(stateDir, 'sessions', 'sess-explicit', 'hud-state.json'), 'utf-8'));
|
|
19
|
+
assert.equal(explicitHud.turn_count, 3);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await rm(wd, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it('does not read current-session data when an explicit session has no state file', async () => {
|
|
26
|
+
const wd = await mkdtemp(join(tmpdir(), 'omx-notify-state-io-missing-'));
|
|
27
|
+
try {
|
|
28
|
+
const stateDir = join(wd, '.omx', 'state');
|
|
29
|
+
await mkdir(join(stateDir, 'sessions', 'sess-current'), { recursive: true });
|
|
30
|
+
await writeFile(join(stateDir, 'session.json'), JSON.stringify({ session_id: 'sess-current', cwd: wd }, null, 2), 'utf-8');
|
|
31
|
+
await writeFile(join(stateDir, 'sessions', 'sess-current', 'auto-nudge-state.json'), JSON.stringify({ count: 9 }, null, 2), 'utf-8');
|
|
32
|
+
const value = await readScopedJsonIfExists(stateDir, 'auto-nudge-state.json', 'sess-explicit', null);
|
|
33
|
+
assert.equal(value, null);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await rm(wd, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=notify-state-io.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-state-io.test.js","sourceRoot":"","sources":["../../../src/scripts/__tests__/notify-state-io.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AAsCA,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AA4BtC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAyBlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,UAAU,yBAAyB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,OAAO,2BAA2B,CAAC;CACpE;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAC5C;AA2PD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAef;AAqTD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,GACL,MAAM,GAAG,IAAI,CAuBf;AA4hED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CA0PnC;AAOD,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAGT;AA2ED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuC3D"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { execFileSync } from "child_process";
|
|
2
2
|
import { closeSync, existsSync, openSync, readFileSync, readSync } from "fs";
|
|
3
|
-
import { mkdir, readFile, readdir, writeFile } from "fs/promises";
|
|
3
|
+
import { appendFile, mkdir, readFile, readdir, writeFile } from "fs/promises";
|
|
4
4
|
import { extname, join, relative, resolve } from "path";
|
|
5
5
|
import { pathToFileURL } from "url";
|
|
6
6
|
import { readModeState, readModeStateForActiveDecision, readModeStateForSession, updateModeState } from "../modes/base.js";
|
|
7
|
-
import { extractSessionIdFromInitializedStatePath, listActiveSkills, readVisibleSkillActiveState, } from "../state/skill-active.js";
|
|
7
|
+
import { extractSessionIdFromInitializedStatePath, getSkillActiveStatePaths, listActiveSkills, readSkillActiveState, readVisibleSkillActiveState, } from "../state/skill-active.js";
|
|
8
8
|
import { readSubagentSessionSummary, recordSubagentTurnForSession, } from "../subagents/tracker.js";
|
|
9
9
|
import { resolveCanonicalTeamStateRoot, resolveWorkerNotifyTeamStateRootPath } from "../team/state-root.js";
|
|
10
10
|
import { appendToLog, isSessionStateUsable, readSessionState, readUsableSessionState, reconcileNativeSessionStart, } from "../hooks/session.js";
|
|
@@ -463,6 +463,7 @@ function readParentPid(pid) {
|
|
|
463
463
|
const raw = execFileSync("ps", ["-o", "ppid=", "-p", String(pid)], {
|
|
464
464
|
encoding: "utf-8",
|
|
465
465
|
stdio: ["ignore", "pipe", "ignore"],
|
|
466
|
+
windowsHide: true,
|
|
466
467
|
}).trim();
|
|
467
468
|
const ppid = Number.parseInt(raw, 10);
|
|
468
469
|
return Number.isFinite(ppid) && ppid > 0 ? ppid : null;
|
|
@@ -481,6 +482,7 @@ function readProcessCommand(pid) {
|
|
|
481
482
|
return execFileSync("ps", ["-o", "command=", "-p", String(pid)], {
|
|
482
483
|
encoding: "utf-8",
|
|
483
484
|
stdio: ["ignore", "pipe", "ignore"],
|
|
485
|
+
windowsHide: true,
|
|
484
486
|
}).trim();
|
|
485
487
|
}
|
|
486
488
|
catch {
|
|
@@ -1533,6 +1535,80 @@ async function readBlockingSkillForStop(cwd, sessionId, threadId, requiredSkill)
|
|
|
1533
1535
|
}
|
|
1534
1536
|
return null;
|
|
1535
1537
|
}
|
|
1538
|
+
function uniqueNonEmpty(values) {
|
|
1539
|
+
return [...new Set(values.map((value) => safeString(value).trim()).filter(Boolean))];
|
|
1540
|
+
}
|
|
1541
|
+
function isTerminalOrInactiveModeState(state) {
|
|
1542
|
+
if (!state)
|
|
1543
|
+
return true;
|
|
1544
|
+
if (state.active !== true)
|
|
1545
|
+
return true;
|
|
1546
|
+
if (getRunContinuationSnapshot(state)?.terminal === true)
|
|
1547
|
+
return true;
|
|
1548
|
+
const phase = safeString(state.current_phase ?? state.currentPhase).trim().toLowerCase();
|
|
1549
|
+
return phase !== "" && TERMINAL_MODE_PHASES.has(phase);
|
|
1550
|
+
}
|
|
1551
|
+
async function readSessionScopedModeStateForRootSkill(cwd, skill, sessionIds) {
|
|
1552
|
+
for (const sessionId of sessionIds) {
|
|
1553
|
+
const state = await readJsonIfExists(getStateFilePath(`${skill}-state.json`, cwd, sessionId));
|
|
1554
|
+
if (state)
|
|
1555
|
+
return state;
|
|
1556
|
+
}
|
|
1557
|
+
return null;
|
|
1558
|
+
}
|
|
1559
|
+
async function reconcileStaleRootSkillActiveStateForStop(cwd, sessionId) {
|
|
1560
|
+
const { rootPath } = getSkillActiveStatePaths(cwd);
|
|
1561
|
+
const rootState = await readSkillActiveState(rootPath);
|
|
1562
|
+
if (!rootState?.active)
|
|
1563
|
+
return;
|
|
1564
|
+
const initializedSessionId = extractSessionIdFromInitializedStatePath(rootState.initialized_state_path);
|
|
1565
|
+
const rootSessionIds = uniqueNonEmpty([
|
|
1566
|
+
sessionId,
|
|
1567
|
+
safeString(rootState.session_id),
|
|
1568
|
+
initializedSessionId,
|
|
1569
|
+
...listActiveSkills(rootState).map((entry) => safeString(entry.session_id)),
|
|
1570
|
+
]);
|
|
1571
|
+
if (rootSessionIds.length === 0)
|
|
1572
|
+
return;
|
|
1573
|
+
const activeEntries = listActiveSkills(rootState);
|
|
1574
|
+
let changed = false;
|
|
1575
|
+
const keptEntries = [];
|
|
1576
|
+
for (const entry of activeEntries) {
|
|
1577
|
+
const skill = safeString(entry.skill).trim();
|
|
1578
|
+
if (!skill)
|
|
1579
|
+
continue;
|
|
1580
|
+
const entrySessionId = safeString(entry.session_id).trim();
|
|
1581
|
+
const candidateSessionIds = uniqueNonEmpty([
|
|
1582
|
+
entrySessionId,
|
|
1583
|
+
sessionId,
|
|
1584
|
+
initializedSessionId,
|
|
1585
|
+
safeString(rootState.session_id),
|
|
1586
|
+
]);
|
|
1587
|
+
const modeState = await readSessionScopedModeStateForRootSkill(cwd, skill, candidateSessionIds);
|
|
1588
|
+
if (isTerminalOrInactiveModeState(modeState)) {
|
|
1589
|
+
changed = true;
|
|
1590
|
+
continue;
|
|
1591
|
+
}
|
|
1592
|
+
keptEntries.push(entry);
|
|
1593
|
+
}
|
|
1594
|
+
if (!changed)
|
|
1595
|
+
return;
|
|
1596
|
+
const nowIso = new Date().toISOString();
|
|
1597
|
+
const nextRoot = {
|
|
1598
|
+
...rootState,
|
|
1599
|
+
active: keptEntries.length > 0,
|
|
1600
|
+
skill: keptEntries[0]?.skill ?? safeString(rootState.skill).trim(),
|
|
1601
|
+
phase: keptEntries[0]?.phase ?? safeString(rootState.phase).trim(),
|
|
1602
|
+
updated_at: nowIso,
|
|
1603
|
+
active_skills: keptEntries,
|
|
1604
|
+
reconciled_at: nowIso,
|
|
1605
|
+
reconciliation_reason: "stop_hook_session_state_terminal",
|
|
1606
|
+
};
|
|
1607
|
+
if (keptEntries.length === 0) {
|
|
1608
|
+
nextRoot.phase = "inactive";
|
|
1609
|
+
}
|
|
1610
|
+
await writeFile(rootPath, JSON.stringify(nextRoot, null, 2));
|
|
1611
|
+
}
|
|
1536
1612
|
function buildRalplanContinuationStatus(blocker, activeSubagentCount) {
|
|
1537
1613
|
const phase = blocker.phase || "planning";
|
|
1538
1614
|
const artifact = blocker.latestPlanPath
|
|
@@ -1897,6 +1973,9 @@ async function buildStopHookOutput(payload, cwd, stateDir, options = {}) {
|
|
|
1897
1973
|
const sessionId = readPayloadSessionId(payload);
|
|
1898
1974
|
const canonicalSessionId = await resolveInternalSessionIdForPayload(cwd, sessionId);
|
|
1899
1975
|
const threadId = readPayloadThreadId(payload);
|
|
1976
|
+
if (canonicalSessionId) {
|
|
1977
|
+
await reconcileStaleRootSkillActiveStateForStop(cwd, canonicalSessionId);
|
|
1978
|
+
}
|
|
1900
1979
|
const execFollowupOutput = await buildExecFollowupStopOutput(cwd, canonicalSessionId);
|
|
1901
1980
|
if (execFollowupOutput)
|
|
1902
1981
|
return execFollowupOutput;
|
|
@@ -2268,11 +2347,29 @@ async function readStdinJson() {
|
|
|
2268
2347
|
function writeNativeHookJsonStdout(output) {
|
|
2269
2348
|
process.stdout.write(`${JSON.stringify(output)}\n`);
|
|
2270
2349
|
}
|
|
2350
|
+
async function logNativeHookCliError(cwd, type, error, payload = {}) {
|
|
2351
|
+
const logsDir = join(cwd || process.cwd(), ".omx", "logs");
|
|
2352
|
+
await mkdir(logsDir, { recursive: true }).catch(() => { });
|
|
2353
|
+
const logPath = join(logsDir, `native-hook-${new Date().toISOString().split("T")[0]}.jsonl`);
|
|
2354
|
+
await appendFile(logPath, JSON.stringify({
|
|
2355
|
+
timestamp: new Date().toISOString(),
|
|
2356
|
+
type,
|
|
2357
|
+
hook_event_name: readHookEventName(payload) ?? "Unknown",
|
|
2358
|
+
session_id: readPayloadSessionId(payload) || undefined,
|
|
2359
|
+
thread_id: readPayloadThreadId(payload) || undefined,
|
|
2360
|
+
turn_id: readPayloadTurnId(payload) || undefined,
|
|
2361
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2362
|
+
}) + "\n").catch(() => { });
|
|
2363
|
+
}
|
|
2271
2364
|
function isStopDispatchFailureTestTrigger(payload) {
|
|
2272
2365
|
return process.env.NODE_ENV === "test"
|
|
2273
2366
|
&& process.env.OMX_NATIVE_HOOK_TEST_THROW_STOP_DISPATCH === "1"
|
|
2274
2367
|
&& readHookEventName(payload) === "Stop";
|
|
2275
2368
|
}
|
|
2369
|
+
function isDispatchFailureTestTrigger() {
|
|
2370
|
+
return process.env.NODE_ENV === "test"
|
|
2371
|
+
&& process.env.OMX_NATIVE_HOOK_TEST_THROW_DISPATCH === "1";
|
|
2372
|
+
}
|
|
2276
2373
|
function buildStopDispatchFailureOutput(error) {
|
|
2277
2374
|
const detail = error instanceof Error ? error.message : String(error);
|
|
2278
2375
|
const reason = "OMX native Stop hook failed before normal continuation handling. Continue once more, preserve runtime state, inspect the hook logs, and retry with a valid Stop JSON response.";
|
|
@@ -2286,6 +2383,7 @@ function buildStopDispatchFailureOutput(error) {
|
|
|
2286
2383
|
export async function runCodexNativeHookCli() {
|
|
2287
2384
|
const { payload, parseError } = await readStdinJson();
|
|
2288
2385
|
if (parseError) {
|
|
2386
|
+
await logNativeHookCliError(process.cwd(), "native_hook_stdin_parse_error", parseError);
|
|
2289
2387
|
writeNativeHookJsonStdout({
|
|
2290
2388
|
decision: "block",
|
|
2291
2389
|
reason: "OMX native hook received malformed JSON input. Preserve runtime state, inspect the emitting hook payload yourself, and retry with valid JSON.",
|
|
@@ -2300,6 +2398,9 @@ export async function runCodexNativeHookCli() {
|
|
|
2300
2398
|
if (isStopDispatchFailureTestTrigger(payload)) {
|
|
2301
2399
|
throw new Error("test-induced Stop dispatch failure");
|
|
2302
2400
|
}
|
|
2401
|
+
if (isDispatchFailureTestTrigger()) {
|
|
2402
|
+
throw new Error("test-induced dispatch failure");
|
|
2403
|
+
}
|
|
2303
2404
|
const result = await dispatchCodexNativeHook(payload);
|
|
2304
2405
|
if (result.outputJson) {
|
|
2305
2406
|
writeNativeHookJsonStdout(result.outputJson);
|
|
@@ -2309,17 +2410,20 @@ export async function runCodexNativeHookCli() {
|
|
|
2309
2410
|
}
|
|
2310
2411
|
}
|
|
2311
2412
|
catch (error) {
|
|
2312
|
-
|
|
2313
|
-
|
|
2413
|
+
const cwd = safeString(payload.cwd).trim() || process.cwd();
|
|
2414
|
+
await logNativeHookCliError(cwd, "native_hook_dispatch_error", error, payload);
|
|
2415
|
+
if (readHookEventName(payload) === "Stop") {
|
|
2416
|
+
writeNativeHookJsonStdout(buildStopDispatchFailureOutput(error));
|
|
2417
|
+
}
|
|
2418
|
+
else {
|
|
2419
|
+
process.exitCode = 1;
|
|
2314
2420
|
}
|
|
2315
|
-
process.stderr.write(`[omx] codex-native Stop hook dispatch failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
2316
|
-
writeNativeHookJsonStdout(buildStopDispatchFailureOutput(error));
|
|
2317
2421
|
}
|
|
2318
2422
|
}
|
|
2319
2423
|
if (isCodexNativeHookMainModule(import.meta.url, process.argv[1])) {
|
|
2320
2424
|
runCodexNativeHookCli().catch((error) => {
|
|
2321
|
-
process.stderr.write(`[omx] codex-native-hook failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
2322
2425
|
process.exitCode = 1;
|
|
2426
|
+
void logNativeHookCliError(process.cwd(), "native_hook_fatal_error", error);
|
|
2323
2427
|
});
|
|
2324
2428
|
}
|
|
2325
2429
|
//# sourceMappingURL=codex-native-hook.js.map
|