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,7 +1,25 @@
1
1
  import { delimiter, isAbsolute, join, relative, resolve as resolvePath } from 'path';
2
- import { existsSync, realpathSync } from 'fs';
2
+ import { existsSync, realpathSync, readFileSync } from 'fs';
3
3
  import { readFile, readdir } from 'fs/promises';
4
- import { isSessionStateUsable, readUsableSessionState, } from '../hooks/session.js';
4
+ import { classifySessionStateLiveness, isSessionStateUsable, } from '../hooks/session.js';
5
+ export const VERIFIED_SESSION_BINDING_FIELDS = [
6
+ 'session_id',
7
+ 'native_session_id',
8
+ 'codex_session_id',
9
+ 'previous_native_session_id',
10
+ 'owner_omx_session_id',
11
+ 'owner_codex_session_id',
12
+ ];
13
+ function verifiedSessionAliases(state) {
14
+ const raw = state;
15
+ const aliases = {};
16
+ for (const field of VERIFIED_SESSION_BINDING_FIELDS) {
17
+ const normalized = normalizeSessionId(raw[field]);
18
+ if (normalized)
19
+ aliases[field] = normalized;
20
+ }
21
+ return aliases;
22
+ }
5
23
  export const SESSION_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
6
24
  export const STATE_MODE_SEGMENT_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
7
25
  const STATE_FILE_SUFFIX = '-state.json';
@@ -14,6 +32,8 @@ const OMX_SESSION_ID_ENV = 'OMX_SESSION_ID';
14
32
  export const WRITABLE_STATE_SCOPE_ERRORS = {
15
33
  unusableSession: 'Cannot resolve writable state scope: session.json is present but unusable.',
16
34
  unboundEnvironment: 'Cannot resolve writable state scope: OMX_SESSION_ID is not bound to session.json.',
35
+ sessionBindingMismatch: 'Cannot resolve writable state scope: OMX_SESSION_ID does not match the live session recorded in session.json.',
36
+ scopeChangedDuringWrite: 'Cannot commit the state write: the writable state scope changed while the write was in progress.',
17
37
  };
18
38
  export function normalizeSessionId(sessionId) {
19
39
  if (typeof sessionId !== 'string')
@@ -51,7 +71,7 @@ export function validateStateModeSegment(mode) {
51
71
  }
52
72
  return normalized;
53
73
  }
