oh-my-codex 0.20.2 → 0.20.5

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 (805) hide show
  1. package/Cargo.lock +36 -18
  2. package/Cargo.toml +1 -1
  3. package/README.md +28 -2
  4. package/crates/omx-runtime/Cargo.toml +4 -0
  5. package/crates/omx-runtime/src/main.rs +415 -2
  6. package/crates/omx-runtime/tests/execution.rs +483 -0
  7. package/crates/omx-runtime-core/src/dispatch.rs +96 -10
  8. package/crates/omx-runtime-core/src/engine.rs +839 -29
  9. package/crates/omx-runtime-core/src/lib.rs +8 -0
  10. package/dist/adapt/__tests__/herdr-target.test.d.ts +2 -0
  11. package/dist/adapt/__tests__/herdr-target.test.d.ts.map +1 -0
  12. package/dist/adapt/__tests__/herdr-target.test.js +72 -0
  13. package/dist/adapt/__tests__/herdr-target.test.js.map +1 -0
  14. package/dist/adapt/contracts.d.ts +1 -1
  15. package/dist/adapt/contracts.d.ts.map +1 -1
  16. package/dist/adapt/contracts.js +1 -1
  17. package/dist/adapt/contracts.js.map +1 -1
  18. package/dist/adapt/herdr/__tests__/authority.test.d.ts +2 -0
  19. package/dist/adapt/herdr/__tests__/authority.test.d.ts.map +1 -0
  20. package/dist/adapt/herdr/__tests__/authority.test.js +49 -0
  21. package/dist/adapt/herdr/__tests__/authority.test.js.map +1 -0
  22. package/dist/adapt/herdr/__tests__/bridge.test.d.ts +2 -0
  23. package/dist/adapt/herdr/__tests__/bridge.test.d.ts.map +1 -0
  24. package/dist/adapt/herdr/__tests__/bridge.test.js +176 -0
  25. package/dist/adapt/herdr/__tests__/bridge.test.js.map +1 -0
  26. package/dist/adapt/herdr/__tests__/sanitize.test.d.ts +2 -0
  27. package/dist/adapt/herdr/__tests__/sanitize.test.d.ts.map +1 -0
  28. package/dist/adapt/herdr/__tests__/sanitize.test.js +45 -0
  29. package/dist/adapt/herdr/__tests__/sanitize.test.js.map +1 -0
  30. package/dist/adapt/herdr/__tests__/semantic.test.d.ts +2 -0
  31. package/dist/adapt/herdr/__tests__/semantic.test.d.ts.map +1 -0
  32. package/dist/adapt/herdr/__tests__/semantic.test.js +130 -0
  33. package/dist/adapt/herdr/__tests__/semantic.test.js.map +1 -0
  34. package/dist/adapt/herdr/__tests__/seq-store.test.d.ts +2 -0
  35. package/dist/adapt/herdr/__tests__/seq-store.test.d.ts.map +1 -0
  36. package/dist/adapt/herdr/__tests__/seq-store.test.js +54 -0
  37. package/dist/adapt/herdr/__tests__/seq-store.test.js.map +1 -0
  38. package/dist/adapt/herdr/__tests__/socket-live.test.d.ts +2 -0
  39. package/dist/adapt/herdr/__tests__/socket-live.test.d.ts.map +1 -0
  40. package/dist/adapt/herdr/__tests__/socket-live.test.js +104 -0
  41. package/dist/adapt/herdr/__tests__/socket-live.test.js.map +1 -0
  42. package/dist/adapt/herdr/__tests__/team-map.test.d.ts +2 -0
  43. package/dist/adapt/herdr/__tests__/team-map.test.d.ts.map +1 -0
  44. package/dist/adapt/herdr/__tests__/team-map.test.js +46 -0
  45. package/dist/adapt/herdr/__tests__/team-map.test.js.map +1 -0
  46. package/dist/adapt/herdr/__tests__/transport.test.d.ts +2 -0
  47. package/dist/adapt/herdr/__tests__/transport.test.d.ts.map +1 -0
  48. package/dist/adapt/herdr/__tests__/transport.test.js +160 -0
  49. package/dist/adapt/herdr/__tests__/transport.test.js.map +1 -0
  50. package/dist/adapt/herdr/__tests__/wiring.test.d.ts +2 -0
  51. package/dist/adapt/herdr/__tests__/wiring.test.d.ts.map +1 -0
  52. package/dist/adapt/herdr/__tests__/wiring.test.js +118 -0
  53. package/dist/adapt/herdr/__tests__/wiring.test.js.map +1 -0
  54. package/dist/adapt/herdr/authority.d.ts +34 -0
  55. package/dist/adapt/herdr/authority.d.ts.map +1 -0
  56. package/dist/adapt/herdr/authority.js +71 -0
  57. package/dist/adapt/herdr/authority.js.map +1 -0
  58. package/dist/adapt/herdr/bridge.d.ts +84 -0
  59. package/dist/adapt/herdr/bridge.d.ts.map +1 -0
  60. package/dist/adapt/herdr/bridge.js +222 -0
  61. package/dist/adapt/herdr/bridge.js.map +1 -0
  62. package/dist/adapt/herdr/sanitize.d.ts +20 -0
  63. package/dist/adapt/herdr/sanitize.d.ts.map +1 -0
  64. package/dist/adapt/herdr/sanitize.js +70 -0
  65. package/dist/adapt/herdr/sanitize.js.map +1 -0
  66. package/dist/adapt/herdr/semantic.d.ts +67 -0
  67. package/dist/adapt/herdr/semantic.d.ts.map +1 -0
  68. package/dist/adapt/herdr/semantic.js +170 -0
  69. package/dist/adapt/herdr/semantic.js.map +1 -0
  70. package/dist/adapt/herdr/seq-store.d.ts +32 -0
  71. package/dist/adapt/herdr/seq-store.d.ts.map +1 -0
  72. package/dist/adapt/herdr/seq-store.js +126 -0
  73. package/dist/adapt/herdr/seq-store.js.map +1 -0
  74. package/dist/adapt/herdr/team-map.d.ts +30 -0
  75. package/dist/adapt/herdr/team-map.d.ts.map +1 -0
  76. package/dist/adapt/herdr/team-map.js +37 -0
  77. package/dist/adapt/herdr/team-map.js.map +1 -0
  78. package/dist/adapt/herdr/transport.d.ts +115 -0
  79. package/dist/adapt/herdr/transport.d.ts.map +1 -0
  80. package/dist/adapt/herdr/transport.js +260 -0
  81. package/dist/adapt/herdr/transport.js.map +1 -0
  82. package/dist/adapt/herdr/wiring.d.ts +24 -0
  83. package/dist/adapt/herdr/wiring.d.ts.map +1 -0
  84. package/dist/adapt/herdr/wiring.js +62 -0
  85. package/dist/adapt/herdr/wiring.js.map +1 -0
  86. package/dist/adapt/herdr.d.ts +19 -0
  87. package/dist/adapt/herdr.d.ts.map +1 -0
  88. package/dist/adapt/herdr.js +115 -0
  89. package/dist/adapt/herdr.js.map +1 -0
  90. package/dist/adapt/index.d.ts +4 -0
  91. package/dist/adapt/index.d.ts.map +1 -1
  92. package/dist/adapt/index.js +48 -0
  93. package/dist/adapt/index.js.map +1 -1
  94. package/dist/adapt/registry.d.ts.map +1 -1
  95. package/dist/adapt/registry.js +11 -0
  96. package/dist/adapt/registry.js.map +1 -1
  97. package/dist/agents/__tests__/definitions.test.js +81 -0
  98. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  99. package/dist/agents/__tests__/native-config.test.js +25 -0
  100. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  101. package/dist/agents/native-config.d.ts +2 -1
  102. package/dist/agents/native-config.d.ts.map +1 -1
  103. package/dist/agents/native-config.js.map +1 -1
  104. package/dist/auth/__tests__/hotswap.test.js +60 -1
  105. package/dist/auth/__tests__/hotswap.test.js.map +1 -1
  106. package/dist/auth/__tests__/storage.test.js +33 -1
  107. package/dist/auth/__tests__/storage.test.js.map +1 -1
  108. package/dist/auth/hotswap.d.ts +22 -2
  109. package/dist/auth/hotswap.d.ts.map +1 -1
  110. package/dist/auth/hotswap.js +107 -22
  111. package/dist/auth/hotswap.js.map +1 -1
  112. package/dist/auth/storage.js +1 -1
  113. package/dist/auth/storage.js.map +1 -1
  114. package/dist/autopilot/__tests__/ralplan-gate.test.js +86 -1333
  115. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  116. package/dist/autopilot/ralplan-gate.d.ts.map +1 -1
  117. package/dist/autopilot/ralplan-gate.js +7 -6
  118. package/dist/autopilot/ralplan-gate.js.map +1 -1
  119. package/dist/cli/__tests__/agents-init.test.js +4 -23
  120. package/dist/cli/__tests__/agents-init.test.js.map +1 -1
  121. package/dist/cli/__tests__/api.test.js +61 -24
  122. package/dist/cli/__tests__/api.test.js.map +1 -1
  123. package/dist/cli/__tests__/auth.test.js +63 -7
  124. package/dist/cli/__tests__/auth.test.js.map +1 -1
  125. package/dist/cli/__tests__/codex-feature-probe.test.js +66 -1
  126. package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -1
  127. package/dist/cli/__tests__/codex-plugin-layout.test.js +150 -2
  128. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  129. package/dist/cli/__tests__/detached-leader-teardown.test.d.ts +2 -0
  130. package/dist/cli/__tests__/detached-leader-teardown.test.d.ts.map +1 -0
  131. package/dist/cli/__tests__/detached-leader-teardown.test.js +473 -0
  132. package/dist/cli/__tests__/detached-leader-teardown.test.js.map +1 -0
  133. package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts +2 -0
  134. package/dist/cli/__tests__/doctor-process-identity-readiness.test.d.ts.map +1 -0
  135. package/dist/cli/__tests__/doctor-process-identity-readiness.test.js +103 -0
  136. package/dist/cli/__tests__/doctor-process-identity-readiness.test.js.map +1 -0
  137. package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts +2 -0
  138. package/dist/cli/__tests__/doctor-state-root-binding.test.d.ts.map +1 -0
  139. package/dist/cli/__tests__/doctor-state-root-binding.test.js +139 -0
  140. package/dist/cli/__tests__/doctor-state-root-binding.test.js.map +1 -0
  141. package/dist/cli/__tests__/doctor-warning-copy.test.js +135 -1
  142. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  143. package/dist/cli/__tests__/exec.test.js +211 -0
  144. package/dist/cli/__tests__/exec.test.js.map +1 -1
  145. package/dist/cli/__tests__/index.test.js +878 -463
  146. package/dist/cli/__tests__/index.test.js.map +1 -1
  147. package/dist/cli/__tests__/launch-fallback.test.js +1290 -127
  148. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  149. package/dist/cli/__tests__/mcp-parity.test.js +8 -4
  150. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  151. package/dist/cli/__tests__/native-assets.test.js +398 -16
  152. package/dist/cli/__tests__/native-assets.test.js.map +1 -1
  153. package/dist/cli/__tests__/native-hook-claim-journal.test.js +132 -6
  154. package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -1
  155. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -3
  156. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  157. package/dist/cli/__tests__/ralph.test.js +3 -3
  158. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  159. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +49 -164
  160. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -1
  161. package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts +2 -0
  162. package/dist/cli/__tests__/ralplan-child-binding-3212.test.d.ts.map +1 -0
  163. package/dist/cli/__tests__/ralplan-child-binding-3212.test.js +56 -0
  164. package/dist/cli/__tests__/ralplan-child-binding-3212.test.js.map +1 -0
  165. package/dist/cli/__tests__/ralplan.test.js +107 -109
  166. package/dist/cli/__tests__/ralplan.test.js.map +1 -1
  167. package/dist/cli/__tests__/resume.test.js +11 -10
  168. package/dist/cli/__tests__/resume.test.js.map +1 -1
  169. package/dist/cli/__tests__/session-scoped-runtime.test.js +1118 -43
  170. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  171. package/dist/cli/__tests__/session-search-help.test.js +25 -1
  172. package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
  173. package/dist/cli/__tests__/setup-agents-overwrite.test.js +8 -55
  174. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  175. package/dist/cli/__tests__/setup-install-mode.test.js +224 -7
  176. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  177. package/dist/cli/__tests__/sparkshell-cli.test.js +93 -41
  178. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  179. package/dist/cli/__tests__/team.test.js +150 -8
  180. package/dist/cli/__tests__/team.test.js.map +1 -1
  181. package/dist/cli/__tests__/ultragoal.test.js +117 -2
  182. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  183. package/dist/cli/__tests__/uninstall.test.js +95 -4
  184. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  185. package/dist/cli/__tests__/update.test.js +669 -177
  186. package/dist/cli/__tests__/update.test.js.map +1 -1
  187. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +33 -2
  188. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  189. package/dist/cli/api.d.ts.map +1 -1
  190. package/dist/cli/api.js +9 -10
  191. package/dist/cli/api.js.map +1 -1
  192. package/dist/cli/codex-feature-probe.d.ts +16 -0
  193. package/dist/cli/codex-feature-probe.d.ts.map +1 -1
  194. package/dist/cli/codex-feature-probe.js +44 -0
  195. package/dist/cli/codex-feature-probe.js.map +1 -1
  196. package/dist/cli/codex-home.d.ts.map +1 -1
  197. package/dist/cli/codex-home.js +7 -4
  198. package/dist/cli/codex-home.js.map +1 -1
  199. package/dist/cli/doctor.d.ts +20 -0
  200. package/dist/cli/doctor.d.ts.map +1 -1
  201. package/dist/cli/doctor.js +290 -3
  202. package/dist/cli/doctor.js.map +1 -1
  203. package/dist/cli/index.d.ts +234 -12
  204. package/dist/cli/index.d.ts.map +1 -1
  205. package/dist/cli/index.js +2409 -746
  206. package/dist/cli/index.js.map +1 -1
  207. package/dist/cli/mcp-parity.js +2 -2
  208. package/dist/cli/mcp-parity.js.map +1 -1
  209. package/dist/cli/native-assets.d.ts +25 -0
  210. package/dist/cli/native-assets.d.ts.map +1 -1
  211. package/dist/cli/native-assets.js +448 -51
  212. package/dist/cli/native-assets.js.map +1 -1
  213. package/dist/cli/native-hook-claim-journal.d.ts +20 -5
  214. package/dist/cli/native-hook-claim-journal.d.ts.map +1 -1
  215. package/dist/cli/native-hook-claim-journal.js +67 -32
  216. package/dist/cli/native-hook-claim-journal.js.map +1 -1
  217. package/dist/cli/package-manager-ownership.d.ts +63 -0
  218. package/dist/cli/package-manager-ownership.d.ts.map +1 -0
  219. package/dist/cli/package-manager-ownership.js +323 -0
  220. package/dist/cli/package-manager-ownership.js.map +1 -0
  221. package/dist/cli/ralph.js +2 -2
  222. package/dist/cli/ralph.js.map +1 -1
  223. package/dist/cli/ralplan.d.ts +5 -7
  224. package/dist/cli/ralplan.d.ts.map +1 -1
  225. package/dist/cli/ralplan.js +83 -134
  226. package/dist/cli/ralplan.js.map +1 -1
  227. package/dist/cli/session-search.d.ts +5 -0
  228. package/dist/cli/session-search.d.ts.map +1 -1
  229. package/dist/cli/session-search.js +87 -0
  230. package/dist/cli/session-search.js.map +1 -1
  231. package/dist/cli/setup-preferences.d.ts +15 -0
  232. package/dist/cli/setup-preferences.d.ts.map +1 -1
  233. package/dist/cli/setup-preferences.js +27 -1
  234. package/dist/cli/setup-preferences.js.map +1 -1
  235. package/dist/cli/setup.d.ts +8 -0
  236. package/dist/cli/setup.d.ts.map +1 -1
  237. package/dist/cli/setup.js +119 -47
  238. package/dist/cli/setup.js.map +1 -1
  239. package/dist/cli/sparkshell.d.ts.map +1 -1
  240. package/dist/cli/sparkshell.js +52 -9
  241. package/dist/cli/sparkshell.js.map +1 -1
  242. package/dist/cli/ultragoal.d.ts.map +1 -1
  243. package/dist/cli/ultragoal.js +2 -2
  244. package/dist/cli/ultragoal.js.map +1 -1
  245. package/dist/cli/uninstall.d.ts +9 -0
  246. package/dist/cli/uninstall.d.ts.map +1 -1
  247. package/dist/cli/uninstall.js +71 -30
  248. package/dist/cli/uninstall.js.map +1 -1
  249. package/dist/cli/update-worker.d.ts +2 -0
  250. package/dist/cli/update-worker.d.ts.map +1 -0
  251. package/dist/cli/update-worker.js +142 -0
  252. package/dist/cli/update-worker.js.map +1 -0
  253. package/dist/cli/update.d.ts +14 -22
  254. package/dist/cli/update.d.ts.map +1 -1
  255. package/dist/cli/update.js +192 -241
  256. package/dist/cli/update.js.map +1 -1
  257. package/dist/compat/__tests__/rust-runtime-compat.test.js +1 -1
  258. package/dist/config/__tests__/generator-idempotent.test.js +503 -30
  259. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  260. package/dist/config/__tests__/generator-notify.test.js +5 -3
  261. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  262. package/dist/config/__tests__/models.test.js +67 -3
  263. package/dist/config/__tests__/models.test.js.map +1 -1
  264. package/dist/config/generator.d.ts +27 -21
  265. package/dist/config/generator.d.ts.map +1 -1
  266. package/dist/config/generator.js +610 -152
  267. package/dist/config/generator.js.map +1 -1
  268. package/dist/config/models.d.ts +12 -2
  269. package/dist/config/models.d.ts.map +1 -1
  270. package/dist/config/models.js +15 -1
  271. package/dist/config/models.js.map +1 -1
  272. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js +25 -0
  273. package/dist/goal-workflows/__tests__/codex-goal-snapshot.test.js.map +1 -1
  274. package/dist/goal-workflows/codex-goal-snapshot.d.ts +1 -1
  275. package/dist/goal-workflows/codex-goal-snapshot.d.ts.map +1 -1
  276. package/dist/goal-workflows/codex-goal-snapshot.js +2 -0
  277. package/dist/goal-workflows/codex-goal-snapshot.js.map +1 -1
  278. package/dist/hooks/__tests__/agents-overlay.test.js +5 -3
  279. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  280. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +27 -4
  281. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  282. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts +2 -0
  283. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.d.ts.map +1 -0
  284. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js +172 -0
  285. package/dist/hooks/__tests__/issue-3293-autopilot-handoff.test.js.map +1 -0
  286. package/dist/hooks/__tests__/keyword-detector.test.js +176 -37
  287. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  288. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +402 -545
  289. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  290. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +39 -4
  291. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  292. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +161 -26
  293. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  294. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +27 -0
  295. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  296. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +10 -118
  297. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  298. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +7 -0
  299. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  300. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +533 -14
  301. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  302. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +159 -24
  303. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  304. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +482 -32
  305. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  306. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js +2 -1
  307. package/dist/hooks/__tests__/notify-hook-team-worker-fail-closed.test.js.map +1 -1
  308. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +68 -1
  309. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  310. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +7 -1
  311. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  312. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +44 -4
  313. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  314. package/dist/hooks/__tests__/prompt-guidance-contract.test.js +9 -0
  315. package/dist/hooks/__tests__/prompt-guidance-contract.test.js.map +1 -1
  316. package/dist/hooks/__tests__/session.test.js +3130 -365
  317. package/dist/hooks/__tests__/session.test.js.map +1 -1
  318. package/dist/hooks/agents-overlay.js +1 -1
  319. package/dist/hooks/agents-overlay.js.map +1 -1
  320. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +108 -2
  321. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  322. package/dist/hooks/extensibility/__tests__/sdk.test.js +151 -1
  323. package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
  324. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  325. package/dist/hooks/extensibility/dispatcher.js +20 -3
  326. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  327. package/dist/hooks/extensibility/plugin-runner.js +1 -0
  328. package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
  329. package/dist/hooks/extensibility/runtime.d.ts.map +1 -1
  330. package/dist/hooks/extensibility/runtime.js.map +1 -1
  331. package/dist/hooks/extensibility/sdk/paths.d.ts +1 -1
  332. package/dist/hooks/extensibility/sdk/paths.d.ts.map +1 -1
  333. package/dist/hooks/extensibility/sdk/paths.js +2 -2
  334. package/dist/hooks/extensibility/sdk/paths.js.map +1 -1
  335. package/dist/hooks/extensibility/sdk/runtime-state.d.ts +1 -1
  336. package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
  337. package/dist/hooks/extensibility/sdk/runtime-state.js +55 -15
  338. package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
  339. package/dist/hooks/extensibility/sdk.d.ts +1 -0
  340. package/dist/hooks/extensibility/sdk.d.ts.map +1 -1
  341. package/dist/hooks/extensibility/sdk.js +1 -1
  342. package/dist/hooks/extensibility/sdk.js.map +1 -1
  343. package/dist/hooks/extensibility/types.d.ts +7 -0
  344. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  345. package/dist/hooks/keyword-detector.d.ts +10 -3
  346. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  347. package/dist/hooks/keyword-detector.js +116 -20
  348. package/dist/hooks/keyword-detector.js.map +1 -1
  349. package/dist/hooks/session.d.ts +204 -14
  350. package/dist/hooks/session.d.ts.map +1 -1
  351. package/dist/hooks/session.js +1500 -223
  352. package/dist/hooks/session.js.map +1 -1
  353. package/dist/hud/__tests__/hud-tmux-injection.test.js +6 -6
  354. package/dist/hud/__tests__/hud-tmux-injection.test.js.map +1 -1
  355. package/dist/hud/__tests__/index.test.js +26 -16
  356. package/dist/hud/__tests__/index.test.js.map +1 -1
  357. package/dist/hud/__tests__/reconcile.test.js +83 -78
  358. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  359. package/dist/hud/__tests__/state.test.js +36 -31
  360. package/dist/hud/__tests__/state.test.js.map +1 -1
  361. package/dist/hud/__tests__/tmux.test.js +155 -198
  362. package/dist/hud/__tests__/tmux.test.js.map +1 -1
  363. package/dist/hud/tmux.d.ts +42 -4
  364. package/dist/hud/tmux.d.ts.map +1 -1
  365. package/dist/hud/tmux.js +1017 -139
  366. package/dist/hud/tmux.js.map +1 -1
  367. package/dist/leader/__tests__/contract.test.js +124 -37
  368. package/dist/leader/__tests__/contract.test.js.map +1 -1
  369. package/dist/leader/contract.d.ts +17 -6
  370. package/dist/leader/contract.d.ts.map +1 -1
  371. package/dist/leader/contract.js +102 -26
  372. package/dist/leader/contract.js.map +1 -1
  373. package/dist/mcp/__tests__/code-intel-server.test.js +31 -3
  374. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
  375. package/dist/mcp/__tests__/hermes-bridge.test.js +17 -0
  376. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  377. package/dist/mcp/__tests__/server-lifecycle.test.js +4 -4
  378. package/dist/mcp/__tests__/state-paths.test.js +735 -4
  379. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  380. package/dist/mcp/__tests__/state-server.test.js +1 -1
  381. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  382. package/dist/mcp/__tests__/trace-server.test.js +2 -2
  383. package/dist/mcp/__tests__/trace-server.test.js.map +1 -1
  384. package/dist/mcp/__tests__/wiki-server.test.js +18 -0
  385. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
  386. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  387. package/dist/mcp/code-intel-server.js +13 -3
  388. package/dist/mcp/code-intel-server.js.map +1 -1
  389. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  390. package/dist/mcp/hermes-bridge.js +2 -2
  391. package/dist/mcp/hermes-bridge.js.map +1 -1
  392. package/dist/mcp/state-paths.d.ts +78 -4
  393. package/dist/mcp/state-paths.d.ts.map +1 -1
  394. package/dist/mcp/state-paths.js +543 -40
  395. package/dist/mcp/state-paths.js.map +1 -1
  396. package/dist/mcp/state-server.d.ts +4 -4
  397. package/dist/mcp/state-server.d.ts.map +1 -1
  398. package/dist/mcp/wiki-server.d.ts +11 -0
  399. package/dist/mcp/wiki-server.d.ts.map +1 -1
  400. package/dist/mcp/wiki-server.js +9 -2
  401. package/dist/mcp/wiki-server.js.map +1 -1
  402. package/dist/modes/__tests__/base-autopilot-gates.test.js +36 -7
  403. package/dist/modes/__tests__/base-autopilot-gates.test.js.map +1 -1
  404. package/dist/modes/__tests__/base-multi-state-compat.test.js +1 -1
  405. package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -1
  406. package/dist/modes/__tests__/base-session-scope.test.js +17 -8
  407. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  408. package/dist/modes/__tests__/base-tmux-pane.test.js +4 -4
  409. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  410. package/dist/modes/base.d.ts +5 -5
  411. package/dist/modes/base.d.ts.map +1 -1
  412. package/dist/modes/base.js +76 -21
  413. package/dist/modes/base.js.map +1 -1
  414. package/dist/native-assets/archive.d.ts +17 -0
  415. package/dist/native-assets/archive.d.ts.map +1 -0
  416. package/dist/native-assets/archive.js +238 -0
  417. package/dist/native-assets/archive.js.map +1 -0
  418. package/dist/native-assets/policy.d.ts +42 -0
  419. package/dist/native-assets/policy.d.ts.map +1 -0
  420. package/dist/native-assets/policy.js +155 -0
  421. package/dist/native-assets/policy.js.map +1 -0
  422. package/dist/notifications/temp-contract.d.ts.map +1 -1
  423. package/dist/notifications/temp-contract.js +4 -0
  424. package/dist/notifications/temp-contract.js.map +1 -1
  425. package/dist/pipeline/__tests__/orchestrator.test.js +164 -42
  426. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  427. package/dist/pipeline/__tests__/stages.test.js +72 -155
  428. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  429. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  430. package/dist/pipeline/orchestrator.js +124 -18
  431. package/dist/pipeline/orchestrator.js.map +1 -1
  432. package/dist/pipeline/stages/ralplan.d.ts.map +1 -1
  433. package/dist/pipeline/stages/ralplan.js +36 -8
  434. package/dist/pipeline/stages/ralplan.js.map +1 -1
  435. package/dist/ralplan/__tests__/consensus-gate.test.js +73 -1316
  436. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  437. package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts +2 -0
  438. package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts.map +1 -0
  439. package/dist/ralplan/__tests__/documented-leader-preflight.test.js +335 -0
  440. package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -0
  441. package/dist/ralplan/__tests__/runtime.test.js +85 -101
  442. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  443. package/dist/ralplan/consensus-gate.d.ts +9 -1
  444. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  445. package/dist/ralplan/consensus-gate.js +82 -338
  446. package/dist/ralplan/consensus-gate.js.map +1 -1
  447. package/dist/ralplan/documented-leader-preflight.d.ts +41 -0
  448. package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -0
  449. package/dist/ralplan/documented-leader-preflight.js +360 -0
  450. package/dist/ralplan/documented-leader-preflight.js.map +1 -0
  451. package/dist/ralplan/runtime.d.ts +2 -1
  452. package/dist/ralplan/runtime.d.ts.map +1 -1
  453. package/dist/ralplan/runtime.js +67 -168
  454. package/dist/ralplan/runtime.js.map +1 -1
  455. package/dist/runtime/__tests__/bridge.test.js +42 -1
  456. package/dist/runtime/__tests__/bridge.test.js.map +1 -1
  457. package/dist/runtime/bridge.d.ts +12 -0
  458. package/dist/runtime/bridge.d.ts.map +1 -1
  459. package/dist/runtime/bridge.js +52 -1
  460. package/dist/runtime/bridge.js.map +1 -1
  461. package/dist/runtime/run-state.d.ts +5 -1
  462. package/dist/runtime/run-state.d.ts.map +1 -1
  463. package/dist/runtime/run-state.js +15 -8
  464. package/dist/runtime/run-state.js.map +1 -1
  465. package/dist/scripts/__tests__/codex-native-hook.test.js +16323 -8978
  466. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  467. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts +2 -0
  468. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.d.ts.map +1 -0
  469. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js +225 -0
  470. package/dist/scripts/__tests__/issue-3293-callsite-parity.test.js.map +1 -0
  471. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts +2 -0
  472. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.d.ts.map +1 -0
  473. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js +188 -0
  474. package/dist/scripts/__tests__/issue-3293-cancel-transaction.test.js.map +1 -0
  475. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts +2 -0
  476. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.d.ts.map +1 -0
  477. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js +259 -0
  478. package/dist/scripts/__tests__/issue-3293-hook-owned-cancel.test.js.map +1 -0
  479. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts +2 -0
  480. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.d.ts.map +1 -0
  481. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js +491 -0
  482. package/dist/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.js.map +1 -0
  483. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts +2 -0
  484. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.d.ts.map +1 -0
  485. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js +708 -0
  486. package/dist/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.js.map +1 -0
  487. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts +2 -0
  488. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.d.ts.map +1 -0
  489. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js +208 -0
  490. package/dist/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.js.map +1 -0
  491. package/dist/scripts/__tests__/notify-state-io.test.js +26 -0
  492. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  493. package/dist/scripts/__tests__/notify-tmux-injection.test.js +23 -1
  494. package/dist/scripts/__tests__/notify-tmux-injection.test.js.map +1 -1
  495. package/dist/scripts/__tests__/postinstall.test.js +19 -1
  496. package/dist/scripts/__tests__/postinstall.test.js.map +1 -1
  497. package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts +2 -0
  498. package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts.map +1 -0
  499. package/dist/scripts/__tests__/reasoning-artifact-contract.test.js +108 -0
  500. package/dist/scripts/__tests__/reasoning-artifact-contract.test.js.map +1 -0
  501. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +63 -173
  502. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -1
  503. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +74 -159
  504. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -1
  505. package/dist/scripts/__tests__/smoke-packed-install.test.js +404 -13
  506. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  507. package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts +2 -0
  508. package/dist/scripts/__tests__/verify-native-release-assets.test.d.ts.map +1 -0
  509. package/dist/scripts/__tests__/verify-native-release-assets.test.js +235 -0
  510. package/dist/scripts/__tests__/verify-native-release-assets.test.js.map +1 -0
  511. package/dist/scripts/codex-native-hook.d.ts +53 -1
  512. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  513. package/dist/scripts/codex-native-hook.js +14448 -1480
  514. package/dist/scripts/codex-native-hook.js.map +1 -1
  515. package/dist/scripts/codex-native-pre-post.d.ts +9 -0
  516. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  517. package/dist/scripts/codex-native-pre-post.js +35 -12
  518. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  519. package/dist/scripts/generate-native-release-manifest.js +80 -51
  520. package/dist/scripts/generate-native-release-manifest.js.map +1 -1
  521. package/dist/scripts/notify-fallback-watcher.js +78 -115
  522. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  523. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  524. package/dist/scripts/notify-hook/auto-nudge.js +74 -3
  525. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  526. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  527. package/dist/scripts/notify-hook/state-io.js +5 -0
  528. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  529. package/dist/scripts/notify-hook/team-dispatch.d.ts +9 -0
  530. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  531. package/dist/scripts/notify-hook/team-dispatch.js +234 -79
  532. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  533. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  534. package/dist/scripts/notify-hook/team-leader-nudge.js +71 -16
  535. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  536. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +12 -4
  537. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  538. package/dist/scripts/notify-hook/team-tmux-guard.js +365 -44
  539. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  540. package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
  541. package/dist/scripts/notify-hook/team-worker-stop.js +42 -21
  542. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  543. package/dist/scripts/notify-hook/team-worker.d.ts +3 -0
  544. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  545. package/dist/scripts/notify-hook/team-worker.js +82 -33
  546. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  547. package/dist/scripts/notify-hook/tmux-injection.d.ts +1 -0
  548. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  549. package/dist/scripts/notify-hook/tmux-injection.js +32 -3
  550. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  551. package/dist/scripts/notify-hook.js +79 -82
  552. package/dist/scripts/notify-hook.js.map +1 -1
  553. package/dist/scripts/postinstall-advisory.d.ts +14 -0
  554. package/dist/scripts/postinstall-advisory.d.ts.map +1 -0
  555. package/dist/scripts/postinstall-advisory.js +49 -0
  556. package/dist/scripts/postinstall-advisory.js.map +1 -0
  557. package/dist/scripts/postinstall.d.ts +1 -1
  558. package/dist/scripts/postinstall.d.ts.map +1 -1
  559. package/dist/scripts/postinstall.js +1 -1
  560. package/dist/scripts/postinstall.js.map +1 -1
  561. package/dist/scripts/smoke-packed-install.d.ts +80 -4
  562. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  563. package/dist/scripts/smoke-packed-install.js +3162 -26
  564. package/dist/scripts/smoke-packed-install.js.map +1 -1
  565. package/dist/scripts/sync-plugin-mirror.d.ts.map +1 -1
  566. package/dist/scripts/sync-plugin-mirror.js +16 -1
  567. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  568. package/dist/scripts/verify-native-release-assets.js +37 -23
  569. package/dist/scripts/verify-native-release-assets.js.map +1 -1
  570. package/dist/state/__tests__/mode-state-context.test.js +61 -0
  571. package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
  572. package/dist/state/__tests__/operations.test.js +462 -850
  573. package/dist/state/__tests__/operations.test.js.map +1 -1
  574. package/dist/state/__tests__/skill-active.test.js +400 -2
  575. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  576. package/dist/state/mode-state-context.d.ts +8 -0
  577. package/dist/state/mode-state-context.d.ts.map +1 -1
  578. package/dist/state/mode-state-context.js +73 -0
  579. package/dist/state/mode-state-context.js.map +1 -1
  580. package/dist/state/operations.d.ts +3 -0
  581. package/dist/state/operations.d.ts.map +1 -1
  582. package/dist/state/operations.js +144 -40
  583. package/dist/state/operations.js.map +1 -1
  584. package/dist/state/skill-active.d.ts +18 -1
  585. package/dist/state/skill-active.d.ts.map +1 -1
  586. package/dist/state/skill-active.js +420 -23
  587. package/dist/state/skill-active.js.map +1 -1
  588. package/dist/state/workflow-transition-reconcile.d.ts +3 -0
  589. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  590. package/dist/state/workflow-transition-reconcile.js +10 -4
  591. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  592. package/dist/state/workflow-transition.d.ts.map +1 -1
  593. package/dist/state/workflow-transition.js +3 -1
  594. package/dist/state/workflow-transition.js.map +1 -1
  595. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +53 -247
  596. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -1
  597. package/dist/subagents/__tests__/tracker.test.js +837 -1048
  598. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  599. package/dist/subagents/tracker.d.ts +58 -135
  600. package/dist/subagents/tracker.d.ts.map +1 -1
  601. package/dist/subagents/tracker.js +811 -632
  602. package/dist/subagents/tracker.js.map +1 -1
  603. package/dist/team/__tests__/api-interop.test.js +91 -1
  604. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  605. package/dist/team/__tests__/delivery-e2e-smoke.test.js +58 -17
  606. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  607. package/dist/team/__tests__/idle-nudge.test.js +45 -15
  608. package/dist/team/__tests__/idle-nudge.test.js.map +1 -1
  609. package/dist/team/__tests__/mcp-comm.test.js +197 -30
  610. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  611. package/dist/team/__tests__/model-contract.test.js +110 -3
  612. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  613. package/dist/team/__tests__/notice-ledger.test.d.ts +2 -0
  614. package/dist/team/__tests__/notice-ledger.test.d.ts.map +1 -0
  615. package/dist/team/__tests__/notice-ledger.test.js +131 -0
  616. package/dist/team/__tests__/notice-ledger.test.js.map +1 -0
  617. package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts +2 -0
  618. package/dist/team/__tests__/pane-teardown-residue-e2e.test.d.ts.map +1 -0
  619. package/dist/team/__tests__/pane-teardown-residue-e2e.test.js +410 -0
  620. package/dist/team/__tests__/pane-teardown-residue-e2e.test.js.map +1 -0
  621. package/dist/team/__tests__/phase-controller.test.js +20 -0
  622. package/dist/team/__tests__/phase-controller.test.js.map +1 -1
  623. package/dist/team/__tests__/runtime-cli.test.js +9 -0
  624. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  625. package/dist/team/__tests__/runtime.test.js +3963 -428
  626. package/dist/team/__tests__/runtime.test.js.map +1 -1
  627. package/dist/team/__tests__/scaling.test.js +2405 -203
  628. package/dist/team/__tests__/scaling.test.js.map +1 -1
  629. package/dist/team/__tests__/state-root.test.js +117 -2
  630. package/dist/team/__tests__/state-root.test.js.map +1 -1
  631. package/dist/team/__tests__/state.test.js +804 -36
  632. package/dist/team/__tests__/state.test.js.map +1 -1
  633. package/dist/team/__tests__/team-ops-contract.test.js +6 -0
  634. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
  635. package/dist/team/__tests__/tmux-session.test.js +4099 -1039
  636. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  637. package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts +2 -0
  638. package/dist/team/__tests__/tmux-source-authority-realtmux.test.d.ts.map +1 -0
  639. package/dist/team/__tests__/tmux-source-authority-realtmux.test.js +149 -0
  640. package/dist/team/__tests__/tmux-source-authority-realtmux.test.js.map +1 -0
  641. package/dist/team/__tests__/tmux-test-fixture.d.ts +69 -0
  642. package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -1
  643. package/dist/team/__tests__/tmux-test-fixture.js +242 -15
  644. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
  645. package/dist/team/__tests__/tmux-test-fixture.test.js +177 -1
  646. package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -1
  647. package/dist/team/__tests__/worker-runtime-identity.test.js +53 -44
  648. package/dist/team/__tests__/worker-runtime-identity.test.js.map +1 -1
  649. package/dist/team/__tests__/worktree.test.js +6 -0
  650. package/dist/team/__tests__/worktree.test.js.map +1 -1
  651. package/dist/team/api-interop.d.ts.map +1 -1
  652. package/dist/team/api-interop.js +15 -9
  653. package/dist/team/api-interop.js.map +1 -1
  654. package/dist/team/exact-pane.d.ts +23 -0
  655. package/dist/team/exact-pane.d.ts.map +1 -0
  656. package/dist/team/exact-pane.js +133 -0
  657. package/dist/team/exact-pane.js.map +1 -0
  658. package/dist/team/idle-nudge.d.ts +12 -1
  659. package/dist/team/idle-nudge.d.ts.map +1 -1
  660. package/dist/team/idle-nudge.js +41 -14
  661. package/dist/team/idle-nudge.js.map +1 -1
  662. package/dist/team/model-contract.d.ts +2 -5
  663. package/dist/team/model-contract.d.ts.map +1 -1
  664. package/dist/team/model-contract.js +59 -17
  665. package/dist/team/model-contract.js.map +1 -1
  666. package/dist/team/notice-ledger.d.ts +54 -0
  667. package/dist/team/notice-ledger.d.ts.map +1 -0
  668. package/dist/team/notice-ledger.js +259 -0
  669. package/dist/team/notice-ledger.js.map +1 -0
  670. package/dist/team/phase-controller.d.ts.map +1 -1
  671. package/dist/team/phase-controller.js +2 -0
  672. package/dist/team/phase-controller.js.map +1 -1
  673. package/dist/team/runtime.d.ts +4 -1
  674. package/dist/team/runtime.d.ts.map +1 -1
  675. package/dist/team/runtime.js +1527 -291
  676. package/dist/team/runtime.js.map +1 -1
  677. package/dist/team/scaling.d.ts +13 -1
  678. package/dist/team/scaling.d.ts.map +1 -1
  679. package/dist/team/scaling.js +1503 -387
  680. package/dist/team/scaling.js.map +1 -1
  681. package/dist/team/state/dispatch.d.ts.map +1 -1
  682. package/dist/team/state/dispatch.js +26 -8
  683. package/dist/team/state/dispatch.js.map +1 -1
  684. package/dist/team/state/locks.d.ts.map +1 -1
  685. package/dist/team/state/locks.js +61 -13
  686. package/dist/team/state/locks.js.map +1 -1
  687. package/dist/team/state/monitor.d.ts +10 -0
  688. package/dist/team/state/monitor.d.ts.map +1 -1
  689. package/dist/team/state/monitor.js +13 -0
  690. package/dist/team/state/monitor.js.map +1 -1
  691. package/dist/team/state/tasks.d.ts.map +1 -1
  692. package/dist/team/state/tasks.js +4 -3
  693. package/dist/team/state/tasks.js.map +1 -1
  694. package/dist/team/state/types.d.ts +15 -0
  695. package/dist/team/state/types.d.ts.map +1 -1
  696. package/dist/team/state/types.js.map +1 -1
  697. package/dist/team/state-root.d.ts +12 -0
  698. package/dist/team/state-root.d.ts.map +1 -1
  699. package/dist/team/state-root.js +177 -0
  700. package/dist/team/state-root.js.map +1 -1
  701. package/dist/team/state.d.ts +85 -1
  702. package/dist/team/state.d.ts.map +1 -1
  703. package/dist/team/state.js +672 -129
  704. package/dist/team/state.js.map +1 -1
  705. package/dist/team/team-ops.d.ts +5 -0
  706. package/dist/team/team-ops.d.ts.map +1 -1
  707. package/dist/team/team-ops.js +4 -0
  708. package/dist/team/team-ops.js.map +1 -1
  709. package/dist/team/tmux-session.d.ts +163 -27
  710. package/dist/team/tmux-session.d.ts.map +1 -1
  711. package/dist/team/tmux-session.js +1682 -376
  712. package/dist/team/tmux-session.js.map +1 -1
  713. package/dist/team/worktree.d.ts.map +1 -1
  714. package/dist/team/worktree.js +4 -0
  715. package/dist/team/worktree.js.map +1 -1
  716. package/dist/ultragoal/__tests__/artifacts.test.js +950 -2
  717. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  718. package/dist/ultragoal/__tests__/docs-contract.test.js +1 -0
  719. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  720. package/dist/ultragoal/artifacts.d.ts +35 -1
  721. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  722. package/dist/ultragoal/artifacts.js +232 -46
  723. package/dist/ultragoal/artifacts.js.map +1 -1
  724. package/dist/utils/__tests__/file-durability.test.d.ts +2 -0
  725. package/dist/utils/__tests__/file-durability.test.d.ts.map +1 -0
  726. package/dist/utils/__tests__/file-durability.test.js +114 -0
  727. package/dist/utils/__tests__/file-durability.test.js.map +1 -0
  728. package/dist/utils/__tests__/paths.test.js +21 -1
  729. package/dist/utils/__tests__/paths.test.js.map +1 -1
  730. package/dist/utils/file-durability.d.ts +25 -0
  731. package/dist/utils/file-durability.d.ts.map +1 -0
  732. package/dist/utils/file-durability.js +67 -0
  733. package/dist/utils/file-durability.js.map +1 -0
  734. package/dist/utils/paths.d.ts.map +1 -1
  735. package/dist/utils/paths.js +14 -6
  736. package/dist/utils/paths.js.map +1 -1
  737. package/dist/verification/__tests__/ci-rust-gates.test.js +49 -4
  738. package/dist/verification/__tests__/ci-rust-gates.test.js.map +1 -1
  739. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +3 -0
  740. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
  741. package/dist/verification/__tests__/explore-harness-release-workflow.test.js +60 -0
  742. package/dist/verification/__tests__/explore-harness-release-workflow.test.js.map +1 -1
  743. package/dist/verification/__tests__/native-release-manifest.test.js +157 -4
  744. package/dist/verification/__tests__/native-release-manifest.test.js.map +1 -1
  745. package/dist/wiki/lint.d.ts +4 -1
  746. package/dist/wiki/lint.d.ts.map +1 -1
  747. package/dist/wiki/lint.js +3 -2
  748. package/dist/wiki/lint.js.map +1 -1
  749. package/package.json +13 -5
  750. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  751. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +105 -17
  752. package/plugins/oh-my-codex/skills/autopilot/SKILL.md +13 -5
  753. package/plugins/oh-my-codex/skills/cancel/SKILL.md +30 -85
  754. package/plugins/oh-my-codex/skills/ralph/SKILL.md +6 -4
  755. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +16 -17
  756. package/plugins/oh-my-codex/skills/team/SKILL.md +13 -9
  757. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +3 -2
  758. package/skills/autopilot/SKILL.md +13 -5
  759. package/skills/cancel/SKILL.md +30 -85
  760. package/skills/ralph/SKILL.md +6 -4
  761. package/skills/ralplan/SKILL.md +16 -17
  762. package/skills/team/SKILL.md +13 -9
  763. package/skills/ultragoal/SKILL.md +3 -2
  764. package/src/scripts/__tests__/codex-native-hook.test.ts +8831 -951
  765. package/src/scripts/__tests__/issue-3293-callsite-parity.test.ts +187 -0
  766. package/src/scripts/__tests__/issue-3293-cancel-transaction.test.ts +189 -0
  767. package/src/scripts/__tests__/issue-3293-hook-owned-cancel.test.ts +187 -0
  768. package/src/scripts/__tests__/issue-3311-ultragoal-native-outside-tmux.test.ts +591 -0
  769. package/src/scripts/__tests__/issue-3358-ultragoal-cancel-lifecycle.test.ts +701 -0
  770. package/src/scripts/__tests__/issue-3369-autopilot-ralplan-state-machine.test.ts +211 -0
  771. package/src/scripts/__tests__/notify-state-io.test.ts +29 -0
  772. package/src/scripts/__tests__/notify-tmux-injection.test.ts +26 -1
  773. package/src/scripts/__tests__/postinstall.test.ts +23 -1
  774. package/src/scripts/__tests__/reasoning-artifact-contract.test.ts +129 -0
  775. package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +67 -185
  776. package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +79 -178
  777. package/src/scripts/__tests__/smoke-packed-install.test.ts +525 -16
  778. package/src/scripts/__tests__/verify-native-release-assets.test.ts +240 -0
  779. package/src/scripts/codex-native-hook.ts +14238 -1429
  780. package/src/scripts/codex-native-pre-post.ts +43 -12
  781. package/src/scripts/generate-native-release-manifest.ts +83 -79
  782. package/src/scripts/notify-fallback-watcher.ts +91 -122
  783. package/src/scripts/notify-hook/auto-nudge.ts +71 -3
  784. package/src/scripts/notify-hook/state-io.ts +11 -0
  785. package/src/scripts/notify-hook/team-dispatch.ts +242 -75
  786. package/src/scripts/notify-hook/team-leader-nudge.ts +72 -22
  787. package/src/scripts/notify-hook/team-tmux-guard.ts +366 -39
  788. package/src/scripts/notify-hook/team-worker-stop.ts +43 -20
  789. package/src/scripts/notify-hook/team-worker.ts +82 -31
  790. package/src/scripts/notify-hook/tmux-injection.ts +33 -3
  791. package/src/scripts/notify-hook.ts +84 -82
  792. package/src/scripts/postinstall-advisory.ts +67 -0
  793. package/src/scripts/postinstall.ts +1 -1
  794. package/src/scripts/smoke-packed-install.ts +3608 -39
  795. package/src/scripts/sync-plugin-mirror.ts +17 -1
  796. package/src/scripts/verify-native-release-assets.ts +39 -31
  797. package/templates/AGENTS.md +1 -0
  798. package/dist/subagents/__tests__/adapted-role-binding.test.d.ts +0 -2
  799. package/dist/subagents/__tests__/adapted-role-binding.test.d.ts.map +0 -1
  800. package/dist/subagents/__tests__/adapted-role-binding.test.js +0 -988
  801. package/dist/subagents/__tests__/adapted-role-binding.test.js.map +0 -1
  802. package/dist/subagents/adapted-role-binding.d.ts +0 -17
  803. package/dist/subagents/adapted-role-binding.d.ts.map +0 -1
  804. package/dist/subagents/adapted-role-binding.js +0 -75
  805. package/dist/subagents/adapted-role-binding.js.map +0 -1
