oh-my-codex 0.20.1 → 0.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (791) hide show
  1. package/Cargo.lock +7 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +36 -1
  4. package/crates/omx-runtime/Cargo.toml +1 -0
  5. package/crates/omx-runtime/src/main.rs +25 -2
  6. package/crates/omx-runtime/tests/execution.rs +219 -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__/hermes.test.js.map +1 -1
  11. package/dist/adapt/contracts.d.ts.map +1 -1
  12. package/dist/agents/__tests__/definitions.test.js +81 -0
  13. package/dist/agents/__tests__/definitions.test.js.map +1 -1
  14. package/dist/agents/__tests__/native-config.test.js +25 -0
  15. package/dist/agents/__tests__/native-config.test.js.map +1 -1
  16. package/dist/agents/native-config.d.ts +2 -1
  17. package/dist/agents/native-config.d.ts.map +1 -1
  18. package/dist/agents/native-config.js.map +1 -1
  19. package/dist/auth/__tests__/hotswap.test.d.ts +2 -0
  20. package/dist/auth/__tests__/hotswap.test.d.ts.map +1 -0
  21. package/dist/auth/__tests__/hotswap.test.js +183 -0
  22. package/dist/auth/__tests__/hotswap.test.js.map +1 -0
  23. package/dist/auth/hotswap.d.ts +6 -0
  24. package/dist/auth/hotswap.d.ts.map +1 -1
  25. package/dist/auth/hotswap.js +102 -19
  26. package/dist/auth/hotswap.js.map +1 -1
  27. package/dist/auth/paths.js.map +1 -1
  28. package/dist/auth/storage.js.map +1 -1
  29. package/dist/autopilot/__tests__/ralplan-gate.test.js +5 -5
  30. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  31. package/dist/autopilot/completion-gate.js.map +1 -1
  32. package/dist/autopilot/fsm.d.ts +1 -1
  33. package/dist/autopilot/fsm.d.ts.map +1 -1
  34. package/dist/autoresearch/goal.js.map +1 -1
  35. package/dist/autoresearch/runtime.js.map +1 -1
  36. package/dist/capabilities/lockfile.js.map +1 -1
  37. package/dist/catalog/reader.js.map +1 -1
  38. package/dist/catalog/skill-mirror.js.map +1 -1
  39. package/dist/cli/__tests__/adapt-help.test.js.map +1 -1
  40. package/dist/cli/__tests__/agents-init.test.js.map +1 -1
  41. package/dist/cli/__tests__/agents.test.js.map +1 -1
  42. package/dist/cli/__tests__/api.test.js.map +1 -1
  43. package/dist/cli/__tests__/ask.test.js.map +1 -1
  44. package/dist/cli/__tests__/auth.test.js +60 -6
  45. package/dist/cli/__tests__/auth.test.js.map +1 -1
  46. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  47. package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
  48. package/dist/cli/__tests__/capabilities.test.js.map +1 -1
  49. package/dist/cli/__tests__/codex-plugin-layout.test.js +80 -0
  50. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  51. package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -1
  52. package/dist/cli/__tests__/doctor-invalid-config.test.js +47 -4
  53. package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -1
  54. package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
  55. package/dist/cli/__tests__/doctor-warning-copy.test.js +752 -15
  56. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  57. package/dist/cli/__tests__/exec.test.js +136 -0
  58. package/dist/cli/__tests__/exec.test.js.map +1 -1
  59. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -1
  60. package/dist/cli/__tests__/index.test.js +473 -14
  61. package/dist/cli/__tests__/index.test.js.map +1 -1
  62. package/dist/cli/__tests__/launch-fallback.test.js +336 -4
  63. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  64. package/dist/cli/__tests__/mcp-parity.test.js +87 -12
  65. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  66. package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts +2 -0
  67. package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts.map +1 -0
  68. package/dist/cli/__tests__/native-hook-claim-journal.test.js +206 -0
  69. package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -0
  70. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  71. package/dist/cli/__tests__/question.test.js.map +1 -1
  72. package/dist/cli/__tests__/ralph-deslop-contract.test.js.map +1 -1
  73. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +6 -0
  74. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  75. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -1
  76. package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -1
  77. package/dist/cli/__tests__/ralph.test.js +8 -3
  78. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  79. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts +2 -0
  80. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts.map +1 -0
  81. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +72 -0
  82. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -0
  83. package/dist/cli/__tests__/ralplan.test.d.ts +2 -0
  84. package/dist/cli/__tests__/ralplan.test.d.ts.map +1 -0
  85. package/dist/cli/__tests__/ralplan.test.js +55 -0
  86. package/dist/cli/__tests__/ralplan.test.js.map +1 -0
  87. package/dist/cli/__tests__/resume.test.js +17 -11
  88. package/dist/cli/__tests__/resume.test.js.map +1 -1
  89. package/dist/cli/__tests__/session-scoped-runtime.test.js +25 -0
  90. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  91. package/dist/cli/__tests__/session-search-help.test.js +25 -1
  92. package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
  93. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  94. package/dist/cli/__tests__/setup-agents-overwrite.test.js +79 -0
  95. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  96. package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -1
  97. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +77 -3
  98. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
  99. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts +2 -0
  100. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts.map +1 -0
  101. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js +285 -0
  102. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js.map +1 -0
  103. package/dist/cli/__tests__/setup-install-mode.test.js +2579 -294
  104. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  105. package/dist/cli/__tests__/setup-preferences.test.d.ts +2 -0
  106. package/dist/cli/__tests__/setup-preferences.test.d.ts.map +1 -0
  107. package/dist/cli/__tests__/setup-preferences.test.js +79 -0
  108. package/dist/cli/__tests__/setup-preferences.test.js.map +1 -0
  109. package/dist/cli/__tests__/setup-refresh.test.js +33 -2
  110. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  111. package/dist/cli/__tests__/setup-scope.test.js +46 -3
  112. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  113. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  114. package/dist/cli/__tests__/state.test.js +37 -0
  115. package/dist/cli/__tests__/state.test.js.map +1 -1
  116. package/dist/cli/__tests__/team.test.js +105 -7
  117. package/dist/cli/__tests__/team.test.js.map +1 -1
  118. package/dist/cli/__tests__/ultragoal.test.js +61 -1
  119. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  120. package/dist/cli/__tests__/uninstall.test.js +1817 -24
  121. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  122. package/dist/cli/__tests__/update.test.js +58 -0
  123. package/dist/cli/__tests__/update.test.js.map +1 -1
  124. package/dist/cli/__tests__/url.test.js.map +1 -1
  125. package/dist/cli/__tests__/windows-popup-loop-contract.test.js +2 -1
  126. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  127. package/dist/cli/adapt.js.map +1 -1
  128. package/dist/cli/agents-init.js.map +1 -1
  129. package/dist/cli/agents.js.map +1 -1
  130. package/dist/cli/api.js.map +1 -1
  131. package/dist/cli/ask.d.ts +1 -1
  132. package/dist/cli/ask.d.ts.map +1 -1
  133. package/dist/cli/ask.js.map +1 -1
  134. package/dist/cli/auth.js.map +1 -1
  135. package/dist/cli/autoresearch-guided.js.map +1 -1
  136. package/dist/cli/autoresearch-intake.js.map +1 -1
  137. package/dist/cli/capabilities.js.map +1 -1
  138. package/dist/cli/cleanup.js.map +1 -1
  139. package/dist/cli/codex-feature-probe.js.map +1 -1
  140. package/dist/cli/codex-home.js.map +1 -1
  141. package/dist/cli/doctor.d.ts +21 -0
  142. package/dist/cli/doctor.d.ts.map +1 -1
  143. package/dist/cli/doctor.js +607 -130
  144. package/dist/cli/doctor.js.map +1 -1
  145. package/dist/cli/explore.js.map +1 -1
  146. package/dist/cli/index.d.ts +14 -3
  147. package/dist/cli/index.d.ts.map +1 -1
  148. package/dist/cli/index.js +245 -57
  149. package/dist/cli/index.js.map +1 -1
  150. package/dist/cli/mcp-parity.js +2 -2
  151. package/dist/cli/mcp-parity.js.map +1 -1
  152. package/dist/cli/mcp-serve.js.map +1 -1
  153. package/dist/cli/mission.js.map +1 -1
  154. package/dist/cli/native-assets.js.map +1 -1
  155. package/dist/cli/native-hook-claim-journal.d.ts +29 -0
  156. package/dist/cli/native-hook-claim-journal.d.ts.map +1 -0
  157. package/dist/cli/native-hook-claim-journal.js +252 -0
  158. package/dist/cli/native-hook-claim-journal.js.map +1 -0
  159. package/dist/cli/omx.js.map +1 -1
  160. package/dist/cli/plugin-marketplace.js.map +1 -1
  161. package/dist/cli/project-runtime-codex-homes.js.map +1 -1
  162. package/dist/cli/question.js.map +1 -1
  163. package/dist/cli/ralph.d.ts.map +1 -1
  164. package/dist/cli/ralph.js +3 -2
  165. package/dist/cli/ralph.js.map +1 -1
  166. package/dist/cli/ralplan.d.ts +10 -0
  167. package/dist/cli/ralplan.d.ts.map +1 -0
  168. package/dist/cli/ralplan.js +110 -0
  169. package/dist/cli/ralplan.js.map +1 -0
  170. package/dist/cli/session-search.d.ts +5 -0
  171. package/dist/cli/session-search.d.ts.map +1 -1
  172. package/dist/cli/session-search.js +87 -0
  173. package/dist/cli/session-search.js.map +1 -1
  174. package/dist/cli/setup-preferences.d.ts +11 -0
  175. package/dist/cli/setup-preferences.d.ts.map +1 -1
  176. package/dist/cli/setup-preferences.js +32 -0
  177. package/dist/cli/setup-preferences.js.map +1 -1
  178. package/dist/cli/setup.d.ts +58 -0
  179. package/dist/cli/setup.d.ts.map +1 -1
  180. package/dist/cli/setup.js +1450 -398
  181. package/dist/cli/setup.js.map +1 -1
  182. package/dist/cli/sparkshell.js.map +1 -1
  183. package/dist/cli/star-prompt.js.map +1 -1
  184. package/dist/cli/state.d.ts.map +1 -1
  185. package/dist/cli/state.js +2 -1
  186. package/dist/cli/state.js.map +1 -1
  187. package/dist/cli/team.js.map +1 -1
  188. package/dist/cli/ultragoal.d.ts +5 -1
  189. package/dist/cli/ultragoal.d.ts.map +1 -1
  190. package/dist/cli/ultragoal.js +34 -2
  191. package/dist/cli/ultragoal.js.map +1 -1
  192. package/dist/cli/uninstall.d.ts +17 -0
  193. package/dist/cli/uninstall.d.ts.map +1 -1
  194. package/dist/cli/uninstall.js +986 -95
  195. package/dist/cli/uninstall.js.map +1 -1
  196. package/dist/cli/update.d.ts.map +1 -1
  197. package/dist/cli/update.js +8 -1
  198. package/dist/cli/update.js.map +1 -1
  199. package/dist/cli/url.js.map +1 -1
  200. package/dist/compat/__tests__/doctor-contract.test.js +5 -1
  201. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
  202. package/dist/compat/__tests__/rust-runtime-compat.test.js +1 -1
  203. package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -1
  204. package/dist/config/__tests__/codex-hooks.test.js +1287 -11
  205. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  206. package/dist/config/__tests__/generator-idempotent.test.js +1179 -32
  207. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  208. package/dist/config/__tests__/generator-notify.test.js +6 -1
  209. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  210. package/dist/config/__tests__/models.test.js +67 -3
  211. package/dist/config/__tests__/models.test.js.map +1 -1
  212. package/dist/config/codex-feature-flags.d.ts.map +1 -1
  213. package/dist/config/codex-feature-flags.js.map +1 -1
  214. package/dist/config/codex-hooks.d.ts +124 -1
  215. package/dist/config/codex-hooks.d.ts.map +1 -1
  216. package/dist/config/codex-hooks.js +2142 -265
  217. package/dist/config/codex-hooks.js.map +1 -1
  218. package/dist/config/commit-lore-guard.js.map +1 -1
  219. package/dist/config/generator.d.ts +23 -34
  220. package/dist/config/generator.d.ts.map +1 -1
  221. package/dist/config/generator.js +1480 -246
  222. package/dist/config/generator.js.map +1 -1
  223. package/dist/config/mcp-registry.js.map +1 -1
  224. package/dist/config/models.d.ts +14 -4
  225. package/dist/config/models.d.ts.map +1 -1
  226. package/dist/config/models.js +15 -1
  227. package/dist/config/models.js.map +1 -1
  228. package/dist/config/omx-first-party-mcp.js.map +1 -1
  229. package/dist/config/team-mode.d.ts.map +1 -1
  230. package/dist/document-refresh/__tests__/enforcer.test.js.map +1 -1
  231. package/dist/document-refresh/enforcer.js.map +1 -1
  232. package/dist/exec/followup.js.map +1 -1
  233. package/dist/goal-workflows/artifacts.js.map +1 -1
  234. package/dist/hooks/__tests__/agents-overlay.test.js +7 -4
  235. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  236. package/dist/hooks/__tests__/analyze-routing-contract.test.js.map +1 -1
  237. package/dist/hooks/__tests__/analyze-skill-contract.test.js.map +1 -1
  238. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  239. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +9 -3
  240. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  241. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
  242. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  243. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  244. package/dist/hooks/__tests__/design-skill.test.js.map +1 -1
  245. package/dist/hooks/__tests__/keyword-detector.test.js +1376 -6
  246. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  247. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +252 -543
  248. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  249. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js +38 -4
  250. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  251. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +765 -10
  252. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  253. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +2 -0
  254. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  255. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +142 -1
  256. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  257. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  258. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js +48 -2
  259. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js.map +1 -1
  260. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +61 -44
  261. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -1
  262. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  263. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +3 -2
  264. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -1
  265. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +243 -4
  266. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  267. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +531 -12
  268. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  269. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +163 -24
  270. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  271. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js +482 -32
  272. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  273. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +68 -1
  274. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  275. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js +7 -1
  276. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  277. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -1
  278. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js +43 -4
  279. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  280. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -1
  281. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
  282. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -1
  283. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -1
  284. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -1
  285. package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts +2 -0
  286. package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts.map +1 -0
  287. package/dist/hooks/__tests__/prompt-session-provenance.test.js +82 -0
  288. package/dist/hooks/__tests__/prompt-session-provenance.test.js.map +1 -0
  289. package/dist/hooks/__tests__/session.test.js +878 -11
  290. package/dist/hooks/__tests__/session.test.js.map +1 -1
  291. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
  292. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js.map +1 -1
  293. package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -1
  294. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -1
  295. package/dist/hooks/agents-overlay.js +5 -5
  296. package/dist/hooks/agents-overlay.js.map +1 -1
  297. package/dist/hooks/code-simplifier/index.js.map +1 -1
  298. package/dist/hooks/explore-routing.js.map +1 -1
  299. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  300. package/dist/hooks/extensibility/events.js.map +1 -1
  301. package/dist/hooks/extensibility/loader.js.map +1 -1
  302. package/dist/hooks/extensibility/plugin-runner-stdin.js.map +1 -1
  303. package/dist/hooks/extensibility/sdk/logging.js.map +1 -1
  304. package/dist/hooks/keyword-detector.d.ts +33 -7
  305. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  306. package/dist/hooks/keyword-detector.js +2228 -119
  307. package/dist/hooks/keyword-detector.js.map +1 -1
  308. package/dist/hooks/keyword-registry.d.ts +12 -0
  309. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  310. package/dist/hooks/keyword-registry.js +41 -0
  311. package/dist/hooks/keyword-registry.js.map +1 -1
  312. package/dist/hooks/prompt-session-provenance.d.ts +87 -0
  313. package/dist/hooks/prompt-session-provenance.d.ts.map +1 -0
  314. package/dist/hooks/prompt-session-provenance.js +180 -0
  315. package/dist/hooks/prompt-session-provenance.js.map +1 -0
  316. package/dist/hooks/session.d.ts +163 -34
  317. package/dist/hooks/session.d.ts.map +1 -1
  318. package/dist/hooks/session.js +1395 -317
  319. package/dist/hooks/session.js.map +1 -1
  320. package/dist/hooks/task-size-detector.js.map +1 -1
  321. package/dist/hud/__tests__/state.test.js.map +1 -1
  322. package/dist/hud/authority.js.map +1 -1
  323. package/dist/hud/constants.js.map +1 -1
  324. package/dist/hud/index.js.map +1 -1
  325. package/dist/hud/reconcile.js.map +1 -1
  326. package/dist/hud/render.js.map +1 -1
  327. package/dist/hud/state.js.map +1 -1
  328. package/dist/hud/tmux.js.map +1 -1
  329. package/dist/leader/__tests__/contract.test.js +153 -1
  330. package/dist/leader/__tests__/contract.test.js.map +1 -1
  331. package/dist/leader/contract.d.ts +42 -5
  332. package/dist/leader/contract.d.ts.map +1 -1
  333. package/dist/leader/contract.js +184 -3
  334. package/dist/leader/contract.js.map +1 -1
  335. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  336. package/dist/mcp/__tests__/code-intel-server.test.js +31 -3
  337. package/dist/mcp/__tests__/code-intel-server.test.js.map +1 -1
  338. package/dist/mcp/__tests__/server-lifecycle.test.js +15 -2
  339. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  340. package/dist/mcp/__tests__/state-paths.test.js +98 -1
  341. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  342. package/dist/mcp/__tests__/wiki-server.test.js +18 -0
  343. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -1
  344. package/dist/mcp/bootstrap.js.map +1 -1
  345. package/dist/mcp/code-intel-server.d.ts +58 -58
  346. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  347. package/dist/mcp/code-intel-server.js +13 -3
  348. package/dist/mcp/code-intel-server.js.map +1 -1
  349. package/dist/mcp/hermes-bridge.js.map +1 -1
  350. package/dist/mcp/hermes-server.d.ts +70 -70
  351. package/dist/mcp/hermes-server.d.ts.map +1 -1
  352. package/dist/mcp/lifecycle-telemetry.js.map +1 -1
  353. package/dist/mcp/memory-server.d.ts +34 -34
  354. package/dist/mcp/memory-server.d.ts.map +1 -1
  355. package/dist/mcp/memory-server.js.map +1 -1
  356. package/dist/mcp/state-paths.d.ts +14 -0
  357. package/dist/mcp/state-paths.d.ts.map +1 -1
  358. package/dist/mcp/state-paths.js +96 -20
  359. package/dist/mcp/state-paths.js.map +1 -1
  360. package/dist/mcp/state-server.d.ts +47 -47
  361. package/dist/mcp/state-server.d.ts.map +1 -1
  362. package/dist/mcp/trace-server.d.ts +4 -4
  363. package/dist/mcp/trace-server.d.ts.map +1 -1
  364. package/dist/mcp/trace-server.js.map +1 -1
  365. package/dist/mcp/wiki-server.d.ts +34 -23
  366. package/dist/mcp/wiki-server.d.ts.map +1 -1
  367. package/dist/mcp/wiki-server.js +9 -2
  368. package/dist/mcp/wiki-server.js.map +1 -1
  369. package/dist/modes/__tests__/base-session-scope.test.js +53 -1
  370. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  371. package/dist/modes/__tests__/base-tmux-pane.test.js +4 -4
  372. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  373. package/dist/modes/base.d.ts.map +1 -1
  374. package/dist/modes/base.js +5 -5
  375. package/dist/modes/base.js.map +1 -1
  376. package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -1
  377. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
  378. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +177 -85
  379. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -1
  380. package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
  381. package/dist/notifications/__tests__/template-engine.test.js.map +1 -1
  382. package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
  383. package/dist/notifications/http-client.js.map +1 -1
  384. package/dist/notifications/index.d.ts +4 -1
  385. package/dist/notifications/index.d.ts.map +1 -1
  386. package/dist/notifications/index.js +3 -9
  387. package/dist/notifications/index.js.map +1 -1
  388. package/dist/notifications/lifecycle-dedupe.js.map +1 -1
  389. package/dist/notifications/reply-listener.d.ts.map +1 -1
  390. package/dist/notifications/reply-listener.js.map +1 -1
  391. package/dist/notifications/session-registry.js.map +1 -1
  392. package/dist/notifications/session-status.js.map +1 -1
  393. package/dist/notifications/temp-contract.d.ts.map +1 -1
  394. package/dist/notifications/temp-contract.js +4 -0
  395. package/dist/notifications/temp-contract.js.map +1 -1
  396. package/dist/notifications/tmux-detector.js.map +1 -1
  397. package/dist/notifications/tmux.js.map +1 -1
  398. package/dist/openclaw/config.js.map +1 -1
  399. package/dist/openclaw/dispatcher.js.map +1 -1
  400. package/dist/pipeline/__tests__/orchestrator.test.js +4 -4
  401. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  402. package/dist/pipeline/__tests__/stages.test.js +16 -13
  403. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  404. package/dist/pipeline/stages/code-review.js.map +1 -1
  405. package/dist/pipeline/stages/ralph-verify.js.map +1 -1
  406. package/dist/pipeline/stages/ralplan.js.map +1 -1
  407. package/dist/pipeline/stages/team-exec.js.map +1 -1
  408. package/dist/pipeline/stages/ultragoal.js.map +1 -1
  409. package/dist/pipeline/stages/ultraqa.js.map +1 -1
  410. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
  411. package/dist/planning/artifact-names.js.map +1 -1
  412. package/dist/planning/artifacts.js.map +1 -1
  413. package/dist/question/__tests__/state.test.js.map +1 -1
  414. package/dist/question/__tests__/ui.test.js.map +1 -1
  415. package/dist/question/autopilot-wait.js.map +1 -1
  416. package/dist/question/client.d.ts.map +1 -1
  417. package/dist/question/client.js.map +1 -1
  418. package/dist/question/deep-interview.js.map +1 -1
  419. package/dist/question/events.js.map +1 -1
  420. package/dist/question/renderer.js.map +1 -1
  421. package/dist/question/state.d.ts.map +1 -1
  422. package/dist/question/state.js.map +1 -1
  423. package/dist/question/ui.js.map +1 -1
  424. package/dist/ralph/contract.d.ts +1 -1
  425. package/dist/ralph/contract.d.ts.map +1 -1
  426. package/dist/ralplan/__tests__/consensus-gate.test.js +527 -8
  427. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  428. package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts +2 -0
  429. package/dist/ralplan/__tests__/documented-leader-preflight.test.d.ts.map +1 -0
  430. package/dist/ralplan/__tests__/documented-leader-preflight.test.js +46 -0
  431. package/dist/ralplan/__tests__/documented-leader-preflight.test.js.map +1 -0
  432. package/dist/ralplan/__tests__/runtime.test.js +116 -14
  433. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  434. package/dist/ralplan/consensus-gate.d.ts +3 -3
  435. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  436. package/dist/ralplan/consensus-gate.js +173 -70
  437. package/dist/ralplan/consensus-gate.js.map +1 -1
  438. package/dist/ralplan/documented-leader-preflight.d.ts +34 -0
  439. package/dist/ralplan/documented-leader-preflight.d.ts.map +1 -0
  440. package/dist/ralplan/documented-leader-preflight.js +58 -0
  441. package/dist/ralplan/documented-leader-preflight.js.map +1 -0
  442. package/dist/ralplan/runtime.d.ts +3 -2
  443. package/dist/ralplan/runtime.d.ts.map +1 -1
  444. package/dist/ralplan/runtime.js +12 -9
  445. package/dist/ralplan/runtime.js.map +1 -1
  446. package/dist/runtime/__tests__/bridge.test.js +42 -1
  447. package/dist/runtime/__tests__/bridge.test.js.map +1 -1
  448. package/dist/runtime/bridge.d.ts +12 -0
  449. package/dist/runtime/bridge.d.ts.map +1 -1
  450. package/dist/runtime/bridge.js +52 -1
  451. package/dist/runtime/bridge.js.map +1 -1
  452. package/dist/runtime/process-tree.js.map +1 -1
  453. package/dist/runtime/run-loop.js.map +1 -1
  454. package/dist/runtime/run-outcome.d.ts +3 -3
  455. package/dist/runtime/run-outcome.d.ts.map +1 -1
  456. package/dist/runtime/run-outcome.js.map +1 -1
  457. package/dist/runtime/run-state.js.map +1 -1
  458. package/dist/scripts/__tests__/codex-native-hook.test.js +6657 -995
  459. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  460. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts +2 -0
  461. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts.map +1 -0
  462. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js +634 -0
  463. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js.map +1 -0
  464. package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -1
  465. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -1
  466. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  467. package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts +2 -0
  468. package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts.map +1 -0
  469. package/dist/scripts/__tests__/notify-fallback-delivery.test.js +174 -0
  470. package/dist/scripts/__tests__/notify-fallback-delivery.test.js.map +1 -0
  471. package/dist/scripts/__tests__/notify-state-io.test.js +57 -1
  472. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  473. package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts +2 -0
  474. package/dist/scripts/__tests__/reasoning-artifact-contract.test.d.ts.map +1 -0
  475. package/dist/scripts/__tests__/reasoning-artifact-contract.test.js +108 -0
  476. package/dist/scripts/__tests__/reasoning-artifact-contract.test.js.map +1 -0
  477. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts +2 -0
  478. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts.map +1 -0
  479. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +78 -0
  480. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -0
  481. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts +2 -0
  482. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts.map +1 -0
  483. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +55 -0
  484. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -0
  485. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  486. package/dist/scripts/__tests__/smoke-packed-install.test.js +1100 -4
  487. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  488. package/dist/scripts/__tests__/test-reply-listener-live.test.js.map +1 -1
  489. package/dist/scripts/build-api.js.map +1 -1
  490. package/dist/scripts/build-explore-harness.js.map +1 -1
  491. package/dist/scripts/build-sparkshell.js.map +1 -1
  492. package/dist/scripts/cleanup-explore-harness.js.map +1 -1
  493. package/dist/scripts/codex-execution-surface.js.map +1 -1
  494. package/dist/scripts/codex-native-hook.d.ts +4 -1
  495. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  496. package/dist/scripts/codex-native-hook.js +11577 -1184
  497. package/dist/scripts/codex-native-hook.js.map +1 -1
  498. package/dist/scripts/generate-native-release-manifest.js.map +1 -1
  499. package/dist/scripts/generate-release-body.js.map +1 -1
  500. package/dist/scripts/hook-payload-guard.d.ts.map +1 -1
  501. package/dist/scripts/hook-payload-guard.js.map +1 -1
  502. package/dist/scripts/notify-fallback-delivery.d.ts +48 -0
  503. package/dist/scripts/notify-fallback-delivery.d.ts.map +1 -0
  504. package/dist/scripts/notify-fallback-delivery.js +419 -0
  505. package/dist/scripts/notify-fallback-delivery.js.map +1 -0
  506. package/dist/scripts/notify-fallback-watcher.js +218 -138
  507. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  508. package/dist/scripts/notify-hook/auto-nudge.d.ts +18 -9
  509. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  510. package/dist/scripts/notify-hook/auto-nudge.js +112 -15
  511. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  512. package/dist/scripts/notify-hook/managed-tmux.d.ts +23 -0
  513. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  514. package/dist/scripts/notify-hook/managed-tmux.js +122 -12
  515. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  516. package/dist/scripts/notify-hook/orchestration-intent.d.ts +7 -7
  517. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -1
  518. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +5 -2
  519. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  520. package/dist/scripts/notify-hook/ralph-session-resume.js +33 -37
  521. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  522. package/dist/scripts/notify-hook/state-io.d.ts +17 -0
  523. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  524. package/dist/scripts/notify-hook/state-io.js +73 -11
  525. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  526. package/dist/scripts/notify-hook/team-dispatch.d.ts +10 -1
  527. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  528. package/dist/scripts/notify-hook/team-dispatch.js +234 -79
  529. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  530. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -2
  531. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  532. package/dist/scripts/notify-hook/team-leader-nudge.js +39 -13
  533. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  534. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +16 -8
  535. package/dist/scripts/notify-hook/team-tmux-guard.d.ts.map +1 -1
  536. package/dist/scripts/notify-hook/team-tmux-guard.js +365 -44
  537. package/dist/scripts/notify-hook/team-tmux-guard.js.map +1 -1
  538. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -1
  539. package/dist/scripts/notify-hook/team-worker-stop.d.ts +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 +19 -18
  542. package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
  543. package/dist/scripts/notify-hook/team-worker.d.ts +5 -2
  544. package/dist/scripts/notify-hook/team-worker.d.ts.map +1 -1
  545. package/dist/scripts/notify-hook/team-worker.js +37 -28
  546. package/dist/scripts/notify-hook/team-worker.js.map +1 -1
  547. package/dist/scripts/notify-hook/tmux-injection.d.ts +8 -1
  548. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  549. package/dist/scripts/notify-hook/tmux-injection.js +53 -18
  550. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  551. package/dist/scripts/notify-hook/visual-verdict.d.ts +1 -1
  552. package/dist/scripts/notify-hook/visual-verdict.d.ts.map +1 -1
  553. package/dist/scripts/notify-hook/visual-verdict.js +15 -13
  554. package/dist/scripts/notify-hook/visual-verdict.js.map +1 -1
  555. package/dist/scripts/notify-hook.d.ts +24 -1
  556. package/dist/scripts/notify-hook.d.ts.map +1 -1
  557. package/dist/scripts/notify-hook.js +267 -90
  558. package/dist/scripts/notify-hook.js.map +1 -1
  559. package/dist/scripts/postinstall.js.map +1 -1
  560. package/dist/scripts/prompt-inventory.js.map +1 -1
  561. package/dist/scripts/smoke-packed-install.d.ts +927 -5
  562. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  563. package/dist/scripts/smoke-packed-install.js +4317 -13
  564. package/dist/scripts/smoke-packed-install.js.map +1 -1
  565. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  566. package/dist/scripts/test-reply-listener-live.js.map +1 -1
  567. package/dist/scripts/test-sparkshell.js.map +1 -1
  568. package/dist/scripts/verify-native-agents.js.map +1 -1
  569. package/dist/session-history/friction.js.map +1 -1
  570. package/dist/session-history/search.js.map +1 -1
  571. package/dist/sidecar/__tests__/boundary.test.js.map +1 -1
  572. package/dist/sidecar/collector.js.map +1 -1
  573. package/dist/sidecar/index.js.map +1 -1
  574. package/dist/sidecar/render.js.map +1 -1
  575. package/dist/sidecar/tmux.js.map +1 -1
  576. package/dist/state/__tests__/mode-state-context.test.js +54 -0
  577. package/dist/state/__tests__/mode-state-context.test.js.map +1 -1
  578. package/dist/state/__tests__/operations.test.js +66 -15
  579. package/dist/state/__tests__/operations.test.js.map +1 -1
  580. package/dist/state/__tests__/skill-active.test.js +19 -1
  581. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  582. package/dist/state/__tests__/workflow-transition.test.js +61 -0
  583. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  584. package/dist/state/mode-state-context.d.ts +5 -0
  585. package/dist/state/mode-state-context.d.ts.map +1 -1
  586. package/dist/state/mode-state-context.js +59 -0
  587. package/dist/state/mode-state-context.js.map +1 -1
  588. package/dist/state/operations.d.ts +1 -1
  589. package/dist/state/operations.d.ts.map +1 -1
  590. package/dist/state/operations.js +49 -55
  591. package/dist/state/operations.js.map +1 -1
  592. package/dist/state/paths.d.ts +1 -1
  593. package/dist/state/paths.d.ts.map +1 -1
  594. package/dist/state/paths.js +1 -1
  595. package/dist/state/paths.js.map +1 -1
  596. package/dist/state/skill-active.d.ts +13 -1
  597. package/dist/state/skill-active.d.ts.map +1 -1
  598. package/dist/state/skill-active.js +43 -4
  599. package/dist/state/skill-active.js.map +1 -1
  600. package/dist/state/terminal-normalization.js.map +1 -1
  601. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  602. package/dist/state/workflow-transition-reconcile.js +20 -4
  603. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  604. package/dist/state/workflow-transition.d.ts +1 -1
  605. package/dist/state/workflow-transition.d.ts.map +1 -1
  606. package/dist/state/workflow-transition.js.map +1 -1
  607. package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts +2 -0
  608. package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts.map +1 -0
  609. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +52 -0
  610. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -0
  611. package/dist/subagents/__tests__/tracker.test.js +1550 -10
  612. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  613. package/dist/subagents/role-routing-marker.d.ts +10 -0
  614. package/dist/subagents/role-routing-marker.d.ts.map +1 -0
  615. package/dist/subagents/role-routing-marker.js +136 -0
  616. package/dist/subagents/role-routing-marker.js.map +1 -0
  617. package/dist/subagents/tracker.d.ts +91 -0
  618. package/dist/subagents/tracker.d.ts.map +1 -1
  619. package/dist/subagents/tracker.js +806 -62
  620. package/dist/subagents/tracker.js.map +1 -1
  621. package/dist/team/__tests__/api-interop.test.js +91 -1
  622. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  623. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  624. package/dist/team/__tests__/delivery-e2e-smoke.test.js +52 -10
  625. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  626. package/dist/team/__tests__/idle-nudge.test.js +45 -15
  627. package/dist/team/__tests__/idle-nudge.test.js.map +1 -1
  628. package/dist/team/__tests__/mcp-comm.test.js +93 -27
  629. package/dist/team/__tests__/mcp-comm.test.js.map +1 -1
  630. package/dist/team/__tests__/model-contract.test.js +341 -4
  631. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  632. package/dist/team/__tests__/role-router.test.js.map +1 -1
  633. package/dist/team/__tests__/runtime-cli.test.js +9 -0
  634. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  635. package/dist/team/__tests__/runtime.test.js +3624 -355
  636. package/dist/team/__tests__/runtime.test.js.map +1 -1
  637. package/dist/team/__tests__/scaling.test.js +2516 -118
  638. package/dist/team/__tests__/scaling.test.js.map +1 -1
  639. package/dist/team/__tests__/state-root.test.js.map +1 -1
  640. package/dist/team/__tests__/state.test.js +804 -36
  641. package/dist/team/__tests__/state.test.js.map +1 -1
  642. package/dist/team/__tests__/team-ops-contract.test.js +6 -0
  643. package/dist/team/__tests__/team-ops-contract.test.js.map +1 -1
  644. package/dist/team/__tests__/tmux-session.test.js +3664 -969
  645. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  646. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
  647. package/dist/team/__tests__/worker-runtime-identity.test.js +38 -2
  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 +2 -2
  652. package/dist/team/api-interop.d.ts.map +1 -1
  653. package/dist/team/api-interop.js +15 -9
  654. package/dist/team/api-interop.js.map +1 -1
  655. package/dist/team/commit-hygiene.js.map +1 -1
  656. package/dist/team/contracts.d.ts +5 -5
  657. package/dist/team/contracts.d.ts.map +1 -1
  658. package/dist/team/delivery-log.js.map +1 -1
  659. package/dist/team/exact-pane.d.ts +23 -0
  660. package/dist/team/exact-pane.d.ts.map +1 -0
  661. package/dist/team/exact-pane.js +133 -0
  662. package/dist/team/exact-pane.js.map +1 -0
  663. package/dist/team/followup-planner.js.map +1 -1
  664. package/dist/team/goal-workflow.js.map +1 -1
  665. package/dist/team/idle-nudge.d.ts +12 -1
  666. package/dist/team/idle-nudge.d.ts.map +1 -1
  667. package/dist/team/idle-nudge.js +41 -14
  668. package/dist/team/idle-nudge.js.map +1 -1
  669. package/dist/team/model-contract.d.ts +18 -2
  670. package/dist/team/model-contract.d.ts.map +1 -1
  671. package/dist/team/model-contract.js +314 -35
  672. package/dist/team/model-contract.js.map +1 -1
  673. package/dist/team/orchestrator.js.map +1 -1
  674. package/dist/team/pane-status.js.map +1 -1
  675. package/dist/team/phase-controller.js.map +1 -1
  676. package/dist/team/reminder-intents.d.ts +1 -1
  677. package/dist/team/reminder-intents.d.ts.map +1 -1
  678. package/dist/team/reminder-intents.js.map +1 -1
  679. package/dist/team/runtime-cli.js.map +1 -1
  680. package/dist/team/runtime.d.ts +1 -0
  681. package/dist/team/runtime.d.ts.map +1 -1
  682. package/dist/team/runtime.js +1326 -231
  683. package/dist/team/runtime.js.map +1 -1
  684. package/dist/team/scaling.d.ts +22 -8
  685. package/dist/team/scaling.d.ts.map +1 -1
  686. package/dist/team/scaling.js +1463 -376
  687. package/dist/team/scaling.js.map +1 -1
  688. package/dist/team/state/dispatch-lock.js.map +1 -1
  689. package/dist/team/state/dispatch.d.ts.map +1 -1
  690. package/dist/team/state/dispatch.js +26 -8
  691. package/dist/team/state/dispatch.js.map +1 -1
  692. package/dist/team/state/events.js.map +1 -1
  693. package/dist/team/state/locks.d.ts.map +1 -1
  694. package/dist/team/state/locks.js +61 -13
  695. package/dist/team/state/locks.js.map +1 -1
  696. package/dist/team/state/tasks.d.ts.map +1 -1
  697. package/dist/team/state/tasks.js +4 -3
  698. package/dist/team/state/tasks.js.map +1 -1
  699. package/dist/team/state-root.js.map +1 -1
  700. package/dist/team/state.d.ts +67 -1
  701. package/dist/team/state.d.ts.map +1 -1
  702. package/dist/team/state.js +636 -129
  703. package/dist/team/state.js.map +1 -1
  704. package/dist/team/team-identity.d.ts.map +1 -1
  705. package/dist/team/team-identity.js.map +1 -1
  706. package/dist/team/team-ops.d.ts +5 -0
  707. package/dist/team/team-ops.d.ts.map +1 -1
  708. package/dist/team/team-ops.js +4 -0
  709. package/dist/team/team-ops.js.map +1 -1
  710. package/dist/team/tmux-session.d.ts +125 -23
  711. package/dist/team/tmux-session.d.ts.map +1 -1
  712. package/dist/team/tmux-session.js +1340 -333
  713. package/dist/team/tmux-session.js.map +1 -1
  714. package/dist/team/worker-bootstrap.js.map +1 -1
  715. package/dist/team/worktree.d.ts.map +1 -1
  716. package/dist/team/worktree.js +4 -0
  717. package/dist/team/worktree.js.map +1 -1
  718. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  719. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  720. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  721. package/dist/ultragoal/artifacts.js +4 -1
  722. package/dist/ultragoal/artifacts.js.map +1 -1
  723. package/dist/url-reader/index.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 +57 -0
  727. package/dist/utils/__tests__/file-durability.test.js.map +1 -0
  728. package/dist/utils/agents-model-table.js.map +1 -1
  729. package/dist/utils/file-durability.d.ts +15 -0
  730. package/dist/utils/file-durability.d.ts.map +1 -0
  731. package/dist/utils/file-durability.js +37 -0
  732. package/dist/utils/file-durability.js.map +1 -0
  733. package/dist/utils/package.js.map +1 -1
  734. package/dist/utils/paths.js.map +1 -1
  735. package/dist/utils/platform-command.js.map +1 -1
  736. package/dist/utils/repo-deps.js.map +1 -1
  737. package/dist/utils/version.js.map +1 -1
  738. package/dist/verification/__tests__/ci-rust-gates.test.js +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/verifier.js.map +1 -1
  742. package/dist/visual/constants.d.ts +1 -1
  743. package/dist/visual/constants.d.ts.map +1 -1
  744. package/dist/vscode/__tests__/index.test.js.map +1 -1
  745. package/dist/vscode/index.js.map +1 -1
  746. package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -1
  747. package/dist/wiki/__tests__/lint.test.js.map +1 -1
  748. package/dist/wiki/__tests__/query.test.js.map +1 -1
  749. package/dist/wiki/__tests__/storage.test.js.map +1 -1
  750. package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -1
  751. package/dist/wiki/lint.d.ts +4 -1
  752. package/dist/wiki/lint.d.ts.map +1 -1
  753. package/dist/wiki/lint.js +3 -2
  754. package/dist/wiki/lint.js.map +1 -1
  755. package/dist/wiki/query.js.map +1 -1
  756. package/dist/wiki/storage.js.map +1 -1
  757. package/package.json +2 -2
  758. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  759. package/plugins/oh-my-codex/hooks/codex-native-hook.mjs +24 -0
  760. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +10 -5
  761. package/plugins/oh-my-codex/skills/ralph/SKILL.md +6 -2
  762. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +6 -2
  763. package/plugins/oh-my-codex/skills/team/SKILL.md +13 -9
  764. package/skills/omx-setup/SKILL.md +10 -5
  765. package/skills/ralph/SKILL.md +6 -2
  766. package/skills/ralplan/SKILL.md +6 -2
  767. package/skills/team/SKILL.md +13 -9
  768. package/src/scripts/__tests__/codex-native-hook.test.ts +20048 -10827
  769. package/src/scripts/__tests__/fixtures/issue-3138-installed-smoke.ts +734 -0
  770. package/src/scripts/__tests__/notify-fallback-delivery.test.ts +177 -0
  771. package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
  772. package/src/scripts/__tests__/reasoning-artifact-contract.test.ts +129 -0
  773. package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +78 -0
  774. package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +60 -0
  775. package/src/scripts/__tests__/smoke-packed-install.test.ts +1309 -4
  776. package/src/scripts/codex-native-hook.ts +11429 -1163
  777. package/src/scripts/notify-fallback-delivery.ts +416 -0
  778. package/src/scripts/notify-fallback-watcher.ts +216 -155
  779. package/src/scripts/notify-hook/auto-nudge.ts +113 -14
  780. package/src/scripts/notify-hook/managed-tmux.ts +149 -12
  781. package/src/scripts/notify-hook/ralph-session-resume.ts +37 -36
  782. package/src/scripts/notify-hook/state-io.ts +100 -13
  783. package/src/scripts/notify-hook/team-dispatch.ts +242 -75
  784. package/src/scripts/notify-hook/team-leader-nudge.ts +40 -18
  785. package/src/scripts/notify-hook/team-tmux-guard.ts +366 -39
  786. package/src/scripts/notify-hook/team-worker-stop.ts +20 -16
  787. package/src/scripts/notify-hook/team-worker.ts +39 -26
  788. package/src/scripts/notify-hook/tmux-injection.ts +66 -23
  789. package/src/scripts/notify-hook/visual-verdict.ts +22 -12
  790. package/src/scripts/notify-hook.ts +336 -90
  791. package/src/scripts/smoke-packed-install.ts +5154 -149
