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
@@ -2,7 +2,7 @@ import { describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
3
  import { spawnSync } from 'node:child_process';
4
4
  import { chmod, mkdtemp, mkdir, readFile, rm, writeFile } from 'node:fs/promises';
5
- import { existsSync } from 'node:fs';
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
6
6
  import { tmpdir } from 'node:os';
7
7
  import { join } from 'node:path';
8
8
  import { initTeamState, enqueueDispatchRequest, readDispatchRequest } from '../../team/state.js';
@@ -18,7 +18,15 @@ async function withTempWorkingDir(run) {
18
18
  }
19
19
  }
20
20
  async function writeJson(path, value) {
21
- await writeFile(path, JSON.stringify(value, null, 2));
21
+ let persisted = value;
22
+ if (path.endsWith('/config.json') && value && typeof value === 'object' && !Array.isArray(value)) {
23
+ const config = value;
24
+ if (!Object.prototype.hasOwnProperty.call(config, 'tmux_pane_owner_id')
25
+ && typeof config.name === 'string' && config.name.trim()) {
26
+ persisted = { ...config, tmux_pane_owner_id: `team:${config.name.trim()}` };
27
+ }
28
+ }
29
+ await writeFile(path, JSON.stringify(persisted, null, 2));
22
30
  }
23
31
  async function writeCanonicalTeamFixture(cwd, { teamName, sessionId, ownerSessionId, coarseState = 'missing', }) {
24
32
  const stateDir = join(cwd, '.omx', 'state');
@@ -69,6 +77,8 @@ async function writeCanonicalTeamFixture(cwd, { teamName, sessionId, ownerSessio
69
77
  },
70
78
  tmux_session: `${teamName}:0`,
71
79
  leader_pane_id: '%97',
80
+ leader_pane_pid: 12097,
81
+ tmux_pane_owner_id: `team:${teamName}`,
72
82
  hud_pane_id: null,
73
83
  resize_hook_name: null,
74
84
  resize_hook_target: null,
@@ -196,9 +206,21 @@ fi
196
206
  if [[ "$cmd" == "send-keys" ]]; then
197
207
  exit 0
198
208
  fi
209
+ if [[ "$cmd" == "show-option" ]]; then
210
+ target=""
211
+ while [[ "$#" -gt 0 ]]; do
212
+ case "$1" in
213
+ -t) target="$2"; shift 2 ;;
214
+ *) shift ;;
215
+ esac
216
+ done
217
+ node -e 'const fs=require("fs"),path=require("path"),root=process.argv[1],target=process.argv[2],teamRoot=path.join(root,".omx","state","team");for(const team of fs.readdirSync(teamRoot,{withFileTypes:true}).filter(entry=>entry.isDirectory()).map(entry=>entry.name)){const dir=path.join(teamRoot,team),manifest=path.join(dir,"manifest.v2.json"),config=path.join(dir,"config.json"),source=fs.existsSync(manifest)?manifest:config;if(!fs.existsSync(source))continue;try{const raw=JSON.parse(fs.readFileSync(source,"utf8"));if(raw.leader_pane_id===target){process.stdout.write(String(raw.tmux_pane_owner_id||"team:"+team));break;}}catch{}}' "$(dirname "$(dirname "$0")")" "$target"
218
+ exit 0
219
+ fi
199
220
  if [[ "$cmd" == "list-panes" ]]; then
200
- echo "%1 12345"
201
- echo "%2 12346"
221
+ for pane in $(seq 1 200); do
222
+ printf '%%%s\t0\t%s\n' "$pane" "$((12000 + pane))"
223
+ done
202
224
  exit 0
203
225
  fi
204
226
  exit 0
@@ -244,6 +266,17 @@ fi
244
266
  if [[ "$cmd" == "send-keys" ]]; then
245
267
  exit 0
246
268
  fi
