oh-my-codex 0.20.1 → 0.20.2

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 (654) hide show
  1. package/Cargo.lock +6 -6
  2. package/Cargo.toml +1 -1
  3. package/README.md +10 -1
  4. package/dist/adapt/__tests__/hermes.test.js.map +1 -1
  5. package/dist/adapt/contracts.d.ts.map +1 -1
  6. package/dist/agents/native-config.js.map +1 -1
  7. package/dist/auth/__tests__/hotswap.test.d.ts +2 -0
  8. package/dist/auth/__tests__/hotswap.test.d.ts.map +1 -0
  9. package/dist/auth/__tests__/hotswap.test.js +183 -0
  10. package/dist/auth/__tests__/hotswap.test.js.map +1 -0
  11. package/dist/auth/hotswap.d.ts.map +1 -1
  12. package/dist/auth/hotswap.js +17 -4
  13. package/dist/auth/hotswap.js.map +1 -1
  14. package/dist/auth/paths.js.map +1 -1
  15. package/dist/auth/storage.js.map +1 -1
  16. package/dist/autopilot/__tests__/ralplan-gate.test.js +4 -4
  17. package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
  18. package/dist/autopilot/completion-gate.js.map +1 -1
  19. package/dist/autopilot/fsm.d.ts +1 -1
  20. package/dist/autopilot/fsm.d.ts.map +1 -1
  21. package/dist/autoresearch/goal.js.map +1 -1
  22. package/dist/autoresearch/runtime.js.map +1 -1
  23. package/dist/capabilities/lockfile.js.map +1 -1
  24. package/dist/catalog/reader.js.map +1 -1
  25. package/dist/catalog/skill-mirror.js.map +1 -1
  26. package/dist/cli/__tests__/adapt-help.test.js.map +1 -1
  27. package/dist/cli/__tests__/agents-init.test.js.map +1 -1
  28. package/dist/cli/__tests__/agents.test.js.map +1 -1
  29. package/dist/cli/__tests__/api.test.js.map +1 -1
  30. package/dist/cli/__tests__/ask.test.js.map +1 -1
  31. package/dist/cli/__tests__/auth.test.js.map +1 -1
  32. package/dist/cli/__tests__/autoresearch-guided.test.js.map +1 -1
  33. package/dist/cli/__tests__/autoresearch.test.js.map +1 -1
  34. package/dist/cli/__tests__/capabilities.test.js.map +1 -1
  35. package/dist/cli/__tests__/codex-plugin-layout.test.js.map +1 -1
  36. package/dist/cli/__tests__/doctor-context-window-warning.test.js.map +1 -1
  37. package/dist/cli/__tests__/doctor-invalid-config.test.js +47 -4
  38. package/dist/cli/__tests__/doctor-invalid-config.test.js.map +1 -1
  39. package/dist/cli/__tests__/doctor-team.test.js.map +1 -1
  40. package/dist/cli/__tests__/doctor-warning-copy.test.js +650 -15
  41. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  42. package/dist/cli/__tests__/exec.test.js.map +1 -1
  43. package/dist/cli/__tests__/imagegen-continuation.test.js.map +1 -1
  44. package/dist/cli/__tests__/index.test.js +216 -11
  45. package/dist/cli/__tests__/index.test.js.map +1 -1
  46. package/dist/cli/__tests__/launch-fallback.test.js +49 -3
  47. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  48. package/dist/cli/__tests__/mcp-parity.test.js +84 -12
  49. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  50. package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts +2 -0
  51. package/dist/cli/__tests__/native-hook-claim-journal.test.d.ts.map +1 -0
  52. package/dist/cli/__tests__/native-hook-claim-journal.test.js +128 -0
  53. package/dist/cli/__tests__/native-hook-claim-journal.test.js.map +1 -0
  54. package/dist/cli/__tests__/nested-help-routing.test.js.map +1 -1
  55. package/dist/cli/__tests__/question.test.js.map +1 -1
  56. package/dist/cli/__tests__/ralph-deslop-contract.test.js.map +1 -1
  57. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +6 -0
  58. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  59. package/dist/cli/__tests__/ralph-prd-deep-interview.test.js.map +1 -1
  60. package/dist/cli/__tests__/ralph-prd-smoke.test.js.map +1 -1
  61. package/dist/cli/__tests__/ralph.test.js +8 -3
  62. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  63. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts +2 -0
  64. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.d.ts.map +1 -0
  65. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js +187 -0
  66. package/dist/cli/__tests__/ralplan-bootstrap-3181.test.js.map +1 -0
  67. package/dist/cli/__tests__/ralplan.test.d.ts +2 -0
  68. package/dist/cli/__tests__/ralplan.test.d.ts.map +1 -0
  69. package/dist/cli/__tests__/ralplan.test.js +129 -0
  70. package/dist/cli/__tests__/ralplan.test.js.map +1 -0
  71. package/dist/cli/__tests__/resume.test.js +6 -1
  72. package/dist/cli/__tests__/resume.test.js.map +1 -1
  73. package/dist/cli/__tests__/session-scoped-runtime.test.js +25 -0
  74. package/dist/cli/__tests__/session-scoped-runtime.test.js.map +1 -1
  75. package/dist/cli/__tests__/session-search-help.test.js.map +1 -1
  76. package/dist/cli/__tests__/session-search.test.js.map +1 -1
  77. package/dist/cli/__tests__/setup-agents-overwrite.test.js +79 -0
  78. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  79. package/dist/cli/__tests__/setup-gh-star.test.js.map +1 -1
  80. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js +77 -3
  81. package/dist/cli/__tests__/setup-hooks-shared-ownership.test.js.map +1 -1
  82. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts +2 -0
  83. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.d.ts.map +1 -0
  84. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js +285 -0
  85. package/dist/cli/__tests__/setup-hooks-trust-e2e.test.js.map +1 -0
  86. package/dist/cli/__tests__/setup-install-mode.test.js +2261 -14
  87. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  88. package/dist/cli/__tests__/setup-preferences.test.d.ts +2 -0
  89. package/dist/cli/__tests__/setup-preferences.test.d.ts.map +1 -0
  90. package/dist/cli/__tests__/setup-preferences.test.js +79 -0
  91. package/dist/cli/__tests__/setup-preferences.test.js.map +1 -0
  92. package/dist/cli/__tests__/setup-refresh.test.js +33 -2
  93. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  94. package/dist/cli/__tests__/setup-scope.test.js +46 -3
  95. package/dist/cli/__tests__/setup-scope.test.js.map +1 -1
  96. package/dist/cli/__tests__/sparkshell-cli.test.js.map +1 -1
  97. package/dist/cli/__tests__/state.test.js +37 -0
  98. package/dist/cli/__tests__/state.test.js.map +1 -1
  99. package/dist/cli/__tests__/team.test.js.map +1 -1
  100. package/dist/cli/__tests__/ultragoal.test.js +61 -1
  101. package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
  102. package/dist/cli/__tests__/uninstall.test.js +1771 -24
  103. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  104. package/dist/cli/__tests__/update.test.js +58 -0
  105. package/dist/cli/__tests__/update.test.js.map +1 -1
  106. package/dist/cli/__tests__/url.test.js.map +1 -1
  107. package/dist/cli/__tests__/windows-popup-loop-contract.test.js.map +1 -1
  108. package/dist/cli/adapt.js.map +1 -1
  109. package/dist/cli/agents-init.js.map +1 -1
  110. package/dist/cli/agents.js.map +1 -1
  111. package/dist/cli/api.js.map +1 -1
  112. package/dist/cli/ask.d.ts +1 -1
  113. package/dist/cli/ask.d.ts.map +1 -1
  114. package/dist/cli/ask.js.map +1 -1
  115. package/dist/cli/auth.js.map +1 -1
  116. package/dist/cli/autoresearch-guided.js.map +1 -1
  117. package/dist/cli/autoresearch-intake.js.map +1 -1
  118. package/dist/cli/capabilities.js.map +1 -1
  119. package/dist/cli/cleanup.js.map +1 -1
  120. package/dist/cli/codex-feature-probe.js.map +1 -1
  121. package/dist/cli/codex-home.js.map +1 -1
  122. package/dist/cli/doctor.d.ts +18 -0
  123. package/dist/cli/doctor.d.ts.map +1 -1
  124. package/dist/cli/doctor.js +594 -130
  125. package/dist/cli/doctor.js.map +1 -1
  126. package/dist/cli/explore.js.map +1 -1
  127. package/dist/cli/index.d.ts +11 -3
  128. package/dist/cli/index.d.ts.map +1 -1
  129. package/dist/cli/index.js +108 -20
  130. package/dist/cli/index.js.map +1 -1
  131. package/dist/cli/mcp-serve.js.map +1 -1
  132. package/dist/cli/mission.js.map +1 -1
  133. package/dist/cli/native-assets.js.map +1 -1
  134. package/dist/cli/native-hook-claim-journal.d.ts +18 -0
  135. package/dist/cli/native-hook-claim-journal.d.ts.map +1 -0
  136. package/dist/cli/native-hook-claim-journal.js +239 -0
  137. package/dist/cli/native-hook-claim-journal.js.map +1 -0
  138. package/dist/cli/omx.js.map +1 -1
  139. package/dist/cli/plugin-marketplace.js.map +1 -1
  140. package/dist/cli/project-runtime-codex-homes.js.map +1 -1
  141. package/dist/cli/question.js.map +1 -1
  142. package/dist/cli/ralph.d.ts.map +1 -1
  143. package/dist/cli/ralph.js +3 -2
  144. package/dist/cli/ralph.js.map +1 -1
  145. package/dist/cli/ralplan.d.ts +14 -0
  146. package/dist/cli/ralplan.d.ts.map +1 -0
  147. package/dist/cli/ralplan.js +203 -0
  148. package/dist/cli/ralplan.js.map +1 -0
  149. package/dist/cli/setup-preferences.d.ts +11 -0
  150. package/dist/cli/setup-preferences.d.ts.map +1 -1
  151. package/dist/cli/setup-preferences.js +32 -0
  152. package/dist/cli/setup-preferences.js.map +1 -1
  153. package/dist/cli/setup.d.ts +53 -0
  154. package/dist/cli/setup.d.ts.map +1 -1
  155. package/dist/cli/setup.js +1401 -398
  156. package/dist/cli/setup.js.map +1 -1
  157. package/dist/cli/sparkshell.js.map +1 -1
  158. package/dist/cli/star-prompt.js.map +1 -1
  159. package/dist/cli/state.d.ts.map +1 -1
  160. package/dist/cli/state.js +2 -1
  161. package/dist/cli/state.js.map +1 -1
  162. package/dist/cli/team.js.map +1 -1
  163. package/dist/cli/ultragoal.d.ts +5 -1
  164. package/dist/cli/ultragoal.d.ts.map +1 -1
  165. package/dist/cli/ultragoal.js +34 -2
  166. package/dist/cli/ultragoal.js.map +1 -1
  167. package/dist/cli/uninstall.d.ts +8 -0
  168. package/dist/cli/uninstall.d.ts.map +1 -1
  169. package/dist/cli/uninstall.js +944 -95
  170. package/dist/cli/uninstall.js.map +1 -1
  171. package/dist/cli/update.d.ts.map +1 -1
  172. package/dist/cli/update.js +8 -1
  173. package/dist/cli/update.js.map +1 -1
  174. package/dist/cli/url.js.map +1 -1
  175. package/dist/compat/__tests__/doctor-contract.test.js +5 -1
  176. package/dist/compat/__tests__/doctor-contract.test.js.map +1 -1
  177. package/dist/compat/__tests__/rust-runtime-compat.test.js.map +1 -1
  178. package/dist/config/__tests__/codex-hooks.test.js +1287 -11
  179. package/dist/config/__tests__/codex-hooks.test.js.map +1 -1
  180. package/dist/config/__tests__/generator-idempotent.test.js +850 -32
  181. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  182. package/dist/config/__tests__/generator-notify.test.js +6 -1
  183. package/dist/config/__tests__/generator-notify.test.js.map +1 -1
  184. package/dist/config/codex-feature-flags.d.ts.map +1 -1
  185. package/dist/config/codex-feature-flags.js.map +1 -1
  186. package/dist/config/codex-hooks.d.ts +124 -1
  187. package/dist/config/codex-hooks.d.ts.map +1 -1
  188. package/dist/config/codex-hooks.js +2142 -265
  189. package/dist/config/codex-hooks.js.map +1 -1
  190. package/dist/config/commit-lore-guard.js.map +1 -1
  191. package/dist/config/generator.d.ts +21 -16
  192. package/dist/config/generator.d.ts.map +1 -1
  193. package/dist/config/generator.js +991 -137
  194. package/dist/config/generator.js.map +1 -1
  195. package/dist/config/mcp-registry.js.map +1 -1
  196. package/dist/config/models.d.ts +2 -2
  197. package/dist/config/models.d.ts.map +1 -1
  198. package/dist/config/models.js.map +1 -1
  199. package/dist/config/omx-first-party-mcp.js.map +1 -1
  200. package/dist/config/team-mode.d.ts.map +1 -1
  201. package/dist/document-refresh/__tests__/enforcer.test.js.map +1 -1
  202. package/dist/document-refresh/enforcer.js.map +1 -1
  203. package/dist/exec/followup.js.map +1 -1
  204. package/dist/goal-workflows/artifacts.js.map +1 -1
  205. package/dist/hooks/__tests__/agents-overlay.test.js +7 -4
  206. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  207. package/dist/hooks/__tests__/analyze-routing-contract.test.js.map +1 -1
  208. package/dist/hooks/__tests__/analyze-skill-contract.test.js.map +1 -1
  209. package/dist/hooks/__tests__/anti-slop-workflow.test.js.map +1 -1
  210. package/dist/hooks/__tests__/autopilot-skill-contract.test.js +9 -3
  211. package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
  212. package/dist/hooks/__tests__/code-review-skill-contract.test.js.map +1 -1
  213. package/dist/hooks/__tests__/consensus-execution-handoff.test.js.map +1 -1
  214. package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
  215. package/dist/hooks/__tests__/design-skill.test.js.map +1 -1
  216. package/dist/hooks/__tests__/keyword-detector.test.js +1372 -2
  217. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  218. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +14 -0
  219. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  220. package/dist/hooks/__tests__/notify-hook-all-workers-idle.test.js.map +1 -1
  221. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +669 -1
  222. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  223. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js +2 -0
  224. package/dist/hooks/__tests__/notify-hook-cross-worktree-heartbeat.test.js.map +1 -1
  225. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +142 -1
  226. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  227. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  228. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js +48 -2
  229. package/dist/hooks/__tests__/notify-hook-non-omx-guard.test.js.map +1 -1
  230. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js +61 -44
  231. package/dist/hooks/__tests__/notify-hook-ralph-resume.test.js.map +1 -1
  232. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  233. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js +3 -2
  234. package/dist/hooks/__tests__/notify-hook-session-idle-dedupe.test.js.map +1 -1
  235. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +243 -4
  236. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  237. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  238. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +8 -1
  239. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  240. package/dist/hooks/__tests__/notify-hook-team-tmux-guard.test.js.map +1 -1
  241. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  242. package/dist/hooks/__tests__/notify-hook-tmux-scrollback.test.js.map +1 -1
  243. package/dist/hooks/__tests__/notify-hook-visual-verdict.test.js.map +1 -1
  244. package/dist/hooks/__tests__/notify-hook-worker-idle.test.js.map +1 -1
  245. package/dist/hooks/__tests__/openclaw-setup-contract.test.js.map +1 -1
  246. package/dist/hooks/__tests__/pre-context-gate-skills.test.js.map +1 -1
  247. package/dist/hooks/__tests__/prometheus-strict-contract.test.js.map +1 -1
  248. package/dist/hooks/__tests__/prompt-guidance-fragments.test.js.map +1 -1
  249. package/dist/hooks/__tests__/prompt-guidance-test-helpers.js.map +1 -1
  250. package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts +2 -0
  251. package/dist/hooks/__tests__/prompt-session-provenance.test.d.ts.map +1 -0
  252. package/dist/hooks/__tests__/prompt-session-provenance.test.js +82 -0
  253. package/dist/hooks/__tests__/prompt-session-provenance.test.js.map +1 -0
  254. package/dist/hooks/__tests__/session.test.js +532 -11
  255. package/dist/hooks/__tests__/session.test.js.map +1 -1
  256. package/dist/hooks/__tests__/skill-catalog-hygiene.test.js.map +1 -1
  257. package/dist/hooks/__tests__/team-runtime-gating-docs-contract.test.js.map +1 -1
  258. package/dist/hooks/__tests__/visual-ralph-skill.test.js.map +1 -1
  259. package/dist/hooks/__tests__/visual-verdict-loop.test.js.map +1 -1
  260. package/dist/hooks/agents-overlay.js +5 -5
  261. package/dist/hooks/agents-overlay.js.map +1 -1
  262. package/dist/hooks/code-simplifier/index.js.map +1 -1
  263. package/dist/hooks/explore-routing.js.map +1 -1
  264. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  265. package/dist/hooks/extensibility/events.js.map +1 -1
  266. package/dist/hooks/extensibility/loader.js.map +1 -1
  267. package/dist/hooks/extensibility/plugin-runner-stdin.js.map +1 -1
  268. package/dist/hooks/extensibility/sdk/logging.js.map +1 -1
  269. package/dist/hooks/keyword-detector.d.ts +33 -7
  270. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  271. package/dist/hooks/keyword-detector.js +2228 -119
  272. package/dist/hooks/keyword-detector.js.map +1 -1
  273. package/dist/hooks/keyword-registry.d.ts +12 -0
  274. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  275. package/dist/hooks/keyword-registry.js +41 -0
  276. package/dist/hooks/keyword-registry.js.map +1 -1
  277. package/dist/hooks/prompt-session-provenance.d.ts +87 -0
  278. package/dist/hooks/prompt-session-provenance.d.ts.map +1 -0
  279. package/dist/hooks/prompt-session-provenance.js +180 -0
  280. package/dist/hooks/prompt-session-provenance.js.map +1 -0
  281. package/dist/hooks/session.d.ts +139 -34
  282. package/dist/hooks/session.d.ts.map +1 -1
  283. package/dist/hooks/session.js +1239 -317
  284. package/dist/hooks/session.js.map +1 -1
  285. package/dist/hooks/task-size-detector.js.map +1 -1
  286. package/dist/hud/__tests__/state.test.js.map +1 -1
  287. package/dist/hud/authority.js.map +1 -1
  288. package/dist/hud/constants.js.map +1 -1
  289. package/dist/hud/index.js.map +1 -1
  290. package/dist/hud/reconcile.js.map +1 -1
  291. package/dist/hud/render.js.map +1 -1
  292. package/dist/hud/state.js.map +1 -1
  293. package/dist/hud/tmux.js.map +1 -1
  294. package/dist/leader/__tests__/contract.test.js +103 -1
  295. package/dist/leader/__tests__/contract.test.js.map +1 -1
  296. package/dist/leader/contract.d.ts +26 -5
  297. package/dist/leader/contract.d.ts.map +1 -1
  298. package/dist/leader/contract.js +109 -3
  299. package/dist/leader/contract.js.map +1 -1
  300. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  301. package/dist/mcp/__tests__/server-lifecycle.test.js +15 -2
  302. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  303. package/dist/mcp/__tests__/state-paths.test.js +98 -1
  304. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  305. package/dist/mcp/bootstrap.js.map +1 -1
  306. package/dist/mcp/code-intel-server.d.ts +58 -58
  307. package/dist/mcp/code-intel-server.d.ts.map +1 -1
  308. package/dist/mcp/code-intel-server.js.map +1 -1
  309. package/dist/mcp/hermes-bridge.js.map +1 -1
  310. package/dist/mcp/hermes-server.d.ts +70 -70
  311. package/dist/mcp/hermes-server.d.ts.map +1 -1
  312. package/dist/mcp/lifecycle-telemetry.js.map +1 -1
  313. package/dist/mcp/memory-server.d.ts +34 -34
  314. package/dist/mcp/memory-server.d.ts.map +1 -1
  315. package/dist/mcp/memory-server.js.map +1 -1
  316. package/dist/mcp/state-paths.d.ts +14 -0
  317. package/dist/mcp/state-paths.d.ts.map +1 -1
  318. package/dist/mcp/state-paths.js +96 -20
  319. package/dist/mcp/state-paths.js.map +1 -1
  320. package/dist/mcp/state-server.d.ts +47 -47
  321. package/dist/mcp/state-server.d.ts.map +1 -1
  322. package/dist/mcp/trace-server.d.ts +4 -4
  323. package/dist/mcp/trace-server.d.ts.map +1 -1
  324. package/dist/mcp/trace-server.js.map +1 -1
  325. package/dist/mcp/wiki-server.d.ts +23 -23
  326. package/dist/mcp/wiki-server.d.ts.map +1 -1
  327. package/dist/mcp/wiki-server.js.map +1 -1
  328. package/dist/modes/__tests__/base-session-scope.test.js +53 -1
  329. package/dist/modes/__tests__/base-session-scope.test.js.map +1 -1
  330. package/dist/modes/base.d.ts.map +1 -1
  331. package/dist/modes/base.js +5 -5
  332. package/dist/modes/base.js.map +1 -1
  333. package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -1
  334. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
  335. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +177 -85
  336. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -1
  337. package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
  338. package/dist/notifications/__tests__/template-engine.test.js.map +1 -1
  339. package/dist/notifications/__tests__/verbosity.test.js.map +1 -1
  340. package/dist/notifications/http-client.js.map +1 -1
  341. package/dist/notifications/index.d.ts +4 -1
  342. package/dist/notifications/index.d.ts.map +1 -1
  343. package/dist/notifications/index.js +3 -9
  344. package/dist/notifications/index.js.map +1 -1
  345. package/dist/notifications/lifecycle-dedupe.js.map +1 -1
  346. package/dist/notifications/reply-listener.d.ts.map +1 -1
  347. package/dist/notifications/reply-listener.js.map +1 -1
  348. package/dist/notifications/session-registry.js.map +1 -1
  349. package/dist/notifications/session-status.js.map +1 -1
  350. package/dist/notifications/temp-contract.js.map +1 -1
  351. package/dist/notifications/tmux-detector.js.map +1 -1
  352. package/dist/notifications/tmux.js.map +1 -1
  353. package/dist/openclaw/config.js.map +1 -1
  354. package/dist/openclaw/dispatcher.js.map +1 -1
  355. package/dist/pipeline/__tests__/orchestrator.test.js.map +1 -1
  356. package/dist/pipeline/__tests__/stages.test.js +8 -5
  357. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  358. package/dist/pipeline/stages/code-review.js.map +1 -1
  359. package/dist/pipeline/stages/ralph-verify.js.map +1 -1
  360. package/dist/pipeline/stages/ralplan.js.map +1 -1
  361. package/dist/pipeline/stages/team-exec.js.map +1 -1
  362. package/dist/pipeline/stages/ultragoal.js.map +1 -1
  363. package/dist/pipeline/stages/ultraqa.js.map +1 -1
  364. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
  365. package/dist/planning/artifact-names.js.map +1 -1
  366. package/dist/planning/artifacts.js.map +1 -1
  367. package/dist/question/__tests__/state.test.js.map +1 -1
  368. package/dist/question/__tests__/ui.test.js.map +1 -1
  369. package/dist/question/autopilot-wait.js.map +1 -1
  370. package/dist/question/client.d.ts.map +1 -1
  371. package/dist/question/client.js.map +1 -1
  372. package/dist/question/deep-interview.js.map +1 -1
  373. package/dist/question/events.js.map +1 -1
  374. package/dist/question/renderer.js.map +1 -1
  375. package/dist/question/state.d.ts.map +1 -1
  376. package/dist/question/state.js.map +1 -1
  377. package/dist/question/ui.js.map +1 -1
  378. package/dist/ralph/contract.d.ts +1 -1
  379. package/dist/ralph/contract.d.ts.map +1 -1
  380. package/dist/ralplan/__tests__/consensus-gate.test.js +403 -8
  381. package/dist/ralplan/__tests__/consensus-gate.test.js.map +1 -1
  382. package/dist/ralplan/__tests__/runtime.test.js +112 -14
  383. package/dist/ralplan/__tests__/runtime.test.js.map +1 -1
  384. package/dist/ralplan/consensus-gate.d.ts +3 -3
  385. package/dist/ralplan/consensus-gate.d.ts.map +1 -1
  386. package/dist/ralplan/consensus-gate.js +155 -60
  387. package/dist/ralplan/consensus-gate.js.map +1 -1
  388. package/dist/ralplan/runtime.d.ts +2 -2
  389. package/dist/ralplan/runtime.d.ts.map +1 -1
  390. package/dist/ralplan/runtime.js +1 -2
  391. package/dist/ralplan/runtime.js.map +1 -1
  392. package/dist/runtime/bridge.d.ts.map +1 -1
  393. package/dist/runtime/bridge.js.map +1 -1
  394. package/dist/runtime/process-tree.js.map +1 -1
  395. package/dist/runtime/run-loop.js.map +1 -1
  396. package/dist/runtime/run-outcome.d.ts +3 -3
  397. package/dist/runtime/run-outcome.d.ts.map +1 -1
  398. package/dist/runtime/run-outcome.js.map +1 -1
  399. package/dist/runtime/run-state.js.map +1 -1
  400. package/dist/scripts/__tests__/codex-native-hook.test.js +4121 -592
  401. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  402. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts +2 -0
  403. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.d.ts.map +1 -0
  404. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js +634 -0
  405. package/dist/scripts/__tests__/fixtures/issue-3138-installed-smoke.js.map +1 -0
  406. package/dist/scripts/__tests__/generate-release-body.test.js.map +1 -1
  407. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -1
  408. package/dist/scripts/__tests__/notify-dispatcher.test.js.map +1 -1
  409. package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts +2 -0
  410. package/dist/scripts/__tests__/notify-fallback-delivery.test.d.ts.map +1 -0
  411. package/dist/scripts/__tests__/notify-fallback-delivery.test.js +174 -0
  412. package/dist/scripts/__tests__/notify-fallback-delivery.test.js.map +1 -0
  413. package/dist/scripts/__tests__/notify-state-io.test.js +57 -1
  414. package/dist/scripts/__tests__/notify-state-io.test.js.map +1 -1
  415. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts +2 -0
  416. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.d.ts.map +1 -0
  417. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js +205 -0
  418. package/dist/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.js.map +1 -0
  419. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts +2 -0
  420. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.d.ts.map +1 -0
  421. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js +175 -0
  422. package/dist/scripts/__tests__/role-intent-durable-recovery-3181.test.js.map +1 -0
  423. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  424. package/dist/scripts/__tests__/smoke-packed-install.test.js +848 -4
  425. package/dist/scripts/__tests__/smoke-packed-install.test.js.map +1 -1
  426. package/dist/scripts/__tests__/test-reply-listener-live.test.js.map +1 -1
  427. package/dist/scripts/build-api.js.map +1 -1
  428. package/dist/scripts/build-explore-harness.js.map +1 -1
  429. package/dist/scripts/build-sparkshell.js.map +1 -1
  430. package/dist/scripts/cleanup-explore-harness.js.map +1 -1
  431. package/dist/scripts/codex-execution-surface.js.map +1 -1
  432. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  433. package/dist/scripts/codex-native-hook.js +689 -156
  434. package/dist/scripts/codex-native-hook.js.map +1 -1
  435. package/dist/scripts/generate-native-release-manifest.js.map +1 -1
  436. package/dist/scripts/generate-release-body.js.map +1 -1
  437. package/dist/scripts/hook-payload-guard.d.ts.map +1 -1
  438. package/dist/scripts/hook-payload-guard.js.map +1 -1
  439. package/dist/scripts/notify-fallback-delivery.d.ts +48 -0
  440. package/dist/scripts/notify-fallback-delivery.d.ts.map +1 -0
  441. package/dist/scripts/notify-fallback-delivery.js +419 -0
  442. package/dist/scripts/notify-fallback-delivery.js.map +1 -0
  443. package/dist/scripts/notify-fallback-watcher.js +136 -30
  444. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  445. package/dist/scripts/notify-hook/auto-nudge.d.ts +18 -9
  446. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  447. package/dist/scripts/notify-hook/auto-nudge.js +39 -13
  448. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  449. package/dist/scripts/notify-hook/managed-tmux.d.ts +23 -0
  450. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  451. package/dist/scripts/notify-hook/managed-tmux.js +122 -12
  452. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  453. package/dist/scripts/notify-hook/orchestration-intent.d.ts +7 -7
  454. package/dist/scripts/notify-hook/orchestration-intent.d.ts.map +1 -1
  455. package/dist/scripts/notify-hook/ralph-session-resume.d.ts +5 -2
  456. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  457. package/dist/scripts/notify-hook/ralph-session-resume.js +33 -37
  458. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  459. package/dist/scripts/notify-hook/state-io.d.ts +17 -0
  460. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  461. package/dist/scripts/notify-hook/state-io.js +73 -11
  462. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  463. package/dist/scripts/notify-hook/team-dispatch.d.ts +1 -1
  464. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  465. package/dist/scripts/notify-hook/team-leader-nudge.d.ts +2 -2
  466. package/dist/scripts/notify-hook/team-tmux-guard.d.ts +4 -4
  467. package/dist/scripts/notify-hook/team-worker-posttooluse.js.map +1 -1
  468. package/dist/scripts/notify-hook/team-worker-stop.d.ts +1 -1
  469. package/dist/scripts/notify-hook/team-worker.d.ts +2 -2
  470. package/dist/scripts/notify-hook/tmux-injection.d.ts +8 -1
  471. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  472. package/dist/scripts/notify-hook/tmux-injection.js +25 -16
  473. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  474. package/dist/scripts/notify-hook/visual-verdict.d.ts +1 -1
  475. package/dist/scripts/notify-hook/visual-verdict.d.ts.map +1 -1
  476. package/dist/scripts/notify-hook/visual-verdict.js +15 -13
  477. package/dist/scripts/notify-hook/visual-verdict.js.map +1 -1
  478. package/dist/scripts/notify-hook.d.ts +24 -1
  479. package/dist/scripts/notify-hook.d.ts.map +1 -1
  480. package/dist/scripts/notify-hook.js +266 -90
  481. package/dist/scripts/notify-hook.js.map +1 -1
  482. package/dist/scripts/postinstall.js.map +1 -1
  483. package/dist/scripts/prompt-inventory.js.map +1 -1
  484. package/dist/scripts/smoke-packed-install.d.ts +879 -2
  485. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  486. package/dist/scripts/smoke-packed-install.js +1528 -7
  487. package/dist/scripts/smoke-packed-install.js.map +1 -1
  488. package/dist/scripts/sync-plugin-mirror.js.map +1 -1
  489. package/dist/scripts/test-reply-listener-live.js.map +1 -1
  490. package/dist/scripts/test-sparkshell.js.map +1 -1
  491. package/dist/scripts/verify-native-agents.js.map +1 -1
  492. package/dist/session-history/friction.js.map +1 -1
  493. package/dist/session-history/search.js.map +1 -1
  494. package/dist/sidecar/__tests__/boundary.test.js.map +1 -1
  495. package/dist/sidecar/collector.js.map +1 -1
  496. package/dist/sidecar/index.js.map +1 -1
  497. package/dist/sidecar/render.js.map +1 -1
  498. package/dist/sidecar/tmux.js.map +1 -1
  499. package/dist/state/__tests__/operations.test.js +64 -15
  500. package/dist/state/__tests__/operations.test.js.map +1 -1
  501. package/dist/state/__tests__/skill-active.test.js +19 -1
  502. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  503. package/dist/state/__tests__/workflow-transition.test.js +61 -0
  504. package/dist/state/__tests__/workflow-transition.test.js.map +1 -1
  505. package/dist/state/mode-state-context.js.map +1 -1
  506. package/dist/state/operations.d.ts +1 -1
  507. package/dist/state/operations.d.ts.map +1 -1
  508. package/dist/state/operations.js +49 -55
  509. package/dist/state/operations.js.map +1 -1
  510. package/dist/state/paths.d.ts +1 -1
  511. package/dist/state/paths.d.ts.map +1 -1
  512. package/dist/state/paths.js +1 -1
  513. package/dist/state/paths.js.map +1 -1
  514. package/dist/state/skill-active.d.ts +13 -1
  515. package/dist/state/skill-active.d.ts.map +1 -1
  516. package/dist/state/skill-active.js +43 -4
  517. package/dist/state/skill-active.js.map +1 -1
  518. package/dist/state/terminal-normalization.js.map +1 -1
  519. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -1
  520. package/dist/state/workflow-transition-reconcile.js +20 -4
  521. package/dist/state/workflow-transition-reconcile.js.map +1 -1
  522. package/dist/state/workflow-transition.d.ts +1 -1
  523. package/dist/state/workflow-transition.d.ts.map +1 -1
  524. package/dist/state/workflow-transition.js.map +1 -1
  525. package/dist/subagents/__tests__/adapted-role-binding.test.d.ts +2 -0
  526. package/dist/subagents/__tests__/adapted-role-binding.test.d.ts.map +1 -0
  527. package/dist/subagents/__tests__/adapted-role-binding.test.js +988 -0
  528. package/dist/subagents/__tests__/adapted-role-binding.test.js.map +1 -0
  529. package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts +2 -0
  530. package/dist/subagents/__tests__/leader-bootstrap-3181.test.d.ts.map +1 -0
  531. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js +273 -0
  532. package/dist/subagents/__tests__/leader-bootstrap-3181.test.js.map +1 -0
  533. package/dist/subagents/__tests__/tracker.test.js +1550 -10
  534. package/dist/subagents/__tests__/tracker.test.js.map +1 -1
  535. package/dist/subagents/adapted-role-binding.d.ts +17 -0
  536. package/dist/subagents/adapted-role-binding.d.ts.map +1 -0
  537. package/dist/subagents/adapted-role-binding.js +75 -0
  538. package/dist/subagents/adapted-role-binding.js.map +1 -0
  539. package/dist/subagents/role-routing-marker.d.ts +10 -0
  540. package/dist/subagents/role-routing-marker.d.ts.map +1 -0
  541. package/dist/subagents/role-routing-marker.js +136 -0
  542. package/dist/subagents/role-routing-marker.js.map +1 -0
  543. package/dist/subagents/tracker.d.ts +172 -0
  544. package/dist/subagents/tracker.d.ts.map +1 -1
  545. package/dist/subagents/tracker.js +1077 -61
  546. package/dist/subagents/tracker.js.map +1 -1
  547. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  548. package/dist/team/__tests__/delivery-e2e-smoke.test.js.map +1 -1
  549. package/dist/team/__tests__/model-contract.test.js +231 -1
  550. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  551. package/dist/team/__tests__/role-router.test.js.map +1 -1
  552. package/dist/team/__tests__/runtime.test.js +401 -1
  553. package/dist/team/__tests__/runtime.test.js.map +1 -1
  554. package/dist/team/__tests__/scaling.test.js +181 -0
  555. package/dist/team/__tests__/scaling.test.js.map +1 -1
  556. package/dist/team/__tests__/state-root.test.js.map +1 -1
  557. package/dist/team/__tests__/tmux-session.test.js +434 -4
  558. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  559. package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
  560. package/dist/team/api-interop.d.ts +2 -2
  561. package/dist/team/api-interop.d.ts.map +1 -1
  562. package/dist/team/api-interop.js.map +1 -1
  563. package/dist/team/commit-hygiene.js.map +1 -1
  564. package/dist/team/contracts.d.ts +5 -5
  565. package/dist/team/contracts.d.ts.map +1 -1
  566. package/dist/team/delivery-log.js.map +1 -1
  567. package/dist/team/followup-planner.js.map +1 -1
  568. package/dist/team/goal-workflow.js.map +1 -1
  569. package/dist/team/idle-nudge.d.ts.map +1 -1
  570. package/dist/team/model-contract.d.ts +20 -1
  571. package/dist/team/model-contract.d.ts.map +1 -1
  572. package/dist/team/model-contract.js +267 -30
  573. package/dist/team/model-contract.js.map +1 -1
  574. package/dist/team/orchestrator.js.map +1 -1
  575. package/dist/team/pane-status.js.map +1 -1
  576. package/dist/team/phase-controller.js.map +1 -1
  577. package/dist/team/reminder-intents.d.ts +1 -1
  578. package/dist/team/reminder-intents.d.ts.map +1 -1
  579. package/dist/team/reminder-intents.js.map +1 -1
  580. package/dist/team/runtime-cli.js.map +1 -1
  581. package/dist/team/runtime.d.ts.map +1 -1
  582. package/dist/team/runtime.js +83 -52
  583. package/dist/team/runtime.js.map +1 -1
  584. package/dist/team/scaling.d.ts +9 -7
  585. package/dist/team/scaling.d.ts.map +1 -1
  586. package/dist/team/scaling.js +69 -28
  587. package/dist/team/scaling.js.map +1 -1
  588. package/dist/team/state/dispatch-lock.js.map +1 -1
  589. package/dist/team/state/dispatch.js.map +1 -1
  590. package/dist/team/state/events.js.map +1 -1
  591. package/dist/team/state/tasks.js.map +1 -1
  592. package/dist/team/state-root.js.map +1 -1
  593. package/dist/team/state.js.map +1 -1
  594. package/dist/team/team-identity.d.ts.map +1 -1
  595. package/dist/team/team-identity.js.map +1 -1
  596. package/dist/team/tmux-session.d.ts +2 -0
  597. package/dist/team/tmux-session.d.ts.map +1 -1
  598. package/dist/team/tmux-session.js +90 -42
  599. package/dist/team/tmux-session.js.map +1 -1
  600. package/dist/team/worker-bootstrap.js.map +1 -1
  601. package/dist/team/worktree.js.map +1 -1
  602. package/dist/ultragoal/__tests__/artifacts.test.js.map +1 -1
  603. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  604. package/dist/ultragoal/artifacts.d.ts.map +1 -1
  605. package/dist/ultragoal/artifacts.js +4 -1
  606. package/dist/ultragoal/artifacts.js.map +1 -1
  607. package/dist/url-reader/index.js.map +1 -1
  608. package/dist/utils/agents-model-table.js.map +1 -1
  609. package/dist/utils/package.js.map +1 -1
  610. package/dist/utils/paths.js.map +1 -1
  611. package/dist/utils/platform-command.js.map +1 -1
  612. package/dist/utils/repo-deps.js.map +1 -1
  613. package/dist/utils/version.js.map +1 -1
  614. package/dist/verification/__tests__/ci-rust-gates.test.js +1 -1
  615. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -1
  616. package/dist/verification/verifier.js.map +1 -1
  617. package/dist/visual/constants.d.ts +1 -1
  618. package/dist/visual/constants.d.ts.map +1 -1
  619. package/dist/vscode/__tests__/index.test.js.map +1 -1
  620. package/dist/vscode/index.js.map +1 -1
  621. package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -1
  622. package/dist/wiki/__tests__/lint.test.js.map +1 -1
  623. package/dist/wiki/__tests__/query.test.js.map +1 -1
  624. package/dist/wiki/__tests__/storage.test.js.map +1 -1
  625. package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -1
  626. package/dist/wiki/lint.js.map +1 -1
  627. package/dist/wiki/query.js.map +1 -1
  628. package/dist/wiki/storage.js.map +1 -1
  629. package/package.json +2 -2
  630. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  631. package/plugins/oh-my-codex/skills/omx-setup/SKILL.md +10 -5
  632. package/plugins/oh-my-codex/skills/ralph/SKILL.md +4 -2
  633. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +5 -2
  634. package/skills/omx-setup/SKILL.md +10 -5
  635. package/skills/ralph/SKILL.md +4 -2
  636. package/skills/ralplan/SKILL.md +5 -2
  637. package/src/scripts/__tests__/codex-native-hook.test.ts +17522 -10630
  638. package/src/scripts/__tests__/fixtures/issue-3138-installed-smoke.ts +734 -0
  639. package/src/scripts/__tests__/notify-fallback-delivery.test.ts +177 -0
  640. package/src/scripts/__tests__/notify-state-io.test.ts +73 -0
  641. package/src/scripts/__tests__/role-intent-bootstrap-e2e-3181.test.ts +215 -0
  642. package/src/scripts/__tests__/role-intent-durable-recovery-3181.test.ts +193 -0
  643. package/src/scripts/__tests__/smoke-packed-install.test.ts +991 -4
  644. package/src/scripts/codex-native-hook.ts +779 -159
  645. package/src/scripts/notify-fallback-delivery.ts +416 -0
  646. package/src/scripts/notify-fallback-watcher.ts +132 -40
  647. package/src/scripts/notify-hook/auto-nudge.ts +43 -12
  648. package/src/scripts/notify-hook/managed-tmux.ts +149 -12
  649. package/src/scripts/notify-hook/ralph-session-resume.ts +37 -36
  650. package/src/scripts/notify-hook/state-io.ts +100 -13
  651. package/src/scripts/notify-hook/tmux-injection.ts +38 -21
  652. package/src/scripts/notify-hook/visual-verdict.ts +22 -12
  653. package/src/scripts/notify-hook.ts +335 -90
  654. package/src/scripts/smoke-packed-install.ts +1829 -6