@@ -25,12 +25,17 @@ import { readAutoresearchCompletionStatus } from '../../autoresearch/skill-valid
25
25
  import { persistDeepInterviewModeState } from '../../hooks/keyword-detector.js';
26
26
  import {
27
27
  isManagedOmxSession,
28
+ isManagedOmxSessionAtPromptContext,
28
29
  resolveManagedCurrentPane,
30
+ resolveManagedCurrentPaneAtPromptContext,
29
31
  resolveManagedPaneFromAnchor,
32
+ resolveManagedPaneFromAnchorAtPromptContext,
30
33
  resolveManagedSessionPane,
34
+ resolveManagedSessionPaneAtPromptContext,
31
35
  resolveInvocationSessionId,
32
36
  verifyManagedPaneTarget,
33
37
  } from './managed-tmux.js';
38
+ import type { PromptMutationAuthorization, ResolvedPromptTurnContext } from '../../hooks/prompt-session-provenance.js';
34
39
 
35
40
  export const SKILL_ACTIVE_STATE_FILE = 'skill-active-state.json';
36
41
  export const DEEP_INTERVIEW_BLOCKED_APPROVAL_INPUTS = ['yes', 'y', 'proceed', 'continue', 'ok', 'sure', 'go ahead', 'next i should'];
@@ -161,6 +166,7 @@ export function normalizeSkillActiveState(raw) {
161
166
  activated_at: safeString(raw.activated_at),
162
167
  updated_at: safeString(raw.updated_at),
163
168
  source: safeString(raw.source),
169
+ owner_codex_session_id: safeString(raw.owner_codex_session_id),
164
170
  input_lock: normalizeInputLock(raw.input_lock),
165
171
  };