269
+ if [[ "$cmd" == "show-option" ]]; then
270
+ target=""
271
+ while [[ "$#" -gt 0 ]]; do
272
+ case "$1" in
273
+ -t) target="$2"; shift 2 ;;
274
+ *) shift ;;
275
+ esac
276
+ done
277
+ node -e 'const fs=require("fs"),path=require("path"),root=process.argv[1],target=process.argv[2],teamRoot=path.join(root,".omx","state","team");for(const team of fs.readdirSync(teamRoot,{withFileTypes:true}).filter(entry=>entry.isDirectory()).map(entry=>entry.name)){const dir=path.join(teamRoot,team),manifest=path.join(dir,"manifest.v2.json"),config=path.join(dir,"config.json"),source=fs.existsSync(manifest)?manifest:config;if(!fs.existsSync(source))continue;try{const raw=JSON.parse(fs.readFileSync(source,"utf8"));if(raw.leader_pane_id===target){process.stdout.write(String(raw.tmux_pane_owner_id||"team:"+team));break;}}catch{}}' "$(dirname "$(dirname "$0")")" "$target"
278
+ exit 0
279
+ fi
247
280
  if [[ "$cmd" == "list-panes" ]]; then
248
281
  printf "%b\\n" "${escapedLines}"
249
282
  exit 0
@@ -251,11 +284,24 @@ fi
251
284
  exit 0