54
- function getStateFilename(mode) {
74
+ export function getStateFilename(mode) {
55
75
  return `${validateStateModeSegment(mode)}${STATE_FILE_SUFFIX}`;
56
76
  }
57
77
  export function validateStateFileName(fileName) {
@@ -92,14 +112,14 @@ function convertWslToWindowsPath(raw) {
92
112
  const rest = String(m[2] || '').replace(/\//g, '\\');
93
113
  return rest ? `${drive}:\\${rest}` : `${drive}:\\`;
94
114
  }
95
- export function resolveWorkingDirectoryForState(workingDirectory) {
115
+ export function resolveWorkingDirectoryForState(workingDirectory, env = process.env) {
96
116
  const raw = typeof workingDirectory === 'string' ? workingDirectory.trim() : '';
97
117
  if (raw.includes('\0')) {
98
118
  throw new Error('workingDirectory contains a NUL byte');
99
119
  }
100
120
  if (!raw) {
101
121
  const cwd = resolvePath(process.cwd());
102
- return enforceWorkingDirectoryPolicy(cwd);
122
+ return enforceWorkingDirectoryPolicy(cwd, env);
103
123
  }
104
124
  let normalized = raw;
105
125
  if (process.platform === 'win32') {
@@ -118,7 +138,7 @@ export function resolveWorkingDirectoryForState(workingDirectory) {
118
138
  throw new Error('workingDirectory contains a NUL byte');
119
139
  }
120
140
  const resolved = resolvePath(normalized);
121
- return enforceWorkingDirectoryPolicy(resolved);
141
+ return enforceWorkingDirectoryPolicy(resolved, env);
122
142
  }
123
143
  function canonicalizeExistingPath(path) {
124
144
  try {
@@ -147,8 +167,8 @@ function canonicalizeExistingPath(path) {
147
167
  }
148
168
  return path;
149
169
  }
150
- function parseAllowedWorkingDirectoryRoots() {
151
- const raw = process.env[WORKDIR_ALLOWLIST_ENV];
170
+ function parseAllowedWorkingDirectoryRoots(env = process.env) {
171
+ const raw = env[WORKDIR_ALLOWLIST_ENV];
152
172
  if (typeof raw !== 'string' || raw.trim() === '')
153
173
  return [];
154
174
  const roots = raw
@@ -172,8 +192,8 @@ function isWithinRoot(path, root) {
172
192
  const rel = relative(root, path);
173
193
  return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
174
194
  }
175
- function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory) {
176
- const roots = parseAllowedWorkingDirectoryRoots();
195
+ function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory, env = process.env) {
196
+ const roots = parseAllowedWorkingDirectoryRoots(env);
177
197
  if (roots.length === 0)
178
198
  return resolvedWorkingDirectory;
179
199
  const canonicalWorkingDirectory = canonicalizeExistingPath(resolvedWorkingDirectory);
@@ -183,23 +203,366 @@ function enforceWorkingDirectoryPolicy(resolvedWorkingDirectory) {
183
203
  }
184
204
  return canonicalWorkingDirectory;
185
205
  }
186
- export function getBaseStateDirWithSource(workingDirectory) {
187
- const teamStateRootOverride = process.env[OMX_TEAM_STATE_ROOT_ENV]?.trim();
206
+ function sessionPointerMatchesId(pointer, sessionId) {
207
+ return [
208
+ pointer.session_id,
209
+ pointer.native_session_id,
210
+ pointer.owner_omx_session_id,
211
+ pointer.owner_codex_session_id,
212
+ pointer.codex_session_id,
213
+ ].some((value) => normalizeSessionId(value) === sessionId);
214
+ }
215
+ function discoverSessionAuthorityBaseStateDir(workingDirectory, env = process.env, onMatch) {
216
+ const sessionId = normalizeSessionId(env[OMX_SESSION_ID_ENV]);
217
+ if (!sessionId)
218
+ return undefined;
219
+ let current = resolveWorkingDirectoryForState(workingDirectory, env);
220
+ const observedCwd = canonicalizeExistingPath(current);
221
+ const allowedRoots = parseAllowedWorkingDirectoryRoots(env);
222
+ const matches = [];
223
+ while (true) {
224
+ const canonicalCurrent = canonicalizeExistingPath(current);
225
+ if (allowedRoots.length > 0 && !allowedRoots.some((root) => isWithinRoot(canonicalCurrent, root)))
226
+ break;
227
+ const candidate = join(current, '.omx', 'state');
228
+ const canonicalCandidate = canonicalizeExistingPath(candidate);
229
+ if (allowedRoots.length > 0 && !allowedRoots.some((root) => isWithinRoot(canonicalCandidate, root))) {
230
+ const parent = resolvePath(current, '..');
231
+ if (parent === current)
232
+ break;
233
+ current = parent;
234
+ continue;
235
+ }
236
+ const pointerPath = join(canonicalCandidate, 'session.json');
237
+ if (existsSync(pointerPath)) {
238
+ try {
239
+ const raw = readFileSync(pointerPath, 'utf8');
240
+ const parsed = JSON.parse(raw);
241
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
242
+ const state = parsed;
243
+ const recordedCwd = typeof state.cwd === 'string'
244
+ ? canonicalizeExistingPath(resolvePath(state.cwd))
245
+ : '';
246
+ const recordedStateRoot = typeof state.state_root === 'string'
247
+ ? canonicalizeExistingPath(resolvePath(state.state_root))
248
+ : recordedCwd
249
+ ? canonicalizeExistingPath(join(recordedCwd, '.omx', 'state'))
250
+ : '';
251
+ if (sessionPointerMatchesId(state, sessionId)
252
+ && recordedCwd
253
+ && recordedStateRoot === canonicalCandidate
254
+ && isWithinRoot(observedCwd, recordedCwd)
255
+ && isSessionStateUsable(state, recordedCwd)) {
256
+ matches.push(canonicalCandidate);
257
+ onMatch?.({ baseStateDir: canonicalCandidate, raw, state, recordedCwd });
258
+ }
259
+ }
260
+ }
261
+ catch {
262
+ // Malformed pointers are classified by the normal state-scope resolver.
263
+ }
264
+ }
265
+ const parent = resolvePath(current, '..');
266
+ if (parent === current)
267
+ break;
268
+ current = parent;
269
+ }
270
+ const uniqueMatches = [...new Set(matches)];
271
+ if (uniqueMatches.length > 1) {
272
+ throw new Error(`Conflicting authoritative state roots for OMX_SESSION_ID ${sessionId}: ${uniqueMatches.join(', ')}`);
273
+ }
274
+ return uniqueMatches[0];
275
+ }
276
+ function validateResolvedBaseStateDir(baseStateDir, rootSource, env) {
277
+ const allowedRoots = parseAllowedWorkingDirectoryRoots(env);
278
+ if (allowedRoots.length > 0) {
279
+ const canonicalBaseStateDir = canonicalizeExistingPath(baseStateDir);
280
+ if (!allowedRoots.some((root) => isWithinRoot(canonicalBaseStateDir, root))) {
281
+ throw new Error(`State root "${canonicalBaseStateDir}" is outside allowed roots (${WORKDIR_ALLOWLIST_ENV})`);
282
+ }
283
+ }
284
+ return { baseStateDir, rootSource };
285
+ }
286
+ export function getBaseStateDirWithSource(workingDirectory, env = process.env) {
287
+ const teamStateRootOverride = env[OMX_TEAM_STATE_ROOT_ENV]?.trim();
188
288
  if (typeof teamStateRootOverride === 'string' && teamStateRootOverride !== '') {
189
- return { baseStateDir: resolveWorkingDirectoryForState(teamStateRootOverride), rootSource: 'team-env' };
289
+ return validateResolvedBaseStateDir(resolveWorkingDirectoryForState(teamStateRootOverride, env), 'team-env', env);
190
290
  }
191
- const omxRootOverride = process.env[OMX_ROOT_ENV]?.trim();
291
+ const omxRootOverride = env[OMX_ROOT_ENV]?.trim();
192
292
  if (typeof omxRootOverride === 'string' && omxRootOverride !== '') {
193
- return { baseStateDir: join(resolveWorkingDirectoryForState(omxRootOverride), '.omx', 'state'), rootSource: 'omx-root-env' };
293
+ return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxRootOverride, env), '.omx', 'state'), 'omx-root-env', env);
194
294
  }
195
- const omxStateRootOverride = process.env[OMX_STATE_ROOT_ENV]?.trim();
295
+ const omxStateRootOverride = env[OMX_STATE_ROOT_ENV]?.trim();
196
296
  if (typeof omxStateRootOverride === 'string' && omxStateRootOverride !== '') {
197
- return { baseStateDir: join(resolveWorkingDirectoryForState(omxStateRootOverride), '.omx', 'state'), rootSource: 'omx-state-root-env' };
297
+ return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxStateRootOverride, env), '.omx', 'state'), 'omx-state-root-env', env);
198
298
  }
199
- return { baseStateDir: join(resolveWorkingDirectoryForState(workingDirectory), '.omx', 'state'), rootSource: 'cwd-default' };
299
+ const sessionAuthority = discoverSessionAuthorityBaseStateDir(workingDirectory, env);
300
+ if (sessionAuthority) {
301
+ return validateResolvedBaseStateDir(sessionAuthority, 'session-authority', env);
302
+ }
303
+ return validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(workingDirectory, env), '.omx', 'state'), 'cwd-default', env);
304
+ }
305
+ export function getBaseStateDir(workingDirectory, env = process.env) {
306
+ return getBaseStateDirWithSource(workingDirectory, env).baseStateDir;
200
307
  }