166
172
  }
@@ -210,16 +216,28 @@ function cloneSkillActiveState(state) {
210
216
  };
211
217
  }
212
218
 
213
- export async function syncSkillStateFromTurn(stateDir, payload) {
219
+ export async function syncSkillStateFromTurn(stateDir, payload, invocationSessionIdOverride = '', authorization: PromptMutationAuthorization | null = null) {
214
220
  const lastMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
215
221
  const latestUserInput = latestUserInputFromPayload(payload);
216
- const invocationSessionId = resolveInvocationSessionId(payload);
222
+ const invocationSessionId = invocationSessionIdOverride || resolveInvocationSessionId(payload);
217
223
  let skillState = await loadSkillActiveState(stateDir, invocationSessionId);
218
224
  let releaseReason = null;
219
225
 
220
226
  if (!skillState) {
221
227
  return { invocationSessionId, skillState: null, releaseReason };
222
228
  }
229
+ if (authorization) {
230
+ const allowedOwners = Array.isArray(authorization.allowedOwnerCodexSessionIds)
231
+ ? authorization.allowedOwnerCodexSessionIds
232
+ : [];
233
+ const existingOwner = safeString(skillState.owner_codex_session_id).trim();
234
+ if (existingOwner && !allowedOwners.includes(existingOwner)) {
235
+ return { invocationSessionId, skillState: null, releaseReason: 'owner_conflict' };
236
+ }
237
+ if (authorization.ownerCodexSessionId) {
238
+ skillState.owner_codex_session_id = authorization.ownerCodexSessionId;
239
+ }
240
+ }
223
241
 
224
242
  const previousSkillState = cloneSkillActiveState(skillState);
225
243
  const previousPhase = normalizeSkillPhase(skillState.phase);
@@ -541,12 +559,50 @@ export async function capturePane(paneId, lines = 10) {
541
559
  }
542
560
  }
543
561
 
544
- export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: any = undefined) {
562
+ async function resolveTeamWorkerNudgeBinding(stateDir: string): Promise<{
563
+ paneId: string;
564
+ panePid: number;
565
+ paneOwnerId: string;
566
+ hudPaneId: string;
567
+ } | null> {
568
+ const workerContext = safeString(process.env.OMX_TEAM_WORKER || '').trim();
569
+ if (!workerContext) return null;
570
+ const match = /^([A-Za-z0-9][A-Za-z0-9_-]*)\/(worker-[1-9]\d*)$/.exec(workerContext);
571
+ if (!match) return null;
572
+ const [, teamName, workerName] = match;
573
+ const teamDir = join(stateDir, 'team', teamName);
574
+ try {
575
+ const manifestPath = join(teamDir, 'manifest.v2.json');
576
+ const configPath = join(teamDir, 'config.json');
577
+ let raw: any;
578
+ try {
579
+ raw = JSON.parse(await readFile(manifestPath, 'utf-8'));
580
+ } catch {
581
+ raw = JSON.parse(await readFile(configPath, 'utf-8'));
582
+ }
583
+ if (safeString(raw?.name).trim() !== teamName || !Array.isArray(raw?.workers)) return null;
584
+ const worker = raw.workers.find((entry: any) => safeString(entry?.name).trim() === workerName);
585
+ const paneId = safeString(worker?.pane_id).trim();
586
+ const panePid = asNumber(worker?.pid);
587
+ const hudPaneId = safeString(raw?.hud_pane_id).trim();
588
+ const paneOwnerId = typeof raw?.tmux_pane_owner_id === 'string' ? raw.tmux_pane_owner_id.trim() : '';
589
+ if (!/^%\d+$/.test(paneId) || !Number.isInteger(panePid) || panePid <= 0 || !paneOwnerId || paneId === hudPaneId) return null;
590
+ return { paneId, panePid, paneOwnerId, hudPaneId };
591
+ } catch {
592
+ return null;
593
+ }
594
+ }
595
+
596
+ export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: any = undefined, context: ResolvedPromptTurnContext | null = null) {
545
597
  const allowTeamWorker = safeString(process.env.OMX_TEAM_WORKER || '').trim() !== '';
546
- const managedCurrentPane = await resolveManagedCurrentPane(cwd, payload, { allowTeamWorker });
598
+ const managedCurrentPane = context
599
+ ? await resolveManagedCurrentPaneAtPromptContext(cwd, context)
600
+ : await resolveManagedCurrentPane(cwd, payload, { allowTeamWorker });
547
601
  if (managedCurrentPane) return managedCurrentPane;
548
602
 
549
- const invocationSessionId = resolveInvocationSessionId(payload);
603
+ const invocationSessionId = context?.status === 'authorized'
604
+ ? context.authorization.targetSessionId
605
+ : resolveInvocationSessionId(payload);
550
606
  const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir, invocationSessionId).catch(() => []);