252
285
  `;
253
286
  }
287
+ function fakeTmuxOwnerOptionHandler(ownerId) {
288
+ return `if [[ "$cmd" == "show-option" ]]; then
289
+ echo "${ownerId}"
290
+ exit 0
291
+ fi`;
292
+ }
254
293
  function runNotifyHook(cwd, fakeBinDir, extraEnv = {}) {
294
+ const sessionPath = join(cwd, '.omx', 'state', 'session.json');
295
+ if (!existsSync(sessionPath)) {
296
+ mkdirSync(join(cwd, '.omx', 'state'), { recursive: true });
297
+ writeFileSync(sessionPath, JSON.stringify({ session_id: extraEnv.OMX_SESSION_ID || 'thread-test' }));
298
+ }
299
+ const sessionState = JSON.parse(readFileSync(sessionPath, 'utf8'));
255
300
  const payload = {
256
301
  cwd,
257
302
  type: 'agent-turn-complete',
258
303
  'thread-id': 'thread-test',
304
+ session_id: sessionState.session_id,
259
305
  'turn-id': `turn-${Date.now()}`,
260
306
  'input-messages': ['test'],
261
307
  'last-assistant-message': 'output',
@@ -301,6 +347,8 @@ describe('notify-hook leader-side authority handoff', () => {
301
347
  name: teamName,
302
348
  tmux_session: 'handoff-sess:0',
303
349
  leader_pane_id: '%91',
350
+ leader_pane_pid: 12091,
351
+ tmux_pane_owner_id: 'team:handoff-alpha',
304
352
  });
305
353
  await writeJson(join(stateDir, 'hud-state.json'), {
306
354
  last_turn_at: new Date(Date.now() - 300_000).toISOString(),
@@ -318,16 +366,51 @@ describe('notify-hook leader-side authority handoff', () => {
318
366
  },
319
367
  ],
320
368
  });
321
- await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath));
369
+ await writeFile(fakeTmuxPath, buildFakeTmux(tmuxLogPath).replace('if [[ "$cmd" == "show-option" ]]; then', 'if [[ "$cmd" == "show-option" ]]; then\n echo "team:foreign"\n exit 0\nfi\nif [[ "$cmd" == "show-option" ]]; then'));
322
370
  await chmod(fakeTmuxPath, 0o755);
323
371
  const result = runNotifyHook(cwd, fakeBinDir, {
324
372
  OMX_SESSION_ID: 'sess-canonical-missing',
325
373
  });
326
374
  assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
327
375
  const tmuxLog = await readFile(tmuxLogPath, 'utf-8').catch(() => '');
328
- assert.match(tmuxLog, /send-keys/, 'current implementation nudges the leader directly in this stale-leader path');
376
+ assert.doesNotMatch(tmuxLog, /send-keys/, 'a same-ID/PID foreign owner must not receive leader input');
329
377
  });
330
378
  });
379
+ it('defers leader nudges without tmux reads when the persisted owner token is missing or malformed', async () => {
380
+ for (const owner of [undefined, 17]) {
381
+ await withTempWorkingDir(async (cwd) => {
382
+ const stateDir = join(cwd, '.omx', 'state');
383
+ const logsDir = join(cwd, '.omx', 'logs');
384
+ const teamName = 'owner-required';
385
+ const teamDir = join(stateDir, 'team', teamName);
386
+ const fakeBinDir = join(cwd, 'fake-bin');
387
+ const tmuxLogPath = join(cwd, 'tmux.log');
388
+ await mkdir(logsDir, { recursive: true });
389
+ await mkdir(fakeBinDir, { recursive: true });
390
+ await mkdir(teamDir, { recursive: true });
391
+ await writeJson(join(stateDir, 'team-state.json'), {
392
+ active: true,
393
+ team_name: teamName,
394
+ current_phase: 'team-exec',
395
+ });
396
+ const config = {
397
+ name: teamName,
398
+ tmux_session: `${teamName}:0`,
399
+ leader_pane_id: '%91',
400
+ leader_pane_pid: 12091,
401
+ };
402
+ config.tmux_pane_owner_id = owner === undefined ? null : owner;
403
+ await writeJson(join(teamDir, 'config.json'), config);
404
+ await writeFile(join(fakeBinDir, 'tmux'), buildFakeTmux(tmuxLogPath));
405
+ await chmod(join(fakeBinDir, 'tmux'), 0o755);
406
+ const result = runNotifyHook(cwd, fakeBinDir, { OMX_SESSION_ID: 'sess-canonical-missing' });
407
+ assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
408
+ assert.equal(existsSync(tmuxLogPath), false, 'missing or malformed persisted owner must not capture or send tmux input');
409
+ const delivery = await readTeamDeliveryLog(cwd);
410
+ assert.ok(delivery.some((entry) => entry.reason === 'leader_pane_owner_missing_no_injection'), 'owner absence must be durably deferred');
411
+ });
412
+ }
413
+ });
331
414
  it('does not drain pending dispatch requests from notify-hook leader context', async () => {
332
415
  await withTempWorkingDir(async (cwd) => {
333
416
  const fakeBinDir = join(cwd, 'fake-bin');
@@ -375,6 +458,7 @@ describe('notify-hook leader-side authority handoff', () => {
375
458
  name: teamName,
376
459
  tmux_session: 'omx-team-beta-active-status',
377
460
  leader_pane_id: '%92',
461
+ leader_pane_pid: 12092,
378
462
  workers: [
379
463
  { name: 'worker-1', index: 1, pane_id: '%10' },
380
464
  ],
@@ -441,6 +525,7 @@ describe('notify-hook team leader nudge', () => {
441
525
  name: teamName,
442
526
  tmux_session: 'deep-interview-suppressed:0',
443
527
  leader_pane_id: '%97',
528
+ leader_pane_pid: 12097,
444
529
  });
445
530
  await writeJson(join(stateDir, 'hud-state.json'), {
446
531
  last_turn_at: new Date(Date.now() - 300_000).toISOString(),
@@ -483,6 +568,7 @@ describe('notify-hook team leader nudge', () => {
483
568
  name: teamName,
484
569
  tmux_session: 'idle-sess:0',
485
570
  leader_pane_id: '%99',
571
+ leader_pane_pid: 12099,
486
572
  workers: [
487
573
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
488
574
  { name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
@@ -553,6 +639,7 @@ describe('notify-hook team leader nudge', () => {
553
639
  name: teamName,
554
640
  tmux_session: 'idle-shutdown:0',
555
641
  leader_pane_id: '%96',
642
+ leader_pane_pid: 12096,
556
643
  workers: [
557
644
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },
558
645
  { name: 'worker-2', index: 2, pane_id: '%11', role: 'executor' },
@@ -577,7 +664,7 @@ describe('notify-hook team leader nudge', () => {
577
664
  updated_at: nowIso,
578
665
  });
579
666
  }
580
- await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%10 12345', '%11 12346']));
667
+ await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%96\t0\t12096', '%10\t0\t12010', '%11\t0\t12011']));
581
668
  await chmod(fakeTmuxPath, 0o755);
582
669
  const result = runNotifyHook(cwd, fakeBinDir, {
583
670
  OMX_SESSION_ID: 'sess-canonical-missing',
@@ -616,6 +703,7 @@ describe('notify-hook team leader nudge', () => {
616
703
  name: teamName,
617
704
  tmux_session: 'idle-followup-reuse:0',
618
705
  leader_pane_id: '%97',
706
+ leader_pane_pid: 12097,
619
707
  workers: [
620
708
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },
621
709
  { name: 'worker-2', index: 2, pane_id: '%11', role: 'executor' },
@@ -639,7 +727,7 @@ describe('notify-hook team leader nudge', () => {
639
727
  updated_at: nowIso,
640
728
  });
641
729
  }
642
- await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%10 12345', '%11 12346']));
730
+ await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%97\t0\t12097', '%10\t0\t12010', '%11\t0\t12011']));
643
731
  await chmod(fakeTmuxPath, 0o755);
644
732
  const result = runNotifyHook(cwd, fakeBinDir, {
645
733
  OMX_SESSION_ID: 'sess-canonical-inactive',
@@ -678,6 +766,7 @@ describe('notify-hook team leader nudge', () => {
678
766
  name: teamName,
679
767
  tmux_session: 'idle-followup-relaunch:0',
680
768
  leader_pane_id: '%98',
769
+ leader_pane_pid: 12098,
681
770
  workers: [
682
771
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },
683
772
  { name: 'worker-2', index: 2, pane_id: '%11', role: 'executor' },
@@ -701,7 +790,7 @@ describe('notify-hook team leader nudge', () => {
701
790
  updated_at: nowIso,
702
791
  });
703
792
  }
704
- await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%98 12349']));
793
+ await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%98\t0\t12098']));
705
794
  await chmod(fakeTmuxPath, 0o755);
706
795
  const result = runNotifyHook(cwd, fakeBinDir);
707
796
  assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
@@ -739,6 +828,7 @@ describe('notify-hook team leader nudge', () => {
739
828
  name: teamName,
740
829
  tmux_session: 'idle-global:0',
741
830
  leader_pane_id: '%97',
831
+ leader_pane_pid: 12097,
742
832
  workers: [
743
833
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
744
834
  { name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
@@ -862,6 +952,7 @@ describe('notify-hook team leader nudge', () => {
862
952
  leader: { session_id: 'sess-canonical-safe', worker_id: 'leader-fixed', role: 'coordinator' },
863
953
  tmux_session: 'bad:0',
864
954
  leader_pane_id: '%666',
955
+ leader_pane_pid: 12666,
865
956
  hud_pane_id: null,
866
957
  resize_hook_name: null,
867
958
  resize_hook_target: null,
@@ -929,6 +1020,7 @@ describe('notify-hook team leader nudge', () => {
929
1020
  name: teamName,
930
1021
  tmux_session: 'devsess:0',
931
1022
  leader_pane_id: '%91',
1023
+ leader_pane_pid: 12091,
932
1024
  });
933
1025
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
934
1026
  worker: 'leader-fixed',
@@ -984,6 +1076,7 @@ describe('notify-hook team leader nudge', () => {
984
1076
  name: teamName,
985
1077
  tmux_session: 'leader-nudge-teardown-race:0',
986
1078
  leader_pane_id: '%91',
1079
+ leader_pane_pid: 12091,
987
1080
  workers: [{ name: 'worker-1', index: 1, pane_id: '%11' }],
988
1081
  });
989
1082
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
@@ -1025,7 +1118,11 @@ if [[ "$cmd" == "display-message" ]]; then
1025
1118
  exit 0
1026
1119
  fi
1027
1120
  if [[ "$cmd" == "list-panes" ]]; then
1028
- echo "%11 12345"
1121
+ printf '%%91\t0\t12091\n'
1122
+ exit 0
1123
+ fi
1124
+ if [[ "$cmd" == "show-option" ]]; then
1125
+ echo "team:leader-nudge-teardown-race"
1029
1126
  exit 0
1030
1127
  fi
1031
1128
  if [[ "$cmd" == "capture-pane" ]]; then
@@ -1110,6 +1207,7 @@ exit 0
1110
1207
  name: teamName,
1111
1208
  tmux_session: 'leader-nudge-late-persist-race:0',
1112
1209
  leader_pane_id: '%91',
1210
+ leader_pane_pid: 12091,
1113
1211
  workers: [{ name: 'worker-1', index: 1, pane_id: '%11' }],
1114
1212
  });
1115
1213
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
@@ -1124,7 +1222,7 @@ exit 0
1124
1222
  },
1125
1223
  ],
1126
1224
  });
1127
- await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%11 12345']));
1225
+ await writeFile(fakeTmuxPath, buildFakeTmuxWithListPanes(tmuxLogPath, ['%91\t0\t12091', '%11\t0\t12345']));
1128
1226
  await chmod(fakeTmuxPath, 0o755);
1129
1227
  try {
1130
1228
  setLeaderNudgeTestHooksForTests({
@@ -1289,6 +1387,8 @@ exit 0
1289
1387
  name: teamName,
1290
1388
  tmux_session: 'busy-live-pane:0',
1291
1389
  leader_pane_id: '%93',
1390
+ leader_pane_pid: 12093,
1391
+ tmux_pane_owner_id: `team:${teamName}`,
1292
1392
  });
1293
1393
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
1294
1394
  worker: 'leader-fixed',
@@ -1307,6 +1407,7 @@ set -eu
1307
1407
  echo "$@" >> "${tmuxLogPath}"
1308
1408
  cmd="$1"
1309
1409
  shift || true
1410
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
1310
1411
  if [[ "$cmd" == "display-message" ]]; then
1311
1412
  target=""
1312
1413
  format=""
@@ -1364,7 +1465,7 @@ if [[ "$cmd" == "send-keys" ]]; then
1364
1465
  exit 0
1365
1466
  fi
1366
1467
  if [[ "$cmd" == "list-panes" ]]; then
1367
- echo "%1 12345"
1468
+ printf '%%93\t0\t12093\n'
1368
1469
  exit 0
1369
1470
  fi
1370
1471
  exit 0
@@ -1413,6 +1514,7 @@ exit 0
1413
1514
  name: teamName,
1414
1515
  tmux_session: 'ack-sess:0',
1415
1516
  leader_pane_id: '%94',
1517
+ leader_pane_pid: 12094,
1416
1518
  workers: [
1417
1519
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: ['1'] },
1418
1520
  ],
@@ -1473,6 +1575,7 @@ exit 0
1473
1575
  name: teamName,
1474
1576
  tmux_session: 'ack-started:0',
1475
1577
  leader_pane_id: '%95',
1578
+ leader_pane_pid: 12095,
1476
1579
  workers: [
1477
1580
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: ['1'] },
1478
1581
  ],
@@ -1543,6 +1646,7 @@ exit 0
1543
1646
  name: teamName,
1544
1647
  tmux_session: 'fresh-mailbox-bounded:0',
1545
1648
  leader_pane_id: '%97',
1649
+ leader_pane_pid: 12097,
1546
1650
  workers: [
1547
1651
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: ['1'] },
1548
1652
  ],
@@ -1597,6 +1701,7 @@ exit 0
1597
1701
  name: teamName,
1598
1702
  tmux_session: 'shell-guard:0',
1599
1703
  leader_pane_id: '%71',
1704
+ leader_pane_pid: 12071,
1600
1705
  });
1601
1706
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
1602
1707
  worker: 'leader-fixed',
@@ -1615,6 +1720,7 @@ set -eu
1615
1720
  echo "$@" >> "${tmuxLogPath}"
1616
1721
  cmd="$1"
1617
1722
  shift || true
1723
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
1618
1724
  if [[ "$cmd" == "display-message" ]]; then
1619
1725
  target=""
1620
1726
  format=""
@@ -1659,7 +1765,7 @@ if [[ "$cmd" == "send-keys" ]]; then
1659
1765
  exit 0
1660
1766
  fi
1661
1767
  if [[ "$cmd" == "list-panes" ]]; then
1662
- echo "%1 12345"
1768
+ printf '%%71\t0\t12071\n'
1663
1769
  exit 0
1664
1770
  fi
1665
1771
  exit 0
@@ -1701,6 +1807,7 @@ exit 0
1701
1807
  name: teamName,
1702
1808
  tmux_session: 'busy-leader-queue:0',
1703
1809
  leader_pane_id: '%73',
1810
+ leader_pane_pid: 12073,
1704
1811
  });
1705
1812
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
1706
1813
  worker: 'leader-fixed',
@@ -1719,6 +1826,7 @@ set -eu
1719
1826
  echo "$@" >> "${tmuxLogPath}"
1720
1827
  cmd="$1"
1721
1828
  shift || true
1829
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
1722
1830
  if [[ "$cmd" == "display-message" ]]; then
1723
1831
  target=""
1724
1832
  format=""
@@ -1772,7 +1880,7 @@ if [[ "$cmd" == "send-keys" ]]; then
1772
1880
  exit 0
1773
1881
  fi
1774
1882
  if [[ "$cmd" == "list-panes" ]]; then
1775
- echo "%1 12345"
1883
+ printf '%%73\t0\t12073\n'
1776
1884
  exit 0
1777
1885
  fi
1778
1886
  exit 0
@@ -1795,7 +1903,7 @@ exit 0
1795
1903
  }
1796
1904
  });
1797
1905
  });
1798
- it('injects leader nudge when capture-pane fails but the leader pane is a live codex pane', async () => {
1906
+ it('defers leader nudge when capture-pane cannot verify readiness despite authoritative live-pane proof', async () => {
1799
1907
  await withTempWorkingDir(async (cwd) => {
1800
1908
  const omxDir = join(cwd, '.omx');
1801
1909
  const stateDir = join(omxDir, 'state');
@@ -1818,6 +1926,7 @@ exit 0
1818
1926
  name: teamName,
1819
1927
  tmux_session: 'capture-failure-live-leader:0',
1820
1928
  leader_pane_id: '%74',
1929
+ leader_pane_pid: 12074,
1821
1930
  });
1822
1931
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
1823
1932
  worker: 'leader-fixed',
@@ -1836,6 +1945,7 @@ set -eu
1836
1945
  echo "$@" >> "${tmuxLogPath}"
1837
1946
  cmd="$1"
1838
1947
  shift || true
1948
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
1839
1949
  if [[ "$cmd" == "display-message" ]]; then
1840
1950
  target=""
1841
1951
  format=""
@@ -1889,7 +1999,7 @@ if [[ "$cmd" == "send-keys" ]]; then
1889
1999
  exit 0
1890
2000
  fi
1891
2001
  if [[ "$cmd" == "list-panes" ]]; then
1892
- echo "%1 12345"
2002
+ printf '%%74\t0\t12074\n'
1893
2003
  exit 0
1894
2004
  fi
1895
2005
  exit 0
@@ -1899,14 +2009,23 @@ exit 0
1899
2009
  const result = runNotifyHook(cwd, fakeBinDir);
1900
2010
  assert.equal(result.status, 0, `notify-hook failed: ${result.stderr || result.stdout}`);
1901
2011
  const tmuxLog = await readFile(tmuxLogPath, 'utf-8');
2012
+ assert.match(tmuxLog, /list-panes -a -F #\{pane_id\}\t#\{pane_dead\}\t#\{pane_pid\}/, 'should retain authoritative exact-pane live proof');
2013
+ assert.match(tmuxLog, /display-message -p -t %74 #\{pane_current_command\}/, 'should query the exact pane command before capture readiness');
1902
2014
  assert.match(tmuxLog, /capture-pane -t %74 -p -S -80/);
1903
- assert.match(tmuxLog, /send-keys -t %74/, 'capture failures should not suppress leader injection into a live codex pane');
2015
+ assert.doesNotMatch(tmuxLog, /(?:set-buffer|paste-buffer|send-keys)/, 'capture readiness failure must suppress all input-effect tmux commands');
1904
2016
  const eventsPath = join(teamDir, 'events', 'events.ndjson');
1905
- if (existsSync(eventsPath)) {
1906
- const events = (await readFile(eventsPath, 'utf-8')).trim().split('\n').filter(Boolean).map((line) => JSON.parse(line));
1907
- const deferred = events.find((entry) => entry.type === 'leader_notification_deferred');
1908
- assert.equal(deferred, undefined, 'capture failure alone should not defer a live codex leader pane');
1909
- }
2017
+ const events = (await readFile(eventsPath, 'utf-8')).trim().split('\n').filter(Boolean).map((line) => JSON.parse(line));
2018
+ const deferred = events.find((entry) => entry.type === 'leader_notification_deferred' && entry.reason === 'pane_readiness_unverified');
2019
+ assert.ok(deferred, 'capture readiness failure should emit a fail-closed deferred event');
2020
+ assert.equal(deferred.pane_current_command, 'codex');
2021
+ assert.equal(deferred.tmux_injection_attempted, false);
2022
+ const deliveryLog = await readTeamDeliveryLog(cwd);
2023
+ assert.ok(deliveryLog.some((entry) => entry.event === 'nudge_triggered'
2024
+ && entry.team === teamName
2025
+ && entry.to_worker === 'leader-fixed'
2026
+ && entry.transport === 'none'
2027
+ && entry.result === 'deferred'
2028
+ && entry.reason === 'pane_readiness_unverified'), 'capture readiness failure should record a fail-closed delivery receipt');
1910
2029
  });
1911
2030
  });
1912
2031
  it('suppresses duplicate visible leader injection when the pane already shows the same classified state', async () => {
@@ -1932,6 +2051,7 @@ exit 0
1932
2051
  name: teamName,
1933
2052
  tmux_session: 'same-classified-state:0',
1934
2053
  leader_pane_id: '%75',
2054
+ leader_pane_pid: 12075,
1935
2055
  });
1936
2056
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
1937
2057
  worker: 'leader-fixed',
@@ -1950,6 +2070,7 @@ set -eu
1950
2070
  echo "$@" >> "${tmuxLogPath}"
1951
2071
  cmd="$1"
1952
2072
  shift || true
2073
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
1953
2074
  if [[ "$cmd" == "display-message" ]]; then
1954
2075
  target=""
1955
2076
  format=""
@@ -2005,7 +2126,7 @@ if [[ "$cmd" == "send-keys" ]]; then
2005
2126
  exit 0
2006
2127
  fi
2007
2128
  if [[ "$cmd" == "list-panes" ]]; then
2008
- echo "%1 12345"
2129
+ printf '%%75\t0\t12075\n'
2009
2130
  exit 0
2010
2131
  fi
2011
2132
  exit 0
@@ -2054,6 +2175,7 @@ exit 0
2054
2175
  name: teamName,
2055
2176
  tmux_session: 'scroll-guard:0',
2056
2177
  leader_pane_id: '%72',
2178
+ leader_pane_pid: 12072,
2057
2179
  });
2058
2180
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
2059
2181
  worker: 'leader-fixed',
@@ -2072,6 +2194,7 @@ set -eu
2072
2194
  echo "$@" >> "${tmuxLogPath}"
2073
2195
  cmd="$1"
2074
2196
  shift || true
2197
+ ${fakeTmuxOwnerOptionHandler(`team:${teamName}`)}
2075
2198
  if [[ "$cmd" == "display-message" ]]; then
2076
2199
  target=""
2077
2200
  format=""
@@ -2121,7 +2244,7 @@ if [[ "$cmd" == "send-keys" ]]; then
2121
2244
  exit 0
2122
2245
  fi
2123
2246
  if [[ "$cmd" == "list-panes" ]]; then
2124
- echo "%1 12345"
2247
+ printf '%%72\t0\t12072\n'
2125
2248
  exit 0
2126
2249
  fi
2127
2250
  exit 0
@@ -2203,6 +2326,7 @@ exit 0
2203
2326
  name: teamName,
2204
2327
  tmux_session: 'completed-reopen:0',
2205
2328
  leader_pane_id: '%91',
2329
+ leader_pane_pid: 12091,
2206
2330
  workers: [
2207
2331
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },
2208
2332
  { name: 'worker-2', index: 2, pane_id: '%11', role: 'executor' },
@@ -2268,6 +2392,7 @@ exit 0
2268
2392
  },
2269
2393
  tmux_session: 'other-session-team:0',
2270
2394
  leader_pane_id: '%94',
2395
+ leader_pane_pid: 12094,
2271
2396
  worker_count: 2,
2272
2397
  workers: [
2273
2398
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },
@@ -2335,6 +2460,7 @@ exit 0
2335
2460
  name: teamName,
2336
2461
  tmux_session: 'omx-team-beta',
2337
2462
  leader_pane_id: '%92',
2463
+ leader_pane_pid: 12092,
2338
2464
  });
2339
2465
  // Leader HUD state is stale (last turn 5 minutes ago)
2340
2466
  await writeJson(join(stateDir, 'hud-state.json'), {
@@ -2381,6 +2507,7 @@ exit 0
2381
2507
  name: teamName,
2382
2508
  tmux_session: 'omx-team-stalled-progress',
2383
2509
  leader_pane_id: '%90',
2510
+ leader_pane_pid: 12090,
2384
2511
  workers: [
2385
2512
  { name: 'worker-1', index: 1, pane_id: '%10' },
2386
2513
  { name: 'worker-2', index: 2, pane_id: '%11' },
@@ -2498,6 +2625,7 @@ exit 0
2498
2625
  name: teamName,
2499
2626
  tmux_session: 'omx-team-stalled-before-stale',
2500
2627
  leader_pane_id: '%89',
2628
+ leader_pane_pid: 12089,
2501
2629
  workers: [
2502
2630
  { name: 'worker-1', index: 1, pane_id: '%10' },
2503
2631
  { name: 'worker-2', index: 2, pane_id: '%11' },
@@ -2616,6 +2744,7 @@ exit 0
2616
2744
  name: teamName,
2617
2745
  tmux_session: 'omx-team-worker-turn-stall-threshold',
2618
2746
  leader_pane_id: '%86',
2747
+ leader_pane_pid: 12086,
2619
2748
  workers: [
2620
2749
  { name: 'worker-1', index: 1, pane_id: '%10' },
2621
2750
  ],
@@ -2710,6 +2839,7 @@ exit 0
2710
2839
  name: teamName,
2711
2840
  tmux_session: 'omx-team-active-turns-no-stall',
2712
2841
  leader_pane_id: '%87',
2842
+ leader_pane_pid: 12087,
2713
2843
  workers: [
2714
2844
  { name: 'worker-1', index: 1, pane_id: '%10' },
2715
2845
  { name: 'worker-2', index: 2, pane_id: '%11' },
@@ -2821,6 +2951,7 @@ exit 0
2821
2951
  name: teamName,
2822
2952
  tmux_session: 'omx-team-stalled-before-stale-bounded',
2823
2953
  leader_pane_id: '%88',
2954
+ leader_pane_pid: 12088,
2824
2955
  workers: [
2825
2956
  { name: 'worker-1', index: 1, pane_id: '%10' },
2826
2957
  { name: 'worker-2', index: 2, pane_id: '%11' },
@@ -2927,6 +3058,7 @@ exit 0
2927
3058
  name: teamName,
2928
3059
  tmux_session: 'omx-team-stale-no-workers',
2929
3060
  leader_pane_id: '%92',
3061
+ leader_pane_pid: 12092,
2930
3062
  hud_pane_id: '%93',
2931
3063
  workers: [
2932
3064
  { name: 'worker-1', index: 1, pane_id: '%10' },
@@ -2967,6 +3099,7 @@ exit 0
2967
3099
  name: teamName,
2968
3100
  tmux_session: 'omx-team-fresh',
2969
3101
  leader_pane_id: '%95',
3102
+ leader_pane_pid: 12095,
2970
3103
  });
2971
3104
  await writeJson(join(stateDir, 'hud-state.json'), {
2972
3105
  last_turn_at: new Date().toISOString(),
@@ -3005,6 +3138,7 @@ exit 0
3005
3138
  name: teamName,
3006
3139
  tmux_session: 'omx-team-stale-cadence',
3007
3140
  leader_pane_id: '%96',
3141
+ leader_pane_pid: 12096,
3008
3142
  });
3009
3143
  const staleHud = {
3010
3144
  last_turn_at: new Date(now - 300_000).toISOString(),
@@ -3070,6 +3204,7 @@ exit 0
3070
3204
  name: teamName,
3071
3205
  tmux_session: 'omx-team-fresh-detached-progress',
3072
3206
  leader_pane_id: '%99',
3207
+ leader_pane_pid: 12099,
3073
3208
  workers: [
3074
3209
  { name: 'worker-1', index: 1, pane_id: '%10', worktree_path: workerWorktree },
3075
3210
  ],
@@ -3163,6 +3298,7 @@ exit 0
3163
3298
  name: teamName,
3164
3299
  tmux_session: 'omx-team-gamma',
3165
3300
  leader_pane_id: '%93',
3301
+ leader_pane_pid: 12093,
3166
3302
  });
3167
3303
  await writeJson(join(mailboxDir, 'leader-fixed.json'), {
3168
3304
  worker: 'leader-fixed',
@@ -3294,6 +3430,7 @@ exit 0
3294
3430
  name: teamName,
3295
3431
  tmux_session: 'idle-bounded:0',
3296
3432
  leader_pane_id: '%98',
3433
+ leader_pane_pid: 12098,
3297
3434
  workers: [
3298
3435
  { name: 'worker-1', index: 1, role: 'executor', assigned_tasks: [] },
3299
3436
  { name: 'worker-2', index: 2, role: 'executor', assigned_tasks: [] },
@@ -3371,6 +3508,7 @@ exit 0
3371
3508
  name: teamName,
3372
3509
  tmux_session: 'omx-team-delta',
3373
3510
  leader_pane_id: '%94',
3511
+ leader_pane_pid: 12094,
3374
3512
  });
3375
3513
  // Leader stale
3376
3514
  await writeJson(join(stateDir, 'hud-state.json'), {
@@ -3447,6 +3585,7 @@ exit 0
3447
3585
  },
3448
3586
  tmux_session: 'valid-team:0',
3449
3587
  leader_pane_id: '%94',
3588
+ leader_pane_pid: 12094,
3450
3589
  worker_count: 1,
3451
3590
  workers: [
3452
3591
  { name: 'worker-1', index: 1, pane_id: '%10', role: 'executor' },