201
- export function getBaseStateDir(workingDirectory) {
202
- return getBaseStateDirWithSource(workingDirectory).baseStateDir;
308
+ function bindingRootSelector(env) {
309
+ if (typeof env[OMX_TEAM_STATE_ROOT_ENV] === 'string' && env[OMX_TEAM_STATE_ROOT_ENV].trim() !== '') {
310
+ return { source: 'team-env', selector: OMX_TEAM_STATE_ROOT_ENV };
311
+ }
312
+ if (typeof env[OMX_ROOT_ENV] === 'string' && env[OMX_ROOT_ENV].trim() !== '') {
313
+ return { source: 'omx-root-env', selector: OMX_ROOT_ENV };
314
+ }
315
+ if (typeof env[OMX_STATE_ROOT_ENV] === 'string' && env[OMX_STATE_ROOT_ENV].trim() !== '') {
316
+ return { source: 'omx-state-root-env', selector: OMX_STATE_ROOT_ENV };
317
+ }
318
+ return undefined;
319
+ }
320
+ /**
321
+ * Read the selected session pointer once and classify its canonical binding.
322
+ * This is intentionally read-only: it never probes fallback roots, repairs
323
+ * pointers, touches tmux, or mutates the supplied environment.
324
+ */
325
+ export async function readCanonicalSessionBindingSnapshot(workingDirectory, env = process.env) {
326
+ let cwd;
327
+ try {
328
+ cwd = resolveWorkingDirectoryForState(workingDirectory, env);
329
+ }
330
+ catch {
331
+ let fallbackCwd = process.cwd();
332
+ try {
333
+ if (typeof workingDirectory === 'string' && workingDirectory.trim())
334
+ fallbackCwd = resolvePath(workingDirectory);
335
+ }
336
+ catch {
337
+ // Keep the process cwd as a safe diagnostic anchor.
338
+ }
339
+ return {
340
+ cwd: fallbackCwd,
341
+ ...(bindingRootSelector(env) ? { rootSource: bindingRootSelector(env)?.source } : normalizeSessionId(env[OMX_SESSION_ID_ENV]) ? { rootSource: 'session-authority' } : {}),
342
+ status: 'resolution-error',
343
+ verifiedAliases: {},
344
+ };
345
+ }
346
+ let resolved;
347
+ let selectedObservation;
348
+ try {
349
+ const teamStateRootOverride = env[OMX_TEAM_STATE_ROOT_ENV]?.trim();
350
+ const omxRootOverride = env[OMX_ROOT_ENV]?.trim();
351
+ const omxStateRootOverride = env[OMX_STATE_ROOT_ENV]?.trim();
352
+ if (teamStateRootOverride) {
353
+ resolved = validateResolvedBaseStateDir(resolveWorkingDirectoryForState(teamStateRootOverride, env), 'team-env', env);
354
+ }
355
+ else if (omxRootOverride) {
356
+ resolved = validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxRootOverride, env), '.omx', 'state'), 'omx-root-env', env);
357
+ }
358
+ else if (omxStateRootOverride) {
359
+ resolved = validateResolvedBaseStateDir(join(resolveWorkingDirectoryForState(omxStateRootOverride, env), '.omx', 'state'), 'omx-state-root-env', env);
360
+ }
361
+ else {
362
+ const sessionAuthority = discoverSessionAuthorityBaseStateDir(cwd, env, (observation) => {
363
+ selectedObservation = observation;
364
+ });
365
+ if (sessionAuthority) {
366
+ resolved = validateResolvedBaseStateDir(sessionAuthority, 'session-authority', env);
367
+ }
368
+ else {
369
+ resolved = validateResolvedBaseStateDir(join(cwd, '.omx', 'state'), 'cwd-default', env);
370
+ }
371
+ }
372
+ }
373
+ catch {
374
+ const selector = bindingRootSelector(env);
375
+ return {
376
+ cwd,
377
+ ...(selector ? { rootSource: selector.source } : normalizeSessionId(env[OMX_SESSION_ID_ENV]) ? { rootSource: 'session-authority' } : {}),
378
+ status: 'resolution-error',
379
+ verifiedAliases: {},
380
+ };
381
+ }
382
+ const baseStateDir = resolved.baseStateDir;
383
+ const selectedSessionJson = join(baseStateDir, 'session.json');
384
+ let raw;
385
+ let parsed;
386
+ if (selectedObservation && selectedObservation.baseStateDir === baseStateDir) {
387
+ raw = selectedObservation.raw;
388
+ parsed = selectedObservation.state;
389
+ }
390
+ else {
391
+ try {
392
+ raw = await readFile(selectedSessionJson, 'utf-8');
393
+ }
394
+ catch (error) {
395
+ if (error.code === 'ENOENT') {
396
+ return {
397
+ cwd,
398
+ baseStateDir,
399
+ rootSource: resolved.rootSource,
400
+ selectedSessionJson,
401
+ status: 'absent',
402
+ verifiedAliases: {},
403
+ };
404
+ }
405
+ return {
406
+ cwd,
407
+ baseStateDir,
408
+ rootSource: resolved.rootSource,
409
+ selectedSessionJson,
410
+ status: 'read-error',
411
+ verifiedAliases: {},
412
+ };
413
+ }
414
+ try {
415
+ parsed = JSON.parse(raw);
416
+ }
417
+ catch {
418
+ return {
419
+ cwd,
420
+ baseStateDir,
421
+ rootSource: resolved.rootSource,
422
+ selectedSessionJson,
423
+ raw,
424
+ status: 'malformed',
425
+ verifiedAliases: {},
426
+ };
427
+ }
428
+ }
429
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
430
+ return {
431
+ cwd,
432
+ baseStateDir,
433
+ rootSource: resolved.rootSource,
434
+ selectedSessionJson,
435
+ raw,
436
+ status: 'malformed',
437
+ verifiedAliases: {},
438
+ };
439
+ }
440
+ const state = parsed;
441
+ const aliases = verifiedSessionAliases(state);
442
+ if (!aliases.session_id) {
443
+ return {
444
+ cwd,
445
+ baseStateDir,
446
+ rootSource: resolved.rootSource,
447
+ selectedSessionJson,
448
+ raw,
449
+ state,
450
+ status: 'malformed',
451
+ verifiedAliases: aliases,
452
+ };
453
+ }
454
+ const recordedCwdRaw = typeof state.cwd === 'string' ? state.cwd.trim() : '';
455
+ if (Object.prototype.hasOwnProperty.call(state, 'state_root') && typeof state.state_root === 'string' && state.state_root.trim() === '') {
456
+ return {
457
+ cwd,
458
+ baseStateDir,
459
+ rootSource: resolved.rootSource,
460
+ selectedSessionJson,
461
+ raw,
462
+ state,
463
+ status: 'malformed',
464
+ verifiedAliases: aliases,
465
+ };
466
+ }
467
+ if (!recordedCwdRaw) {
468
+ return {
469
+ cwd,
470
+ baseStateDir,
471
+ rootSource: resolved.rootSource,
472
+ selectedSessionJson,
473
+ raw,
474
+ state,
475
+ status: 'missing-recorded-cwd',
476
+ verifiedAliases: aliases,
477
+ };
478
+ }
479
+ let recordedCwd;
480
+ let canonicalBaseStateDir;
481
+ let canonicalObservedCwd;
482
+ try {
483
+ recordedCwd = canonicalizeExistingPath(resolvePath(recordedCwdRaw));
484
+ canonicalBaseStateDir = canonicalizeExistingPath(baseStateDir);
485
+ canonicalObservedCwd = canonicalizeExistingPath(resolvePath(cwd));
486
+ }
487
+ catch {
488
+ return {
489
+ cwd,
490
+ baseStateDir,
491
+ rootSource: resolved.rootSource,
492
+ selectedSessionJson,
493
+ raw,
494
+ state,
495
+ status: 'read-error',
496
+ verifiedAliases: aliases,
497
+ };
498
+ }
499
+ const explicitRoot = typeof state.state_root === 'string' && state.state_root.trim() !== ''
500
+ ? state.state_root.trim()
501
+ : undefined;
502
+ let recordedStateRoot;
503
+ try {
504
+ recordedStateRoot = explicitRoot
505
+ ? canonicalizeExistingPath(resolvePath(explicitRoot))
506
+ : canonicalizeExistingPath(join(recordedCwd, '.omx', 'state'));
507
+ }
508
+ catch {
509
+ return {
510
+ cwd,
511
+ baseStateDir,
512
+ rootSource: resolved.rootSource,
513
+ selectedSessionJson,
514
+ recordedCwd,
515
+ raw,
516
+ state,
517
+ status: 'root-mismatch',
518
+ verifiedAliases: aliases,
519
+ };
520
+ }
521
+ if (recordedStateRoot !== canonicalBaseStateDir) {
522
+ return {
523
+ cwd,
524
+ baseStateDir,
525
+ rootSource: resolved.rootSource,
526
+ selectedSessionJson,
527
+ recordedCwd,
528
+ raw,
529
+ state,
530
+ status: 'root-mismatch',
531
+ verifiedAliases: aliases,
532
+ };
533
+ }
534
+ if (!isWithinRoot(canonicalObservedCwd, recordedCwd)) {
535
+ return {
536
+ cwd,
537
+ baseStateDir,
538
+ rootSource: resolved.rootSource,
539
+ selectedSessionJson,
540
+ recordedCwd,
541
+ raw,
542
+ state,
543
+ status: 'foreign-cwd',
544
+ verifiedAliases: aliases,
545
+ };
546
+ }
547
+ let liveness;
548
+ try {
549
+ liveness = classifySessionStateLiveness(state);
550
+ }
551
+ catch {
552
+ liveness = 'identity-indeterminate';
553
+ }
554
+ return {
555
+ cwd,
556
+ baseStateDir,
557
+ rootSource: resolved.rootSource,
558
+ selectedSessionJson,
559
+ recordedCwd,
560
+ raw,
561
+ state,
562
+ liveness,
563
+ status: liveness,
564
+ verifiedAliases: aliases,
565
+ };
203
566
  }
