oh-my-codex 0.14.2 → 0.14.4

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 (144) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +1 -1
  4. package/crates/omx-explore/src/main.rs +2 -2
  5. package/dist/agents/__tests__/definitions.test.js +1 -1
  6. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  7. package/dist/agents/__tests__/native-config.test.js +4 -4
  8. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  9. package/dist/agents/definitions.js +1 -1
  10. package/dist/agents/definitions.js.map +1 -1
  11. package/dist/cli/__tests__/agents.test.js +5 -5
  12. package/dist/cli/__tests__/cleanup.test.js +27 -0
  13. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  14. package/dist/cli/__tests__/doctor-invalid-config.test.js +1 -1
  15. package/dist/cli/__tests__/explore.test.js +62 -5
  16. package/dist/cli/__tests__/explore.test.js.map +1 -1
  17. package/dist/cli/__tests__/index.test.js +63 -0
  18. package/dist/cli/__tests__/index.test.js.map +1 -1
  19. package/dist/cli/__tests__/question.test.js +146 -1
  20. package/dist/cli/__tests__/question.test.js.map +1 -1
  21. package/dist/cli/__tests__/setup-agents-overwrite.test.js +1 -1
  22. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  23. package/dist/cli/__tests__/setup-refresh.test.js +6 -6
  24. package/dist/cli/__tests__/uninstall.test.js +8 -8
  25. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  26. package/dist/cli/agents.js +1 -1
  27. package/dist/cli/cleanup.d.ts.map +1 -1
  28. package/dist/cli/cleanup.js +18 -2
  29. package/dist/cli/cleanup.js.map +1 -1
  30. package/dist/cli/codex-home.d.ts +8 -0
  31. package/dist/cli/codex-home.d.ts.map +1 -0
  32. package/dist/cli/codex-home.js +54 -0
  33. package/dist/cli/codex-home.js.map +1 -0
  34. package/dist/cli/explore.d.ts +1 -0
  35. package/dist/cli/explore.d.ts.map +1 -1
  36. package/dist/cli/explore.js +15 -6
  37. package/dist/cli/explore.js.map +1 -1
  38. package/dist/cli/index.d.ts +1 -6
  39. package/dist/cli/index.d.ts.map +1 -1
  40. package/dist/cli/index.js +2 -49
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/config/__tests__/generator-idempotent.test.js +56 -12
  43. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  44. package/dist/config/__tests__/generator-notify.test.js +12 -12
  45. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  46. package/dist/config/generator.d.ts.map +1 -1
  47. package/dist/config/generator.js +60 -22
  48. package/dist/config/generator.js.map +1 -1
  49. package/dist/config/models.d.ts +1 -1
  50. package/dist/config/models.js +1 -1
  51. package/dist/hooks/__tests__/clawhip-event-contract.test.js +7 -0
  52. package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -1
  53. package/dist/hooks/__tests__/deep-interview-contract.test.js +17 -0
  54. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  55. package/dist/hooks/__tests__/keyword-detector.test.js +87 -0
  56. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  57. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +1 -1
  58. package/dist/hooks/__tests__/skill-guidance-contract.test.js +8 -1
  59. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  60. package/dist/hooks/__tests__/tmux-hook-engine.test.js +2 -2
  61. package/dist/hooks/extensibility/__tests__/events.test.js +6 -0
  62. package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -1
  63. package/dist/hooks/extensibility/types.d.ts +1 -1
  64. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  65. package/dist/hooks/keyword-detector.d.ts +3 -0
  66. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  67. package/dist/hooks/keyword-detector.js +11 -4
  68. package/dist/hooks/keyword-detector.js.map +1 -1
  69. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  70. package/dist/hooks/prompt-guidance-contract.js +31 -15
  71. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  72. package/dist/hud/__tests__/reconcile.test.js +22 -0
  73. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  74. package/dist/hud/reconcile.d.ts +2 -1
  75. package/dist/hud/reconcile.d.ts.map +1 -1
  76. package/dist/hud/reconcile.js +3 -2
  77. package/dist/hud/reconcile.js.map +1 -1
  78. package/dist/hud/tmux.d.ts +3 -2
  79. package/dist/hud/tmux.d.ts.map +1 -1
  80. package/dist/hud/tmux.js +11 -4
  81. package/dist/hud/tmux.js.map +1 -1
  82. package/dist/question/__tests__/deep-interview.test.js +58 -1
  83. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  84. package/dist/question/__tests__/renderer.test.js +282 -24
  85. package/dist/question/__tests__/renderer.test.js.map +1 -1
  86. package/dist/question/__tests__/state.test.js +27 -0
  87. package/dist/question/__tests__/state.test.js.map +1 -1
  88. package/dist/question/__tests__/ui.test.js +129 -0
  89. package/dist/question/__tests__/ui.test.js.map +1 -1
  90. package/dist/question/deep-interview.d.ts +1 -0
  91. package/dist/question/deep-interview.d.ts.map +1 -1
  92. package/dist/question/deep-interview.js +80 -2
  93. package/dist/question/deep-interview.js.map +1 -1
  94. package/dist/question/renderer.d.ts +4 -1
  95. package/dist/question/renderer.d.ts.map +1 -1
  96. package/dist/question/renderer.js +101 -4
  97. package/dist/question/renderer.js.map +1 -1
  98. package/dist/question/state.js +1 -1
  99. package/dist/question/state.js.map +1 -1
  100. package/dist/question/ui.d.ts +3 -1
  101. package/dist/question/ui.d.ts.map +1 -1
  102. package/dist/question/ui.js +14 -6
  103. package/dist/question/ui.js.map +1 -1
  104. package/dist/scripts/__tests__/codex-native-hook.test.js +265 -3
  105. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  106. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  107. package/dist/scripts/codex-native-hook.js +47 -9
  108. package/dist/scripts/codex-native-hook.js.map +1 -1
  109. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  110. package/dist/scripts/codex-native-pre-post.js +47 -0
  111. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  112. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
  113. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
  114. package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
  115. package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
  116. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  117. package/dist/scripts/notify-hook/team-dispatch.js +9 -0
  118. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  119. package/dist/team/__tests__/events.test.js +25 -0
  120. package/dist/team/__tests__/events.test.js.map +1 -1
  121. package/dist/team/__tests__/model-contract.test.js +3 -3
  122. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  123. package/dist/team/__tests__/runtime.test.js +18 -7
  124. package/dist/team/__tests__/runtime.test.js.map +1 -1
  125. package/dist/team/__tests__/scaling.test.js +1 -1
  126. package/dist/team/__tests__/tmux-session.test.js +296 -5
  127. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  128. package/dist/team/runtime.d.ts.map +1 -1
  129. package/dist/team/runtime.js +30 -0
  130. package/dist/team/runtime.js.map +1 -1
  131. package/dist/team/tmux-session.d.ts.map +1 -1
  132. package/dist/team/tmux-session.js +60 -3
  133. package/dist/team/tmux-session.js.map +1 -1
  134. package/dist/utils/__tests__/agents-model-table.test.js +1 -1
  135. package/dist/utils/__tests__/agents-model-table.test.js.map +1 -1
  136. package/package.json +2 -2
  137. package/skills/deep-interview/SKILL.md +13 -2
  138. package/skills/ultrawork/SKILL.md +91 -59
  139. package/src/scripts/__tests__/codex-native-hook.test.ts +318 -3
  140. package/src/scripts/codex-native-hook.ts +49 -6
  141. package/src/scripts/codex-native-pre-post.ts +45 -0
  142. package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
  143. package/src/scripts/notify-hook/team-dispatch.ts +9 -0
  144. package/templates/AGENTS.md +1 -1
