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.
Files changed (263) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/crates/omx-explore/src/main.rs +434 -28
  4. package/dist/agents/__tests__/native-config.test.js +50 -0
  5. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  6. package/dist/agents/native-config.d.ts.map +1 -1
  7. package/dist/agents/native-config.js +3 -2
  8. package/dist/agents/native-config.js.map +1 -1
  9. package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -0
  10. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  11. package/dist/cli/__tests__/explore.test.js +118 -1
  12. package/dist/cli/__tests__/explore.test.js.map +1 -1
  13. package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
  14. package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
  15. package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
  16. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
  17. package/dist/cli/__tests__/index.test.js +182 -18
  18. package/dist/cli/__tests__/index.test.js.map +1 -1
  19. package/dist/cli/__tests__/launch-fallback.test.js +88 -2
  20. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  21. package/dist/cli/__tests__/ralph.test.js +62 -0
  22. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  23. package/dist/cli/__tests__/setup-install-mode.test.js +45 -0
  24. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  25. package/dist/cli/__tests__/team.test.js +465 -12
  26. package/dist/cli/__tests__/team.test.js.map +1 -1
  27. package/dist/cli/__tests__/ultragoal.test.js +40 -0
  28. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  29. package/dist/cli/explore.d.ts.map +1 -1
  30. package/dist/cli/explore.js +208 -8
  31. package/dist/cli/explore.js.map +1 -1
  32. package/dist/cli/index.d.ts +11 -3
  33. package/dist/cli/index.d.ts.map +1 -1
  34. package/dist/cli/index.js +124 -18
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/ralph.d.ts.map +1 -1
  37. package/dist/cli/ralph.js +37 -3
  38. package/dist/cli/ralph.js.map +1 -1
  39. package/dist/cli/setup.d.ts.map +1 -1
  40. package/dist/cli/setup.js +93 -4
  41. package/dist/cli/setup.js.map +1 -1
  42. package/dist/cli/team.d.ts +1 -0
  43. package/dist/cli/team.d.ts.map +1 -1
  44. package/dist/cli/team.js +42 -7
  45. package/dist/cli/team.js.map +1 -1
  46. package/dist/cli/ultragoal.d.ts +1 -1
  47. package/dist/cli/ultragoal.d.ts.map +1 -1
  48. package/dist/cli/ultragoal.js +6 -3
  49. package/dist/cli/ultragoal.js.map +1 -1
  50. package/dist/config/__tests__/codex-hooks.test.js +5 -0
  51. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  52. package/dist/config/__tests__/models.test.js +18 -1
  53. package/dist/config/__tests__/models.test.js.map +1 -1
  54. package/dist/config/codex-hooks.d.ts.map +1 -1
  55. package/dist/config/codex-hooks.js +4 -1
  56. package/dist/config/codex-hooks.js.map +1 -1
  57. package/dist/config/models.d.ts +6 -0
  58. package/dist/config/models.d.ts.map +1 -1
  59. package/dist/config/models.js +37 -0
  60. package/dist/config/models.js.map +1 -1
  61. package/dist/exec/followup.d.ts +1 -0
  62. package/dist/exec/followup.d.ts.map +1 -1
  63. package/dist/exec/followup.js +9 -3
  64. package/dist/exec/followup.js.map +1 -1
  65. package/dist/hooks/__tests__/anti-slop-workflow.test.js +19 -0
  66. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  67. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +19 -2
  68. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  69. package/dist/hooks/__tests__/deep-interview-contract.test.js +40 -0
  70. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  71. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
  72. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
  73. package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
  74. package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
  75. package/dist/hooks/__tests__/session.test.js +32 -0
  76. package/dist/hooks/__tests__/session.test.js.map +1 -1
  77. package/dist/hooks/codebase-map.d.ts.map +1 -1
  78. package/dist/hooks/codebase-map.js +3 -2
  79. package/dist/hooks/codebase-map.js.map +1 -1
  80. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  81. package/dist/hooks/extensibility/dispatcher.js +6 -4
  82. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  83. package/dist/hooks/extensibility/logging.d.ts.map +1 -1
  84. package/dist/hooks/extensibility/logging.js +3 -2
  85. package/dist/hooks/extensibility/logging.js.map +1 -1
  86. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
  87. package/dist/hooks/extensibility/sdk/paths.js +4 -3
  88. package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
  89. package/dist/hooks/session.d.ts.map +1 -1
  90. package/dist/hooks/session.js +22 -12
  91. package/dist/hooks/session.js.map +1 -1
  92. package/dist/hud/__tests__/hud-tmux-injection.test.js +8 -7
  93. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  94. package/dist/hud/__tests__/reconcile.test.js +1 -1
  95. package/dist/hud/__tests__/state.test.js +24 -0
  96. package/dist/hud/__tests__/state.test.js.map +1 -1
  97. package/dist/hud/index.js +1 -1
  98. package/dist/hud/index.js.map +1 -1
  99. package/dist/hud/state.d.ts.map +1 -1
  100. package/dist/hud/state.js +22 -8
  101. package/dist/hud/state.js.map +1 -1
  102. package/dist/hud/tmux.js +1 -1
  103. package/dist/hud/tmux.js.map +1 -1
  104. package/dist/imagegen/continuation.d.ts +44 -0
  105. package/dist/imagegen/continuation.d.ts.map +1 -0
  106. package/dist/imagegen/continuation.js +220 -0
  107. package/dist/imagegen/continuation.js.map +1 -0
  108. package/dist/mcp/__tests__/bootstrap.test.js +47 -2
  109. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  110. package/dist/mcp/__tests__/server-lifecycle.test.js +49 -1
  111. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  112. package/dist/mcp/bootstrap.d.ts +2 -0
  113. package/dist/mcp/bootstrap.d.ts.map +1 -1
  114. package/dist/mcp/bootstrap.js +95 -15
  115. package/dist/mcp/bootstrap.js.map +1 -1
  116. package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
  117. package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
  118. package/dist/mcp/lifecycle-telemetry.js +95 -0
  119. package/dist/mcp/lifecycle-telemetry.js.map +1 -0
  120. package/dist/pipeline/__tests__/stages.test.js +274 -5
  121. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  122. package/dist/pipeline/stages/team-exec.d.ts +2 -0
  123. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  124. package/dist/pipeline/stages/team-exec.js +51 -26
  125. package/dist/pipeline/stages/team-exec.js.map +1 -1
  126. package/dist/planning/__tests__/artifacts.test.js +138 -3
  127. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  128. package/dist/planning/__tests__/context-pack-status.test.d.ts +2 -0
  129. package/dist/planning/__tests__/context-pack-status.test.d.ts.map +1 -0
  130. package/dist/planning/__tests__/context-pack-status.test.js +271 -0
  131. package/dist/planning/__tests__/context-pack-status.test.js.map +1 -0
  132. package/dist/planning/artifacts.d.ts +12 -1
  133. package/dist/planning/artifacts.d.ts.map +1 -1
  134. package/dist/planning/artifacts.js +32 -9
  135. package/dist/planning/artifacts.js.map +1 -1
  136. package/dist/planning/context-pack-status.d.ts +42 -0
  137. package/dist/planning/context-pack-status.d.ts.map +1 -0
  138. package/dist/planning/context-pack-status.js +479 -0
  139. package/dist/planning/context-pack-status.js.map +1 -0
  140. package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
  141. package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
  142. package/dist/runtime/__tests__/process-tree.test.js +107 -0
  143. package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
  144. package/dist/runtime/process-tree.d.ts +28 -0
  145. package/dist/runtime/process-tree.d.ts.map +1 -0
  146. package/dist/runtime/process-tree.js +230 -0
  147. package/dist/runtime/process-tree.js.map +1 -0
  148. package/dist/scripts/__tests__/codex-native-hook.test.js +205 -1
  149. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  150. package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
  151. package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
  152. package/dist/scripts/__tests__/notify-state-io.test.js +40 -0
  153. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
  154. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  155. package/dist/scripts/codex-native-hook.js +111 -7
  156. package/dist/scripts/codex-native-hook.js.map +1 -1
  157. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  158. package/dist/scripts/notify-hook/managed-tmux.js +6 -9
  159. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  160. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  161. package/dist/scripts/notify-hook/process-runner.js +4 -1
  162. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  163. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  164. package/dist/scripts/notify-hook/state-io.js +4 -7
  165. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  166. package/dist/scripts/notify-hook.js +25 -3
  167. package/dist/scripts/notify-hook.js.map +1 -1
  168. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  169. package/dist/scripts/verify-native-agents.js +3 -1
  170. package/dist/scripts/verify-native-agents.js.map +1 -1
  171. package/dist/sidecar/__tests__/tmux.test.js +1 -1
  172. package/dist/sidecar/__tests__/tmux.test.js.map +1 -1
  173. package/dist/sidecar/tmux.js +1 -1
  174. package/dist/sidecar/tmux.js.map +1 -1
  175. package/dist/state/__tests__/workflow-transition.test.js +45 -1
  176. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  177. package/dist/state/workflow-transition-reconcile.js +2 -2
  178. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  179. package/dist/state/workflow-transition.js +2 -2
  180. package/dist/state/workflow-transition.js.map +1 -1
  181. package/dist/team/__tests__/approved-execution.test.js +96 -0
  182. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  183. package/dist/team/__tests__/followup-planner.test.js +16 -0
  184. package/dist/team/__tests__/followup-planner.test.js.map +1 -1
  185. package/dist/team/__tests__/model-contract.test.js +16 -0
  186. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  187. package/dist/team/__tests__/repo-aware-decomposition.test.js +20 -0
  188. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
  189. package/dist/team/__tests__/runtime-cli.test.js +16 -0
  190. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  191. package/dist/team/__tests__/runtime.test.js +209 -11
  192. package/dist/team/__tests__/runtime.test.js.map +1 -1
  193. package/dist/team/__tests__/scaling.test.js +110 -0
  194. package/dist/team/__tests__/scaling.test.js.map +1 -1
  195. package/dist/team/__tests__/tmux-session.test.js +9 -0
  196. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  197. package/dist/team/__tests__/worker-runtime-identity.test.js +6 -0
  198. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  199. package/dist/team/approved-execution.d.ts +13 -0
  200. package/dist/team/approved-execution.d.ts.map +1 -1
  201. package/dist/team/approved-execution.js +40 -22
  202. package/dist/team/approved-execution.js.map +1 -1
  203. package/dist/team/followup-planner.d.ts +1 -0
  204. package/dist/team/followup-planner.d.ts.map +1 -1
  205. package/dist/team/followup-planner.js +9 -9
  206. package/dist/team/followup-planner.js.map +1 -1
  207. package/dist/team/model-contract.d.ts +1 -1
  208. package/dist/team/model-contract.d.ts.map +1 -1
  209. package/dist/team/model-contract.js +4 -3
  210. package/dist/team/model-contract.js.map +1 -1
  211. package/dist/team/repo-aware-decomposition.d.ts +1 -0
  212. package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
  213. package/dist/team/repo-aware-decomposition.js +5 -1
  214. package/dist/team/repo-aware-decomposition.js.map +1 -1
  215. package/dist/team/runtime-cli.d.ts +4 -0
  216. package/dist/team/runtime-cli.d.ts.map +1 -1
  217. package/dist/team/runtime-cli.js +14 -1
  218. package/dist/team/runtime-cli.js.map +1 -1
  219. package/dist/team/runtime.d.ts +1 -0
  220. package/dist/team/runtime.d.ts.map +1 -1
  221. package/dist/team/runtime.js +46 -16
  222. package/dist/team/runtime.js.map +1 -1
  223. package/dist/team/scaling.d.ts.map +1 -1
  224. package/dist/team/scaling.js +13 -6
  225. package/dist/team/scaling.js.map +1 -1
  226. package/dist/team/tmux-session.d.ts.map +1 -1
  227. package/dist/team/tmux-session.js +7 -0
  228. package/dist/team/tmux-session.js.map +1 -1
  229. package/dist/ultragoal/__tests__/artifacts.test.js +51 -0
  230. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  231. package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
  232. package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
  233. package/dist/ultragoal/__tests__/docs-contract.test.js +23 -0
  234. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
  235. package/dist/ultragoal/artifacts.d.ts +2 -2
  236. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  237. package/dist/ultragoal/artifacts.js +37 -1
  238. package/dist/ultragoal/artifacts.js.map +1 -1
  239. package/dist/verification/__tests__/ci-rust-gates.test.js +44 -14
  240. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  241. package/package.json +1 -1
  242. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  243. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +9 -0
  244. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +25 -2
  245. package/plugins/oh-my-codex/skills/plan/SKILL.md +7 -4
  246. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +13 -3
  247. package/plugins/oh-my-codex/skills/team/SKILL.md +2 -2
  248. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +8 -0
  249. package/prompts/planner.md +1 -1
  250. package/skills/ai-slop-cleaner/SKILL.md +9 -0
  251. package/skills/deep-interview/SKILL.md +25 -2
  252. package/skills/plan/SKILL.md +7 -4
  253. package/skills/ralplan/SKILL.md +13 -3
  254. package/skills/team/SKILL.md +2 -2
  255. package/skills/visual-ralph/SKILL.md +8 -0
  256. package/src/scripts/__tests__/codex-native-hook.test.ts +231 -1
  257. package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
  258. package/src/scripts/codex-native-hook.ts +129 -14
  259. package/src/scripts/notify-hook/managed-tmux.ts +6 -7
  260. package/src/scripts/notify-hook/process-runner.ts +4 -1
  261. package/src/scripts/notify-hook/state-io.ts +5 -7
  262. package/src/scripts/notify-hook.ts +26 -3
  263. package/src/scripts/verify-native-agents.ts +3 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notify-state-io.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9E,MAAM,SAAS,CACb,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAChE,OAAO,CACR,CAAC;YAEF,MAAM,CAAC,KAAK,CACV,MAAM,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,EACtD,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,CAAC,CAC5C,CAAC;YACF,MAAM,CAAC,KAAK,CACV,MAAM,kBAAkB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,CAAC,EACrE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAC9D,CAAC;YAEF,MAAM,eAAe,CAAC,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAC3D,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,MAAM,SAAS,CACb,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAC9B,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAChE,OAAO,CACR,CAAC;YACF,MAAM,SAAS,CACb,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,uBAAuB,CAAC,EACnE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EACrC,OAAO,CACR,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,sBAAsB,CACxC,QAAQ,EACR,uBAAuB,EACvB,eAAe,EACf,IAAI,CACL,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-native-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-native-hook.ts"],"names":[],"mappings":"AAmCA,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;AAmTD,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;AAw8DD,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;AA+CD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqC3D"}
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
- if (readHookEventName(payload) !== "Stop") {
2313
- throw error;
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