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
@@ -21,7 +21,22 @@
21
21
  import { writeFile, appendFile, mkdir, readFile } from 'fs/promises';
22
22
  import { existsSync } from 'fs';
23
23
  import { dirname, join, resolve } from 'path';
24
- import { isSessionStateUsable } from '../hooks/session.js';
24
+ import { fileURLToPath } from 'url';
25
+ import {
26
+ appendPromptSessionProvenanceRejection,
27
+ isSessionStateUsable,
28
+ readSessionPointer,
29
+ normalizeSessionId,
30
+ resolveSessionPointerContext,
31
+ type SessionPointerContext,
32
+ } from '../hooks/session.js';
33
+ import {
34
+ evaluateResolvedPromptTurn,
35
+ extractSelectedTargetOwnerEvidence,
36
+ preflightSelectedTargetOwner,
37
+ type ResolvedPromptTurnContext,
38
+ } from '../hooks/prompt-session-provenance.js';
39
+ import { readTeamModeConfig } from '../config/team-mode.js';
25
40
 
26
41
  import { safeString, asNumber } from './notify-hook/utils.js';
27
42
  import {
@@ -32,12 +47,16 @@ import {
32
47
  import { getBaseStateDir } from '../mcp/state-paths.js';
33
48
  import {
34
49
  getScopedStatePath,
50
+ getScopedStatePathAtScope,
51
+ readScopedJsonAtScope,
52
+ hasExistingScopedSessionDir,
35
53
  readCurrentSessionId,
36
54
  readScopedJsonIfExists,
37
55
  getScopedStateDirsForCurrentSession,
38
56
  normalizeNotifyState,
39
57
  pruneRecentTurns,
40
58
  readdir,
59
+ type NotifyStateScope,
41
60
  } from './notify-hook/state-io.js';
42
61
  import { isLeaderStale, resolveLeaderStalenessThresholdMs, maybeNudgeTeamLeader } from './notify-hook/team-leader-nudge.js';
43
62
  import { drainPendingTeamDispatch } from './notify-hook/team-dispatch.js';
@@ -49,7 +68,7 @@ import {
49
68
  isDeepInterviewInputLockActive,
50
69
  syncSkillStateFromTurn,
51
70
  } from './notify-hook/auto-nudge.js';
52
- import { isManagedOmxSession } from './notify-hook/managed-tmux.js';
71
+ import { isManagedOmxSessionAtPromptContext } from './notify-hook/managed-tmux.js';
53
72
  import { logNotifyHookEvent } from './notify-hook/log.js';
54
73
  import { reconcileRalphSessionResume } from './notify-hook/ralph-session-resume.js';
55
74
  import { sendPaneInput } from './notify-hook/team-tmux-guard.js';
@@ -73,6 +92,13 @@ import {
73
92
  extractRawJsonStringField,
74
93
  utf8ByteLength,
75
94
  } from './hook-payload-guard.js';
95
+ import {
96
+ classifyKeywordInput,
97
+ recordSkillActivation,
98
+ type KeywordInputClassification,
99
+ type RecordSkillActivationInput,
100
+ type SkillActiveState,
101
+ } from '../hooks/keyword-detector.js';
76
102
 
77
103
  const RALPH_ACTIVE_PROGRESS_PHASES = new Set([
78
104
  'start',
@@ -89,6 +115,8 @@ const RALPH_ACTIVE_PROGRESS_PHASES = new Set([
89
115
  ]);
90
116
 
91
117
  const IDLE_NOTIFICATION_SUMMARY_MAX_LENGTH = 240;
118
+ const NOTIFY_SKILL_ACTIVATION_ERROR_MAX_LENGTH = 512;
119
+ const NOTIFY_SKILL_ACTIVATION_CONTEXT_MAX_LENGTH = 200;
92
120
 
93
121
  async function readJsonFileIfObject(path: string): Promise<Record<string, unknown> | null> {
94
122
  try {
@@ -263,13 +291,6 @@ function classifyIdleNotificationPhase(message: unknown): 'idle' | 'progress' |
263
291
  }
264
292
 
265
293
 
266
- function isExplicitAutopilotActivationText(text: string): boolean {
267
- return /(?:^|[^\w])\$autopilot\b/i.test(text)
268
- || /^\s*\/autopilot\b/i.test(text)
269
- || /^\s*(?:please\s+)?autopilot(?:\s+(?:this|mode|workflow|skill|loop|now))?\s*[.!]?\s*$/i.test(text)
270
- || /\b(?:use|run|start|enable|launch|invoke|activate|resume|continue)\s+(?:the\s+)?autopilot(?:\s+(?:mode|workflow|skill|loop|now))?\s*[.!]?\s*$/i.test(text)
271
- || /\bautopilot\s+(?:mode|workflow|skill|loop)\b/i.test(text);
272
- }
273
294
 
274
295
  function looksLikeAutopilotTerminalHandoff(text: string): boolean {
275
296
  return /\bAutopilot complete\b/i.test(text)
@@ -334,6 +355,106 @@ async function shouldSuppressAutopilotTerminalReplayActivation(
334
355
  return hasTerminalAutopilotStateForNotifyTurn(stateDir, sessionId, payload);
335
356
  }
336
357
 
358
+ export interface NotifySkillActivationInput {
359
+ readonly stateDir: string;
360
+ readonly sourceCwd: string;
361
+ readonly text: string;
362
+ readonly sessionId?: string;
363
+ readonly threadId?: string;
364
+ readonly turnId?: string;
365
+ readonly payload: Record<string, unknown>;
366
+ readonly nowIso?: string;
367
+ }
368
+
369
+ export interface NotifySkillActivationDependencies {
370
+ readonly classifyKeywordInput?: (text: string) => KeywordInputClassification;
371
+ readonly recordSkillActivation?: (input: RecordSkillActivationInput) => Promise<SkillActiveState | null>;
372
+ }
373
+
374
+ function boundedNotifySkillActivationContext(value: unknown): string | null {
375
+ try {
376
+ const context = safeString(value).trim().slice(0, NOTIFY_SKILL_ACTIVATION_CONTEXT_MAX_LENGTH);
377
+ return context || null;
378
+ } catch {
379
+ return null;
380
+ }
381
+ }
382
+
383
+ function boundedNotifySkillActivationError(error: unknown): string {
384
+ try {
385
+ const message = error instanceof Error ? error.message : String(error);
386
+ return message.slice(0, NOTIFY_SKILL_ACTIVATION_ERROR_MAX_LENGTH);
387
+ } catch {
388
+ return 'unknown_error';
389
+ }
390
+ }
391
+
392
+ async function logNotifySkillActivationFailure(
393
+ logsDir: string,
394
+ input: NotifySkillActivationInput,
395
+ error: unknown,
396
+ ): Promise<void> {
397
+ await logNotifyHookEvent(logsDir, {
398
+ timestamp: new Date().toISOString(),
399
+ level: 'warn',
400
+ type: 'notify_skill_activation_failure',
401
+ error: boundedNotifySkillActivationError(error),
402
+ session_id: boundedNotifySkillActivationContext(input.sessionId),
403
+ thread_id: boundedNotifySkillActivationContext(input.threadId),
404
+ turn_id: boundedNotifySkillActivationContext(input.turnId),
405
+ }).catch(() => {});
406
+ }
407
+
408
+ /**
409
+ * Records prompt skill activation using one shared input classification for the
410
+ * terminal-replay check and the state writer.
411
+ */
412
+ export async function recordNotifySkillActivation(
413
+ input: NotifySkillActivationInput,
414
+ dependencies: NotifySkillActivationDependencies = {},
415
+ ): Promise<SkillActiveState | null> {
416
+ const classification = (dependencies.classifyKeywordInput ?? classifyKeywordInput)(input.text);
417
+ const teamEnabled = readTeamModeConfig(input.sourceCwd).enabled;
418
+ const runtimeMatches = teamEnabled
419
+ ? classification.matches
420
+ : classification.matches.filter((match) => match.skill !== 'team');
421
+ const terminalAutopilotReplay = await shouldSuppressAutopilotTerminalReplayActivation(
422
+ input.stateDir,
423
+ input.payload,
424
+ runtimeMatches.some((match) => match.skill === 'autopilot'),
425
+ input.sessionId || '',
426
+ );
427
+ if (terminalAutopilotReplay && runtimeMatches[0]?.skill === 'autopilot') return null;
428
+
429
+ return (dependencies.recordSkillActivation ?? recordSkillActivation)({
430
+ stateDir: input.stateDir,
431
+ sourceCwd: input.sourceCwd,
432
+ text: input.text,
433
+ sessionId: input.sessionId,
434
+ threadId: input.threadId,
435
+ turnId: input.turnId,
436
+ nowIso: input.nowIso,
437
+ classification,
438
+ allowSecondaryAutopilot: !terminalAutopilotReplay,
439
+ });
440
+ }
441
+
442
+ /**
443
+ * Non-fatal notify-hook boundary for shared classification and state writes.
444
+ */
445
+ export async function recordNotifySkillActivationNonFatal(
446
+ input: NotifySkillActivationInput,
447
+ logsDir: string,
448
+ dependencies: NotifySkillActivationDependencies = {},
449
+ ): Promise<SkillActiveState | null> {
450
+ try {
451
+ return await recordNotifySkillActivation(input, dependencies);
452
+ } catch (error) {
453
+ await logNotifySkillActivationFailure(logsDir, input, error);
454
+ return null;
455
+ }
456
+ }
457
+
337
458
  function buildIdleNotificationFingerprint(payload: Record<string, unknown>): string {
338
459
  const lastAssistantMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
339
460
  const summary = summarizeIdleNotificationMessage(lastAssistantMessage);
@@ -357,6 +478,78 @@ function isNotifyFallbackTaskCompletePayload(payload: Record<string, unknown>):
357
478
  ));
358
479
  }
359
480
 
481
+ interface LeaderNotifyWriteDecision {
482
+ readonly context: ResolvedPromptTurnContext;
483
+ readonly pointerContext: SessionPointerContext;
484
+ readonly scope?: NotifyStateScope;
485
+ }
486
+
487
+ async function preflightLeaderNotifyTarget(
488
+ stateDir: string,
489
+ context: ResolvedPromptTurnContext,
490
+ ): Promise<ResolvedPromptTurnContext> {
491
+ if (context.status !== 'authorized') return context;
492
+ const scope: NotifyStateScope = {
493
+ targetSessionId: context.authorization.targetSessionId,
494
+ ownerCodexSessionId: context.authorization.ownerCodexSessionId,
495
+ allowedStorageSessionIds: context.authorization.allowedStorageSessionIds,
496
+ };
497
+ const probePath = await getScopedStatePathAtScope(stateDir, 'prompt-provenance-probe.json', scope);
498
+ const targetDir = dirname(probePath);
499
+ const evidence: Array<{ ownerCodexSessionId?: unknown; targetSessionId?: unknown }> = [];
500
+ let filenames: string[];
501
+ try {
502
+ filenames = await readdir(targetDir);
503
+ } catch (error) {
504
+ if ((error as NodeJS.ErrnoException).code === 'ENOENT') return context;
505
+ return preflightSelectedTargetOwner(context, [{ ownerCodexSessionId: {} }], 'notify', new Date().toISOString());
506
+ }
507
+ for (const filename of filenames) {
508
+ if (!filename.endsWith('-state.json') && filename !== 'skill-active-state.json') continue;
509
+ try {
510
+ const value = JSON.parse(await readFile(join(targetDir, filename), 'utf8')) as unknown;
511
+ evidence.push(...extractSelectedTargetOwnerEvidence(value));
512
+ } catch {
513
+ evidence.push({ ownerCodexSessionId: {} });
514
+ }
515
+ }
516
+ return preflightSelectedTargetOwner(context, evidence, 'notify', new Date().toISOString());
517
+ }
518
+
519
+ async function resolveLeaderNotifyWriteDecision(
520
+ cwd: string,
521
+ stateDir: string,
522
+ payloadSessionId: unknown,
523
+ ): Promise<LeaderNotifyWriteDecision> {
524
+ const pointerContext = resolveSessionPointerContext(cwd);
525
+ const selectedPointer = await readSessionPointer(pointerContext);
526
+ const ownerEnvSessionId = process.env.OMX_SESSION_ID;
527
+ const normalizedOwnerEnvSessionId = normalizeSessionId(ownerEnvSessionId);
528
+ const forkScopeExists = normalizedOwnerEnvSessionId
529
+ ? await hasExistingScopedSessionDir(stateDir, normalizedOwnerEnvSessionId)
530
+ : false;
531
+ const context = evaluateResolvedPromptTurn({
532
+ producer: 'notify',
533
+ payloadSessionId,
534
+ ownerEnvSessionId,
535
+ selectedPointer,
536
+ forkScopeExists,
537
+ nowIso: new Date().toISOString(),
538
+ });
539
+ const preflightedContext = await preflightLeaderNotifyTarget(stateDir, context);
540
+ if (preflightedContext.status !== 'authorized') return { context: preflightedContext, pointerContext };
541
+ if (context.status !== 'authorized') return { context, pointerContext };
542
+ return {
543
+ context: preflightedContext,
544
+ pointerContext,
545
+ scope: {
546
+ targetSessionId: preflightedContext.authorization.targetSessionId,
547
+ ownerCodexSessionId: preflightedContext.authorization.ownerCodexSessionId,
548
+ allowedStorageSessionIds: preflightedContext.authorization.allowedStorageSessionIds,
549
+ },
550
+ };
551
+ }
552
+
360
553
  async function main() {
361
554
  const rawPayload = process.argv[process.argv.length - 1];
362
555
  if (!rawPayload || rawPayload.startsWith('-')) {
@@ -377,7 +570,8 @@ async function main() {
377
570
  if (!(await isOmxManagedCwd(cwd))) {
378
571
  process.exit(0);
379
572
  }
380
- const payloadSessionId = safeString(payload.session_id || payload['session-id'] || '');
573
+ const rawPayloadSessionId = payload.session_id ?? payload['session-id'];
574
+ const payloadSessionId = safeString(rawPayloadSessionId);
381
575
  const payloadThreadId = safeString(payload['thread-id'] || payload.thread_id || '');
382
576
  const inputMessages = normalizeInputMessages(payload);
383
577
  const latestUserInput = safeString(inputMessages.length > 0 ? inputMessages[inputMessages.length - 1] : '');
@@ -396,46 +590,70 @@ async function main() {
396
590
  const stateDir = resolvedWorkerStateDir || getBaseStateDir(cwd);
397
591
  const logsDir = join(cwd, '.omx', 'logs');
398
592
  const omxDir = join(cwd, '.omx');
399
- let currentOmxSessionId = '';
593
+ const leaderWriteDecision = isTeamWorker
594
+ ? null
595
+ : await resolveLeaderNotifyWriteDecision(cwd, stateDir, rawPayloadSessionId);
596
+ if (!isTeamWorker && leaderWriteDecision?.context.status === 'rejected') {
597
+ await appendPromptSessionProvenanceRejection(
598
+ leaderWriteDecision.pointerContext,
599
+ leaderWriteDecision.context.diagnostic,
600
+ ).catch(() => {});
601
+ return;
602
+ }
603
+ if (!isTeamWorker && leaderWriteDecision?.context.status === 'suppressed-target-child') return;
604
+ const leaderAuthorization = leaderWriteDecision?.context.status === 'authorized'
605
+ ? leaderWriteDecision.context.authorization
606
+ : null;
607
+ const canWriteLeaderScopedState = Boolean(leaderWriteDecision?.scope && leaderAuthorization);
608
+ let currentOmxSessionId = isTeamWorker
609
+ ? ''
610
+ : leaderWriteDecision?.scope?.targetSessionId || '';
400
611
  const getEffectiveSessionId = () => currentOmxSessionId || payloadSessionId;
401
612
 
402
613
  // Ensure directories exist
403
614
  await mkdir(logsDir, { recursive: true }).catch(() => {});
404
- if (workerStateRootResolved) {
615
+ if (isTeamWorker && workerStateRootResolved) {
405
616
  await mkdir(stateDir, { recursive: true }).catch(() => {});
406
617
  currentOmxSessionId = await readCurrentSessionId(stateDir).catch(() => '') || '';
407
618
  }
408
619
 
409
620
  // Turn-level dedupe prevents double-processing when native notify and fallback
410
621
  // watcher both emit the same completed turn.
411
- try {
412
- if (!workerStateRootResolved) throw new Error('worker_state_root_unresolved');
413
- const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
414
- if (turnId) {
415
- const now = Date.now();
416
- const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
417
- const eventType = safeString(payload.type || 'agent-turn-complete');
418
- const key = `${threadId || 'no-thread'}|${turnId}|${eventType}`;
419
- const dedupeSessionId = getEffectiveSessionId();
420
- const dedupeStatePath = await getScopedStatePath(stateDir, 'notify-hook-state.json', dedupeSessionId);
421
- const dedupeState = normalizeNotifyState(
422
- await readScopedJsonIfExists(stateDir, 'notify-hook-state.json', dedupeSessionId, null),
423
- );
424
- dedupeState.recent_turns = pruneRecentTurns(dedupeState.recent_turns, now);
425
- if (dedupeState.recent_turns[key]) {
426
- process.exit(0);
622
+ if (isTeamWorker || canWriteLeaderScopedState) {
623
+ try {
624
+ if (!workerStateRootResolved) throw new Error('worker_state_root_unresolved');
625
+ const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
626
+ if (turnId) {
627
+ const now = Date.now();
628
+ const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
629
+ const eventType = safeString(payload.type || 'agent-turn-complete');
630
+ const key = `${threadId || 'no-thread'}|${turnId}|${eventType}`;
631
+ const dedupeSessionId = getEffectiveSessionId();
632
+ const scope = leaderWriteDecision?.scope;
633
+ const dedupeStatePath = scope
634
+ ? await getScopedStatePathAtScope(stateDir, 'notify-hook-state.json', scope)
635
+ : await getScopedStatePath(stateDir, 'notify-hook-state.json', dedupeSessionId);
636
+ const dedupeState = normalizeNotifyState(
637
+ scope
638
+ ? await readScopedJsonAtScope(stateDir, 'notify-hook-state.json', scope, null)
639
+ : await readScopedJsonIfExists(stateDir, 'notify-hook-state.json', dedupeSessionId, null),
640
+ );
641
+ dedupeState.recent_turns = pruneRecentTurns(dedupeState.recent_turns, now);
642
+ if (dedupeState.recent_turns[key]) {
643
+ process.exit(0);
644
+ }
645
+ dedupeState.recent_turns[key] = now;
646
+ dedupeState.last_event_at = new Date().toISOString();
647
+ await mkdir(dirname(dedupeStatePath), { recursive: true }).catch(() => {});
648
+ await writeFile(dedupeStatePath, JSON.stringify(dedupeState, null, 2)).catch(() => {});
427
649
  }
428
- dedupeState.recent_turns[key] = now;
429
- dedupeState.last_event_at = new Date().toISOString();
430
- await mkdir(dirname(dedupeStatePath), { recursive: true }).catch(() => {});
431
- await writeFile(dedupeStatePath, JSON.stringify(dedupeState, null, 2)).catch(() => {});
650
+ } catch {
651
+ // Non-critical
432
652
  }
433
- } catch {
434
- // Non-critical
435
653
  }
436
654
 
437
655
  // 0.5. Track leader + native subagent thread activity (lead session only)
438
- if (!isTeamWorker) {
656
+ if (!isTeamWorker && canWriteLeaderScopedState) {
439
657
  try {
440
658
  const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
441
659
  const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
@@ -513,14 +731,22 @@ async function main() {
513
731
 
514
732
  // Reconcile Ralph ownership for same-Codex-session continuation before
515
733
  // lifecycle counters or injection read the active scope.
516
- if (!isTeamWorker) {
734
+ if (!isTeamWorker && canWriteLeaderScopedState) {
517
735
  try {
518
736
  const resumeResult = await reconcileRalphSessionResume({
519
737
  stateDir,
520
- payloadSessionId,
738
+ authorization: leaderAuthorization!,
739
+ env: {
740
+ ...process.env,
741
+ OMX_SESSION_ID: leaderAuthorization!.targetSessionId,
742
+ CODEX_SESSION_ID: '',
743
+ SESSION_ID: '',
744
+ },
521
745
  payloadThreadId,
522
746
  });
523
- currentOmxSessionId = resumeResult.currentOmxSessionId;
747
+ if (resumeResult.currentOmxSessionId && resumeResult.currentOmxSessionId === leaderAuthorization!.targetSessionId) {
748
+ currentOmxSessionId = resumeResult.currentOmxSessionId;
749
+ }
524
750
  if (resumeResult.resumed || resumeResult.updatedCurrentOwner) {
525
751
  await logNotifyHookEvent(logsDir, {
526
752
  timestamp: new Date().toISOString(),
@@ -547,9 +773,9 @@ async function main() {
547
773
 
548
774
  // 2. Update active mode state (increment iteration)
549
775
  // GUARD: Skip when running inside a team worker to prevent state corruption
550
- if (!isTeamWorker) {
776
+ if (!isTeamWorker && canWriteLeaderScopedState) {
551
777
  try {
552
- const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir);
778
+ const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir, getEffectiveSessionId());
553
779
  for (const scopedDir of scopedDirs) {
554
780
  const stateFiles = await readdir(scopedDir).catch(() => []);
555
781
  for (const f of stateFiles) {
@@ -678,11 +904,12 @@ async function main() {
678
904
  }
679
905
 
680
906
  // 4. Write HUD state summary for `omx hud` (lead session only)
681
- if (!isTeamWorker) {
907
+ if (!isTeamWorker && canWriteLeaderScopedState) {
682
908
  try {
683
- const scopedSessionId = getEffectiveSessionId();
684
- const hudStatePath = await getScopedStatePath(stateDir, 'hud-state.json', scopedSessionId);
685
- let hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', scopedSessionId, {
909
+ const scope = leaderWriteDecision?.scope;
910
+ if (!scope) return;
911
+ const hudStatePath = await getScopedStatePathAtScope(stateDir, 'hud-state.json', scope);
912
+ let hudState = await readScopedJsonAtScope(stateDir, 'hud-state.json', scope, {
686
913
  last_turn_at: '',
687
914
  turn_count: 0,
688
915
  });
@@ -711,39 +938,42 @@ async function main() {
711
938
  }
712
939
  }
713
940
 
941
+ let skillSyncResult: Awaited<ReturnType<typeof syncSkillStateFromTurn>> | null = null;
942
+
714
943
  // 4.45. Skill activation tracking: update skill-active-state.json before any nudge logic.
715
- try {
716
- const { detectKeywords, recordSkillActivation } = await import('../hooks/keyword-detector.js');
944
+ if (isTeamWorker || canWriteLeaderScopedState) {
717
945
  if (latestUserInput) {
718
- const activationSessionId = getEffectiveSessionId();
719
- const isAutopilotActivation = detectKeywords(latestUserInput)
720
- .some((match) => match.skill === 'autopilot')
721
- || isExplicitAutopilotActivationText(latestUserInput);
722
- const suppressTerminalReplay = await shouldSuppressAutopilotTerminalReplayActivation(
946
+ await recordNotifySkillActivationNonFatal({
723
947
  stateDir,
948
+ sourceCwd: cwd,
949
+ text: latestUserInput,
950
+ sessionId: getEffectiveSessionId(),
951
+ threadId: payloadThreadId,
952
+ turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
724
953
  payload,
725
- isAutopilotActivation,
726
- activationSessionId,
727
- );
728
- if (!suppressTerminalReplay) {
729
- await recordSkillActivation({
730
- stateDir,
731
- sourceCwd: cwd,
732
- text: latestUserInput,
733
- sessionId: activationSessionId,
734
- threadId: payloadThreadId,
735
- turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
736
- });
737
- }
954
+ }, logsDir, {
955
+ recordSkillActivation: async (input) => recordSkillActivation({
956
+ ...input,
957
+ ...(!isTeamWorker && leaderWriteDecision ? {
958
+ resolvedPromptTurnContext: leaderWriteDecision.context,
959
+ onProvenanceRejected: async (diagnostic: import('../hooks/prompt-session-provenance.js').PromptDiagnosticDescriptor) => {
960
+ await appendPromptSessionProvenanceRejection(leaderWriteDecision.pointerContext, diagnostic).catch(() => {});
961
+ },
962
+ } : {}),
963
+ }),
964
+ });
738
965
  }
739
- } catch {
740
- // Non-fatal: keyword detector module may not be built yet
741
- }
742
966
 
743
- try {
744
- await syncSkillStateFromTurn(stateDir, payload);
745
- } catch {
746
- // Non-fatal: lifecycle sync should not block the hook
967
+ try {
968
+ skillSyncResult = await syncSkillStateFromTurn(
969
+ stateDir,
970
+ payload,
971
+ !isTeamWorker && leaderAuthorization ? leaderAuthorization.targetSessionId : '',
972
+ !isTeamWorker ? leaderAuthorization : null,
973
+ );
974
+ } catch {
975
+ // Non-fatal: lifecycle sync should not block the hook
976
+ }
747
977
  }
748
978
 
749
979
  const effectiveSessionId = getEffectiveSessionId();
@@ -772,16 +1002,16 @@ async function main() {
772
1002
 
773
1003
  // 5. Optional tmux prompt injection workaround (non-fatal, opt-in)
774
1004
  // Skip for team workers - only the lead should inject prompts
775
- if (!isTeamWorker) {
1005
+ if (!isTeamWorker && canWriteLeaderScopedState) {
776
1006
  try {
777
- await handleTmuxInjection({ payload, cwd, stateDir, logsDir });
1007
+ await handleTmuxInjection({ payload, cwd, stateDir, logsDir, context: leaderWriteDecision!.context });
778
1008
  } catch {
779
1009
  // Non-critical
780
1010
  }
781
1011
  }
782
1012
 
783
1013
  // 5.5. Opportunistic team dispatch drain (leader session only).
784
- if (!isTeamWorker) {
1014
+ if (!isTeamWorker && canWriteLeaderScopedState) {
785
1015
  try {
786
1016
  await drainPendingTeamDispatch({ cwd, stateDir, logsDir, maxPerTick: 5 } as any);
787
1017
  } catch {
@@ -790,7 +1020,7 @@ async function main() {
790
1020
  }
791
1021
 
792
1022
  // 6. Team leader nudge (lead session only): remind the leader to check teammate/mailbox state.
793
- if (!isTeamWorker && !deepInterviewStateActive) {
1023
+ if (!isTeamWorker && canWriteLeaderScopedState && !deepInterviewStateActive) {
794
1024
  try {
795
1025
  await maybeNudgeTeamLeader({ cwd, stateDir, logsDir, preComputedLeaderStale });
796
1026
  } catch {
@@ -866,9 +1096,12 @@ async function main() {
866
1096
  const idleFingerprint = buildIdleNotificationFingerprint(payload);
867
1097
  const notifySessionId = getEffectiveSessionId();
868
1098
 
869
- const shouldNotifyLifecycle = notifySessionId
870
- && shouldSendIdleNotification(stateDir, notifySessionId, idleFingerprint);
871
- const shouldDispatchSessionIdleHookEvent = notifySessionId
1099
+ const shouldNotifyLifecycle = notifySessionId && (
1100
+ !canWriteLeaderScopedState
1101
+ || shouldSendIdleNotification(stateDir, notifySessionId, idleFingerprint)
1102
+ );
1103
+ const shouldDispatchSessionIdleHookEvent = canWriteLeaderScopedState
1104
+ && notifySessionId
872
1105
  && shouldSendSessionIdleHookEvent(stateDir, notifySessionId, idleFingerprint);
873
1106
 
874
1107
  if (shouldNotifyLifecycle || shouldDispatchSessionIdleHookEvent) {
@@ -876,8 +1109,10 @@ async function main() {
876
1109
  const idleResult = await notifyLifecycle('session-idle', {
877
1110
  sessionId: notifySessionId,
878
1111
  projectPath: cwd,
1112
+ }, undefined, {
1113
+ persistScopedReceipts: canWriteLeaderScopedState,
879
1114
  });
880
- if (idleResult && idleResult.anySuccess) {
1115
+ if (canWriteLeaderScopedState && idleResult && idleResult.anySuccess) {
881
1116
  recordIdleNotificationSent(stateDir, notifySessionId, idleFingerprint);
882
1117
  }
883
1118
  }
@@ -919,9 +1154,16 @@ async function main() {
919
1154
 
920
1155
  // 9. Auto-nudge: detect Codex stall patterns and automatically send a continuation prompt.
921
1156
  // Works for both leader and worker contexts.
922
- if (!deepInterviewStateActive || deepInterviewInputLockActive) {
1157
+ if ((isTeamWorker || canWriteLeaderScopedState) && (!deepInterviewStateActive || deepInterviewInputLockActive)) {
923
1158
  try {
924
- await maybeAutoNudge({ cwd, stateDir, logsDir, payload });
1159
+ await maybeAutoNudge({
1160
+ cwd,
1161
+ stateDir,
1162
+ logsDir,
1163
+ payload,
1164
+ context: isTeamWorker ? null : leaderWriteDecision!.context,
1165
+ syncResult: skillSyncResult,
1166
+ });
925
1167
  } catch {
926
1168
  // Non-critical
927
1169
  }
@@ -938,6 +1180,7 @@ async function main() {
938
1180
  logsDir,
939
1181
  sessionId: getEffectiveSessionId(),
940
1182
  turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
1183
+ persistRuntimeFeedback: canWriteLeaderScopedState,
941
1184
  });
942
1185
  } catch (err) {
943
1186
  // Structured warning for module import failure (issue #421)
@@ -956,12 +1199,12 @@ async function main() {
956
1199
 
957
1200
  // 10. Code simplifier: delegate recently modified files for simplification.
958
1201
  // Opt-in via ~/.omx/config.json: { "codeSimplifier": { "enabled": true } }
959
- if (!isTeamWorker) {
1202
+ if (!isTeamWorker && canWriteLeaderScopedState) {
960
1203
  try {
961
1204
  const { processCodeSimplifier } = await import('../hooks/code-simplifier/index.js');
962
1205
  const csResult = processCodeSimplifier(cwd, stateDir);
963
1206
  if (csResult.triggered) {
964
- const managedSession = await isManagedOmxSession(cwd, payload, { allowTeamWorker: false });
1207
+ const managedSession = await isManagedOmxSessionAtPromptContext(cwd, leaderWriteDecision!.context, { allowTeamWorker: false });
965
1208
  if (!managedSession) {
966
1209
  const { logTmuxHookEvent } = await import('./notify-hook/log.js');
967
1210
  await logTmuxHookEvent(logsDir, {
@@ -970,11 +1213,12 @@ async function main() {
970
1213
  reason: 'unmanaged_session',
971
1214
  });
972
1215
  } else {
973
- const csPaneId = await resolveNudgePaneTarget(stateDir, cwd, payload);
1216
+ const csPaneId = await resolveNudgePaneTarget(stateDir, cwd, payload, leaderWriteDecision!.context);
974
1217
  if (csPaneId) {
975
1218
  const csText = `${csResult.message} ${DEFAULT_MARKER}`;
976
1219
  const sendResult = await sendPaneInput({
977
1220
  paneTarget: csPaneId,
1221
+ exactPaneId: csPaneId,
978
1222
  prompt: csText,
979
1223
  submitKeyPresses: 2,
980
1224
  submitDelayMs: 100,
@@ -1025,9 +1269,11 @@ async function logFatalNotifyHookError(err: unknown): Promise<void> {
1025
1269
  }) + '\n').catch(() => {});
1026
1270
  }
1027
1271
 
1028
- main().catch((err) => {
1029
- // Notify hooks are auxiliary background work. Avoid printing stack traces into
1030
- // Codex TUI/PowerShell foreground panes; record diagnostics in .omx/logs.
1031
- process.exitCode = 0;
1032
- void logFatalNotifyHookError(err);
1033
- });
1272
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
1273
+ main().catch((err) => {
1274
+ // Notify hooks are auxiliary background work. Avoid printing stack traces into
1275
+ // Codex TUI/PowerShell foreground panes; record diagnostics in .omx/logs.
1276
+ process.exitCode = 0;
1277
+ void logFatalNotifyHookError(err);
1278
+ });
1279
+ }