oh-my-codex 0.16.0 → 0.16.2

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 (357) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +2 -2
  4. package/crates/omx-explore/src/main.rs +434 -28
  5. package/dist/agents/__tests__/native-config.test.js +50 -0
  6. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  7. package/dist/agents/native-config.d.ts.map +1 -1
  8. package/dist/agents/native-config.js +3 -2
  9. package/dist/agents/native-config.js.map +1 -1
  10. package/dist/cli/__tests__/codex-plugin-layout.test.js +1 -0
  11. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  12. package/dist/cli/__tests__/doctor-warning-copy.test.js +1 -1
  13. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  14. package/dist/cli/__tests__/explore.test.js +120 -3
  15. package/dist/cli/__tests__/explore.test.js.map +1 -1
  16. package/dist/cli/__tests__/imagegen-continuation.test.d.ts +2 -0
  17. package/dist/cli/__tests__/imagegen-continuation.test.d.ts.map +1 -0
  18. package/dist/cli/__tests__/imagegen-continuation.test.js +135 -0
  19. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -0
  20. package/dist/cli/__tests__/index.test.js +182 -18
  21. package/dist/cli/__tests__/index.test.js.map +1 -1
  22. package/dist/cli/__tests__/launch-fallback.test.js +88 -2
  23. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  24. package/dist/cli/__tests__/ralph.test.js +62 -0
  25. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  26. package/dist/cli/__tests__/setup-install-mode.test.js +48 -0
  27. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  28. package/dist/cli/__tests__/setup-scope.test.js +12 -0
  29. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  30. package/dist/cli/__tests__/team.test.js +465 -12
  31. package/dist/cli/__tests__/team.test.js.map +1 -1
  32. package/dist/cli/__tests__/ultragoal.test.js +50 -5
  33. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  34. package/dist/cli/__tests__/uninstall.test.js +6 -2
  35. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  36. package/dist/cli/explore.d.ts.map +1 -1
  37. package/dist/cli/explore.js +211 -12
  38. package/dist/cli/explore.js.map +1 -1
  39. package/dist/cli/index.d.ts +11 -3
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +124 -18
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/ralph.d.ts.map +1 -1
  44. package/dist/cli/ralph.js +37 -3
  45. package/dist/cli/ralph.js.map +1 -1
  46. package/dist/cli/setup.d.ts.map +1 -1
  47. package/dist/cli/setup.js +100 -9
  48. package/dist/cli/setup.js.map +1 -1
  49. package/dist/cli/team.d.ts +1 -0
  50. package/dist/cli/team.d.ts.map +1 -1
  51. package/dist/cli/team.js +42 -7
  52. package/dist/cli/team.js.map +1 -1
  53. package/dist/cli/ultragoal.d.ts +1 -1
  54. package/dist/cli/ultragoal.d.ts.map +1 -1
  55. package/dist/cli/ultragoal.js +29 -8
  56. package/dist/cli/ultragoal.js.map +1 -1
  57. package/dist/cli/uninstall.d.ts.map +1 -1
  58. package/dist/cli/uninstall.js +2 -1
  59. package/dist/cli/uninstall.js.map +1 -1
  60. package/dist/config/__tests__/codex-hooks.test.js +97 -2
  61. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  62. package/dist/config/__tests__/generator-idempotent.test.js +1 -1
  63. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  64. package/dist/config/__tests__/generator-notify.test.js +22 -0
  65. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  66. package/dist/config/__tests__/models.test.js +18 -1
  67. package/dist/config/__tests__/models.test.js.map +1 -1
  68. package/dist/config/__tests__/wiki-config-contract.test.js +2 -1
  69. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -1
  70. package/dist/config/codex-hooks.d.ts +17 -3
  71. package/dist/config/codex-hooks.d.ts.map +1 -1
  72. package/dist/config/codex-hooks.js +102 -2
  73. package/dist/config/codex-hooks.js.map +1 -1
  74. package/dist/config/generator.d.ts +4 -1
  75. package/dist/config/generator.d.ts.map +1 -1
  76. package/dist/config/generator.js +69 -12
  77. package/dist/config/generator.js.map +1 -1
  78. package/dist/config/models.d.ts +6 -0
  79. package/dist/config/models.d.ts.map +1 -1
  80. package/dist/config/models.js +37 -0
  81. package/dist/config/models.js.map +1 -1
  82. package/dist/exec/followup.d.ts +1 -0
  83. package/dist/exec/followup.d.ts.map +1 -1
  84. package/dist/exec/followup.js +9 -3
  85. package/dist/exec/followup.js.map +1 -1
  86. package/dist/hooks/__tests__/anti-slop-workflow.test.js +19 -0
  87. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  88. package/dist/hooks/__tests__/consensus-execution-handoff.test.js +19 -2
  89. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  90. package/dist/hooks/__tests__/deep-interview-contract.test.js +40 -0
  91. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  92. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts +2 -0
  93. package/dist/hooks/__tests__/foreground-isolation-contract.test.d.ts.map +1 -0
  94. package/dist/hooks/__tests__/foreground-isolation-contract.test.js +28 -0
  95. package/dist/hooks/__tests__/foreground-isolation-contract.test.js.map +1 -0
  96. package/dist/hooks/__tests__/keyword-detector.test.js +37 -25
  97. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  98. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +10 -4
  99. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  100. package/dist/hooks/__tests__/session.test.js +32 -0
  101. package/dist/hooks/__tests__/session.test.js.map +1 -1
  102. package/dist/hooks/__tests__/wiki-docs-contract.test.js +6 -4
  103. package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -1
  104. package/dist/hooks/codebase-map.d.ts.map +1 -1
  105. package/dist/hooks/codebase-map.js +3 -2
  106. package/dist/hooks/codebase-map.js.map +1 -1
  107. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  108. package/dist/hooks/extensibility/dispatcher.js +6 -4
  109. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  110. package/dist/hooks/extensibility/logging.d.ts.map +1 -1
  111. package/dist/hooks/extensibility/logging.js +3 -2
  112. package/dist/hooks/extensibility/logging.js.map +1 -1
  113. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
  114. package/dist/hooks/extensibility/sdk/paths.js +4 -3
  115. package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
  116. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  117. package/dist/hooks/keyword-detector.js +2 -4
  118. package/dist/hooks/keyword-detector.js.map +1 -1
  119. package/dist/hooks/session.d.ts.map +1 -1
  120. package/dist/hooks/session.js +22 -12
  121. package/dist/hooks/session.js.map +1 -1
  122. package/dist/hud/__tests__/hud-tmux-injection.test.js +8 -7
  123. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  124. package/dist/hud/__tests__/reconcile.test.js +1 -1
  125. package/dist/hud/__tests__/state.test.js +24 -0
  126. package/dist/hud/__tests__/state.test.js.map +1 -1
  127. package/dist/hud/index.js +1 -1
  128. package/dist/hud/index.js.map +1 -1
  129. package/dist/hud/state.d.ts.map +1 -1
  130. package/dist/hud/state.js +22 -8
  131. package/dist/hud/state.js.map +1 -1
  132. package/dist/hud/tmux.js +1 -1
  133. package/dist/hud/tmux.js.map +1 -1
  134. package/dist/imagegen/continuation.d.ts +44 -0
  135. package/dist/imagegen/continuation.d.ts.map +1 -0
  136. package/dist/imagegen/continuation.js +220 -0
  137. package/dist/imagegen/continuation.js.map +1 -0
  138. package/dist/mcp/__tests__/bootstrap.test.js +47 -2
  139. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  140. package/dist/mcp/__tests__/server-lifecycle.test.js +49 -1
  141. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  142. package/dist/mcp/__tests__/state-server.test.js +145 -6
  143. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  144. package/dist/mcp/__tests__/wiki-server.test.js +97 -1
  145. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
  146. package/dist/mcp/bootstrap.d.ts +2 -0
  147. package/dist/mcp/bootstrap.d.ts.map +1 -1
  148. package/dist/mcp/bootstrap.js +95 -15
  149. package/dist/mcp/bootstrap.js.map +1 -1
  150. package/dist/mcp/lifecycle-telemetry.d.ts +16 -0
  151. package/dist/mcp/lifecycle-telemetry.d.ts.map +1 -0
  152. package/dist/mcp/lifecycle-telemetry.js +95 -0
  153. package/dist/mcp/lifecycle-telemetry.js.map +1 -0
  154. package/dist/mcp/wiki-server.d.ts.map +1 -1
  155. package/dist/mcp/wiki-server.js +11 -2
  156. package/dist/mcp/wiki-server.js.map +1 -1
  157. package/dist/pipeline/__tests__/stages.test.js +274 -5
  158. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  159. package/dist/pipeline/stages/team-exec.d.ts +2 -0
  160. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  161. package/dist/pipeline/stages/team-exec.js +51 -26
  162. package/dist/pipeline/stages/team-exec.js.map +1 -1
  163. package/dist/planning/__tests__/artifacts.test.js +138 -3
  164. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  165. package/dist/planning/__tests__/context-pack-status.test.d.ts +2 -0
  166. package/dist/planning/__tests__/context-pack-status.test.d.ts.map +1 -0
  167. package/dist/planning/__tests__/context-pack-status.test.js +271 -0
  168. package/dist/planning/__tests__/context-pack-status.test.js.map +1 -0
  169. package/dist/planning/artifacts.d.ts +12 -1
  170. package/dist/planning/artifacts.d.ts.map +1 -1
  171. package/dist/planning/artifacts.js +32 -9
  172. package/dist/planning/artifacts.js.map +1 -1
  173. package/dist/planning/context-pack-status.d.ts +42 -0
  174. package/dist/planning/context-pack-status.d.ts.map +1 -0
  175. package/dist/planning/context-pack-status.js +479 -0
  176. package/dist/planning/context-pack-status.js.map +1 -0
  177. package/dist/runtime/__tests__/process-tree.test.d.ts +2 -0
  178. package/dist/runtime/__tests__/process-tree.test.d.ts.map +1 -0
  179. package/dist/runtime/__tests__/process-tree.test.js +107 -0
  180. package/dist/runtime/__tests__/process-tree.test.js.map +1 -0
  181. package/dist/runtime/process-tree.d.ts +28 -0
  182. package/dist/runtime/process-tree.d.ts.map +1 -0
  183. package/dist/runtime/process-tree.js +230 -0
  184. package/dist/runtime/process-tree.js.map +1 -0
  185. package/dist/scripts/__tests__/codex-native-hook.test.js +267 -2
  186. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  187. package/dist/scripts/__tests__/notify-state-io.test.d.ts +2 -0
  188. package/dist/scripts/__tests__/notify-state-io.test.d.ts.map +1 -0
  189. package/dist/scripts/__tests__/notify-state-io.test.js +40 -0
  190. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -0
  191. package/dist/scripts/codex-execution-surface.d.ts +1 -1
  192. package/dist/scripts/codex-execution-surface.d.ts.map +1 -1
  193. package/dist/scripts/codex-execution-surface.js.map +1 -1
  194. package/dist/scripts/codex-native-hook.d.ts +1 -1
  195. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  196. package/dist/scripts/codex-native-hook.js +141 -9
  197. package/dist/scripts/codex-native-hook.js.map +1 -1
  198. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  199. package/dist/scripts/notify-hook/managed-tmux.js +6 -9
  200. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  201. package/dist/scripts/notify-hook/process-runner.d.ts.map +1 -1
  202. package/dist/scripts/notify-hook/process-runner.js +4 -1
  203. package/dist/scripts/notify-hook/process-runner.js.map +1 -1
  204. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  205. package/dist/scripts/notify-hook/state-io.js +4 -7
  206. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  207. package/dist/scripts/notify-hook.js +25 -3
  208. package/dist/scripts/notify-hook.js.map +1 -1
  209. package/dist/scripts/verify-native-agents.d.ts.map +1 -1
  210. package/dist/scripts/verify-native-agents.js +3 -1
  211. package/dist/scripts/verify-native-agents.js.map +1 -1
  212. package/dist/sidecar/__tests__/tmux.test.js +1 -1
  213. package/dist/sidecar/__tests__/tmux.test.js.map +1 -1
  214. package/dist/sidecar/tmux.js +1 -1
  215. package/dist/sidecar/tmux.js.map +1 -1
  216. package/dist/state/__tests__/operations.test.js +79 -0
  217. package/dist/state/__tests__/operations.test.js.map +1 -1
  218. package/dist/state/__tests__/skill-active.test.js +10 -18
  219. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  220. package/dist/state/__tests__/workflow-transition.test.js +45 -1
  221. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  222. package/dist/state/operations.d.ts.map +1 -1
  223. package/dist/state/operations.js +1 -20
  224. package/dist/state/operations.js.map +1 -1
  225. package/dist/state/skill-active.d.ts +1 -0
  226. package/dist/state/skill-active.d.ts.map +1 -1
  227. package/dist/state/skill-active.js +28 -18
  228. package/dist/state/skill-active.js.map +1 -1
  229. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  230. package/dist/state/workflow-transition-reconcile.js +3 -2
  231. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  232. package/dist/state/workflow-transition.js +2 -2
  233. package/dist/state/workflow-transition.js.map +1 -1
  234. package/dist/team/__tests__/approved-execution.test.js +96 -0
  235. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  236. package/dist/team/__tests__/followup-planner.test.js +16 -0
  237. package/dist/team/__tests__/followup-planner.test.js.map +1 -1
  238. package/dist/team/__tests__/model-contract.test.js +16 -0
  239. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  240. package/dist/team/__tests__/repo-aware-decomposition.test.js +20 -0
  241. package/dist/team/__tests__/repo-aware-decomposition.test.js.map +1 -1
  242. package/dist/team/__tests__/runtime-cli.test.js +16 -0
  243. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  244. package/dist/team/__tests__/runtime.test.js +209 -11
  245. package/dist/team/__tests__/runtime.test.js.map +1 -1
  246. package/dist/team/__tests__/scaling.test.js +110 -0
  247. package/dist/team/__tests__/scaling.test.js.map +1 -1
  248. package/dist/team/__tests__/tmux-session.test.js +9 -0
  249. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  250. package/dist/team/__tests__/worker-runtime-identity.test.js +6 -0
  251. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  252. package/dist/team/approved-execution.d.ts +13 -0
  253. package/dist/team/approved-execution.d.ts.map +1 -1
  254. package/dist/team/approved-execution.js +40 -22
  255. package/dist/team/approved-execution.js.map +1 -1
  256. package/dist/team/followup-planner.d.ts +1 -0
  257. package/dist/team/followup-planner.d.ts.map +1 -1
  258. package/dist/team/followup-planner.js +9 -9
  259. package/dist/team/followup-planner.js.map +1 -1
  260. package/dist/team/model-contract.d.ts +1 -1
  261. package/dist/team/model-contract.d.ts.map +1 -1
  262. package/dist/team/model-contract.js +4 -3
  263. package/dist/team/model-contract.js.map +1 -1
  264. package/dist/team/repo-aware-decomposition.d.ts +1 -0
  265. package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
  266. package/dist/team/repo-aware-decomposition.js +5 -1
  267. package/dist/team/repo-aware-decomposition.js.map +1 -1
  268. package/dist/team/runtime-cli.d.ts +4 -0
  269. package/dist/team/runtime-cli.d.ts.map +1 -1
  270. package/dist/team/runtime-cli.js +14 -1
  271. package/dist/team/runtime-cli.js.map +1 -1
  272. package/dist/team/runtime.d.ts +1 -0
  273. package/dist/team/runtime.d.ts.map +1 -1
  274. package/dist/team/runtime.js +46 -16
  275. package/dist/team/runtime.js.map +1 -1
  276. package/dist/team/scaling.d.ts.map +1 -1
  277. package/dist/team/scaling.js +13 -6
  278. package/dist/team/scaling.js.map +1 -1
  279. package/dist/team/tmux-session.d.ts.map +1 -1
  280. package/dist/team/tmux-session.js +7 -0
  281. package/dist/team/tmux-session.js.map +1 -1
  282. package/dist/ultragoal/__tests__/artifacts.test.js +129 -4
  283. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  284. package/dist/ultragoal/__tests__/docs-contract.test.d.ts +2 -0
  285. package/dist/ultragoal/__tests__/docs-contract.test.d.ts.map +1 -0
  286. package/dist/ultragoal/__tests__/docs-contract.test.js +31 -0
  287. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -0
  288. package/dist/ultragoal/artifacts.d.ts +6 -2
  289. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  290. package/dist/ultragoal/artifacts.js +108 -4
  291. package/dist/ultragoal/artifacts.js.map +1 -1
  292. package/dist/utils/paths.d.ts +3 -1
  293. package/dist/utils/paths.d.ts.map +1 -1
  294. package/dist/utils/paths.js +6 -2
  295. package/dist/utils/paths.js.map +1 -1
  296. package/dist/verification/__tests__/ci-rust-gates.test.js +44 -14
  297. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  298. package/dist/wiki/__tests__/ingest.test.js +35 -1
  299. package/dist/wiki/__tests__/ingest.test.js.map +1 -1
  300. package/dist/wiki/__tests__/lint.test.js +14 -1
  301. package/dist/wiki/__tests__/lint.test.js.map +1 -1
  302. package/dist/wiki/__tests__/query.test.js +28 -3
  303. package/dist/wiki/__tests__/query.test.js.map +1 -1
  304. package/dist/wiki/__tests__/session-hooks.test.js +30 -2
  305. package/dist/wiki/__tests__/session-hooks.test.js.map +1 -1
  306. package/dist/wiki/__tests__/storage.test.js +62 -22
  307. package/dist/wiki/__tests__/storage.test.js.map +1 -1
  308. package/dist/wiki/index.d.ts +2 -2
  309. package/dist/wiki/index.d.ts.map +1 -1
  310. package/dist/wiki/index.js +2 -2
  311. package/dist/wiki/index.js.map +1 -1
  312. package/dist/wiki/ingest.js +2 -2
  313. package/dist/wiki/ingest.js.map +1 -1
  314. package/dist/wiki/lifecycle.d.ts +5 -0
  315. package/dist/wiki/lifecycle.d.ts.map +1 -1
  316. package/dist/wiki/lifecycle.js +31 -4
  317. package/dist/wiki/lifecycle.js.map +1 -1
  318. package/dist/wiki/lint.d.ts.map +1 -1
  319. package/dist/wiki/lint.js +12 -8
  320. package/dist/wiki/lint.js.map +1 -1
  321. package/dist/wiki/query.d.ts.map +1 -1
  322. package/dist/wiki/query.js +3 -2
  323. package/dist/wiki/query.js.map +1 -1
  324. package/dist/wiki/storage.d.ts +4 -0
  325. package/dist/wiki/storage.d.ts.map +1 -1
  326. package/dist/wiki/storage.js +54 -18
  327. package/dist/wiki/storage.js.map +1 -1
  328. package/package.json +1 -1
  329. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  330. package/plugins/oh-my-codex/skills/ai-slop-cleaner/SKILL.md +9 -0
  331. package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +25 -2
  332. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +1 -1
  333. package/plugins/oh-my-codex/skills/plan/SKILL.md +7 -4
  334. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +13 -3
  335. package/plugins/oh-my-codex/skills/team/SKILL.md +2 -2
  336. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -7
  337. package/plugins/oh-my-codex/skills/visual-ralph/SKILL.md +8 -0
  338. package/plugins/oh-my-codex/skills/wiki/SKILL.md +5 -5
  339. package/prompts/planner.md +1 -1
  340. package/skills/ai-slop-cleaner/SKILL.md +9 -0
  341. package/skills/deep-interview/SKILL.md +25 -2
  342. package/skills/omx-setup/SKILL.md +1 -1
  343. package/skills/plan/SKILL.md +7 -4
  344. package/skills/ralplan/SKILL.md +13 -3
  345. package/skills/team/SKILL.md +2 -2
  346. package/skills/ultragoal/SKILL.md +11 -7
  347. package/skills/visual-ralph/SKILL.md +8 -0
  348. package/skills/wiki/SKILL.md +5 -5
  349. package/src/scripts/__tests__/codex-native-hook.test.ts +302 -2
  350. package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
  351. package/src/scripts/codex-execution-surface.ts +2 -0
  352. package/src/scripts/codex-native-hook.ts +163 -16
  353. package/src/scripts/notify-hook/managed-tmux.ts +6 -7
  354. package/src/scripts/notify-hook/process-runner.ts +4 -1
  355. package/src/scripts/notify-hook/state-io.ts +5 -7
  356. package/src/scripts/notify-hook.ts +26 -3
  357. 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,4 +1,4 @@