@@ -1 +1 @@
1
- {"version":3,"file":"visual-verdict.d.ts","sourceRoot":"","sources":["../../../src/scripts/notify-hook/visual-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqDH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrF;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE1H"}
1
+ {"version":3,"file":"visual-verdict.d.ts","sourceRoot":"","sources":["../../../src/scripts/notify-hook/visual-verdict.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAqDH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CASrF;AAED;;;;;;;;;GASG;AACH,wBAAsB,yBAAyB,CAAC,EAC9C,GAAG,EACH,OAAO,EACP,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,EACN,sBAA6B,GAC9B,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAyErB"}
@@ -79,24 +79,26 @@ export function parseVisualVerdict(text) {
79
79
  *
80
80
  * Module import failure is handled by the caller in notify-hook.ts.
81
81
  */
82
- export async function maybePersistVisualVerdict({ cwd, payload, stateDir, logsDir, sessionId, turnId }) {
82
+ export async function maybePersistVisualVerdict({ cwd, payload, stateDir, logsDir, sessionId, turnId, persistRuntimeFeedback = true, }) {
83
83
  const output = safeString(payload?.['last-assistant-message'] || payload?.last_assistant_message || '');
84
84
  if (!output)
85
85
  return;
86
86
  // Runtime visual feedback (JSON/fenced JSON) for ralph-progress persistence.
87
87
  // Non-fatal and observable via warn-level structured logging.
88
- try {
89
- await maybePersistRuntimeVisualFeedback({ cwd, output, sessionId, stateDir });
90
- }
91
- catch (err) {
92
- await logNotifyHookEvent(logsDir, {
93
- timestamp: new Date().toISOString(),
94
- level: 'warn',
95
- type: 'visual_runtime_feedback_persist_failure',
96
- error: err?.message || String(err),
97
- session_id: sessionId,
98
- turn_id: turnId,
99
- });
88
+ if (persistRuntimeFeedback) {
89
+ try {
90
+ await maybePersistRuntimeVisualFeedback({ cwd, output, sessionId, stateDir });
91
+ }
92
+ catch (err) {
93
+ await logNotifyHookEvent(logsDir, {
94
+ timestamp: new Date().toISOString(),
95
+ level: 'warn',
96
+ type: 'visual_runtime_feedback_persist_failure',
97
+ error: err?.message || String(err),
98
+ session_id: sessionId,
99
+ turn_id: turnId,
100
+ });
101
+ }
100
102
  }
101
103
  const parsed = parseVisualVerdict(output);
102
104
  if (!parsed) {
@@ -1 +1 @@
1
- {"version":3,"file":"visual-verdict.js","sourceRoot":"","sources":["../../../src/scripts/notify-hook/visual-verdict.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visual-verdict.js","sourceRoot":"","sources":["../../../src/scripts/notify-hook/visual-verdict.ts"],"names":[],"mappings":"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"}
@@ -16,5 +16,28 @@
16
16
  * team-leader-nudge.js – leader mailbox nudge
17
17
  * team-worker.js – worker heartbeat and idle notification
18
18
  */
19
- export {};
19
+ import { type KeywordInputClassification, type RecordSkillActivationInput, type SkillActiveState } from '../hooks/keyword-detector.js';
20
+ export interface NotifySkillActivationInput {
21
+ readonly stateDir: string;
22
+ readonly sourceCwd: string;
23
+ readonly text: string;
24
+ readonly sessionId?: string;
25
+ readonly threadId?: string;
26
+ readonly turnId?: string;
27
+ readonly payload: Record<string, unknown>;
28
+ readonly nowIso?: string;
29
+ }
30
+ export interface NotifySkillActivationDependencies {
31
+ readonly classifyKeywordInput?: (text: string) => KeywordInputClassification;
32
+ readonly recordSkillActivation?: (input: RecordSkillActivationInput) => Promise<SkillActiveState | null>;
33
+ }
34
+ /**
35
+ * Records prompt skill activation using one shared input classification for the
36
+ * terminal-replay check and the state writer.
37
+ */
38
+ export declare function recordNotifySkillActivation(input: NotifySkillActivationInput, dependencies?: NotifySkillActivationDependencies): Promise<SkillActiveState | null>;
39
+ /**
40
+ * Non-fatal notify-hook boundary for shared classification and state writes.
41
+ */
42
+ export declare function recordNotifySkillActivationNonFatal(input: NotifySkillActivationInput, logsDir: string, dependencies?: NotifySkillActivationDependencies): Promise<SkillActiveState | null>;
20
43
  //# sourceMappingURL=notify-hook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notify-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/notify-hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG"}
1
+ {"version":3,"file":"notify-hook.d.ts","sourceRoot":"","sources":["../../src/scripts/notify-hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;GAgBG;AA4EH,OAAO,EAGL,KAAK,0BAA0B,EAC/B,KAAK,0BAA0B,EAC/B,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAiQtC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,0BAA0B,CAAC;IAC7E,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;CAC1G;AAoCD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,0BAA0B,EACjC,YAAY,GAAE,iCAAsC,GACnD,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAyBlC;AAED;;GAEG;AACH,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE,MAAM,EACf,YAAY,GAAE,iCAAsC,GACnD,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAOlC"}
@@ -19,16 +19,19 @@
19
19
  import { writeFile, appendFile, mkdir, readFile } from 'fs/promises';
20
20
  import { existsSync } from 'fs';
21
21
  import { dirname, join, resolve } from 'path';
22
- import { isSessionStateUsable } from '../hooks/session.js';
22
+ import { fileURLToPath } from 'url';
23
+ import { appendPromptSessionProvenanceRejection, isSessionStateUsable, readSessionPointer, normalizeSessionId, resolveSessionPointerContext, } from '../hooks/session.js';
24
+ import { evaluateResolvedPromptTurn, extractSelectedTargetOwnerEvidence, preflightSelectedTargetOwner, } from '../hooks/prompt-session-provenance.js';
25
+ import { readTeamModeConfig } from '../config/team-mode.js';
23
26
  import { safeString, asNumber } from './notify-hook/utils.js';
24
27
  import { getSessionTokenUsage, getQuotaUsage, normalizeInputMessages, } from './notify-hook/payload-parser.js';
25
28
  import { getBaseStateDir } from '../mcp/state-paths.js';
26
- import { getScopedStatePath, readCurrentSessionId, readScopedJsonIfExists, getScopedStateDirsForCurrentSession, normalizeNotifyState, pruneRecentTurns, readdir, } from './notify-hook/state-io.js';
29
+ import { getScopedStatePath, getScopedStatePathAtScope, readScopedJsonAtScope, hasExistingScopedSessionDir, readCurrentSessionId, readScopedJsonIfExists, getScopedStateDirsForCurrentSession, normalizeNotifyState, pruneRecentTurns, readdir, } from './notify-hook/state-io.js';
27
30
  import { isLeaderStale, resolveLeaderStalenessThresholdMs, maybeNudgeTeamLeader } from './notify-hook/team-leader-nudge.js';
28
31
  import { drainPendingTeamDispatch } from './notify-hook/team-dispatch.js';
29
32
  import { handleTmuxInjection } from './notify-hook/tmux-injection.js';
30
33
  import { maybeAutoNudge, resolveNudgePaneTarget, isDeepInterviewStateActive, isDeepInterviewInputLockActive, syncSkillStateFromTurn, } from './notify-hook/auto-nudge.js';
31
- import { isManagedOmxSession } from './notify-hook/managed-tmux.js';
34
+ import { isManagedOmxSessionAtPromptContext } from './notify-hook/managed-tmux.js';
32
35
  import { logNotifyHookEvent } from './notify-hook/log.js';
33
36
  import { reconcileRalphSessionResume } from './notify-hook/ralph-session-resume.js';
34
37
  import { sendPaneInput } from './notify-hook/team-tmux-guard.js';
@@ -37,6 +40,7 @@ import { parseTeamWorkerEnv, resolveTeamStateDirForWorker, updateWorkerHeartbeat
37
40
  import { DEFAULT_MARKER } from './tmux-hook-engine.js';
38
41
  import { sameFilePath } from '../utils/paths.js';
39
42
  import { MAX_NOTIFY_ARGV_JSON_BYTES, extractRawJsonStringField, utf8ByteLength, } from './hook-payload-guard.js';
43
+ import { classifyKeywordInput, recordSkillActivation, } from '../hooks/keyword-detector.js';
40
44
  const RALPH_ACTIVE_PROGRESS_PHASES = new Set([
41
45
  'start',
42
46
  'started',
@@ -51,6 +55,8 @@ const RALPH_ACTIVE_PROGRESS_PHASES = new Set([
51
55
  'fixing',
52
56
  ]);
53
57
  const IDLE_NOTIFICATION_SUMMARY_MAX_LENGTH = 240;
58
+ const NOTIFY_SKILL_ACTIVATION_ERROR_MAX_LENGTH = 512;
59
+ const NOTIFY_SKILL_ACTIVATION_CONTEXT_MAX_LENGTH = 200;
54
60
  async function readJsonFileIfObject(path) {
55
61
  try {
56
62
  const raw = await readFile(path, 'utf-8');
@@ -227,13 +233,6 @@ function classifyIdleNotificationPhase(message) {
227
233
  }
228
234
  return 'idle';
229
235
  }
230
- function isExplicitAutopilotActivationText(text) {
231
- return /(?:^|[^\w])\$autopilot\b/i.test(text)
232
- || /^\s*\/autopilot\b/i.test(text)
233
- || /^\s*(?:please\s+)?autopilot(?:\s+(?:this|mode|workflow|skill|loop|now))?\s*[.!]?\s*$/i.test(text)
234
- || /\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)
235
- || /\bautopilot\s+(?:mode|workflow|skill|loop)\b/i.test(text);
236
- }
237
236
  function looksLikeAutopilotTerminalHandoff(text) {
238
237
  return /\bAutopilot complete\b/i.test(text)
239
238
  || /\btask_complete\b/i.test(text)
@@ -281,6 +280,72 @@ async function shouldSuppressAutopilotTerminalReplayActivation(stateDir, payload
281
280
  return false;
282
281
  return hasTerminalAutopilotStateForNotifyTurn(stateDir, sessionId, payload);
283
282
  }
283
+ function boundedNotifySkillActivationContext(value) {
284
+ try {
285
+ const context = safeString(value).trim().slice(0, NOTIFY_SKILL_ACTIVATION_CONTEXT_MAX_LENGTH);
286
+ return context || null;
287
+ }
288
+ catch {
289
+ return null;
290
+ }
291
+ }
292
+ function boundedNotifySkillActivationError(error) {
293
+ try {
294
+ const message = error instanceof Error ? error.message : String(error);
295
+ return message.slice(0, NOTIFY_SKILL_ACTIVATION_ERROR_MAX_LENGTH);
296
+ }
297
+ catch {
298
+ return 'unknown_error';
299
+ }
300
+ }
301
+ async function logNotifySkillActivationFailure(logsDir, input, error) {
302
+ await logNotifyHookEvent(logsDir, {
303
+ timestamp: new Date().toISOString(),
304
+ level: 'warn',
305
+ type: 'notify_skill_activation_failure',
306
+ error: boundedNotifySkillActivationError(error),
307
+ session_id: boundedNotifySkillActivationContext(input.sessionId),
308
+ thread_id: boundedNotifySkillActivationContext(input.threadId),
309
+ turn_id: boundedNotifySkillActivationContext(input.turnId),
310
+ }).catch(() => { });
311
+ }
312
+ /**
313
+ * Records prompt skill activation using one shared input classification for the
314
+ * terminal-replay check and the state writer.
315
+ */
316
+ export async function recordNotifySkillActivation(input, dependencies = {}) {
317
+ const classification = (dependencies.classifyKeywordInput ?? classifyKeywordInput)(input.text);
318
+ const teamEnabled = readTeamModeConfig(input.sourceCwd).enabled;
319
+ const runtimeMatches = teamEnabled
320
+ ? classification.matches
321
+ : classification.matches.filter((match) => match.skill !== 'team');
322
+ const terminalAutopilotReplay = await shouldSuppressAutopilotTerminalReplayActivation(input.stateDir, input.payload, runtimeMatches.some((match) => match.skill === 'autopilot'), input.sessionId || '');
323
+ if (terminalAutopilotReplay && runtimeMatches[0]?.skill === 'autopilot')
324
+ return null;
325
+ return (dependencies.recordSkillActivation ?? recordSkillActivation)({
326
+ stateDir: input.stateDir,
327
+ sourceCwd: input.sourceCwd,
328
+ text: input.text,
329
+ sessionId: input.sessionId,
330
+ threadId: input.threadId,
331
+ turnId: input.turnId,
332
+ nowIso: input.nowIso,
333
+ classification,
334
+ allowSecondaryAutopilot: !terminalAutopilotReplay,
335
+ });
336
+ }
337
+ /**
338
+ * Non-fatal notify-hook boundary for shared classification and state writes.
339
+ */
340
+ export async function recordNotifySkillActivationNonFatal(input, logsDir, dependencies = {}) {
341
+ try {
342
+ return await recordNotifySkillActivation(input, dependencies);
343
+ }
344
+ catch (error) {
345
+ await logNotifySkillActivationFailure(logsDir, input, error);
346
+ return null;
347
+ }
348
+ }
284
349
  function buildIdleNotificationFingerprint(payload) {
285
350
  const lastAssistantMessage = safeString(payload['last-assistant-message'] || payload.last_assistant_message || '');
286
351
  const summary = summarizeIdleNotificationMessage(lastAssistantMessage);
@@ -300,6 +365,70 @@ function isNotifyFallbackTaskCompletePayload(payload) {
300
365
  return false;
301
366
  return normalizeInputMessages(payload).some((message) => (message.includes('[notify-fallback] synthesized from rollout task_complete')));
302
367
  }
368
+ async function preflightLeaderNotifyTarget(stateDir, context) {
369
+ if (context.status !== 'authorized')
370
+ return context;
371
+ const scope = {
372
+ targetSessionId: context.authorization.targetSessionId,
373
+ ownerCodexSessionId: context.authorization.ownerCodexSessionId,
374
+ allowedStorageSessionIds: context.authorization.allowedStorageSessionIds,
375
+ };
376
+ const probePath = await getScopedStatePathAtScope(stateDir, 'prompt-provenance-probe.json', scope);
377
+ const targetDir = dirname(probePath);
378
+ const evidence = [];
379
+ let filenames;
380
+ try {
381
+ filenames = await readdir(targetDir);
382
+ }
383
+ catch (error) {
384
+ if (error.code === 'ENOENT')
385
+ return context;
386
+ return preflightSelectedTargetOwner(context, [{ ownerCodexSessionId: {} }], 'notify', new Date().toISOString());
387
+ }
388
+ for (const filename of filenames) {
389
+ if (!filename.endsWith('-state.json') && filename !== 'skill-active-state.json')
390
+ continue;
391
+ try {
392
+ const value = JSON.parse(await readFile(join(targetDir, filename), 'utf8'));
393
+ evidence.push(...extractSelectedTargetOwnerEvidence(value));
394
+ }
395
+ catch {
396
+ evidence.push({ ownerCodexSessionId: {} });
397
+ }
398
+ }
399
+ return preflightSelectedTargetOwner(context, evidence, 'notify', new Date().toISOString());
400
+ }
401
+ async function resolveLeaderNotifyWriteDecision(cwd, stateDir, payloadSessionId) {
402
+ const pointerContext = resolveSessionPointerContext(cwd);
403
+ const selectedPointer = await readSessionPointer(pointerContext);
404
+ const ownerEnvSessionId = process.env.OMX_SESSION_ID;
405
+ const normalizedOwnerEnvSessionId = normalizeSessionId(ownerEnvSessionId);
406
+ const forkScopeExists = normalizedOwnerEnvSessionId
407
+ ? await hasExistingScopedSessionDir(stateDir, normalizedOwnerEnvSessionId)
408
+ : false;
409
+ const context = evaluateResolvedPromptTurn({
410
+ producer: 'notify',
411
+ payloadSessionId,
412
+ ownerEnvSessionId,
413
+ selectedPointer,
414
+ forkScopeExists,
415
+ nowIso: new Date().toISOString(),
416
+ });
417
+ const preflightedContext = await preflightLeaderNotifyTarget(stateDir, context);
418
+ if (preflightedContext.status !== 'authorized')
419
+ return { context: preflightedContext, pointerContext };
420
+ if (context.status !== 'authorized')
421
+ return { context, pointerContext };
422
+ return {
423
+ context: preflightedContext,
424
+ pointerContext,
425
+ scope: {
426
+ targetSessionId: preflightedContext.authorization.targetSessionId,
427
+ ownerCodexSessionId: preflightedContext.authorization.ownerCodexSessionId,
428
+ allowedStorageSessionIds: preflightedContext.authorization.allowedStorageSessionIds,
429
+ },
430
+ };
431
+ }
303
432
  async function main() {
304
433
  const rawPayload = process.argv[process.argv.length - 1];
305
434
  if (!rawPayload || rawPayload.startsWith('-')) {
@@ -319,7 +448,8 @@ async function main() {
319
448
  if (!(await isOmxManagedCwd(cwd))) {
320
449
  process.exit(0);
321
450
  }
322
- const payloadSessionId = safeString(payload.session_id || payload['session-id'] || '');
451
+ const rawPayloadSessionId = payload.session_id ?? payload['session-id'];
452
+ const payloadSessionId = safeString(rawPayloadSessionId);
323
453
  const payloadThreadId = safeString(payload['thread-id'] || payload.thread_id || '');
324
454
  const inputMessages = normalizeInputMessages(payload);
325
455
  const latestUserInput = safeString(inputMessages.length > 0 ? inputMessages[inputMessages.length - 1] : '');
@@ -336,43 +466,65 @@ async function main() {
336
466
  const stateDir = resolvedWorkerStateDir || getBaseStateDir(cwd);
337
467
  const logsDir = join(cwd, '.omx', 'logs');
338
468
  const omxDir = join(cwd, '.omx');
339
- let currentOmxSessionId = '';
469
+ const leaderWriteDecision = isTeamWorker
470
+ ? null
471
+ : await resolveLeaderNotifyWriteDecision(cwd, stateDir, rawPayloadSessionId);
472
+ if (!isTeamWorker && leaderWriteDecision?.context.status === 'rejected') {
473
+ await appendPromptSessionProvenanceRejection(leaderWriteDecision.pointerContext, leaderWriteDecision.context.diagnostic).catch(() => { });
474
+ return;
475
+ }
476
+ if (!isTeamWorker && leaderWriteDecision?.context.status === 'suppressed-target-child')
477
+ return;
478
+ const leaderAuthorization = leaderWriteDecision?.context.status === 'authorized'
479
+ ? leaderWriteDecision.context.authorization
480
+ : null;
481
+ const canWriteLeaderScopedState = Boolean(leaderWriteDecision?.scope && leaderAuthorization);
482
+ let currentOmxSessionId = isTeamWorker
483
+ ? ''
484
+ : leaderWriteDecision?.scope?.targetSessionId || '';
340
485
  const getEffectiveSessionId = () => currentOmxSessionId || payloadSessionId;
341
486
  // Ensure directories exist
342
487
  await mkdir(logsDir, { recursive: true }).catch(() => { });
343
- if (workerStateRootResolved) {
488
+ if (isTeamWorker && workerStateRootResolved) {
344
489
  await mkdir(stateDir, { recursive: true }).catch(() => { });
345
490
  currentOmxSessionId = await readCurrentSessionId(stateDir).catch(() => '') || '';
346
491
  }
347
492
  // Turn-level dedupe prevents double-processing when native notify and fallback
348
493
  // watcher both emit the same completed turn.
349
- try {
350
- if (!workerStateRootResolved)
351
- throw new Error('worker_state_root_unresolved');
352
- const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
353
- if (turnId) {
354
- const now = Date.now();
355
- const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
356
- const eventType = safeString(payload.type || 'agent-turn-complete');
357
- const key = `${threadId || 'no-thread'}|${turnId}|${eventType}`;
358
- const dedupeSessionId = getEffectiveSessionId();
359
- const dedupeStatePath = await getScopedStatePath(stateDir, 'notify-hook-state.json', dedupeSessionId);
360
- const dedupeState = normalizeNotifyState(await readScopedJsonIfExists(stateDir, 'notify-hook-state.json', dedupeSessionId, null));
361
- dedupeState.recent_turns = pruneRecentTurns(dedupeState.recent_turns, now);
362
- if (dedupeState.recent_turns[key]) {
363
- process.exit(0);
494
+ if (isTeamWorker || canWriteLeaderScopedState) {
495
+ try {
496
+ if (!workerStateRootResolved)
497
+ throw new Error('worker_state_root_unresolved');
498
+ const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
499
+ if (turnId) {
500
+ const now = Date.now();
501
+ const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
502
+ const eventType = safeString(payload.type || 'agent-turn-complete');
503
+ const key = `${threadId || 'no-thread'}|${turnId}|${eventType}`;
504
+ const dedupeSessionId = getEffectiveSessionId();
505
+ const scope = leaderWriteDecision?.scope;
506
+ const dedupeStatePath = scope
507
+ ? await getScopedStatePathAtScope(stateDir, 'notify-hook-state.json', scope)
508
+ : await getScopedStatePath(stateDir, 'notify-hook-state.json', dedupeSessionId);
509
+ const dedupeState = normalizeNotifyState(scope
510
+ ? await readScopedJsonAtScope(stateDir, 'notify-hook-state.json', scope, null)
511
+ : await readScopedJsonIfExists(stateDir, 'notify-hook-state.json', dedupeSessionId, null));
512
+ dedupeState.recent_turns = pruneRecentTurns(dedupeState.recent_turns, now);
513
+ if (dedupeState.recent_turns[key]) {
514
+ process.exit(0);
515
+ }
516
+ dedupeState.recent_turns[key] = now;
517
+ dedupeState.last_event_at = new Date().toISOString();
518
+ await mkdir(dirname(dedupeStatePath), { recursive: true }).catch(() => { });
519
+ await writeFile(dedupeStatePath, JSON.stringify(dedupeState, null, 2)).catch(() => { });
364
520
  }
365
- dedupeState.recent_turns[key] = now;
366
- dedupeState.last_event_at = new Date().toISOString();
367
- await mkdir(dirname(dedupeStatePath), { recursive: true }).catch(() => { });
368
- await writeFile(dedupeStatePath, JSON.stringify(dedupeState, null, 2)).catch(() => { });
369
521
  }
370
- }
371
- catch {
372
- // Non-critical
522
+ catch {
523
+ // Non-critical
524
+ }
373
525
  }
374
526
  // 0.5. Track leader + native subagent thread activity (lead session only)
375
- if (!isTeamWorker) {
527
+ if (!isTeamWorker && canWriteLeaderScopedState) {
376
528
  try {
377
529
  const threadId = safeString(payload['thread-id'] || payload.thread_id || '');
378
530
  const turnId = safeString(payload['turn-id'] || payload.turn_id || '');
@@ -444,14 +596,22 @@ async function main() {
444
596
  }
445
597
  // Reconcile Ralph ownership for same-Codex-session continuation before
446
598
  // lifecycle counters or injection read the active scope.
447
- if (!isTeamWorker) {
599
+ if (!isTeamWorker && canWriteLeaderScopedState) {
448
600
  try {
449
601
  const resumeResult = await reconcileRalphSessionResume({
450
602
  stateDir,
451
- payloadSessionId,
603
+ authorization: leaderAuthorization,
604
+ env: {
605
+ ...process.env,
606
+ OMX_SESSION_ID: leaderAuthorization.targetSessionId,
607
+ CODEX_SESSION_ID: '',
608
+ SESSION_ID: '',
609
+ },
452
610
  payloadThreadId,
453
611
  });
454
- currentOmxSessionId = resumeResult.currentOmxSessionId;
612
+ if (resumeResult.currentOmxSessionId && resumeResult.currentOmxSessionId === leaderAuthorization.targetSessionId) {
613
+ currentOmxSessionId = resumeResult.currentOmxSessionId;
614
+ }
455
615
  if (resumeResult.resumed || resumeResult.updatedCurrentOwner) {
456
616
  await logNotifyHookEvent(logsDir, {
457
617
  timestamp: new Date().toISOString(),
@@ -478,9 +638,9 @@ async function main() {
478
638
  }
479
639
  // 2. Update active mode state (increment iteration)
480
640
  // GUARD: Skip when running inside a team worker to prevent state corruption
481
- if (!isTeamWorker) {
641
+ if (!isTeamWorker && canWriteLeaderScopedState) {
482
642
  try {
483
- const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir);
643
+ const scopedDirs = await getScopedStateDirsForCurrentSession(stateDir, getEffectiveSessionId());
484
644
  for (const scopedDir of scopedDirs) {
485
645
  const stateFiles = await readdir(scopedDir).catch(() => []);
486
646
  for (const f of stateFiles) {
@@ -608,11 +768,13 @@ async function main() {
608
768
  }
609
769
  }
610
770
  // 4. Write HUD state summary for `omx hud` (lead session only)
611
- if (!isTeamWorker) {
771
+ if (!isTeamWorker && canWriteLeaderScopedState) {
612
772
  try {
613
- const scopedSessionId = getEffectiveSessionId();
614
- const hudStatePath = await getScopedStatePath(stateDir, 'hud-state.json', scopedSessionId);
615
- let hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', scopedSessionId, {
773
+ const scope = leaderWriteDecision?.scope;
774
+ if (!scope)
775
+ return;
776
+ const hudStatePath = await getScopedStatePathAtScope(stateDir, 'hud-state.json', scope);
777
+ let hudState = await readScopedJsonAtScope(stateDir, 'hud-state.json', scope, {
616
778
  last_turn_at: '',
617
779
  turn_count: 0,
618
780
  });
@@ -641,35 +803,36 @@ async function main() {
641
803
  // Non-critical: heartbeat write failure should never block the hook
642
804
  }
643
805
  }
806
+ let skillSyncResult = null;
644
807
  // 4.45. Skill activation tracking: update skill-active-state.json before any nudge logic.
645
- try {
646
- const { detectKeywords, recordSkillActivation } = await import('../hooks/keyword-detector.js');
808
+ if (isTeamWorker || canWriteLeaderScopedState) {
647
809
  if (latestUserInput) {
648
- const activationSessionId = getEffectiveSessionId();
649
- const isAutopilotActivation = detectKeywords(latestUserInput)
650
- .some((match) => match.skill === 'autopilot')
651
- || isExplicitAutopilotActivationText(latestUserInput);
652
- const suppressTerminalReplay = await shouldSuppressAutopilotTerminalReplayActivation(stateDir, payload, isAutopilotActivation, activationSessionId);
653
- if (!suppressTerminalReplay) {
654
- await recordSkillActivation({
655
- stateDir,
656
- sourceCwd: cwd,
657
- text: latestUserInput,
658
- sessionId: activationSessionId,
659
- threadId: payloadThreadId,
660
- turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
661
- });
662
- }
810
+ await recordNotifySkillActivationNonFatal({
811
+ stateDir,
812
+ sourceCwd: cwd,
813
+ text: latestUserInput,
814
+ sessionId: getEffectiveSessionId(),
815
+ threadId: payloadThreadId,
816
+ turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
817
+ payload,
818
+ }, logsDir, {
819
+ recordSkillActivation: async (input) => recordSkillActivation({
820
+ ...input,
821
+ ...(!isTeamWorker && leaderWriteDecision ? {
822
+ resolvedPromptTurnContext: leaderWriteDecision.context,
823
+ onProvenanceRejected: async (diagnostic) => {
824
+ await appendPromptSessionProvenanceRejection(leaderWriteDecision.pointerContext, diagnostic).catch(() => { });
825
+ },
826
+ } : {}),
827
+ }),
828
+ });
829
+ }
830
+ try {
831
+ skillSyncResult = await syncSkillStateFromTurn(stateDir, payload, !isTeamWorker && leaderAuthorization ? leaderAuthorization.targetSessionId : '', !isTeamWorker ? leaderAuthorization : null);
832
+ }
833
+ catch {
834
+ // Non-fatal: lifecycle sync should not block the hook
663
835
  }
664
- }
665
- catch {
666
- // Non-fatal: keyword detector module may not be built yet
667
- }
668
- try {
669
- await syncSkillStateFromTurn(stateDir, payload);
670
- }
671
- catch {
672
- // Non-fatal: lifecycle sync should not block the hook
673
836
  }
674
837
  const effectiveSessionId = getEffectiveSessionId();
675
838
  const deepInterviewStateActive = effectiveSessionId
@@ -696,16 +859,16 @@ async function main() {
696
859
  }
697
860
  // 5. Optional tmux prompt injection workaround (non-fatal, opt-in)
698
861
  // Skip for team workers - only the lead should inject prompts
699
- if (!isTeamWorker) {
862
+ if (!isTeamWorker && canWriteLeaderScopedState) {
700
863
  try {
701
- await handleTmuxInjection({ payload, cwd, stateDir, logsDir });
864
+ await handleTmuxInjection({ payload, cwd, stateDir, logsDir, context: leaderWriteDecision.context });
702
865
  }
703
866
  catch {
704
867
  // Non-critical
705
868
  }
706
869
  }
707
870
  // 5.5. Opportunistic team dispatch drain (leader session only).
708
- if (!isTeamWorker) {
871
+ if (!isTeamWorker && canWriteLeaderScopedState) {
709
872
  try {
710
873
  await drainPendingTeamDispatch({ cwd, stateDir, logsDir, maxPerTick: 5 });
711
874
  }
@@ -714,7 +877,7 @@ async function main() {
714
877
  }
715
878
  }
716
879
  // 6. Team leader nudge (lead session only): remind the leader to check teammate/mailbox state.
717
- if (!isTeamWorker && !deepInterviewStateActive) {
880
+ if (!isTeamWorker && canWriteLeaderScopedState && !deepInterviewStateActive) {
718
881
  try {
719
882
  await maybeNudgeTeamLeader({ cwd, stateDir, logsDir, preComputedLeaderStale });
720
883
  }
@@ -783,17 +946,20 @@ async function main() {
783
946
  const { shouldSendIdleNotification, recordIdleNotificationSent, shouldSendSessionIdleHookEvent, recordSessionIdleHookEventSent, } = await import('../notifications/idle-cooldown.js');
784
947
  const idleFingerprint = buildIdleNotificationFingerprint(payload);
785
948
  const notifySessionId = getEffectiveSessionId();
786
- const shouldNotifyLifecycle = notifySessionId
787
- && shouldSendIdleNotification(stateDir, notifySessionId, idleFingerprint);
788
- const shouldDispatchSessionIdleHookEvent = notifySessionId
949
+ const shouldNotifyLifecycle = notifySessionId && (!canWriteLeaderScopedState
950
+ || shouldSendIdleNotification(stateDir, notifySessionId, idleFingerprint));
951
+ const shouldDispatchSessionIdleHookEvent = canWriteLeaderScopedState
952
+ && notifySessionId
789
953
  && shouldSendSessionIdleHookEvent(stateDir, notifySessionId, idleFingerprint);
790
954
  if (shouldNotifyLifecycle || shouldDispatchSessionIdleHookEvent) {
791
955
  if (shouldNotifyLifecycle) {
792
956
  const idleResult = await notifyLifecycle('session-idle', {
793
957
  sessionId: notifySessionId,
794
958
  projectPath: cwd,
959
+ }, undefined, {
960
+ persistScopedReceipts: canWriteLeaderScopedState,
795
961
  });
796
- if (idleResult && idleResult.anySuccess) {
962
+ if (canWriteLeaderScopedState && idleResult && idleResult.anySuccess) {
797
963
  recordIdleNotificationSent(stateDir, notifySessionId, idleFingerprint);
798
964
  }
799
965
  }
@@ -835,9 +1001,16 @@ async function main() {
835
1001
  }
836
1002
  // 9. Auto-nudge: detect Codex stall patterns and automatically send a continuation prompt.
837
1003
  // Works for both leader and worker contexts.
838
- if (!deepInterviewStateActive || deepInterviewInputLockActive) {
1004
+ if ((isTeamWorker || canWriteLeaderScopedState) && (!deepInterviewStateActive || deepInterviewInputLockActive)) {
839
1005
  try {
840
- await maybeAutoNudge({ cwd, stateDir, logsDir, payload });
1006
+ await maybeAutoNudge({
1007
+ cwd,
1008
+ stateDir,
1009
+ logsDir,
1010
+ payload,
1011
+ context: isTeamWorker ? null : leaderWriteDecision.context,
1012
+ syncResult: skillSyncResult,
1013
+ });
841
1014
  }
842
1015
  catch {
843
1016
  // Non-critical
@@ -854,6 +1027,7 @@ async function main() {
854
1027
  logsDir,
855
1028
  sessionId: getEffectiveSessionId(),
856
1029
  turnId: safeString(payload['turn-id'] || payload.turn_id || ''),
1030
+ persistRuntimeFeedback: canWriteLeaderScopedState,
857
1031
  });
858
1032
  }
859
1033
  catch (err) {
@@ -872,12 +1046,12 @@ async function main() {
872
1046
  }
873
1047
  // 10. Code simplifier: delegate recently modified files for simplification.
874
1048
  // Opt-in via ~/.omx/config.json: { "codeSimplifier": { "enabled": true } }
875
- if (!isTeamWorker) {
1049
+ if (!isTeamWorker && canWriteLeaderScopedState) {
876
1050
  try {
877
1051
  const { processCodeSimplifier } = await import('../hooks/code-simplifier/index.js');
878
1052
  const csResult = processCodeSimplifier(cwd, stateDir);
879
1053
  if (csResult.triggered) {
880
- const managedSession = await isManagedOmxSession(cwd, payload, { allowTeamWorker: false });
1054
+ const managedSession = await isManagedOmxSessionAtPromptContext(cwd, leaderWriteDecision.context, { allowTeamWorker: false });
881
1055
  if (!managedSession) {
882
1056
  const { logTmuxHookEvent } = await import('./notify-hook/log.js');
883
1057
  await logTmuxHookEvent(logsDir, {
@@ -887,7 +1061,7 @@ async function main() {
887
1061
  });
888
1062
  }
889
1063
  else {
890
- const csPaneId = await resolveNudgePaneTarget(stateDir, cwd, payload);
1064
+ const csPaneId = await resolveNudgePaneTarget(stateDir, cwd, payload, leaderWriteDecision.context);
891
1065
  if (csPaneId) {
892
1066
  const csText = `${csResult.message} ${DEFAULT_MARKER}`;
893
1067
  const sendResult = await sendPaneInput({
@@ -941,10 +1115,12 @@ async function logFatalNotifyHookError(err) {
941
1115
  error: err instanceof Error ? err.message : String(err),
942
1116
  }) + '\n').catch(() => { });
943
1117
  }
944
- main().catch((err) => {
945
- // Notify hooks are auxiliary background work. Avoid printing stack traces into
946
- // Codex TUI/PowerShell foreground panes; record diagnostics in .omx/logs.
947
- process.exitCode = 0;
948
- void logFatalNotifyHookError(err);
949
- });
1118
+ if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
1119
+ main().catch((err) => {
1120
+ // Notify hooks are auxiliary background work. Avoid printing stack traces into
1121
+ // Codex TUI/PowerShell foreground panes; record diagnostics in .omx/logs.
1122
+ process.exitCode = 0;
1123
+ void logFatalNotifyHookError(err);
1124
+ });
1125
+ }
950
1126
  //# sourceMappingURL=notify-hook.js.map