oh-my-codex 0.14.2 → 0.14.3

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 (116) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/dist/cli/__tests__/cleanup.test.js +27 -0
  4. package/dist/cli/__tests__/cleanup.test.js.map +1 -1
  5. package/dist/cli/__tests__/explore.test.js +58 -1
  6. package/dist/cli/__tests__/explore.test.js.map +1 -1
  7. package/dist/cli/__tests__/index.test.js +63 -0
  8. package/dist/cli/__tests__/index.test.js.map +1 -1
  9. package/dist/cli/__tests__/question.test.js +146 -1
  10. package/dist/cli/__tests__/question.test.js.map +1 -1
  11. package/dist/cli/cleanup.d.ts.map +1 -1
  12. package/dist/cli/cleanup.js +18 -2
  13. package/dist/cli/cleanup.js.map +1 -1
  14. package/dist/cli/codex-home.d.ts +8 -0
  15. package/dist/cli/codex-home.d.ts.map +1 -0
  16. package/dist/cli/codex-home.js +54 -0
  17. package/dist/cli/codex-home.js.map +1 -0
  18. package/dist/cli/explore.d.ts +1 -0
  19. package/dist/cli/explore.d.ts.map +1 -1
  20. package/dist/cli/explore.js +15 -6
  21. package/dist/cli/explore.js.map +1 -1
  22. package/dist/cli/index.d.ts +1 -6
  23. package/dist/cli/index.d.ts.map +1 -1
  24. package/dist/cli/index.js +2 -49
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/config/__tests__/generator-idempotent.test.js +44 -0
  27. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  28. package/dist/config/generator.d.ts.map +1 -1
  29. package/dist/config/generator.js +59 -21
  30. package/dist/config/generator.js.map +1 -1
  31. package/dist/hooks/__tests__/clawhip-event-contract.test.js +7 -0
  32. package/dist/hooks/__tests__/clawhip-event-contract.test.js.map +1 -1
  33. package/dist/hooks/__tests__/deep-interview-contract.test.js +17 -0
  34. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  35. package/dist/hooks/__tests__/keyword-detector.test.js +87 -0
  36. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  37. package/dist/hooks/__tests__/skill-guidance-contract.test.js +8 -1
  38. package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
  39. package/dist/hooks/extensibility/__tests__/events.test.js +6 -0
  40. package/dist/hooks/extensibility/__tests__/events.test.js.map +1 -1
  41. package/dist/hooks/extensibility/types.d.ts +1 -1
  42. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  43. package/dist/hooks/keyword-detector.d.ts +3 -0
  44. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  45. package/dist/hooks/keyword-detector.js +11 -4
  46. package/dist/hooks/keyword-detector.js.map +1 -1
  47. package/dist/hooks/prompt-guidance-contract.d.ts.map +1 -1
  48. package/dist/hooks/prompt-guidance-contract.js +31 -15
  49. package/dist/hooks/prompt-guidance-contract.js.map +1 -1
  50. package/dist/hud/__tests__/reconcile.test.js +22 -0
  51. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  52. package/dist/hud/reconcile.d.ts +2 -1
  53. package/dist/hud/reconcile.d.ts.map +1 -1
  54. package/dist/hud/reconcile.js +3 -2
  55. package/dist/hud/reconcile.js.map +1 -1
  56. package/dist/hud/tmux.d.ts +3 -2
  57. package/dist/hud/tmux.d.ts.map +1 -1
  58. package/dist/hud/tmux.js +11 -4
  59. package/dist/hud/tmux.js.map +1 -1
  60. package/dist/question/__tests__/deep-interview.test.js +58 -1
  61. package/dist/question/__tests__/deep-interview.test.js.map +1 -1
  62. package/dist/question/__tests__/renderer.test.js +282 -24
  63. package/dist/question/__tests__/renderer.test.js.map +1 -1
  64. package/dist/question/__tests__/state.test.js +27 -0
  65. package/dist/question/__tests__/state.test.js.map +1 -1
  66. package/dist/question/__tests__/ui.test.js +129 -0
  67. package/dist/question/__tests__/ui.test.js.map +1 -1
  68. package/dist/question/deep-interview.d.ts +1 -0
  69. package/dist/question/deep-interview.d.ts.map +1 -1
  70. package/dist/question/deep-interview.js +80 -2
  71. package/dist/question/deep-interview.js.map +1 -1
  72. package/dist/question/renderer.d.ts +4 -1
  73. package/dist/question/renderer.d.ts.map +1 -1
  74. package/dist/question/renderer.js +101 -4
  75. package/dist/question/renderer.js.map +1 -1
  76. package/dist/question/state.js +1 -1
  77. package/dist/question/state.js.map +1 -1
  78. package/dist/question/ui.d.ts +3 -1
  79. package/dist/question/ui.d.ts.map +1 -1
  80. package/dist/question/ui.js +14 -6
  81. package/dist/question/ui.js.map +1 -1
  82. package/dist/scripts/__tests__/codex-native-hook.test.js +265 -3
  83. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  84. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  85. package/dist/scripts/codex-native-hook.js +47 -9
  86. package/dist/scripts/codex-native-hook.js.map +1 -1
  87. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  88. package/dist/scripts/codex-native-pre-post.js +47 -0
  89. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  90. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts +2 -0
  91. package/dist/scripts/notify-hook/__tests__/operational-events.test.d.ts.map +1 -0
  92. package/dist/scripts/notify-hook/__tests__/operational-events.test.js +24 -0
  93. package/dist/scripts/notify-hook/__tests__/operational-events.test.js.map +1 -0
  94. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  95. package/dist/scripts/notify-hook/team-dispatch.js +9 -0
  96. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  97. package/dist/team/__tests__/events.test.js +25 -0
  98. package/dist/team/__tests__/events.test.js.map +1 -1
  99. package/dist/team/__tests__/runtime.test.js +8 -1
  100. package/dist/team/__tests__/runtime.test.js.map +1 -1
  101. package/dist/team/__tests__/tmux-session.test.js +293 -2
  102. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  103. package/dist/team/runtime.d.ts.map +1 -1
  104. package/dist/team/runtime.js +30 -0
  105. package/dist/team/runtime.js.map +1 -1
  106. package/dist/team/tmux-session.d.ts.map +1 -1
  107. package/dist/team/tmux-session.js +60 -3
  108. package/dist/team/tmux-session.js.map +1 -1
  109. package/package.json +2 -2
  110. package/skills/deep-interview/SKILL.md +13 -2
  111. package/skills/ultrawork/SKILL.md +91 -59
  112. package/src/scripts/__tests__/codex-native-hook.test.ts +318 -3
  113. package/src/scripts/codex-native-hook.ts +49 -6
  114. package/src/scripts/codex-native-pre-post.ts +45 -0
  115. package/src/scripts/notify-hook/__tests__/operational-events.test.ts +24 -0
  116. package/src/scripts/notify-hook/team-dispatch.ts +9 -0