551
607
  for (const dir of scopedDirs) {
552
608
  const files = await readdir(dir).catch(() => []);
@@ -558,9 +614,11 @@ export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: a
558
614
  if (!state || !state.active || !state.tmux_pane_id) continue;
559
615
  const anchoredPane = safeString(state.tmux_pane_id).trim();
560
616
  if (!anchoredPane) continue;
561
- const managedPane = await resolveManagedPaneFromAnchor(anchoredPane, cwd, payload, { allowTeamWorker });
617
+ const managedPane = context
618
+ ? await resolveManagedPaneFromAnchorAtPromptContext(anchoredPane, cwd, context)
619
+ : await resolveManagedPaneFromAnchor(anchoredPane, cwd, payload, { allowTeamWorker });
562
620
  if (managedPane) return managedPane;
563
- if (allowTeamWorker) {
621
+ if (allowTeamWorker && !context) {
564
622
  const verdict = await verifyManagedPaneTarget(anchoredPane, cwd, payload, { allowTeamWorker });
565
623
  if (verdict.ok) return anchoredPane;
566
624
  }
@@ -570,10 +628,12 @@ export async function resolveNudgePaneTarget(stateDir: any, cwd = '', payload: a
570
628
  }
571
629
  }
572
630
 
573
- return await resolveManagedSessionPane(cwd, payload);
631
+ return context
632
+ ? await resolveManagedSessionPaneAtPromptContext(cwd, context)
633
+ : await resolveManagedSessionPane(cwd, payload);
574
634
  }