@@ -1,14 +1,25 @@
1
1
  // @ts-nocheck
2
2
  import assert from 'node:assert/strict';
3
- import { access, chmod, mkdtemp, mkdir, rm, symlink, writeFile } from 'node:fs/promises';
3
+ import { access, chmod, mkdtemp, mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises';
4
4
  import { EventEmitter } from 'node:events';
5
5
  import { tmpdir } from 'node:os';
6
6
  import { delimiter, join } from 'node:path';
7
7
  import { PassThrough } from 'node:stream';
8
8
  import { test } from 'node:test';
9
9
  import {
10
+ assertPackedLaunchCwdPreserved,
11
+ assertInstalledPluginSurface,
12
+ assertInstalledReasoningDeclarationContract,
13
+ assertInstalledReasoningRuntimeContract,
14
+ assertInstalledRootReasoningHelp,
15
+ assertInstalledRootReasoningRejection,
16
+ assertInstalledTeamSkillContract,
17
+ assertPackedInstallFileMetadata,
18
+ assertPackedRegressionWorkflowState,
19
+ buildNativeHookSmokePayload,
10
20
  ensureRepoDependencies,
11
21
  hasUsableNodeModules,
22
+ buildPackedProbeEnv,
12
23
  buildPackedRegressionEnvironment,
13
24
  CODEX_APP_SERVER_TIMEOUTS,
14
25
  CodexAppServer,
@@ -16,25 +27,35 @@ import {
16
27
  MANAGED_CODEX_HOOK_EVENTS,
17
28
  PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS,
18
29
  PACKED_INSTALL_NATIVE_HOOK_REGRESSION_PROMPTS,
30
+ PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE,
19
31
  PACKED_INSTALL_SMOKE_CORE_COMMANDS,
20
32
  appendForeignHookGroups,
21
33
  appendDisplayOrderStableForeignHookGroups,
22
- buildNativeHookSmokePayload,
23
34
  createCodexBatchWriteEnvelope,
24
35
  createCodexHooksListEnvelope,
25
36
  createCodexInitializeEnvelope,
26
37
  foreignHookGroupSnapshot,
27
38
  generatedHookTrustState,
39
+ isForbiddenPackedInstallArtifact,
40
+ PACKED_INSTALL_FORBIDDEN_ARTIFACT_PATHS,
41
+ PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS,
42
+ PACKED_INSTALL_PLUGIN_MCP_TARGETS,
43
+ parseFakeCodexLaunches,
28
44
  parseNpmPackJsonOutput,
29
45
  parseCodexHooksListResult,
30
46
  probeCodexVersion,
47
+ parseArgs,
31
48
  resolveGitCommonDir,
32
49
  resolveReusableNodeModulesSource,
50
+ replacePathKeyCaseInsensitive,
51
+ resolvePackedSmokeRuntimeBinary,
33
52
  validateHookStdout,
53
+ shouldPackedRegressionStopBlock,
34
54
  assertCodexBatchWriteResult,
35
55
  assertGeneratedTrustMatchesCodex,
36
56
  managedCodexHooksByEvent,
37
57
  } from '../smoke-packed-install.js';
58
+ import { parseNativeSubagentResultDisposition } from '../../leader/contract.js';
38
59
 
39
60
  function createFakeCodexAppServer(
40
61
  onRequest: (request: Record<string, unknown>, child: EventEmitter & Record<string, unknown>) => void,
@@ -51,6 +72,126 @@ function createFakeCodexAppServer(
51
72
  }
52
73
 
53
74
 
75
+ test('packed smoke resolves and validates the platform-aware repo runtime', async () => {
76
+ const root = await mkdtemp(join(tmpdir(), 'omx-packed-runtime-'));
77
+ try {
78
+ const debugDir = join(root, 'target', 'debug');
79
+ await mkdir(debugDir, { recursive: true });
80
+ const runtimePath = join(debugDir, 'omx-runtime');
81
+ await writeFile(runtimePath, '#!/bin/sh\nexit 0\n');
82
+ await chmod(runtimePath, 0o755);
83
+ assert.equal(resolvePackedSmokeRuntimeBinary(root, { platform: 'linux' }), runtimePath);
84
+
85
+ const windowsRuntimePath = join(debugDir, 'omx-runtime.exe');
86
+ await writeFile(windowsRuntimePath, 'windows executable fixture');
87
+ assert.equal(resolvePackedSmokeRuntimeBinary(root, { platform: 'win32' }), windowsRuntimePath);
88
+ assert.throws(
89
+ () => resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: 'relative/omx-runtime' }),
90
+ /must be absolute/,
91
+ );
92
+ assert.equal(
93
+ resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: runtimePath }),
94
+ runtimePath,
95
+ );
96
+ assert.throws(
97
+ () => resolvePackedSmokeRuntimeBinary(join(root, 'missing'), { platform: 'linux' }),
98
+ /run "npm run build:runtime"/,
99
+ );
100
+ const nonExecutablePath = join(root, 'non-executable-runtime');
101
+ await writeFile(nonExecutablePath, 'not executable');
102
+ await chmod(nonExecutablePath, 0o644);
103
+ assert.throws(
104
+ () => resolvePackedSmokeRuntimeBinary(root, { platform: 'linux', candidate: nonExecutablePath }),
105
+ /executable regular file/,
106
+ );
107
+ } finally {
108
+ await rm(root, { recursive: true, force: true });
109
+ }
110
+ });
111
+
112
+ test('packed probe env strips ambient runtime and supports default, absent, and explicit provisioning', async () => {
113
+ const root = await mkdtemp(join(tmpdir(), 'omx-packed-probe-env-'));
114
+ try {
115
+ const debugDir = join(root, 'target', 'debug');
116
+ await mkdir(debugDir, { recursive: true });
117
+ const runtimePath = join(debugDir, 'omx-runtime');
118
+ await writeFile(runtimePath, '#!/bin/sh\nexit 0\n');
119
+ await chmod(runtimePath, 0o755);
120
+
121
+ const defaultEnv = buildPackedProbeEnv(
122
+ { OMX_RUNTIME_BINARY: '/tmp/ambient-decoy' },
123
+ { repoRoot: root },
124
+ );
125
+ assert.equal(defaultEnv.OMX_RUNTIME_BINARY, runtimePath);
126
+ const absentEnv = buildPackedProbeEnv({}, { runtimeBinary: null });
127
+ assert.equal(Object.hasOwn(absentEnv, 'OMX_RUNTIME_BINARY'), false);
128
+ const explicitEnv = buildPackedProbeEnv({}, { runtimeBinary: runtimePath });
129
+ assert.equal(explicitEnv.OMX_RUNTIME_BINARY, runtimePath);
130
+ assert.throws(
131
+ () => buildPackedProbeEnv({}, { runtimeBinary: 'relative/omx-runtime' }),
132
+ /must be absolute/,
133
+ );
134
+ } finally {
135
+ await rm(root, { recursive: true, force: true });
136
+ }
137
+ });
138
+
139
+ test('packed fail-closed PATH replacement removes a win32-shaped decoy runtime and every casing variant', async () => {
140
+ const root = await mkdtemp(join(tmpdir(), 'omx-packed-path-isolation-'));
141
+ try {
142
+ const decoyDir = join(root, 'decoy');
143
+ const isolatedDir = join(root, 'isolated');
144
+ await mkdir(decoyDir);
145
+ await mkdir(isolatedDir);
146
+ const decoyRuntime = join(decoyDir, 'omx-runtime.exe');
147
+ await writeFile(decoyRuntime, 'decoy');
148
+ await access(decoyRuntime);
149
+
150
+ const env = replacePathKeyCaseInsensitive(
151
+ { Path: decoyDir, PATH: join(root, 'other'), KEEP: '1' },
152
+ isolatedDir,
153
+ );
154
+ const pathKeys = Object.keys(env).filter((key) => key.toUpperCase() === 'PATH');
155
+ assert.deepEqual(pathKeys, ['Path']);
156
+ assert.equal(env.Path, isolatedDir);
157
+ assert.equal(env.Path.split(delimiter).includes(decoyDir), false);
158
+ assert.equal(env.KEEP, '1');
159
+ } finally {
160
+ await rm(root, { recursive: true, force: true });
161
+ }
162
+ });
163
+
164
+ test('packed fail-closed PATH replacement creates a single POSIX key when absent', () => {
165
+ const env = replacePathKeyCaseInsensitive({ KEEP: '1' }, '/isolated');
166
+ assert.deepEqual(env, { KEEP: '1', PATH: '/isolated' });
167
+ });
168
+
169
+ test('packed launch cwd assertion accepts filesystem aliases and rejects distinct directories', async () => {
170
+ if (process.platform === 'win32') return;
171
+ const root = await mkdtemp(join(tmpdir(), 'omx-packed-cwd-'));
172
+ try {
173
+ const realDir = join(root, 'real');
174
+ const otherDir = join(root, 'other');
175
+ const aliasDir = join(root, 'alias');
176
+ await mkdir(realDir);
177
+ await mkdir(otherDir);
178
+ await symlink(realDir, aliasDir);
179
+ assert.doesNotThrow(() => assertPackedLaunchCwdPreserved(realDir, aliasDir, 'cwd mismatch'));
180
+ assert.throws(
181
+ () => assertPackedLaunchCwdPreserved(realDir, otherDir, 'cwd mismatch'),
182
+ /cwd mismatch: expected .* received /,
183
+ );
184
+ } finally {
185
+ await rm(root, { recursive: true, force: true });
186
+ }
187
+ });
188
+
189
+ test('packed smoke arguments expose a probe-only mode and reject unknown flags', () => {
190
+ assert.deepEqual(parseArgs([]), { failClosedProbe: false });
191
+ assert.deepEqual(parseArgs(['--fail-closed-probe']), { failClosedProbe: true });
192
+ assert.throws(() => parseArgs(['--unknown']), /Unknown argument/);
193
+ });
194
+
54
195
  test('packed install smoke retains narrow boot commands and adds the isolated lifecycle separately', () => {
55
196
  assert.deepEqual(PACKED_INSTALL_SMOKE_CORE_COMMANDS, [
56
197
  ['--help'],
@@ -68,6 +209,51 @@ test('packed install smoke retains narrow boot commands and adds the isolated li
68
209
  );
69
210
  });
70
211
 
212
+ test('packed 0.144.5 fixture is sanitized, pointer-free, and kept separate from the 0.142.5 lifecycle pin', () => {
213
+ assert.deepEqual(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, {
214
+ hook_event_name: 'PreToolUse',
215
+ session_id: 'packed-01445-session',
216
+ turn_id: 'packed-01445-turn',
217
+ tool_name: 'Bash',
218
+ tool_use_id: 'packed-01445-tool',
219
+ tool_input: { command: 'omx ralplan role-intent write --role architect --parent-thread "$CODEX_THREAD_ID" --json' },
220
+ });
221
+ assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'tracker'), false);
222
+ assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'session_pointer'), false);
223
+ assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'cwd'), false);
224
+ assert.equal(Object.hasOwn(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE, 'thread_id'), false);
225
+ assert.equal(PACKED_CODEX_01445_NO_POINTER_NO_TRACKER_FIXTURE.session_id.includes('-'), true);
226
+ });
227
+
228
+ test('source parser regression keeps collaboration results authoritative over unrelated child prose', () => {
229
+ const successfulResponse = JSON.stringify({
230
+ success: true,
231
+ status: 'completed',
232
+ agents: [{ agent_name: '/root', agent_status: 'running' }],
233
+ output: 'Child succeeded; an optional adapter was unavailable, unsupported, and not found.',
234
+ });
235
+ for (const toolName of [
236
+ 'collaboration.spawn_agent',
237
+ 'collaboration.list_agents',
238
+ 'collaborationlist_agents',
239
+ 'collaboration.followup_task',
240
+ 'collaboration.wait_agent',
241
+ ]) {
242
+ assert.equal(parseNativeSubagentResultDisposition(toolName, successfulResponse).kind, 'success', toolName);
243
+ }
244
+
245
+ const nestedLifecycleOnly = JSON.stringify({
246
+ agents: [
247
+ { agent_name: '/root', agent_status: 'running' },
248
+ {
249
+ agent_name: '/root/reviewer',
250
+ agent_status: { completed: 'Optional adapter is unavailable and unsupported.' },
251
+ },
252
+ ],
253
+ });
254
+ assert.equal(parseNativeSubagentResultDisposition('collaborationlist_agents', nestedLifecycleOnly).kind, 'unknown');
255
+ });
256
+
71
257
  test('packed lifecycle keeps the pinned newline-delimited Codex app-server envelopes literal', () => {
72
258
  assert.deepEqual(createCodexInitializeEnvelope('omx-hook-trust-regression'), {
73
259
  id: 1,
@@ -668,24 +854,40 @@ test('packed lifecycle fails before probing the 33rd unique PATH candidate', asy
668
854
  if (process.platform === 'win32') return;
669
855
  const root = await mkdtemp(join(tmpdir(), 'omx-codex-candidate-budget-'));
670
856
  const candidateDirs = Array.from({ length: 33 }, (_value, index) => join(root, `candidate-${index}`));
671
- const thirtyThirdProbe = join(root, '33rd-candidate-was-probed');
857
+ // Duplicate the first PATH entry twice to demonstrate that PATH de-duplication
858
+ // (by resolved candidate path) does not consume extra candidate-budget slots,
859
+ // while still preserving first-occurrence probing order.
860
+ const pathValue = [candidateDirs[0], candidateDirs[0], ...candidateDirs].join(delimiter);
861
+ const spawnedExecutables: string[] = [];
862
+ const spawnSyncImpl = ((command: string) => {
863
+ spawnedExecutables.push(command);
864
+ return { status: 1, stdout: '', stderr: '', error: undefined };
865
+ }) as never;
672
866
  try {
673
867
  await Promise.all(candidateDirs.map((dir) => mkdir(dir, { recursive: true })));
674
- await Promise.all(candidateDirs.map(async (dir, index) => {
868
+ await Promise.all(candidateDirs.map(async (dir) => {
675
869
  const executable = join(dir, 'codex');
676
- await writeFile(
677
- executable,
678
- index === candidateDirs.length - 1
679
- ? `#!/bin/sh\n: > ${JSON.stringify(thirtyThirdProbe)}\nprintf '%s\\n' 'codex-cli 0.142.5'\n`
680
- : '#!/bin/sh\nexit 1\n',
681
- );
870
+ // These candidates are never actually executed: spawnSyncImpl is a
871
+ // deterministic seam that returns an immediate nonzero result without
872
+ // starting a real shell process. Only filesystem presence is real.
873
+ await writeFile(executable, '#!/bin/sh\nexit 1\n');
682
874
  await chmod(executable, 0o755);
683
875
  }));
684
876
  assert.throws(
685
- () => probeCodexVersion(root, { PATH: candidateDirs.join(delimiter) }),
877
+ () => probeCodexVersion(root, { PATH: pathValue }, { spawnSyncImpl }),
686
878
  /32-candidate PATH budget/,
687
879
  );
688
- await assert.rejects(access(thirtyThirdProbe));
880
+ assert.equal(spawnedExecutables.length, 32, 'must probe exactly 32 unique candidates before the budget error');
881
+ assert.deepEqual(
882
+ spawnedExecutables,
883
+ candidateDirs.slice(0, 32).map((dir) => join(dir, 'codex')),
884
+ 'must probe unique candidates in PATH order, with the duplicated first entry counted only once',
885
+ );
886
+ const thirtyThirdExecutable = join(candidateDirs[32], 'codex');
887
+ assert.ok(
888
+ !spawnedExecutables.includes(thirtyThirdExecutable),
889
+ 'the 33rd unique candidate must never be spawned',
890
+ );
689
891
  } finally {
690
892
  await rm(root, { recursive: true, force: true });
691
893
  }
@@ -804,6 +1006,17 @@ test('display-order-stable foreign fixture preserves pre-approved group and hand
804
1006
  );
805
1007
  });
806
1008
 
1009
+ test('packed install smoke probes every advertised plugin MCP target', () => {
1010
+ assert.deepEqual(PACKED_INSTALL_PLUGIN_MCP_TARGETS, [
1011
+ ['omx_state', 'state', 'omx-state'],
1012
+ ['omx_memory', 'memory', 'omx-memory'],
1013
+ ['omx_code_intel', 'code-intel', 'omx-code-intel'],
1014
+ ['omx_trace', 'trace', 'omx-trace'],
1015
+ ['omx_wiki', 'wiki', 'omx-wiki'],
1016
+ ['omx_hermes', 'hermes', 'omx-hermes'],
1017
+ ]);
1018
+ });
1019
+
807
1020
  test('packed install smoke covers every installed native hook event with minimal payloads', () => {
808
1021
  assert.deepEqual(PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS, [
809
1022
  'SessionStart',
@@ -933,13 +1146,13 @@ test('packed install smoke covers directive activation and terminal false-activa
933
1146
  { name: 'doc-preserves-earlier', prompt: 'Use autopilot mode; "note"; use $ralplan is the workflow command.', expectedSkill: 'autopilot', expectedStopBlock: true },
934
1147
  { name: 'doc-colon-followup', prompt: 'use $ralplan is the workflow command: use $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
935
1148
  { name: 'table-followup', prompt: 'Mode | Meaning\n--- | ---\nmanual | documentation\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
936
- { name: 'neg-advance-reopen', prompt: 'Do not run $ralplan but advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
937
- { name: 'neg-jump-reopen', prompt: 'Do not run $ralplan but jump straight to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
1149
+ { name: 'neg-advance-reopen', prompt: 'Do not run $ralplan but advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
1150
+ { name: 'neg-jump-reopen', prompt: 'Do not run $ralplan but jump straight to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
938
1151
  { name: 'reference-plain-title', prompt: '[docs]: /target "title\nplain text"\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
939
1152
  { name: 'reference-plain-destination', prompt: '[docs]: ./target\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
940
1153
  { name: 'directive-use-the', prompt: 'Do not run $ralplan; use the $autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true },
941
1154
  { name: 'directive-continue-after-quote', prompt: '"quoted"\ncontinue with $ralplan', expectedSkill: 'ralplan', expectedStopBlock: true },
942
- { name: 'doc-advance-followup', prompt: 'use $ralplan is the workflow command; advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false },
1155
+ { name: 'doc-advance-followup', prompt: 'use $ralplan is the workflow command; advance to $ultragoal', expectedSkill: 'ultragoal', expectedStopBlock: false, insideTmux: true },
943
1156
  { name: 'directive-run-code-review', prompt: 'run $code-review', expectedSkill: 'code-review', expectedStopBlock: false },
944
1157
  { name: 'directive-documentation', prompt: 'use $ralplan is the consensus-planning command', expectedSkill: null, expectedStopBlock: false },
945
1158
  { name: 'nested-bounded-child-unbounded-parent', prompt: '"`x`\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
@@ -971,13 +1184,39 @@ test('packed install smoke covers directive activation and terminal false-activa
971
1184
  { name: 'percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
972
1185
  { name: 'fullwidth-percent-suffix', prompt: '$ralplan%docs', expectedSkill: null, expectedStopBlock: false },
973
1186
  { name: 'g1a-ordered-multi-skill', prompt: '$ralplan, $autopilot; $team', expectedSkill: 'ralplan', expectedStopBlock: true, expectedDeferredSkills: ['autopilot', 'team'], expectedActiveSkills: ['ralplan'], insideTmux: true },
974
- { name: 'g1c-duplicate-alias', prompt: '$autopilot $oh-my-codex:autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true, expectedDeferredSkills: [], expectedActiveSkills: ['autopilot'] },
1187
+ { name: 'g1c-duplicate-alias', prompt: '$autopilot $oh-my-codex:autopilot build it', expectedSkill: 'autopilot', expectedStopBlock: true, expectedDeferredSkills: [], expectedActiveSkills: [] },
975
1188
  { name: 'b3-longer-valid-fence', prompt: '```text\n$autopilot build it\n````\n$ralplan plan it', expectedSkill: 'ralplan', expectedStopBlock: true },
976
1189
  { name: 'b4-shorter-invalid-fence', prompt: '````text\n$autopilot build it\n```\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
977
1190
  { name: 'b5-different-marker-invalid-fence', prompt: '```text\n$autopilot build it\n~~~\n$ralplan plan it', expectedSkill: null, expectedStopBlock: false },
978
1191
  ]);
979
1192
  });
980
1193
 
1194
+ test('packed regression workflow expectations distinguish active activation from receipt-unavailable Autopilot termination', () => {
1195
+ assert.doesNotThrow(() => assertPackedRegressionWorkflowState(
1196
+ { name: 'active-ralplan', expectedSkill: 'ralplan' },
1197
+ { active: true, skill: 'ralplan' },
1198
+ ));
1199
+ assert.doesNotThrow(() => assertPackedRegressionWorkflowState(
1200
+ { name: 'failed-autopilot', expectedSkill: 'autopilot' },
1201
+ {
1202
+ active: false,
1203
+ skill: 'autopilot',
1204
+ phase: 'failed',
1205
+ error: 'documented_host_consensus_receipt_unavailable',
1206
+ active_skills: [],
1207
+ },
1208
+ ));
1209
+ assert.throws(() => assertPackedRegressionWorkflowState(
1210
+ { name: 'stale-active-autopilot', expectedSkill: 'autopilot' },
1211
+ { active: true, skill: 'autopilot', phase: 'running', active_skills: [{ skill: 'autopilot' }] },
1212
+ ), /persisted unexpected workflow state/);
1213
+ });
1214
+
1215
+ test('packed regression Stop expectations release terminal receipt-unavailable Autopilot state', () => {
1216
+ assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'ralplan', expectedStopBlock: true }), true);
1217
+ assert.equal(shouldPackedRegressionStopBlock({ expectedSkill: 'autopilot', expectedStopBlock: true }), false);
1218
+ });
1219
+
981
1220
  test('packed regression environment clears inherited Team routing state', () => {
982
1221
  const environment = buildPackedRegressionEnvironment(
983
1222
  { name: 'poisoned-team-case', insideTmux: true },
@@ -1048,6 +1287,31 @@ test('packed install native hook stdout validation enforces event output contrac
1048
1287
  );
1049
1288
  });
1050
1289
 
1290
+ test('fake Codex launch capture preserves argv and runtime side-effect evidence', () => {
1291
+ const capture = `${JSON.stringify({
1292
+ argv: ['--', '--spark'],
1293
+ cwd: '/tmp/omx-packed-launch',
1294
+ hasResumeSqlite: true,
1295
+ OMX_NOTIFY_TEMP_CONTRACT: null,
1296
+ OMX_TEAM_WORKER_LAUNCH_ARGS: null,
1297
+ })}\n`;
1298
+ assert.deepEqual(parseFakeCodexLaunches(capture), [{
1299
+ argv: ['--', '--spark'],
1300
+ cwd: '/tmp/omx-packed-launch',
1301
+ hasResumeSqlite: true,
1302
+ OMX_NOTIFY_TEMP_CONTRACT: null,
1303
+ OMX_TEAM_WORKER_LAUNCH_ARGS: null,
1304
+ }]);
1305
+ assert.throws(
1306
+ () => parseFakeCodexLaunches(`${JSON.stringify({
1307
+ argv: ['--spark'],
1308
+ cwd: '/tmp/omx-packed-launch',
1309
+ OMX_NOTIFY_TEMP_CONTRACT: null,
1310
+ })}\n`),
1311
+ /fake Codex capture did not contain a valid launch record/,
1312
+ );
1313
+ });
1314
+
1051
1315
  test('parseNpmPackJsonOutput ignores prepack logs before npm pack JSON', () => {
1052
1316
  const parsed = parseNpmPackJsonOutput([
1053
1317
  '[sync-plugin-mirror] synced 29 canonical skill directories and plugin metadata',
@@ -1062,6 +1326,251 @@ test('parseNpmPackJsonOutput ignores prepack logs before npm pack JSON', () => {
1062
1326
  assert.deepEqual(parsed, [{ filename: 'oh-my-codex-0.15.0.tgz' }]);
1063
1327
  });
1064
1328
 
1329
+ test('packed install metadata requires runtime, declarations, Team skills, and plugin assets only', () => {
1330
+ const files = PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS.map((path) => ({ path }));
1331
+ assert.doesNotThrow(() => assertPackedInstallFileMetadata(files));
1332
+ assert.equal(
1333
+ PACKED_INSTALL_REQUIRED_ARTIFACT_PATHS.some((path) => path.startsWith('docs/')),
1334
+ false,
1335
+ 'repository documentation must not become an npm package requirement',
1336
+ );
1337
+ assert.throws(
1338
+ () => assertPackedInstallFileMetadata(files.slice(1)),
1339
+ /npm pack is missing required artifact: dist\/config\/models\.js/,
1340
+ );
1341
+ assert.throws(
1342
+ () => assertPackedInstallFileMetadata([...files, { path: 'docs/reference/omx-config-schema-routing.md' }]),
1343
+ /npm pack includes forbidden workspace artifact: docs\/reference\/omx-config-schema-routing\.md/,
1344
+ );
1345
+
1346
+ for (const path of [
1347
+ '.gjc/session/plan.md',
1348
+ 'docs/reference/page.md',
1349
+ '.omx/state/team.json',
1350
+ 'artifact.tgz',
1351
+ 'tmp/smoke-output.txt',
1352
+ 'temp/smoke-output.json',
1353
+ 'scratch.tmp',
1354
+ ]) {
1355
+ assert.equal(isForbiddenPackedInstallArtifact(path), true, `expected ${path} to be rejected`);
1356
+ }
1357
+ for (const prefix of PACKED_INSTALL_FORBIDDEN_ARTIFACT_PATHS) {
1358
+ assert.equal(isForbiddenPackedInstallArtifact(`${prefix}probe`), true);
1359
+ }
1360
+ assert.equal(isForbiddenPackedInstallArtifact('templates/AGENTS.md'), false);
1361
+ assert.equal(isForbiddenPackedInstallArtifact('dist/notifications/__tests__/temp-mode.test.d.ts'), false);
1362
+ });
1363
+
1364
+ test('packed install helpers enforce root rejection and no config mutation', () => {
1365
+ const help = 'Usage: omx reasoning <low|medium|high|xhigh>\n --xhigh\n';
1366
+ assert.doesNotThrow(() => assertInstalledRootReasoningHelp(help));
1367
+ assert.throws(() => assertInstalledRootReasoningHelp(`${help} --max\n`), /must not advertise --max/);
1368
+
1369
+ const maxStderr = [
1370
+ 'Reasoning mode "max" is not supported by "omx reasoning".',
1371
+ 'Per-agent "max" is configured with agentReasoning; direct -c model_reasoning_effort=... is passed to Codex and remains capability-dependent.',
1372
+ 'Invalid reasoning mode "max". Expected one of: low, medium, high, xhigh.',
1373
+ 'Usage: omx reasoning <low|medium|high|xhigh>',
1374
+ ].join('\n');
1375
+ assert.doesNotThrow(() => assertInstalledRootReasoningRejection(
1376
+ 'max',
1377
+ { status: 1, stdout: '', stderr: maxStderr },
1378
+ undefined,
1379
+ undefined,
1380
+ ));
1381
+ assert.throws(
1382
+ () => assertInstalledRootReasoningRejection('max', { status: 1, stdout: '', stderr: maxStderr }, undefined, 'created'),
1383
+ /must not create or mutate config\.toml/,
1384
+ );
1385
+
1386
+ const ultraStderr = [
1387
+ 'Reasoning mode "ultra" is not supported by OMX root or per-agent reasoning and is not an alias for "max".',
1388
+ 'Direct -c model_reasoning_effort=... remains opaque Codex passthrough.',
1389
+ 'Invalid reasoning mode "ultra". Expected one of: low, medium, high, xhigh.',
1390
+ 'Usage: omx reasoning <low|medium|high|xhigh>',
1391
+ ].join('\n');
1392
+ assert.doesNotThrow(() => assertInstalledRootReasoningRejection(
1393
+ 'ultra',
1394
+ { status: 1, stdout: '', stderr: ultraStderr },
1395
+ 'model = "preserve"\n',
1396
+ 'model = "preserve"\n',
1397
+ ));
1398
+ });
1399
+
1400
+ test('packed install helpers freeze installed runtime and declaration reasoning contracts', () => {
1401
+ const models = {
1402
+ CANONICAL_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh'],
1403
+ AMBIGUOUS_UNSUPPORTED_REASONING_EFFORTS: ['max', 'ultra'],
1404
+ PER_AGENT_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh', 'max'],
1405
+ ROOT_REASONING_EFFORTS: ['low', 'medium', 'high', 'xhigh'],
1406
+ ROOT_UNSUPPORTED_REASONING_EFFORTS: ['max', 'ultra'],
1407
+ isAmbiguousUnsupportedReasoningEffort: (value: string) => value.toLowerCase() === 'max' || value.toLowerCase() === 'ultra',
1408
+ isUnsupportedRootReasoningEffort: (value: string) => value.toLowerCase() === 'max' || value.toLowerCase() === 'ultra',
1409
+ normalizeUnsupportedRootReasoningEffort: (value: string) => {
1410
+ const normalized = value.trim().toLowerCase();
1411
+ return normalized === 'max' || normalized === 'ultra' ? normalized : undefined;
1412
+ },
1413
+ };
1414
+ assert.doesNotThrow(() => assertInstalledReasoningRuntimeContract(models));
1415
+
1416
+ const modelsDeclaration = [
1417
+ 'export declare const CANONICAL_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh"];',
1418
+ 'export type ConfiguredAgentReasoningEffort = (typeof CANONICAL_REASONING_EFFORTS)[number];',
1419
+ 'export declare const AMBIGUOUS_UNSUPPORTED_REASONING_EFFORTS: readonly ["max", "ultra"];',
1420
+ 'export declare const PER_AGENT_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh", "max"];',
1421
+ 'export type PerAgentReasoningEffort = (typeof PER_AGENT_REASONING_EFFORTS)[number];',
1422
+ 'export declare const ROOT_REASONING_EFFORTS: readonly ["low", "medium", "high", "xhigh"];',
1423
+ 'export type RootReasoningEffort = (typeof ROOT_REASONING_EFFORTS)[number];',
1424
+ 'export declare const ROOT_UNSUPPORTED_REASONING_EFFORTS: readonly ["max", "ultra"];',
1425
+ 'export declare function isUnsupportedRootReasoningEffort(value: string): boolean;',
1426
+ 'export declare function normalizeUnsupportedRootReasoningEffort(value: string): RootUnsupportedReasoningEffort | undefined;',
1427
+ ].join('\n');
1428
+ const definitionsDeclaration = [
1429
+ 'export interface AgentDefinition {',
1430
+ " reasoningEffort: 'low' | 'medium' | 'high' | 'xhigh';",
1431
+ '}',
1432
+ ].join('\n');
1433
+ assert.doesNotThrow(() => assertInstalledReasoningDeclarationContract({
1434
+ models: modelsDeclaration,
1435
+ definitions: definitionsDeclaration,
1436
+ nativeConfig: 'export interface GeneratedNativeAgentConfig {\n reasoningEffort?: PerAgentReasoningEffort;\n}',
1437
+ team: 'export type TeamReasoningEffort = PerAgentReasoningEffort;',
1438
+ }));
1439
+ assert.throws(
1440
+ () => assertInstalledReasoningDeclarationContract({
1441
+ models: modelsDeclaration.replace(': boolean;', ': value is RootUnsupportedReasoningEffort;'),
1442
+ definitions: definitionsDeclaration,
1443
+ nativeConfig: 'reasoningEffort?: PerAgentReasoningEffort;',
1444
+ team: 'export type TeamReasoningEffort = PerAgentReasoningEffort;',
1445
+ }),
1446
+ /plain boolean, not a type predicate/,
1447
+ );
1448
+ });
1449
+
1450
+ test('packed install removes same-user native-anchor authentication', async () => {
1451
+ const hookSource = await readFile(join(process.cwd(), 'src/scripts/codex-native-hook.ts'), 'utf8');
1452
+ const cliSource = await readFile(join(process.cwd(), 'src/cli/index.ts'), 'utf8');
1453
+ assert.doesNotMatch(hookSource, /isVerifiedPluginLauncherClaim|classifyNativeTranscriptProvenance|signNativeLeaderAttestation|native-anchor-auth/);
1454
+ assert.match(hookSource, /unsupported_documented_leader_proof/);
1455
+ assert.match(cliSource, /execWithOverlay[\s\S]+OMX_CODEX_LAUNCH_ID[\s\S]+buildHudRuntimeEnv\(\{ sessionId/);
1456
+ });
1457
+
1458
+ test('packed install contract requires canonical/plugin Team skill parity and text', async () => {
1459
+ const canonical = await readFile(join(process.cwd(), 'skills/team/SKILL.md'));
1460
+ const pluginMirror = await readFile(join(process.cwd(), 'plugins/oh-my-codex/skills/team/SKILL.md'));
1461
+ assert.doesNotThrow(() => assertInstalledTeamSkillContract(canonical, pluginMirror));
1462
+ });
1463
+
1464
+ test('packed install plugin assertions enforce the packaged plugin contract', async () => {
1465
+ const root = await mkdtemp(join(tmpdir(), 'omx-packed-plugin-surface-'));
1466
+ try {
1467
+ const pluginRoot = join(root, 'plugins/oh-my-codex');
1468
+ const pluginManifestPath = join(pluginRoot, '.codex-plugin/plugin.json');
1469
+ const mcpManifestPath = join(pluginRoot, '.mcp.json');
1470
+ const appManifestPath = join(pluginRoot, '.app.json');
1471
+ const hooksManifestPath = join(pluginRoot, 'hooks/hooks.json');
1472
+ const hookLauncherPath = join(pluginRoot, 'hooks/codex-native-hook.mjs');
1473
+ const hookCommand = 'node "${PLUGIN_ROOT}/hooks/codex-native-hook.mjs"';
1474
+ await mkdir(join(pluginRoot, '.codex-plugin'), { recursive: true });
1475
+ await mkdir(join(pluginRoot, 'hooks'), { recursive: true });
1476
+
1477
+ const writeValidPluginSurface = async (): Promise<void> => {
1478
+ await writeFile(pluginManifestPath, JSON.stringify({
1479
+ name: 'oh-my-codex',
1480
+ version: '0.0.0-test',
1481
+ skills: './skills/',
1482
+ mcpServers: './.mcp.json',
1483
+ apps: './.app.json',
1484
+ hooks: './hooks/hooks.json',
1485
+ interface: {
1486
+ displayName: 'OMX',
1487
+ shortDescription: 'Test plugin',
1488
+ longDescription: 'Structurally valid plugin test fixture.',
1489
+ developerName: 'Test',
1490
+ category: 'Developer Tools',
1491
+ },
1492
+ }));
1493
+ await writeFile(mcpManifestPath, JSON.stringify({
1494
+ mcpServers: Object.fromEntries([
1495
+ ['omx_state', 'state'],
1496
+ ['omx_memory', 'memory'],
1497
+ ['omx_code_intel', 'code-intel'],
1498
+ ['omx_trace', 'trace'],
1499
+ ['omx_wiki', 'wiki'],
1500
+ ['omx_hermes', 'hermes'],
1501
+ ].map(([name, service]) => [name, {
1502
+ command: 'omx',
1503
+ args: ['mcp-serve', service],
1504
+ enabled: false,
1505
+ }])),
1506
+ }));
1507
+ await writeFile(appManifestPath, JSON.stringify({ apps: {} }));
1508
+ await writeFile(hooksManifestPath, JSON.stringify({
1509
+ hooks: Object.fromEntries(PACKED_INSTALL_NATIVE_HOOK_SMOKE_EVENTS.map((eventName) => [eventName, [{
1510
+ hooks: [{ type: 'command', command: hookCommand }],
1511
+ }]])),
1512
+ }));
1513
+ await writeFile(hookLauncherPath, [
1514
+ '#!/usr/bin/env node',
1515
+ "import { spawn } from 'node:child_process';",
1516
+ "import { join } from 'node:path';",
1517
+ "const OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER = 'omx-plugin-hook-launcher:v1';",
1518
+ "const OMX_PLUGIN_HOOK_ROUTING_ONLY_MARKER = 'omx-plugin-hook-routing-only:v1';",
1519
+ "const hookDir = new URL('.', import.meta.url).pathname;",
1520
+ 'function readPinnedLauncher() {',
1521
+ " const launcherPath = join(hookDir, 'omx-command.json');",
1522
+ ' return { command: process.execPath, argsPrefix: [], launcherPath };',
1523
+ '}',
1524
+ 'const input = Buffer.from(\'\');',
1525
+ 'const { command, argsPrefix } = readPinnedLauncher();',
1526
+ "const child = spawn(command, [...argsPrefix, 'codex-native-hook']);",
1527
+ 'child.stdin.end(input);',
1528
+ '',
1529
+ ].join('\n'));
1530
+ };
1531
+
1532
+ await writeValidPluginSurface();
1533
+ assert.doesNotThrow(() => assertInstalledPluginSurface(root));
1534
+
1535
+ await writeValidPluginSurface();
1536
+ await writeFile(hookLauncherPath, [
1537
+ '#!/usr/bin/env node',
1538
+ "const OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER = 'omx-plugin-hook-launcher:v1';",
1539
+ 'process.stdout.write(OMX_PLUGIN_HOOK_LAUNCHER_CONTRACT_MARKER);',
1540
+ '',
1541
+ ].join('\n'));
1542
+ assert.throws(
1543
+ () => assertInstalledPluginSurface(root),
1544
+ /must read its pinned omx-command\.json delegate configuration/,
1545
+ );
1546
+
1547
+ await writeFile(pluginManifestPath, '{}');
1548
+ assert.throws(() => assertInstalledPluginSurface(root), /plugin\.json\.name/);
1549
+
1550
+ await writeValidPluginSurface();
1551
+ await writeFile(mcpManifestPath, JSON.stringify({ mcpServers: {} }));
1552
+ assert.throws(() => assertInstalledPluginSurface(root), /omx_state/);
1553
+
1554
+ await writeValidPluginSurface();
1555
+ await writeFile(appManifestPath, JSON.stringify({ apps: [] }));
1556
+ assert.throws(() => assertInstalledPluginSurface(root), /\.app\.json\.apps/);
1557
+
1558
+ await writeValidPluginSurface();
1559
+ await writeFile(hooksManifestPath, JSON.stringify({ hooks: {} }));
1560
+ assert.throws(() => assertInstalledPluginSurface(root), /hook event is missing: SessionStart/);
1561
+
1562
+ await writeValidPluginSurface();
1563
+ await writeFile(hookLauncherPath, 'export {};\n');
1564
+ assert.throws(() => assertInstalledPluginSurface(root), /must start with a Node shebang/);
1565
+
1566
+ await writeValidPluginSurface();
1567
+ await writeFile(mcpManifestPath, '{not-json');
1568
+ assert.throws(() => assertInstalledPluginSurface(root), /plugin manifest is not parseable JSON/);
1569
+ } finally {
1570
+ await rm(root, { recursive: true, force: true });
1571
+ }
1572
+ });
1573
+
1065
1574
  test('resolveGitCommonDir resolves relative git common dir output against the repo root', () => {
1066
1575
  const commonDir = resolveGitCommonDir('/tmp/worktree', () => ({
1067
1576
  status: 0,