@@ -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":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAuCvD,SAAS,eAAe,CAAC,MAAsB;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACtF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,GAAW,EAAE,WAAmB,EAAE,WAAoB;IAC5E,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,KAAK;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;SAC/C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,MAAsB,EAAE,UAAoB,EAAE,SAAkB;IACnF,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1C,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC;IACnC,MAAM,eAAe,GAAG,UAAU;SAC/B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,WAAW,CAAC;SACvC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,IAAI,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAE5E,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9F,MAAM,MAAM,GAAG,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QACvG,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,MAAM;YACb,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,MAAM;YACvB,GAAG,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,SAAS;YAChB,eAAe,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;YACrC,eAAe,EAAE,CAAC,SAAS,CAAC;YAC5B,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACtD,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,eAAe,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QACjC,eAAe,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAsB,EAAE,MAAsB;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpD,IAAI,CAAC,MAAM,IAAI,SAAS,KAAK,gBAAgB;QAAE,OAAO;IACtD,IAAI,CAAC;QACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;IAC/E,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAsB,EAAE,MAAwB;IAClF,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,eAAyB,EAAE,KAAa;IAC/D,OAAO,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC;QACpD,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,sCAAsC;IACpD,OAAO;QACL,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAAsB,EACtB,KAAgC,EAChC,GAAY;IAEZ,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACnD,IAAI,WAAW,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IAE3G,MAAM,UAAU,GAAG,CAAC,KAAa,EAAmB,EAAE,CAAC,CAAC;QACtD,MAAM,EAAE,KAAK;QACb,KAAK,EAAE;YACL,GAAG,KAAK;YACR,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,GAAG,WAAW,CAAC,GAAG,WAAW;YACpE,KAAK,EAAE,SAAS;SACjB;KACF,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;QAC5D,IAAI,aAAa,GAAG,WAAW,EAAE,CAAC;YAChC,OAAO;gBACL,MAAM,EAAE,CAAC,yBAAyB,CAAC,MAAM,CAAC;gBAC1C,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,WAAW,EAAE,aAAa;oBAC1B,eAAe,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe;oBAClI,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,eAAe,EAAE,eAAe,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC;gBAC1E,KAAK,EAAE,SAAS;aACjB;SACF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAClD,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,KAAK,EAAE;oBACL,GAAG,KAAK;oBACR,KAAK,EAAE,SAAS;iBACjB;aACF,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,KAAK;YACb,KAAK,EAAE;gBACL,GAAG,KAAK;gBACR,KAAK,EAAE,8DAA8D;aACtE;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,MAAsB,EACtB,KAAgC;IAEhC,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEhC,YAAY,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC;QAC7C,MAAM,SAAS,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACvG,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,yBAAyB,CAAC,MAAM,CAAC;QAC/B,CAAC,CAAC,oDAAoD;QACtD,CAAC,CAAC,mCAAmC,CACxC,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,MAAsB,EACtB,OAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAC5C,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,IAAI,OAAO,CAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/C,IAAI,KAAK,GAAG,sCAAsC,EAAE,CAAC;QACrD,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAClC,KAAK,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,UAAoB,EAAE,EAAE;YACtC,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;YAC5B,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,GAAY,EAAE,EAAE;YAC7C,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,4BAA4B,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAChE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACrB,MAAM,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO;YAE3B,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxD,OAAO;YACT,CAAC;YACD,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,kBAAkB,CAAC,KAA8B,CAAC,CAAC;QACnD,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,MAAsB,EACtB,OAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAC5C,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAA8B,EAAE,MAAM,EAAE,MAA+B,EAAE,CAAC,CAAC;IACrH,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC;YAC9C,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,8BAA8B,CAAC;QAEnC,IAAI,UAAU,GAAoB,IAAI,CAAC;QACvC,OAAO,CAAC,UAAU,EAAE,CAAC;YACnB,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;YACvG,IAAI,CAAC,UAAU;gBAAE,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAa,EACb,OAAuB,EAAE;IAEzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAC5C,MAAM,EAAE,GAAG,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAA8B,EAAE,MAAM,EAAE,MAA+B,EAAE,CAAC,CAAC;IACrH,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,SAAS;gBAAE,OAAO,SAAS,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,OAAuB,EAAE;IAC/E,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC;YAC1D,CAAC,CAAC,MAAM,6BAA6B,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAChE,CAAC,CAAC,MAAM,8BAA8B,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEpE,IAAI,SAA6B,CAAC;QAClC,IAAI,MAAM,CAAC,WAAW,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACzE,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1D,MAAM,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/C,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,yBAAyB,CAC7B,UAAU,EACV,OAAO,EACP,oBAAoB,EACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
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 {