575
635
 
576
- export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
636
+ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload, context = null, syncResult = null }: { cwd: string; stateDir: string; logsDir: string; payload: any; context?: ResolvedPromptTurnContext | null; syncResult?: any }) {
577
637
  const config = await loadAutoNudgeConfig();
578
638
  const effectiveResponse = resolveEffectiveAutoNudgeResponse(config.response);
579
639
  if (!config.enabled) return;
@@ -587,7 +647,9 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
587
647
  }
588
648
 
589
649
  const sourceName = safeString(payload?.source || '');
590
- const managedSession = await isManagedOmxSession(cwd, payload, { allowTeamWorker: true });
650
+ const managedSession = context
651
+ ? await isManagedOmxSessionAtPromptContext(cwd, context, { allowTeamWorker: false })
652
+ : await isManagedOmxSession(cwd, payload, { allowTeamWorker: true });
591
653
  if (!managedSession) {
592
654
  if (sourceName === 'notify-fallback-watcher-stall') return;
593
655
  await logTmuxHookEvent(logsDir, {
@@ -599,7 +661,10 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
599
661
  }
600
662
 
601
663
  const lastMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
602
- const { invocationSessionId, skillState, releaseReason } = await syncSkillStateFromTurn(stateDir, payload);
664
+ const { invocationSessionId, skillState, releaseReason } = syncResult
665
+ || (context?.status === 'authorized'
666
+ ? { invocationSessionId: context.authorization.targetSessionId, skillState: null, releaseReason: null }
667
+ : await syncSkillStateFromTurn(stateDir, payload));
603
668
 
604
669
  try {
605
670
  const nudgeStatePath = await getScopedStatePath(stateDir, 'auto-nudge-state.json', invocationSessionId);
@@ -607,14 +672,34 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
607
672
  if (!nudgeState || typeof nudgeState !== 'object') {
608
673
  nudgeState = { nudgeCount: 0, lastNudgeAt: '', lastSignature: '', lastSemanticSignature: '' };
609
674
  }
610
- const paneId = await resolveNudgePaneTarget(stateDir, cwd, payload);
675
+ const teamWorkerBinding = await resolveTeamWorkerNudgeBinding(stateDir);
676
+ if (safeString(process.env.OMX_TEAM_WORKER || '').trim() && !teamWorkerBinding) return;
677
+ const paneId = teamWorkerBinding?.paneId
678
+ ?? await resolveNudgePaneTarget(stateDir, cwd, payload, context);
679
+ const teamPaneOptions = teamWorkerBinding
680
+ ? {
681
+ exactPaneId: teamWorkerBinding.paneId,
682
+ expectedPanePid: teamWorkerBinding.panePid,
683
+ expectedPaneOwnerId: teamWorkerBinding.paneOwnerId,
684
+ expectedHudPaneId: teamWorkerBinding.hudPaneId,
685
+ }
686
+ : { exactPaneId: paneId };
611
687
 
612
688
  let detected = detectStallPattern(lastMessage, config.patterns, skillState?.phase);
613
689
  let source = 'payload';
614
690
  let captured = '';
615
691
 
616
692
  if (!detected && paneId) {
617
- captured = await capturePane(paneId);
693
+ if (teamWorkerBinding) {
694
+ const captureGuard = await evaluatePaneInjectionReadiness(paneId, {
695
+ skipIfScrolling: true,
696
+ ...teamPaneOptions,
697
+ });
698
+ if (!captureGuard.ok) return;
699
+ captured = captureGuard.paneCapture;
700
+ } else {
701
+ captured = await capturePane(paneId);
702
+ }
618
703
  detected = detectStallPattern(filterCapturedTestLines(captured), config.patterns, skillState?.phase);
619
704
  source = 'capture-pane';
620
705
  }
@@ -675,7 +760,7 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
675
760
  return;
676
761
  }
677
762
 
678
- const paneGuard = await evaluatePaneInjectionReadiness(paneId, { skipIfScrolling: true });
763
+ const paneGuard = await evaluatePaneInjectionReadiness(paneId, { skipIfScrolling: true, ...teamPaneOptions });
679
764
  if (!paneGuard.ok) {
680
765
  await logTmuxHookEvent(logsDir, {
681
766
  timestamp: new Date().toISOString(),
@@ -688,6 +773,18 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
688
773
  }).catch(() => {});
689
774
  return;
690
775
  }
776
+ const readinessPanePid = asNumber(paneGuard.exactPaneProof?.pid);
777
+ if (!Number.isInteger(readinessPanePid) || readinessPanePid <= 0) {
778
+ await logTmuxHookEvent(logsDir, {
779
+ timestamp: new Date().toISOString(),
780
+ type: 'auto_nudge_skipped',
781
+ pane_id: paneId,
782
+ reason: 'pane_readiness_unverified',
783
+ source,
784
+ }).catch(() => {});
785
+ return;
786
+ }
787
+ const pinnedPaneOptions = { ...teamPaneOptions, expectedPanePid: readinessPanePid };
691
788
 
692
789
  const blockedAutoApproval = isDeepInterviewAutoApprovalLocked(skillState)
693
790
  && !releaseReason
@@ -716,6 +813,8 @@ export async function maybeAutoNudge({ cwd, stateDir, logsDir, payload }) {
716
813
  try {
717
814
  const sendResult = await sendPaneInput({
718
815
  paneTarget: paneId,
816
+ exactPaneId: paneId,
817
+ ...pinnedPaneOptions,
719
818
  prompt: `${effectiveResponse} ${DEFAULT_MARKER}`,
720
819
  submitKeyPresses: 2,
721
820
  submitDelayMs: 100,
@@ -5,6 +5,8 @@ import { readSessionState, isSessionStale } from '../../hooks/session.js';
5
5
  import { runProcess } from './process-runner.js';
6
6
  import { safeString } from './utils.js';
7
7
  import { sameFilePath } from '../../utils/paths.js';
8
+ import type { ResolvedPromptTurnContext } from '../../hooks/prompt-session-provenance.js';
9
+
8
10
 
9
11
  const OMX_INSTANCE_OPTION = '@omx_instance_id';
10
12
  const OMX_PANE_INSTANCE_OPTION = '@omx_pane_instance_id';
@@ -82,20 +84,30 @@ function readCurrentTmuxSessionName(): string {
82
84
  }
83
85
  }
84
86
 
85
- async function readTmuxOption(targetValue: string, optionName: string, { pane = false } = {}): Promise<string> {
87
+ interface TmuxOptionProbe {
88
+ status: 'present' | 'absent' | 'error';
89
+ value: string;
90
+ }
91
+
92
+ async function probeTmuxOption(targetValue: string, optionName: string, { pane = false } = {}): Promise<TmuxOptionProbe> {
86
93
  const target = safeString(targetValue).trim();
87
- if (!target) return '';
94
+ if (!target) return { status: 'absent', value: '' };
88
95
  const args = ['show-option', '-qv'];
89
96
  if (pane) args.push('-p');
90
97
  args.push('-t', target, optionName);
91
98
  try {
92
99
  const result = await runProcess('tmux', args, 2000);
93
- return safeString(result.stdout).trim();
100
+ const value = safeString(result.stdout).trim();
101
+ return { status: value ? 'present' : 'absent', value };
94
102
  } catch {
95
- return '';
103
+ return { status: 'error', value: '' };
96
104
  }
97
105
  }
98
106
 
107
+ async function readTmuxOption(targetValue: string, optionName: string, { pane = false } = {}): Promise<string> {
108
+ return (await probeTmuxOption(targetValue, optionName, { pane })).value;
109
+ }
110
+
99
111
  async function readTmuxSessionInstanceId(sessionTarget: string): Promise<string> {
100
112
  return readTmuxOption(sessionTarget, OMX_INSTANCE_OPTION);
101
113
  }
@@ -104,6 +116,86 @@ async function readTmuxPaneInstanceId(paneTarget: string): Promise<string> {
104
116
  return readTmuxOption(paneTarget, OMX_PANE_INSTANCE_OPTION, { pane: true });
105
117
  }
106
118
 
119
+ export interface ActualTmuxInstanceEvidence {
120
+ paneTarget: string;
121
+ sessionName: string;
122
+ paneInstanceId: string;
123
+ sessionInstanceId: string;
124
+ instanceId: string;
125
+ source: 'none' | 'pane' | 'session';
126
+ paneTagStatus: 'not-requested' | 'present' | 'absent' | 'error';
127
+ }
128
+
129
+ export async function probeActualTmuxInstanceEvidence(paneTarget?: string): Promise<ActualTmuxInstanceEvidence> {
130
+ const resolvedPaneTarget = safeString(paneTarget ?? process.env.TMUX_PANE ?? '').trim();
131
+ let sessionName = '';
132
+ if (resolvedPaneTarget) {
133
+ try {
134
+ const result = await runProcess('tmux', ['display-message', '-p', '-t', resolvedPaneTarget, '#S'], 2000);
135
+ sessionName = safeString(result.stdout).trim();
136
+ } catch {
137
+ // A pane target without a session cannot provide session-tag evidence.
138
+ }
139
+ } else {
140
+ sessionName = readCurrentTmuxSessionName();
141
+ }
142
+
143
+ const paneProbe = resolvedPaneTarget
144
+ ? await probeTmuxOption(resolvedPaneTarget, OMX_PANE_INSTANCE_OPTION, { pane: true })
145
+ : { status: 'absent' as const, value: '' };
146
+ const paneTagStatus = resolvedPaneTarget ? paneProbe.status : 'not-requested';
147
+ if (paneProbe.status === 'present') {
148
+ return {
149
+ paneTarget: resolvedPaneTarget,
150
+ sessionName,
151
+ paneInstanceId: paneProbe.value,
152
+ sessionInstanceId: '',
153
+ instanceId: paneProbe.value,
154
+ source: 'pane',
155
+ paneTagStatus,
156
+ };
157
+ }
158
+ if (paneProbe.status === 'error') {
159
+ return {
160
+ paneTarget: resolvedPaneTarget,
161
+ sessionName,
162
+ paneInstanceId: '',
163
+ sessionInstanceId: '',
164
+ instanceId: '',
165
+ source: 'none',
166
+ paneTagStatus,
167
+ };
168
+ }
169
+
170
+ const sessionInstanceId = sessionName
171
+ ? await readTmuxSessionInstanceId(sessionName)
172
+ : '';
173
+ return {
174
+ paneTarget: resolvedPaneTarget,
175
+ sessionName,
176
+ paneInstanceId: '',
177
+ sessionInstanceId,
178
+ instanceId: sessionInstanceId,
179
+ source: sessionInstanceId ? 'session' : 'none',
180
+ paneTagStatus,
181
+ };
182
+ }
183
+
184
+ export function tmuxEvidenceBindsCandidate(
185
+ evidence: ActualTmuxInstanceEvidence,
186
+ candidateSessionId: string,
187
+ ): boolean {
188
+ const candidate = safeString(candidateSessionId).trim();
189
+ if (!candidate) return false;
190
+ if (evidence.paneTagStatus === 'present') {
191
+ return evidence.source === 'pane' && evidence.paneInstanceId === candidate;
192
+ }
193
+ return evidence.paneTagStatus === 'absent'
194
+ && evidence.source === 'session'
195
+ && evidence.sessionInstanceId === candidate;
196
+ }
197
+
198
+
107
199
  function warnPaneInstanceFallback(paneTarget: string): void {
108
200
  // Notify hooks run inside Codex foreground hook surfaces. Keep this
109
201
  // compatibility fallback silent; downstream tmux-hook events still record
@@ -218,9 +310,10 @@ export async function resolveManagedSessionContext(
218
310
  authoritativeSessionCwd,
219
311
  canonicalSessionId || invocationSessionId,
220
312
  );
221
- const currentTmuxSessionName = readCurrentTmuxSessionName();
222
- const currentTmuxPaneTarget = safeString(paneTarget || process.env.TMUX_PANE || '').trim();
223
- const currentTmuxPaneInstanceId = currentTmuxPaneTarget ? await readTmuxPaneInstanceId(currentTmuxPaneTarget) : '';
313
+ const evidence = await probeActualTmuxInstanceEvidence(paneTarget);
314
+ const currentTmuxSessionName = evidence.sessionName || readCurrentTmuxSessionName();
315
+ const currentTmuxPaneTarget = evidence.paneTarget;
316
+ const currentTmuxPaneInstanceId = evidence.paneInstanceId;
224
317
  if (currentTmuxPaneInstanceId && currentTmuxPaneInstanceId !== invocationSessionId) {
225
318
  return {
226
319
  managed: false,
@@ -248,7 +341,11 @@ export async function resolveManagedSessionContext(
248
341
  };
249
342
  }
250
343
 
251
- const currentTmuxInstanceId = currentTmuxSessionName ? await readTmuxSessionInstanceId(currentTmuxSessionName) : '';
344
+ const currentTmuxInstanceId = evidence.sessionName === currentTmuxSessionName
345
+ ? evidence.sessionInstanceId
346
+ : currentTmuxSessionName
347
+ ? await readTmuxSessionInstanceId(currentTmuxSessionName)
348
+ : '';
252
349
  if (currentTmuxInstanceId && currentTmuxInstanceId !== invocationSessionId) {
253
350
  return {
254
351
  managed: false,
@@ -359,6 +456,39 @@ export async function isManagedOmxSession(cwd: string, payload: any, options: {
359
456
  return context.managed === true;
360
457
  }
361
458
 
459
+ /**
460
+ * Leader-only adapter: tmux ownership is derived from the immutable provenance
461
+ * owner instead of re-reading payload or environment session identity.
462
+ */
463
+ export async function isManagedOmxSessionAtPromptContext(
464
+ cwd: string,
465
+ context: ResolvedPromptTurnContext,
466
+ options: { allowTeamWorker?: boolean } = {},
467
+ ): Promise<boolean> {
468
+ if (context.status !== 'authorized') return false;
469
+ return isManagedOmxSession(cwd, { session_id: context.authorization.ownerCodexSessionId }, options);
470
+ }
471
+
472
+ export async function verifyManagedPaneTargetAtPromptContext(paneId: string, cwd: string, context: ResolvedPromptTurnContext): Promise<any> {
473
+ if (context.status !== 'authorized') return { ok: false, reason: 'prompt_context_unauthorized', paneTarget: safeString(paneId).trim() };
474
+ return verifyManagedPaneTarget(paneId, cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
475
+ }
476
+
477
+ export async function resolveManagedCurrentPaneAtPromptContext(cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
478
+ if (context.status !== 'authorized') return '';
479
+ return resolveManagedCurrentPane(cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
480
+ }
481
+
482
+ export async function resolveManagedSessionPaneAtPromptContext(cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
483
+ if (context.status !== 'authorized') return '';
484
+ return resolveManagedSessionPane(cwd, { session_id: context.authorization.ownerCodexSessionId });
485
+ }
486
+
487
+ export async function resolveManagedPaneFromAnchorAtPromptContext(anchorPane: string, cwd: string, context: ResolvedPromptTurnContext): Promise<string> {
488
+ if (context.status !== 'authorized') return '';
489
+ return resolveManagedPaneFromAnchor(anchorPane, cwd, { session_id: context.authorization.ownerCodexSessionId }, { allowTeamWorker: false });
490
+ }
491
+
362
492
  export async function verifyManagedPaneTarget(paneId: string, cwd: string, payload: any, { allowTeamWorker = true } = {}): Promise<any> {
363
493
  const paneTarget = safeString(paneId).trim();
364
494
  if (!paneTarget) {
@@ -380,13 +510,20 @@ export async function verifyManagedPaneTarget(paneId: string, cwd: string, paylo
380
510
  }
381
511
 
382
512
  try {
383
- const sessionResult = await runProcess('tmux', ['display-message', '-p', '-t', paneTarget, '#S'], 2000);
384
- const paneSessionName = safeString(sessionResult.stdout).trim();
513
+ let paneSessionName = safeString(managedContext.currentTmuxSessionName).trim();
514
+ if (!paneSessionName) {
515
+ const sessionResult = await runProcess('tmux', ['display-message', '-p', '-t', paneTarget, '#S'], 2000);
516
+ paneSessionName = safeString(sessionResult.stdout).trim();
517
+ }
385
518
  if (!paneSessionName) {
386
519
  return { ok: false, reason: 'pane_session_missing', paneTarget, managedContext };
387
520
  }
388
- const paneInstanceId = await readTmuxPaneInstanceId(paneTarget);
389
- const sessionInstanceId = paneInstanceId ? '' : await readTmuxSessionInstanceId(paneSessionName);
521
+ const paneInstanceId = safeString(managedContext.currentTmuxPaneInstanceId).trim()
522
+ || await readTmuxPaneInstanceId(paneTarget);
523
+ const sessionInstanceId = paneInstanceId
524
+ ? ''
525
+ : safeString(managedContext.currentTmuxInstanceId).trim()
526
+ || await readTmuxSessionInstanceId(paneSessionName);
390
527
  if (paneInstanceId && paneInstanceId !== managedContext.invocationSessionId) {
391
528
  return { ok: false, reason: 'pane_instance_mismatch', paneTarget, paneSessionName, paneInstanceId, managedContext };
392
529
  }
@@ -4,6 +4,7 @@ import { dirname, join } from 'path';
4
4
  import { captureTmuxPaneFromEnv } from '../../state/mode-state-context.js';
5
5
  import { resolveCodexPane } from '../tmux-hook-engine.js';
6
6
  import { safeString } from './utils.js';
7
+ import type { PromptMutationAuthorization } from '../../hooks/prompt-session-provenance.js';
7
8
 
8
9
  const SESSION_ID_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
9
10
  const RALPH_TERMINAL_PHASES = new Set(['blocked_on_user', 'complete', 'failed', 'cancelled', 'interrupted']);
@@ -19,7 +20,9 @@ interface RalphSessionResumeHooks {
19
20
 
20
21
  interface RalphSessionResumeParams {
21
22
  stateDir: string;
22
- payloadSessionId: string;
23
+ authorization?: PromptMutationAuthorization;
24
+ /** Worker-only legacy identity; leader resume requires authorization. */
25
+ payloadSessionId?: string;
23
26
  payloadThreadId?: string;
24
27
  env?: NodeJS.ProcessEnv;
25
28
  hooks?: RalphSessionResumeHooks;
@@ -210,25 +213,6 @@ async function markRalphStateAbandoned(
210
213
  });
211
214
  }
212
215
 
213
- function readSessionIdFromEnvironment(env: NodeJS.ProcessEnv = process.env): string {
214
- const candidates = [env.OMX_SESSION_ID, env.CODEX_SESSION_ID, env.SESSION_ID];
215
- for (const candidate of candidates) {
216
- const sessionId = safeString(candidate).trim();
217
- if (SESSION_ID_PATTERN.test(sessionId)) return sessionId;
218
- }
219
- return '';
220
- }
221
-
222
- async function readCurrentOmxSessionId(stateDir: string, env: NodeJS.ProcessEnv = process.env): Promise<string> {
223
- const envSessionId = readSessionIdFromEnvironment(env);
224
- if (envSessionId) return envSessionId;
225
-
226
- const session = await readJson(join(stateDir, 'session.json'));
227
- if (!session || typeof session !== 'object') return '';
228
- const sessionId = safeString(session?.session_id).trim();
229
- return SESSION_ID_PATTERN.test(sessionId) ? sessionId : '';
230
- }
231
-
232
216
  function resolveResumePane(env: NodeJS.ProcessEnv = process.env): string {
233
217
  const injectedPane = captureTmuxPaneFromEnv(env);
234
218
  if (env !== process.env && injectedPane) return injectedPane;
@@ -249,8 +233,9 @@ function bindCurrentPane(state: Record<string, unknown>, nowIso: string, env: No
249
233
  async function scanMatchingRalphCandidates(
250
234
  stateDir: string,
251
235
  currentOmxSessionId: string,
252
- payloadSessionId: string,
236
+ ownerCodexSessionId: string,
253
237
  payloadThreadId: string,
238
+ allowedStorageSessionIds: readonly string[],
254
239
  env: NodeJS.ProcessEnv = process.env,
255
240
  ): Promise<{ candidates: RalphStateCandidate[]; abandonedCount: number }> {
256
241
  const sessionsRoot = join(stateDir, 'sessions');
@@ -260,18 +245,15 @@ async function scanMatchingRalphCandidates(
260
245
  const matches: RalphStateCandidate[] = [];
261
246
  let abandonedCount = 0;
262
247
  for (const entry of entries) {
263
- if (!entry.isDirectory() || !SESSION_ID_PATTERN.test(entry.name) || entry.name === currentOmxSessionId) continue;
248
+ if (!entry.isDirectory() || !SESSION_ID_PATTERN.test(entry.name) || entry.name === currentOmxSessionId || !allowedStorageSessionIds.includes(entry.name)) continue;
264
249
  const path = join(sessionsRoot, entry.name, 'ralph-state.json');
265
250
  if (!existsSync(path)) continue;
266
251
  const state = await readJson(path);
267
252
  if (!isActiveRalphCandidate(state)) continue;
268
253
  const ownerSessionId = safeString(state.owner_codex_session_id).trim();
269
254
  const ownerThreadId = safeString(state.owner_codex_thread_id).trim();
270
- if (ownerSessionId) {
271
- if (!payloadSessionId || ownerSessionId !== payloadSessionId) continue;
272
- } else if (!payloadThreadId || !ownerThreadId || ownerThreadId !== payloadThreadId) {
273
- continue;
274
- }
255
+ if (ownerSessionId !== ownerCodexSessionId) continue;
256
+ if (ownerThreadId && payloadThreadId && ownerThreadId !== payloadThreadId) continue;
275
257
  const freshness = await readRalphStateFreshness(path, state, env);
276
258
  if (freshness.stale) {
277
259
  await markRalphStateAbandoned(path, state, freshness);
@@ -289,21 +271,29 @@ async function scanMatchingRalphCandidates(
289
271
 
290
272
  export async function reconcileRalphSessionResume({
291
273
  stateDir,
292
- payloadSessionId,
274
+ authorization,
293
275
  payloadThreadId = '',
294
276
  env = process.env,
295
277
  hooks,
296
278
  }: RalphSessionResumeParams): Promise<RalphSessionResumeResult> {
279
+ if (!authorization) {
280
+ return {
281
+ currentOmxSessionId: '',
282
+ resumed: false,
283
+ updatedCurrentOwner: false,
284
+ reason: 'authorization_missing',
285
+ };
286
+ }
297
287
  const lockedResult = await withRalphResumeLock(stateDir, async () => {
298
288
  await hooks?.afterLockAcquired?.();
299
289
 
300
- const currentOmxSessionId = await readCurrentOmxSessionId(stateDir, env);
301
- if (!currentOmxSessionId) {
290
+ const currentOmxSessionId = authorization.targetSessionId;
291
+ if (!SESSION_ID_PATTERN.test(currentOmxSessionId) || !authorization.allowedStorageSessionIds.includes(currentOmxSessionId)) {
302
292
  return {
303
293
  currentOmxSessionId: '',
304
294
  resumed: false,
305
295
  updatedCurrentOwner: false,
306
- reason: 'current_omx_session_missing',
296
+ reason: 'current_omx_session_unauthorized',
307
297
  };
308
298
  }
309
299
 
@@ -315,6 +305,16 @@ export async function reconcileRalphSessionResume({
315
305
  : null;
316
306
  const nowIso = new Date().toISOString();
317
307
 
308
+ const currentOwnerCodexSessionId = safeString(currentRalphState?.owner_codex_session_id).trim();
309
+ if (currentRalphState && currentOwnerCodexSessionId && currentOwnerCodexSessionId !== authorization.ownerCodexSessionId) {
310
+ return {
311
+ currentOmxSessionId,
312
+ resumed: false,
313
+ updatedCurrentOwner: false,
314
+ reason: 'current_ralph_owner_unauthorized',
315
+ targetPath: currentRalphPath,
316
+ };
317
+ }
318
318
  if (currentRalphState && currentRalphState.active === true) {
319
319
  const freshness = await readRalphStateFreshness(currentRalphPath, currentRalphState, env);
320
320
  if (freshness.stale) {
@@ -335,8 +335,8 @@ export async function reconcileRalphSessionResume({
335
335
  updated.owner_omx_session_id = currentOmxSessionId;
336
336
  changed = true;
337
337
  }
338
- if (payloadSessionId && !safeString(updated.owner_codex_session_id).trim()) {
339
- updated.owner_codex_session_id = payloadSessionId;
338
+ if (!safeString(updated.owner_codex_session_id).trim()) {
339
+ updated.owner_codex_session_id = authorization.ownerCodexSessionId;
340
340
  changed = true;
341
341
  }
342
342
  if (
@@ -382,14 +382,14 @@ export async function reconcileRalphSessionResume({
382
382
  };
383
383
  }
384
384
 
385
- const normalizedPayloadSessionId = safeString(payloadSessionId).trim();
385
+ const normalizedPayloadSessionId = authorization.ownerCodexSessionId;
386
386
  const normalizedPayloadThreadId = safeString(payloadThreadId).trim();
387
- if (!normalizedPayloadSessionId && !normalizedPayloadThreadId) {
387
+ if (!normalizedPayloadSessionId) {
388
388
  return {
389
389
  currentOmxSessionId,
390
390
  resumed: false,
391
391
  updatedCurrentOwner: false,
392
- reason: 'payload_codex_identity_missing',
392
+ reason: 'authorized_owner_missing',
393
393
  };
394
394
  }
395
395
 
@@ -398,6 +398,7 @@ export async function reconcileRalphSessionResume({
398
398
  currentOmxSessionId,
399
399
  normalizedPayloadSessionId,
400
400
  normalizedPayloadThreadId,
401
+ authorization.allowedStorageSessionIds,
401
402
  env,
402
403
  );
403
404
  if (candidates.length !== 1) {