@@ -71,13 +71,18 @@ function buildAnswer(record, selections, otherText) {
71
71
  selected_values: [selected.value],
72
72
  };
73
73
  }
74
- function maybeInjectAnswer(record, answer) {
75
- const target = record.renderer?.return_target;
76
- const transport = record.renderer?.return_transport;
74
+ function safeString(value) {
75
+ return typeof value === 'string' ? value : '';
76
+ }
77
+ function maybeInjectAnswer(record, answer, deps = {}) {
78
+ const env = deps.env ?? process.env;
79
+ const envTransport = safeString(env.OMX_QUESTION_RETURN_TRANSPORT).trim();
80
+ const target = record.renderer?.return_target ?? safeString(env.OMX_QUESTION_RETURN_TARGET).trim();
81
+ const transport = record.renderer?.return_transport ?? (envTransport === 'tmux-send-keys' ? envTransport : undefined);
77
82
  if (!target || transport !== 'tmux-send-keys')
78
83
  return;
79
84
  try {
80
- injectQuestionAnswerToPane(target, answer);
85
+ (deps.injectAnswerToPane ?? injectQuestionAnswerToPane)(target, answer);
81
86
  }
82
87
  catch {
83
88
  // Best-effort continuation nudge only; stdout return path remains canonical.
@@ -310,8 +315,11 @@ export async function runQuestionUi(recordPath, deps = {}) {
310
315
  otherText = await promptForOtherText(record.other_label, { input, output });
311
316
  }
312
317
  const answer = buildAnswer(record, selections, otherText);
313
- await markQuestionAnswered(recordPath, answer);
314
- maybeInjectAnswer(record, answer);
318
+ const answeredRecord = await markQuestionAnswered(recordPath, answer);
319
+ maybeInjectAnswer(answeredRecord, answer, {
320
+ env: deps.env,
321
+ injectAnswerToPane: deps.injectAnswerToPane,
322
+ });
315
323
  }
316
324
  catch (error) {
317
325
  await markQuestionTerminalError(recordPath, 'error', 'question_ui_failed', error instanceof Error ? error.message : String(error));
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/question/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/question/ui.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,7 @@ const TEAM_ENV_KEYS = [
67
67
  "OMX_TEAM_STATE_ROOT",
68
68
  "OMX_TEAM_LEADER_CWD",
69
69
  "OMX_SESSION_ID",
70
+ "TMUX_PANE",
70
71
  ];
71
72
  const priorTeamEnv = new Map();
72
73
  beforeEach(() => {
@@ -470,6 +471,31 @@ describe("codex native hook dispatch", () => {
470
471
  await rm(cwd, { recursive: true, force: true });
471
472
  }
472
473
  });
474
+ it("adds ultrawork-specific activation guidance only for true ultrawork workflow activation", async () => {
475
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ultrawork-routing-"));
476
+ try {
477
+ await mkdir(join(cwd, ".omx", "state"), { recursive: true });
478
+ const result = await dispatchCodexNativeHook({
479
+ hook_event_name: "UserPromptSubmit",
480
+ cwd,
481
+ session_id: "sess-ultrawork-msg",
482
+ thread_id: "thread-ultrawork-msg",
483
+ turn_id: "turn-ultrawork-msg",
484
+ prompt: "$ultrawork fan out the regression checks",
485
+ }, { cwd });
486
+ assert.equal(result.omxEventName, "keyword-detector");
487
+ assert.equal(result.skillState?.skill, "ultrawork");
488
+ const message = String(result.outputJson?.hookSpecificOutput?.additionalContext || "");
489
+ assert.match(message, /\$ultrawork" -> ultrawork/);
490
+ assert.match(message, /ground the task before editing/i);
491
+ assert.match(message, /define pass\/fail acceptance criteria/i);
492
+ assert.match(message, /direct-tool plus background evidence lanes/i);
493
+ assert.match(message, /Ralph owns persistence and the full verified-completion promise/i);
494
+ }
495
+ finally {
496
+ await rm(cwd, { recursive: true, force: true });
497
+ }
498
+ });
473
499
  it("does not activate Ralph workflow state from a plain conversational mention", async () => {
474
500
  const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ralph-plain-text-"));
475
501
  try {
@@ -637,13 +663,48 @@ describe("codex native hook dispatch", () => {
637
663
  assert.match(message, /do not fall back to `request_user_input` or plain-text questioning/i);
638
664
  assert.match(message, /After starting `omx question` in a background terminal, wait for that terminal to finish and read the JSON answer before continuing the interview\./);
639
665
  assert.match(message, /If bare `omx question` is unavailable in this reused session, use the current-session CLI bridge command:/);
640
- assert.match(message, /`'.+' '.+dist\/cli\/omx\.js' question`/);
666
+ assert.match(message, /'.+' '.+dist\/cli\/omx\.js' question/);
667
+ assert.doesNotMatch(message, /OMX_QUESTION_RETURN_PANE=/);
668
+ assert.doesNotMatch(message, /preserve the leader pane/i);
641
669
  assert.match(message, /Stop remains blocked while a deep-interview question obligation is pending\./);
642
670
  }
643
671
  finally {
644
672
  await rm(cwd, { recursive: true, force: true });
645
673
  }
646
674
  });
675
+ it("includes leader-pane preservation guidance when a pane hint is available", async () => {
676
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-deep-interview-pane-hint-"));
677
+ try {
678
+ const sessionId = "sess-deep-interview-pane-hint";
679
+ const sessionDir = join(cwd, ".omx", "state", "sessions", sessionId);
680
+ await mkdir(sessionDir, { recursive: true });
681
+ await writeJson(join(sessionDir, "deep-interview-state.json"), {
682
+ active: true,
683
+ mode: "deep-interview",
684
+ current_phase: "intent-first",
685
+ started_at: "2026-04-21T10:00:00.000Z",
686
+ updated_at: "2026-04-21T10:00:00.000Z",
687
+ tmux_pane_id: "%77",
688
+ });
689
+ const result = await dispatchCodexNativeHook({
690
+ hook_event_name: "UserPromptSubmit",
691
+ cwd,
692
+ session_id: sessionId,
693
+ thread_id: "thread-deep-interview-pane-hint",
694
+ turn_id: "turn-deep-interview-pane-hint",
695
+ prompt: "$deep-interview gather requirements",
696
+ }, { cwd });
697
+ assert.equal(result.omxEventName, "keyword-detector");
698
+ assert.equal(result.skillState?.skill, "deep-interview");
699
+ const message = String(result.outputJson?.hookSpecificOutput?.additionalContext || "");
700
+ assert.match(message, /OMX_QUESTION_RETURN_PANE='%77'/);
701
+ assert.match(message, /preserve the leader pane/i);
702
+ assert.match(message, /OMX_QUESTION_RETURN_PANE=%77/);
703
+ }
704
+ finally {
705
+ await rm(cwd, { recursive: true, force: true });
706
+ }
707
+ });
647
708
  it("keeps bare keep-going continuation on the active ralph skill without resetting through generic keep-going routing", async () => {
648
709
  const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-ralph-bare-continuation-"));
649
710
  try {
@@ -935,8 +996,8 @@ esac
935
996
  }, { cwd });
936
997
  assert.equal(result.omxEventName, "keyword-detector");
937
998
  const tmuxCalls = await readFile(tmuxLog, "utf-8");
938
- assert.match(tmuxCalls, /list-panes/);
939
- assert.match(tmuxCalls, /split-window/);
999
+ assert.match(tmuxCalls, /list-panes -t %1 -F/);
1000
+ assert.match(tmuxCalls, /split-window -v -l 3 -d -t %1 -c/);
940
1001
  assert.match(tmuxCalls, /resize-pane -t %9 -y 3/);
941
1002
  assert.match(tmuxCalls, /dist\/cli\/omx\.js' hud --watch --preset=focused/);
942
1003
  assert.doesNotMatch(tmuxCalls, /\/tmp\/codex-host-binary' hud --watch/);
@@ -959,6 +1020,75 @@ esac
959
1020
  await rm(cwd, { recursive: true, force: true });
960
1021
  }
961
1022
  });
1023
+ it("blocks Bash omx question when no leader-pane return hint is preserved", async () => {
1024
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-pretool-question-enforce-"));
1025
+ try {
1026
+ const result = await dispatchCodexNativeHook({
1027
+ hook_event_name: "PreToolUse",
1028
+ cwd,
1029
+ tool_name: "Bash",
1030
+ tool_use_id: "tool-question-block",
1031
+ tool_input: { command: `omx question --json --input '{"question":"Q?","options":["A"],"allow_other":true}'` },
1032
+ }, { cwd });
1033
+ assert.equal(result.omxEventName, "pre-tool-use");
1034
+ assert.equal(result.outputJson?.decision, "block");
1035
+ assert.match(String(result.outputJson?.systemMessage || ""), /OMX_QUESTION_RETURN_PANE=\$TMUX_PANE/);
1036
+ }
1037
+ finally {
1038
+ await rm(cwd, { recursive: true, force: true });
1039
+ }
1040
+ });
1041
+ it("allows Bash omx question when the command preserves the leader-pane return hint", async () => {
1042
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-pretool-question-allow-"));
1043
+ try {
1044
+ const result = await dispatchCodexNativeHook({
1045
+ hook_event_name: "PreToolUse",
1046
+ cwd,
1047
+ tool_name: "Bash",
1048
+ tool_use_id: "tool-question-allow",
1049
+ tool_input: { command: `OMX_QUESTION_RETURN_PANE=$TMUX_PANE omx question --json --input '{"question":"Q?","options":["A"],"allow_other":true}'` },
1050
+ }, { cwd });
1051
+ assert.equal(result.omxEventName, "pre-tool-use");
1052
+ assert.equal(result.outputJson, null);
1053
+ }
1054
+ finally {
1055
+ await rm(cwd, { recursive: true, force: true });
1056
+ }
1057
+ });
1058
+ it("allows the quoted pane env assignment emitted by the deep-interview bridge command", async () => {
1059
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-pretool-question-quoted-allow-"));
1060
+ try {
1061
+ const result = await dispatchCodexNativeHook({
1062
+ hook_event_name: "PreToolUse",
1063
+ cwd,
1064
+ tool_name: "Bash",
1065
+ tool_use_id: "tool-question-quoted-allow",
1066
+ tool_input: { command: `OMX_QUESTION_RETURN_PANE='%42' node ./dist/cli/omx.js question --json --input '{"question":"Q?","options":["A"],"allow_other":true}'` },
1067
+ }, { cwd });
1068
+ assert.equal(result.omxEventName, "pre-tool-use");
1069
+ assert.equal(result.outputJson, null);
1070
+ }
1071
+ finally {
1072
+ await rm(cwd, { recursive: true, force: true });
1073
+ }
1074
+ });
1075
+ it("blocks Bash node omx.js question when the command does not preserve the leader-pane return hint", async () => {
1076
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-pretool-question-node-block-"));
1077
+ try {
1078
+ const result = await dispatchCodexNativeHook({
1079
+ hook_event_name: "PreToolUse",
1080
+ cwd,
1081
+ tool_name: "Bash",
1082
+ tool_use_id: "tool-question-node-block",
1083
+ tool_input: { command: `node ./dist/cli/omx.js question --json --input '{"question":"Q?","options":["A"],"allow_other":true}'` },
1084
+ }, { cwd });
1085
+ assert.equal(result.omxEventName, "pre-tool-use");
1086
+ assert.equal(result.outputJson?.decision, "block");
1087
+ }
1088
+ finally {
1089
+ await rm(cwd, { recursive: true, force: true });
1090
+ }
1091
+ });
962
1092
  it("returns a destructive-command caution on PreToolUse for rm -rf dist", async () => {
963
1093
  const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-pretool-danger-"));
964
1094
  try {
@@ -1822,6 +1952,65 @@ esac
1822
1952
  await rm(cwd, { recursive: true, force: true });
1823
1953
  }
1824
1954
  });
1955
+ it("suppresses duplicate Autopilot planning Stop replays so stale planning state cannot loop indefinitely", async () => {
1956
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-autopilot-planning-replay-"));
1957
+ try {
1958
+ const stateDir = join(cwd, ".omx", "state");
1959
+ await mkdir(stateDir, { recursive: true });
1960
+ await writeJson(join(stateDir, "autopilot-state.json"), {
1961
+ active: true,
1962
+ current_phase: "planning",
1963
+ });
1964
+ const payload = {
1965
+ hook_event_name: "Stop",
1966
+ cwd,
1967
+ session_id: "sess-stop-autopilot-planning-replay",
1968
+ thread_id: "thread-stop-autopilot-planning-replay",
1969
+ turn_id: "turn-stop-autopilot-planning-replay",
1970
+ last_assistant_message: "Autopilot planning is still active.",
1971
+ };
1972
+ const first = await dispatchCodexNativeHook(payload, { cwd });
1973
+ const replay = await dispatchCodexNativeHook({
1974
+ ...payload,
1975
+ stop_hook_active: true,
1976
+ }, { cwd });
1977
+ assert.equal(first.omxEventName, "stop");
1978
+ assert.deepEqual(first.outputJson, {
1979
+ decision: "block",
1980
+ reason: "OMX autopilot is still active (phase: planning); continue the task and gather fresh verification evidence before stopping.",
1981
+ stopReason: "autopilot_planning",
1982
+ systemMessage: "OMX autopilot is still active (phase: planning).",
1983
+ });
1984
+ assert.equal(replay.omxEventName, "stop");
1985
+ assert.equal(replay.outputJson, null);
1986
+ }
1987
+ finally {
1988
+ await rm(cwd, { recursive: true, force: true });
1989
+ }
1990
+ });
1991
+ it("does not block Stop from stale root Autopilot planning state when the explicit session has no scoped state", async () => {
1992
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-stale-root-autopilot-planning-"));
1993
+ try {
1994
+ const stateDir = join(cwd, ".omx", "state");
1995
+ await mkdir(join(stateDir, "sessions", "sess-current"), { recursive: true });
1996
+ await writeJson(join(stateDir, "session.json"), { session_id: "sess-current", cwd });
1997
+ await writeJson(join(stateDir, "autopilot-state.json"), {
1998
+ active: true,
1999
+ mode: "autopilot",
2000
+ current_phase: "planning",
2001
+ });
2002
+ const result = await dispatchCodexNativeHook({
2003
+ hook_event_name: "Stop",
2004
+ cwd,
2005
+ session_id: "sess-current",
2006
+ }, { cwd });
2007
+ assert.equal(result.omxEventName, "stop");
2008
+ assert.equal(result.outputJson, null);
2009
+ }
2010
+ finally {
2011
+ await rm(cwd, { recursive: true, force: true });
2012
+ }
2013
+ });
1825
2014
  it("does not block Stop when an explicit blocked_on_user run_outcome is present on a mode state", async () => {
1826
2015
  const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-autopilot-blocked-outcome-"));
1827
2016
  try {
@@ -2619,6 +2808,79 @@ esac
2619
2808
  await rm(cwd, { recursive: true, force: true });
2620
2809
  }
2621
2810
  });
2811
+ it("does not re-block Stop after a same-session deep-interview question record is already answered", async () => {
2812
+ const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-deep-interview-question-answered-"));
2813
+ try {
2814
+ const sessionId = "sess-stop-deep-interview-question-answered";
2815
+ const stateDir = join(cwd, ".omx", "state");
2816
+ const sessionDir = join(stateDir, "sessions", sessionId);
2817
+ await mkdir(join(sessionDir, "questions"), { recursive: true });
2818
+ await writeJson(join(stateDir, "session.json"), { session_id: sessionId });
2819
+ await writeJson(join(sessionDir, "skill-active-state.json"), {
2820
+ version: 1,
2821
+ active: true,
2822
+ skill: "deep-interview",
2823
+ phase: "planning",
2824
+ session_id: sessionId,
2825
+ thread_id: "thread-stop-deep-interview-question-answered",
2826
+ });
2827
+ await writeJson(join(sessionDir, "deep-interview-state.json"), {
2828
+ active: false,
2829
+ mode: "deep-interview",
2830
+ current_phase: "intent-first",
2831
+ lifecycle_outcome: "askuserQuestion",
2832
+ run_outcome: "blocked_on_user",
2833
+ completed_at: "2026-04-19T03:20:30.000Z",
2834
+ session_id: sessionId,
2835
+ thread_id: "thread-stop-deep-interview-question-answered",
2836
+ question_enforcement: {
2837
+ obligation_id: "obligation-answered",
2838
+ source: "omx-question",
2839
+ status: "pending",
2840
+ lifecycle_outcome: "askuserQuestion",
2841
+ requested_at: "2026-04-19T03:20:00.000Z",
2842
+ },
2843
+ });
2844
+ await writeJson(join(sessionDir, "questions", "question-answered.json"), {
2845
+ kind: "omx.question/v1",
2846
+ question_id: "question-answered",
2847
+ session_id: sessionId,
2848
+ created_at: "2026-04-19T03:20:05.000Z",
2849
+ updated_at: "2026-04-19T03:20:10.000Z",
2850
+ status: "answered",
2851
+ question: "What should happen next?",
2852
+ options: [{ label: "Continue", value: "continue" }],
2853
+ allow_other: false,
2854
+ other_label: "Other",
2855
+ multi_select: false,
2856
+ type: "single-answerable",
2857
+ source: "deep-interview",
2858
+ answer: {
2859
+ kind: "option",
2860
+ value: "continue",
2861
+ selected_labels: ["Continue"],
2862
+ selected_values: ["continue"],
2863
+ },
2864
+ });
2865
+ const result = await dispatchCodexNativeHook({
2866
+ hook_event_name: "Stop",
2867
+ cwd,
2868
+ session_id: sessionId,
2869
+ thread_id: "thread-stop-deep-interview-question-answered",
2870
+ }, { cwd });
2871
+ assert.equal(result.omxEventName, "stop");
2872
+ assert.equal(result.outputJson, null);
2873
+ const state = JSON.parse(await readFile(join(sessionDir, "deep-interview-state.json"), "utf-8"));
2874
+ assert.equal(state.question_enforcement?.status, "satisfied");
2875
+ assert.equal(state.question_enforcement?.question_id, "question-answered");
2876
+ assert.ok(state.question_enforcement?.satisfied_at);
2877
+ assert.equal(state.lifecycle_outcome, undefined);
2878
+ assert.equal(state.run_outcome, undefined);
2879
+ }
2880
+ finally {
2881
+ await rm(cwd, { recursive: true, force: true });
2882
+ }
2883
+ });
2622
2884
  it("keeps blocking pending deep-interview question Stop replays until the obligation changes", async () => {
2623
2885
  const cwd = await mkdtemp(join(tmpdir(), "omx-native-hook-stop-deep-interview-question-replay-"));
2624
2886
  try {