1
- type CodexHookEventName = "SessionStart" | "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop";
1
+ type CodexHookEventName = "SessionStart" | "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "PreCompact" | "PostCompact" | "Stop";
2
2
  type CodexHookPayload = Record<string, unknown>;
3
3
  export type CodexLauncherKind = "native" | "cli";
4
4
  export type CodexTransportKind = "attached-tmux" | "outside-tmux";
@@ -1 +1 @@
1
- {"version":3,"file":"codex-execution-surface.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-execution-surface.ts"],"names":[],"mappings":"AAGA,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,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACjD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAsBD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,qBAAqB,CAwBvB"}
1
+ {"version":3,"file":"codex-execution-surface.d.ts","sourceRoot":"","sources":["../../src/scripts/codex-execution-surface.ts"],"names":[],"mappings":"AAGA,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,MAAM,CAAC;AAEX,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,KAAK,CAAC;AACjD,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,cAAc,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAsBD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CACrB,GACL,qBAAqB,CAwBvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-execution-surface.js","sourceRoot":"","sources":["../../src/scripts/codex-execution-surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAmBjC,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,GAAW,EACX,UAKI,EAAE;IAEN,MAAM,SAAS,GAAuB,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QACvE,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACtG,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/E,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,wBAAwB,GAAG,UAAU,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,MAAM,iBAAiB,GAAG,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,OAAO,IAAI,aAAa,KAAK,UAAU,CAAC;IAC/G,MAAM,oBAAoB,GAAG,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,WAAW,IAAI,aAAa,KAAK,KAAK,CAAC;IACpH,MAAM,QAAQ,GAAsB,CAAC,iBAAiB,IAAI,CACxD,oBAAoB;WACjB,CAAC,OAAO,CAAC,aAAa,KAAK,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;WAC/F,CAAC,CAAC,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,wBAAwB,CAAC;WACrE,CACD,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE;eAC5C,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE;eAC5C,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAChG,CACF;QACC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,KAAK,CAAC;IAEV,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"codex-execution-surface.js","sourceRoot":"","sources":["../../src/scripts/codex-execution-surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAqBjC,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAChE,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,SAAS,6BAA6B,CAAC,GAAW;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,GAAW,EACX,UAKI,EAAE;IAEN,MAAM,SAAS,GAAuB,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QACvE,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,cAAc,CAAC;IACnB,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IACtG,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/E,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,wBAAwB,GAAG,UAAU,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,MAAM,iBAAiB,GAAG,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,OAAO,IAAI,aAAa,KAAK,UAAU,CAAC;IAC/G,MAAM,oBAAoB,GAAG,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,WAAW,IAAI,aAAa,KAAK,KAAK,CAAC;IACpH,MAAM,QAAQ,GAAsB,CAAC,iBAAiB,IAAI,CACxD,oBAAoB;WACjB,CAAC,OAAO,CAAC,aAAa,KAAK,cAAc,IAAI,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;WAC/F,CAAC,CAAC,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,wBAAwB,CAAC;WACrE,CACD,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE;eAC5C,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE;eAC5C,UAAU,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAChG,CACF;QACC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,KAAK,CAAC;IAEV,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type SkillActiveState } from "../hooks/keyword-detector.js";
2
2
  import { reconcileHudForPromptSubmit } from "../hud/reconcile.js";
3
- type CodexHookEventName = "SessionStart" | "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "Stop";
3
+ type CodexHookEventName = "SessionStart" | "PreToolUse" | "PostToolUse" | "UserPromptSubmit" | "PreCompact" | "PostCompact" | "Stop";
4
4
  type CodexHookPayload = Record<string, unknown>;
5
5
  interface NativeHookDispatchOptions {
6
6
  cwd?: string;
@@ -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;AA6BlE,KAAK,kBAAkB,GACnB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,YAAY,GACZ,aAAa,GACb,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;AA6PD,wBAAgB,2BAA2B,CACzC,aAAa,EAAE,kBAAkB,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAmBf;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,CA8QnC;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";
@@ -21,7 +21,7 @@ import { resolveCodexExecutionSurface, } from "./codex-execution-surface.js";
21
21
  import { buildNativeHookEvent, } from "../hooks/extensibility/events.js";
22
22
  import { dispatchHookEventRuntime } from "../hooks/extensibility/runtime.js";
23
23
  import { reconcileHudForPromptSubmit } from "../hud/reconcile.js";
24
- import { onSessionStart as buildWikiSessionStartContext } from "../wiki/lifecycle.js";
24
+ import { onPostCompact as buildWikiPostCompactContext, onPreCompact as buildWikiPreCompactContext, onSessionStart as buildWikiSessionStartContext, } from "../wiki/lifecycle.js";
25
25
  import { readAutoresearchCompletionStatus, readAutoresearchModeStateForActiveDecision } from "../autoresearch/skill-validation.js";
26
26
  import { readRunState } from "../runtime/run-state.js";
27
27
  import { getRunContinuationSnapshot, shouldContinueRun } from "../runtime/run-loop.js";
@@ -235,6 +235,8 @@ function readHookEventName(payload) {
235
235
  || raw === "PreToolUse"
236
236
  || raw === "PostToolUse"
237
237
  || raw === "UserPromptSubmit"
238
+ || raw === "PreCompact"
239
+ || raw === "PostCompact"
238
240
  || raw === "Stop") {
239
241
  return raw;
240
242
  }
@@ -250,6 +252,10 @@ export function mapCodexHookEventToOmxEvent(hookEventName) {
250
252
  return "post-tool-use";
251
253
  case "UserPromptSubmit":
252
254
  return "keyword-detector";
255
+ case "PreCompact":
256
+ return "pre-compact";
257
+ case "PostCompact":
258
+ return "post-compact";
253
259
  case "Stop":
254
260
  return "stop";
255
261
  default:
@@ -463,6 +469,7 @@ function readParentPid(pid) {
463
469
  const raw = execFileSync("ps", ["-o", "ppid=", "-p", String(pid)], {
464
470
  encoding: "utf-8",
465
471
  stdio: ["ignore", "pipe", "ignore"],
472
+ windowsHide: true,
466
473
  }).trim();
467
474
  const ppid = Number.parseInt(raw, 10);
468
475
  return Number.isFinite(ppid) && ppid > 0 ? ppid : null;
@@ -481,6 +488,7 @@ function readProcessCommand(pid) {
481
488
  return execFileSync("ps", ["-o", "command=", "-p", String(pid)], {
482
489
  encoding: "utf-8",
483
490
  stdio: ["ignore", "pipe", "ignore"],
491
+ windowsHide: true,
484
492
  }).trim();
485
493
  }
486
494
  catch {
@@ -1533,6 +1541,80 @@ async function readBlockingSkillForStop(cwd, sessionId, threadId, requiredSkill)
1533
1541
  }
1534
1542
  return null;
1535
1543
  }
1544
+ function uniqueNonEmpty(values) {
1545
+ return [...new Set(values.map((value) => safeString(value).trim()).filter(Boolean))];
1546
+ }
1547
+ function isTerminalOrInactiveModeState(state) {
1548
+ if (!state)
1549
+ return true;
1550
+ if (state.active !== true)
1551
+ return true;
1552
+ if (getRunContinuationSnapshot(state)?.terminal === true)
1553
+ return true;
1554
+ const phase = safeString(state.current_phase ?? state.currentPhase).trim().toLowerCase();
1555
+ return phase !== "" && TERMINAL_MODE_PHASES.has(phase);
1556
+ }
1557
+ async function readSessionScopedModeStateForRootSkill(cwd, skill, sessionIds) {
1558
+ for (const sessionId of sessionIds) {
1559
+ const state = await readJsonIfExists(getStateFilePath(`${skill}-state.json`, cwd, sessionId));
1560
+ if (state)
1561
+ return state;
1562
+ }
1563
+ return null;
1564
+ }
1565
+ async function reconcileStaleRootSkillActiveStateForStop(cwd, sessionId) {
1566
+ const { rootPath } = getSkillActiveStatePaths(cwd);
1567
+ const rootState = await readSkillActiveState(rootPath);
1568
+ if (!rootState?.active)
1569
+ return;
1570
+ const initializedSessionId = extractSessionIdFromInitializedStatePath(rootState.initialized_state_path);
1571
+ const rootSessionIds = uniqueNonEmpty([
1572
+ sessionId,
1573
+ safeString(rootState.session_id),
1574
+ initializedSessionId,
1575
+ ...listActiveSkills(rootState).map((entry) => safeString(entry.session_id)),
1576
+ ]);
1577
+ if (rootSessionIds.length === 0)
1578
+ return;
1579
+ const activeEntries = listActiveSkills(rootState);
1580
+ let changed = false;
1581
+ const keptEntries = [];
1582
+ for (const entry of activeEntries) {
1583
+ const skill = safeString(entry.skill).trim();
1584
+ if (!skill)
1585
+ continue;
1586
+ const entrySessionId = safeString(entry.session_id).trim();
1587
+ const candidateSessionIds = uniqueNonEmpty([
1588
+ entrySessionId,
1589
+ sessionId,
1590
+ initializedSessionId,
1591
+ safeString(rootState.session_id),
1592
+ ]);
1593
+ const modeState = await readSessionScopedModeStateForRootSkill(cwd, skill, candidateSessionIds);
1594
+ if (isTerminalOrInactiveModeState(modeState)) {
1595
+ changed = true;
1596
+ continue;
1597
+ }
1598
+ keptEntries.push(entry);
1599
+ }
1600
+ if (!changed)
1601
+ return;
1602
+ const nowIso = new Date().toISOString();
1603
+ const nextRoot = {
1604
+ ...rootState,
1605
+ active: keptEntries.length > 0,
1606
+ skill: keptEntries[0]?.skill ?? safeString(rootState.skill).trim(),
1607
+ phase: keptEntries[0]?.phase ?? safeString(rootState.phase).trim(),
1608
+ updated_at: nowIso,
1609
+ active_skills: keptEntries,
1610
+ reconciled_at: nowIso,
1611
+ reconciliation_reason: "stop_hook_session_state_terminal",
1612
+ };
1613
+ if (keptEntries.length === 0) {
1614
+ nextRoot.phase = "inactive";
1615
+ }
1616
+ await writeFile(rootPath, JSON.stringify(nextRoot, null, 2));
1617
+ }
1536
1618
  function buildRalplanContinuationStatus(blocker, activeSubagentCount) {
1537
1619
  const phase = blocker.phase || "planning";
1538
1620
  const artifact = blocker.latestPlanPath
@@ -1897,6 +1979,9 @@ async function buildStopHookOutput(payload, cwd, stateDir, options = {}) {
1897
1979
  const sessionId = readPayloadSessionId(payload);
1898
1980
  const canonicalSessionId = await resolveInternalSessionIdForPayload(cwd, sessionId);
1899
1981
  const threadId = readPayloadThreadId(payload);
1982
+ if (canonicalSessionId) {
1983
+ await reconcileStaleRootSkillActiveStateForStop(cwd, canonicalSessionId);
1984
+ }
1900
1985
  const execFollowupOutput = await buildExecFollowupStopOutput(cwd, canonicalSessionId);
1901
1986
  if (execFollowupOutput)
1902
1987
  return execFollowupOutput;
@@ -2196,7 +2281,29 @@ export async function dispatchCodexNativeHook(payload, options = {}) {
2196
2281
  allowTeamWorkerSideEffects: false,
2197
2282
  });
2198
2283
  }
2199
- if ((hookEventName === "SessionStart" && !skipCanonicalSessionStartContext) || hookEventName === "UserPromptSubmit") {
2284
+ if (hookEventName === "PreCompact") {
2285
+ const compactContext = buildWikiPreCompactContext({ cwd });
2286
+ if (compactContext.additionalContext) {
2287
+ outputJson = {
2288
+ hookSpecificOutput: {
2289
+ hookEventName,
2290
+ additionalContext: compactContext.additionalContext,
2291
+ },
2292
+ };
2293
+ }
2294
+ }
2295
+ else if (hookEventName === "PostCompact") {
2296
+ const compactContext = buildWikiPostCompactContext({ cwd });
2297
+ if (compactContext.additionalContext) {
2298
+ outputJson = {
2299
+ hookSpecificOutput: {
2300
+ hookEventName,
2301
+ additionalContext: compactContext.additionalContext,
2302
+ },
2303
+ };
2304
+ }
2305
+ }
2306
+ else if ((hookEventName === "SessionStart" && !skipCanonicalSessionStartContext) || hookEventName === "UserPromptSubmit") {
2200
2307
  const additionalContext = hookEventName === "SessionStart"
2201
2308
  ? await buildSessionStartContext(cwd, canonicalSessionId || nativeSessionId, {
2202
2309
  hookEventName,
@@ -2268,11 +2375,29 @@ async function readStdinJson() {
2268
2375
  function writeNativeHookJsonStdout(output) {
2269
2376
  process.stdout.write(`${JSON.stringify(output)}\n`);
2270
2377
  }
2378
+ async function logNativeHookCliError(cwd, type, error, payload = {}) {
2379
+ const logsDir = join(cwd || process.cwd(), ".omx", "logs");
2380
+ await mkdir(logsDir, { recursive: true }).catch(() => { });
2381
+ const logPath = join(logsDir, `native-hook-${new Date().toISOString().split("T")[0]}.jsonl`);
2382
+ await appendFile(logPath, JSON.stringify({
2383
+ timestamp: new Date().toISOString(),
2384
+ type,
2385
+ hook_event_name: readHookEventName(payload) ?? "Unknown",
2386
+ session_id: readPayloadSessionId(payload) || undefined,
2387
+ thread_id: readPayloadThreadId(payload) || undefined,
2388
+ turn_id: readPayloadTurnId(payload) || undefined,
2389
+ error: error instanceof Error ? error.message : String(error),
2390
+ }) + "\n").catch(() => { });
2391
+ }
2271
2392
  function isStopDispatchFailureTestTrigger(payload) {
2272
2393
  return process.env.NODE_ENV === "test"
2273
2394
  && process.env.OMX_NATIVE_HOOK_TEST_THROW_STOP_DISPATCH === "1"
2274
2395
  && readHookEventName(payload) === "Stop";
2275
2396
  }
2397
+ function isDispatchFailureTestTrigger() {
2398
+ return process.env.NODE_ENV === "test"
2399
+ && process.env.OMX_NATIVE_HOOK_TEST_THROW_DISPATCH === "1";
2400
+ }
2276
2401
  function buildStopDispatchFailureOutput(error) {
2277
2402
  const detail = error instanceof Error ? error.message : String(error);
2278
2403
  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 +2411,7 @@ function buildStopDispatchFailureOutput(error) {
2286
2411
  export async function runCodexNativeHookCli() {
2287
2412
  const { payload, parseError } = await readStdinJson();
2288
2413
  if (parseError) {
2414
+ await logNativeHookCliError(process.cwd(), "native_hook_stdin_parse_error", parseError);
2289
2415
  writeNativeHookJsonStdout({
2290
2416
  decision: "block",
2291
2417
  reason: "OMX native hook received malformed JSON input. Preserve runtime state, inspect the emitting hook payload yourself, and retry with valid JSON.",
@@ -2300,6 +2426,9 @@ export async function runCodexNativeHookCli() {
2300
2426
  if (isStopDispatchFailureTestTrigger(payload)) {
2301
2427
  throw new Error("test-induced Stop dispatch failure");
2302
2428
  }
2429
+ if (isDispatchFailureTestTrigger()) {
2430
+ throw new Error("test-induced dispatch failure");
2431
+ }
2303
2432
  const result = await dispatchCodexNativeHook(payload);
2304
2433
  if (result.outputJson) {
2305
2434
  writeNativeHookJsonStdout(result.outputJson);
@@ -2309,17 +2438,20 @@ export async function runCodexNativeHookCli() {
2309
2438
  }
2310
2439
  }
2311
2440
  catch (error) {
2312
- if (readHookEventName(payload) !== "Stop") {
2313
- throw error;
2441
+ const cwd = safeString(payload.cwd).trim() || process.cwd();
2442
+ await logNativeHookCliError(cwd, "native_hook_dispatch_error", error, payload);
2443
+ if (readHookEventName(payload) === "Stop") {
2444
+ writeNativeHookJsonStdout(buildStopDispatchFailureOutput(error));
2445
+ }
2446
+ else {
2447
+ process.exitCode = 1;
2314
2448
  }
2315
- process.stderr.write(`[omx] codex-native Stop hook dispatch failed: ${error instanceof Error ? error.message : String(error)}\n`);
2316
- writeNativeHookJsonStdout(buildStopDispatchFailureOutput(error));
2317
2449
  }
2318
2450
  }
2319
2451
  if (isCodexNativeHookMainModule(import.meta.url, process.argv[1])) {
2320
2452
  runCodexNativeHookCli().catch((error) => {
2321
- process.stderr.write(`[omx] codex-native-hook failed: ${error instanceof Error ? error.message : String(error)}\n`);
2322
2453
  process.exitCode = 1;
2454
+ void logNativeHookCliError(process.cwd(), "native_hook_fatal_error", error);
2323
2455
  });
2324
2456
  }
2325
2457
  //# sourceMappingURL=codex-native-hook.js.map