204
567
  export function getStateDir(workingDirectory, sessionId) {
205
568
  const base = getBaseStateDir(workingDirectory);
@@ -225,22 +588,45 @@ function resolveCanonicalSessionId(candidate, metadata) {
225
588
  return undefined;
226
589
  if (!metadata)
227
590
  return candidate;
228
- return metadata.nativeSessionAliases.includes(candidate) || metadata.ownerOmxSessionId === candidate
591
+ return metadata.nativeSessionAliases.includes(candidate)
592
+ || metadata.ownerOmxSessionId === candidate
593
+ || metadata.ownerCodexSessionId === candidate
229
594
  ? metadata.sessionId
230
595
  : candidate;
231
596
  }
232
- async function readUsableSessionStateFromBaseStateDir(cwd, baseStateDir = getBaseStateDir(cwd)) {
233
- const sessionPath = join(baseStateDir, 'session.json');
234
- if (!existsSync(sessionPath))
597
+ /**
598
+ * Read the selected session.json once and return the parsed snapshot only
599
+ * when it holds full selected-root authority for this exact base state
600
+ * directory: a nonempty recorded cwd that contains the observed cwd, and a
601
+ * recorded state_root canonical-equal to the selected base (with the
602
+ * historical cwd-derived fallback when state_root is absent). Usability/
603
+ * liveness is deliberately NOT checked here so stale-dead recovery can
604
+ * evaluate authority AND liveness from the same immutable bytes. A malformed
605
+ * or non-authoritative pointer returns null (fail closed); unexpected read
606
+ * I/O errors propagate instead of being collapsed into a generic classification.
607
+ */
608
+ async function readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, selectedSnapshot) {
609
+ const snapshot = selectedSnapshot ?? await readCanonicalSessionBindingSnapshot(cwd);
610
+ const selectedBaseStateDir = baseStateDir ?? snapshot.baseStateDir;
611
+ if (!selectedBaseStateDir)
235
612
  return null;
236
- try {
237
- const content = await readFile(sessionPath, 'utf-8');
238
- const state = JSON.parse(content);
239
- return isSessionStateUsable(state, cwd) ? state : null;
613
+ if (snapshot.status === 'read-error') {
614
+ throw new Error('selected session pointer read failed');
240
615
  }
241
- catch {
616
+ if (!snapshot.raw
617
+ || !snapshot.state
618
+ || !snapshot.recordedCwd
619
+ || !snapshot.baseStateDir
620
+ || canonicalizeExistingPath(snapshot.baseStateDir) !== canonicalizeExistingPath(selectedBaseStateDir)
621
+ || !['usable', 'stale-dead', 'identity-indeterminate'].includes(snapshot.status)) {
242
622
  return null;
243
623
  }
624
+ return {
625
+ baseStateDir: selectedBaseStateDir,
626
+ raw: snapshot.raw,
627
+ state: snapshot.state,
628
+ recordedCwd: snapshot.recordedCwd,
629
+ };
244
630
  }
245
631
  function normalizeSessionMetadata(state, sourcePath) {
246
632
  const sessionId = normalizeSessionId(state?.session_id);
@@ -283,16 +669,33 @@ function normalizeSessionMetadata(state, sourcePath) {
283
669
  ...(sourcePath ? { sourcePath } : {}),
284
670
  };
285
671
  }
286
- async function readSessionMetadataFromBaseStateDir(cwd, baseStateDir = getBaseStateDir(cwd)) {
287
- const sessionPath = join(baseStateDir, 'session.json');
288
- const session = await readUsableSessionStateFromBaseStateDir(cwd, baseStateDir);
672
+ export async function readSessionMetadataFromBaseStateDir(cwd, baseStateDir, options = {}) {
673
+ const selectedBaseStateDir = baseStateDir ?? getBaseStateDir(cwd);
674
+ const snapshot = await readCanonicalSessionBindingSnapshot(cwd, options.allowLegacyBoundHud
675
+ ? { ...process.env, [OMX_TEAM_STATE_ROOT_ENV]: selectedBaseStateDir, [OMX_ROOT_ENV]: '', [OMX_STATE_ROOT_ENV]: '' }
676
+ : process.env);
677
+ if (!selectedBaseStateDir)
678
+ return undefined;
679
+ const sessionPath = join(selectedBaseStateDir, 'session.json');
680
+ const authoritative = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, selectedBaseStateDir, snapshot);
681
+ const session = authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd)
682
+ ? authoritative.state
683
+ : options.allowLegacyBoundHud
684
+ && snapshot.status === 'identity-indeterminate'
685
+ && snapshot.state
686
+ && snapshot.baseStateDir
687
+ && canonicalizeExistingPath(snapshot.baseStateDir) === canonicalizeExistingPath(selectedBaseStateDir)
688
+ ? snapshot.state
689
+ : null;
289
690
  return normalizeSessionMetadata(session, sessionPath);
290
691
  }
291
692
  export async function readCurrentSessionId(workingDirectory) {
292
693
  const cwd = resolveWorkingDirectoryForState(workingDirectory);
293
- const baseStateDir = getBaseStateDir(cwd);
694
+ const snapshot = await readCanonicalSessionBindingSnapshot(cwd);
695
+ const baseStateDir = snapshot.baseStateDir ?? getBaseStateDir(cwd);
294
696
  const envSessionId = readSessionIdFromEnvironment();
295
- const metadata = await readSessionMetadataFromBaseStateDir(cwd, baseStateDir);
697
+ const authoritative = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, snapshot);
698
+ const metadata = normalizeSessionMetadata(authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd) ? authoritative.state : null, join(baseStateDir, 'session.json'));
296
699
  if (envSessionId)
297
700
  return resolveCanonicalSessionId(envSessionId, metadata);
298
701
  if (metadata?.sessionId)
@@ -301,25 +704,59 @@ export async function readCurrentSessionId(workingDirectory) {
301
704
  if (resolvePath(baseStateDir) !== resolvePath(localStateDir)) {
302
705
  return undefined;
303
706
  }
304
- return (await readUsableSessionState(cwd))?.session_id;
707
+ if (authoritative && isSessionStateUsable(authoritative.state, authoritative.recordedCwd)) {
708
+ return authoritative.state.session_id;
709
+ }
710
+ // Legacy HUD readers may carry only a local session_id pointer. This is never
711
+ // used for explicit, foreign, malformed, or otherwise contaminated roots.
712
+ if (snapshot.status !== 'missing-recorded-cwd')
713
+ return undefined;
714
+ try {
715
+ const raw = JSON.parse(await readFile(join(baseStateDir, 'session.json'), 'utf-8'));
716
+ return typeof raw.session_id === 'string' ? normalizeSessionId(raw.session_id) : undefined;
717
+ }
718
+ catch {
719
+ return undefined;
720
+ }
305
721
  }
306
722
  function isKnownSessionAlias(sessionId, metadata) {
307
723
  return metadata.nativeSessionAliases.includes(sessionId)
308
724
  || metadata.ownerOmxSessionId === sessionId
309
725
  || metadata.ownerCodexSessionId === sessionId;
310
726
  }
727
+ let selectedPointerRecoveryHookForTests;
728
+ let writableScopeRevalidationHookForTests;
729
+ let selectedDecisionSnapshotReadHookForTests;
730
+ let recoveryStabilityRereadHookForTests;
731
+ export function __setWritableStateScopeTestHooksForTests(hooks) {
732
+ selectedPointerRecoveryHookForTests = hooks.beforeRecoveryReread;
733
+ writableScopeRevalidationHookForTests = hooks.beforeScopeRevalidation;
734
+ selectedDecisionSnapshotReadHookForTests = hooks.onSelectedDecisionSnapshotRead;
735
+ recoveryStabilityRereadHookForTests = hooks.onRecoveryStabilityReread;
736
+ }
311
737
  /**
312
738
  * Writable scope precedence:
313
739
  * - explicit session_id preserves explicit fork writes;
314
740
  * - a usable session.json supplies the only implicit session scope;
315
741
  * - OMX_SESSION_ID may bind a known alias only when the live tmux pane proves
316
742
  * the canonical session tag;
743
+ * - a stale-dead session.json yields to an explicit exact-current
744
+ * OMX_SESSION_ID binding (the dead owner holds no authority; SessionStart
745
+ * remains the only pointer writer);
746
+ * - an identity-indeterminate session.json may recover only when OMX_SESSION_ID
747
+ * exactly matches the pointer's own session_id (the owner may still be alive,
748
+ * so unlike stale-dead recovery, no looser validated binding is accepted);
317
749
  * - root writes are allowed only when session.json is absent.
318
750
  */
319
751
  export async function resolveWritableStateScope(workingDirectory, explicitSessionId) {
320
752
  const cwd = resolveWorkingDirectoryForState(workingDirectory);
321
- const baseStateDir = getBaseStateDir(cwd);
322
- const metadata = await readSessionMetadataFromBaseStateDir(cwd, baseStateDir);
753
+ const canonicalSnapshot = await readCanonicalSessionBindingSnapshot(cwd);
754
+ const baseStateDir = canonicalSnapshot.baseStateDir ?? getBaseStateDir(cwd);
755
+ let selectedDecisionSnapshotReadOrdinalForTests = 0;
756
+ let recoveryStabilityRereadOrdinalForTests = 0;
757
+ const snapshot = await readAuthoritativeSessionSnapshotFromBaseStateDir(cwd, baseStateDir, canonicalSnapshot);
758
+ const liveness = snapshot ? classifySessionStateLiveness(snapshot.state) : undefined;
759
+ const metadata = normalizeSessionMetadata(snapshot && liveness === 'usable' ? snapshot.state : null, join(baseStateDir, 'session.json'));
323
760
  const validatedExplicit = validateSessionId(explicitSessionId);
324
761
  if (validatedExplicit) {
325
762
  const sessionId = resolveCanonicalSessionId(validatedExplicit, metadata) ?? validatedExplicit;
@@ -330,7 +767,43 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
330
767
  };
331
768
  }
332
769
  if (!metadata) {
333
- if (existsSync(join(baseStateDir, 'session.json'))) {
770
+ const sessionPath = join(baseStateDir, 'session.json');
771
+ if (existsSync(sessionPath)) {
772
+ const envSessionId = normalizeSessionId(process.env[OMX_SESSION_ID_ENV]);
773
+ if (snapshot && selectedDecisionSnapshotReadHookForTests) {
774
+ selectedDecisionSnapshotReadHookForTests({
775
+ ordinal: ++selectedDecisionSnapshotReadOrdinalForTests,
776
+ raw: snapshot.raw,
777
+ });
778
+ }
779
+ if (snapshot && envSessionId) {
780
+ const canonicalPointerSessionId = normalizeSessionId(snapshot.state.session_id);
781
+ const recoveryEligible = Boolean(canonicalPointerSessionId
782
+ && (liveness === 'stale-dead'
783
+ || (liveness === 'identity-indeterminate' && envSessionId === canonicalPointerSessionId)));
784
+ if (recoveryEligible) {
785
+ if (selectedPointerRecoveryHookForTests)
786
+ await selectedPointerRecoveryHookForTests();
787
+ const reread = await readFile(sessionPath, 'utf-8').catch((error) => {
788
+ if (error.code === 'ENOENT')
789
+ return undefined;
790
+ throw error;
791
+ });
792
+ if (recoveryStabilityRereadHookForTests) {
793
+ recoveryStabilityRereadHookForTests({
794
+ ordinal: ++recoveryStabilityRereadOrdinalForTests,
795
+ raw: reread,
796
+ });
797
+ }
798
+ if (reread === snapshot.raw) {
799
+ return {
800
+ source: 'session',
801
+ sessionId: envSessionId,
802
+ stateDir: join(baseStateDir, 'sessions', envSessionId),
803
+ };
804
+ }
805
+ }
806
+ }
334
807
  throw new Error(WRITABLE_STATE_SCOPE_ERRORS.unusableSession);
335
808
  }
336
809
  if (normalizeSessionId(process.env[OMX_SESSION_ID_ENV])) {
@@ -350,7 +823,7 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
350
823
  };
351
824
  }
352
825
  if (!isKnownSessionAlias(envSessionId, metadata)) {
353
- throw new Error(WRITABLE_STATE_SCOPE_ERRORS.unboundEnvironment);
826
+ throw new Error(WRITABLE_STATE_SCOPE_ERRORS.sessionBindingMismatch);
354
827
  }
355
828
  return {
356
829
  source: 'session',
@@ -358,6 +831,36 @@ export async function resolveWritableStateScope(workingDirectory, explicitSessio
358
831
  stateDir: join(baseStateDir, 'sessions', metadata.sessionId),
359
832
  };
360
833
  }
834
+ /**
835
+ * Point-in-time check performed immediately before the caller's commit. It
836
+ * reduces, but does not eliminate, the window for a pointer or root
837
+ * publication to move the selected target: one can still land after this
838
+ * check returns and before the caller's write, rename, or unlink. Multi-file
839
+ * sequences are not atomic.
840
+ */
841
+ export async function assertWritableStateScopeUnchanged(workingDirectory, explicitSessionId, expected, expectedBaseStateDir, event) {
842
+ if (writableScopeRevalidationHookForTests)
843
+ await writableScopeRevalidationHookForTests(event);
844
+ const current = await resolveWritableStateScope(workingDirectory, explicitSessionId);
845
+ const currentBaseStateDir = getBaseStateDirWithSource(workingDirectory).baseStateDir;
846
+ if (current.source !== expected.source
847
+ || current.sessionId !== expected.sessionId
848
+ || current.stateDir !== expected.stateDir
849
+ || currentBaseStateDir !== expectedBaseStateDir) {
850
+ throw new Error(WRITABLE_STATE_SCOPE_ERRORS.scopeChangedDuringWrite);
851
+ }
852
+ }
853
+ export function createWritableCommitRevalidator(options) {
854
+ let commitOrdinal = 0;
855
+ return async (attempt) => {
856
+ const event = {
857
+ operation: options.operation,
858
+ commitOrdinal: ++commitOrdinal,
859
+ ...attempt,
860
+ };
861
+ await assertWritableStateScopeUnchanged(options.cwd, options.explicitSessionId, options.capturedScope, options.baseStateDir, event);
862
+ };
863
+ }
361
864
  export async function resolveStateScope(workingDirectory, explicitSessionId) {
362
865
  const cwd = resolveWorkingDirectoryForState(workingDirectory);
363
866
  const baseStateDir = getBaseStateDir(cwd);
@@ -516,7 +1019,7 @@ export async function getAllScopedStateDirs(workingDirectory) {
516
1019
  return [getBaseStateDir(workingDirectory), ...(await getAllSessionScopedStateDirs(workingDirectory))];
517
1020
  }
518
1021
  export function isModeStateFilename(filename) {
519
- return filename.endsWith(STATE_FILE_SUFFIX) && filename !== 'session.json';
1022
+ return filename.endsWith(STATE_FILE_SUFFIX) && filename !== 'session.json' && filename !== 'run-state.json';
520
1023
  }
521
1024
  async function listModeStateFilesInDir(dir, scope) {
522
1025
  if (!existsSync(dir))