oh-my-codex 0.12.4 → 0.12.6

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 (475) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/README.md +27 -3
  4. package/dist/cli/__tests__/ask.test.js +26 -0
  5. package/dist/cli/__tests__/ask.test.js.map +1 -1
  6. package/dist/cli/__tests__/doctor-warning-copy.test.js +28 -0
  7. package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
  8. package/dist/cli/__tests__/explore.test.js +95 -8
  9. package/dist/cli/__tests__/explore.test.js.map +1 -1
  10. package/dist/cli/__tests__/index.test.js +102 -4
  11. package/dist/cli/__tests__/index.test.js.map +1 -1
  12. package/dist/cli/__tests__/launch-fallback.test.js +169 -0
  13. package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
  14. package/dist/cli/__tests__/mcp-parity.test.js +31 -0
  15. package/dist/cli/__tests__/mcp-parity.test.js.map +1 -1
  16. package/dist/cli/__tests__/setup-agents-overwrite.test.js +66 -2
  17. package/dist/cli/__tests__/setup-agents-overwrite.test.js.map +1 -1
  18. package/dist/cli/__tests__/setup-refresh.test.js +51 -1
  19. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  20. package/dist/cli/__tests__/team.test.js +148 -3
  21. package/dist/cli/__tests__/team.test.js.map +1 -1
  22. package/dist/cli/__tests__/uninstall.test.js +14 -1
  23. package/dist/cli/__tests__/uninstall.test.js.map +1 -1
  24. package/dist/cli/cleanup.js +1 -1
  25. package/dist/cli/cleanup.js.map +1 -1
  26. package/dist/cli/constants.d.ts +1 -0
  27. package/dist/cli/constants.d.ts.map +1 -1
  28. package/dist/cli/constants.js +1 -0
  29. package/dist/cli/constants.js.map +1 -1
  30. package/dist/cli/doctor.d.ts.map +1 -1
  31. package/dist/cli/doctor.js +15 -0
  32. package/dist/cli/doctor.js.map +1 -1
  33. package/dist/cli/explore.d.ts +1 -0
  34. package/dist/cli/explore.d.ts.map +1 -1
  35. package/dist/cli/explore.js +49 -1
  36. package/dist/cli/explore.js.map +1 -1
  37. package/dist/cli/index.d.ts +2 -1
  38. package/dist/cli/index.d.ts.map +1 -1
  39. package/dist/cli/index.js +127 -14
  40. package/dist/cli/index.js.map +1 -1
  41. package/dist/cli/mcp-parity.d.ts +1 -1
  42. package/dist/cli/mcp-parity.d.ts.map +1 -1
  43. package/dist/cli/mcp-parity.js +24 -0
  44. package/dist/cli/mcp-parity.js.map +1 -1
  45. package/dist/cli/setup.d.ts.map +1 -1
  46. package/dist/cli/setup.js +17 -5
  47. package/dist/cli/setup.js.map +1 -1
  48. package/dist/cli/team.d.ts.map +1 -1
  49. package/dist/cli/team.js +80 -6
  50. package/dist/cli/team.js.map +1 -1
  51. package/dist/cli/uninstall.d.ts.map +1 -1
  52. package/dist/cli/uninstall.js +1 -0
  53. package/dist/cli/uninstall.js.map +1 -1
  54. package/dist/config/__tests__/generator-idempotent.test.js +60 -0
  55. package/dist/config/__tests__/generator-idempotent.test.js.map +1 -1
  56. package/dist/config/__tests__/mcp-registry.test.js +61 -0
  57. package/dist/config/__tests__/mcp-registry.test.js.map +1 -1
  58. package/dist/config/__tests__/wiki-config-contract.test.d.ts +2 -0
  59. package/dist/config/__tests__/wiki-config-contract.test.d.ts.map +1 -0
  60. package/dist/config/__tests__/wiki-config-contract.test.js +19 -0
  61. package/dist/config/__tests__/wiki-config-contract.test.js.map +1 -0
  62. package/dist/config/generator.d.ts +1 -0
  63. package/dist/config/generator.d.ts.map +1 -1
  64. package/dist/config/generator.js +88 -3
  65. package/dist/config/generator.js.map +1 -1
  66. package/dist/config/mcp-registry.d.ts +2 -0
  67. package/dist/config/mcp-registry.d.ts.map +1 -1
  68. package/dist/config/mcp-registry.js +12 -0
  69. package/dist/config/mcp-registry.js.map +1 -1
  70. package/dist/hooks/__tests__/agents-overlay.test.js +39 -0
  71. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  72. package/dist/hooks/__tests__/keyword-detector.test.js +297 -4
  73. package/dist/hooks/__tests__/keyword-detector.test.js.map +1 -1
  74. package/dist/hooks/__tests__/notify-fallback-watcher.test.js +392 -22
  75. package/dist/hooks/__tests__/notify-fallback-watcher.test.js.map +1 -1
  76. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js +166 -67
  77. package/dist/hooks/__tests__/notify-hook-auto-nudge.test.js.map +1 -1
  78. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js +112 -2
  79. package/dist/hooks/__tests__/notify-hook-managed-tmux.test.js.map +1 -1
  80. package/dist/hooks/__tests__/notify-hook-modules.test.js +52 -12
  81. package/dist/hooks/__tests__/notify-hook-modules.test.js.map +1 -1
  82. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts +2 -3
  83. package/dist/hooks/__tests__/notify-hook-regression-205.test.d.ts.map +1 -1
  84. package/dist/hooks/__tests__/notify-hook-regression-205.test.js +18 -23
  85. package/dist/hooks/__tests__/notify-hook-regression-205.test.js.map +1 -1
  86. package/dist/hooks/__tests__/notify-hook-session-scope.test.js +33 -0
  87. package/dist/hooks/__tests__/notify-hook-session-scope.test.js.map +1 -1
  88. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js +176 -1
  89. package/dist/hooks/__tests__/notify-hook-team-dispatch.test.js.map +1 -1
  90. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js +355 -7
  91. package/dist/hooks/__tests__/notify-hook-team-leader-nudge.test.js.map +1 -1
  92. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js +90 -2
  93. package/dist/hooks/__tests__/notify-hook-tmux-heal.test.js.map +1 -1
  94. package/dist/hooks/__tests__/session.test.js +142 -2
  95. package/dist/hooks/__tests__/session.test.js.map +1 -1
  96. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts +2 -0
  97. package/dist/hooks/__tests__/wiki-docs-contract.test.d.ts.map +1 -0
  98. package/dist/hooks/__tests__/wiki-docs-contract.test.js +34 -0
  99. package/dist/hooks/__tests__/wiki-docs-contract.test.js.map +1 -0
  100. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  101. package/dist/hooks/agents-overlay.js +0 -1
  102. package/dist/hooks/agents-overlay.js.map +1 -1
  103. package/dist/hooks/extensibility/__tests__/dispatcher.test.js +32 -0
  104. package/dist/hooks/extensibility/__tests__/dispatcher.test.js.map +1 -1
  105. package/dist/hooks/extensibility/__tests__/runtime.test.js +31 -0
  106. package/dist/hooks/extensibility/__tests__/runtime.test.js.map +1 -1
  107. package/dist/hooks/extensibility/__tests__/sdk.test.js +33 -3
  108. package/dist/hooks/extensibility/__tests__/sdk.test.js.map +1 -1
  109. package/dist/hooks/extensibility/dispatcher.d.ts.map +1 -1
  110. package/dist/hooks/extensibility/dispatcher.js +41 -0
  111. package/dist/hooks/extensibility/dispatcher.js.map +1 -1
  112. package/dist/hooks/extensibility/sdk/runtime-state.d.ts.map +1 -1
  113. package/dist/hooks/extensibility/sdk/runtime-state.js +7 -1
  114. package/dist/hooks/extensibility/sdk/runtime-state.js.map +1 -1
  115. package/dist/hooks/extensibility/types.d.ts +1 -0
  116. package/dist/hooks/extensibility/types.d.ts.map +1 -1
  117. package/dist/hooks/keyword-detector.d.ts +6 -1
  118. package/dist/hooks/keyword-detector.d.ts.map +1 -1
  119. package/dist/hooks/keyword-detector.js +207 -10
  120. package/dist/hooks/keyword-detector.js.map +1 -1
  121. package/dist/hooks/keyword-registry.d.ts.map +1 -1
  122. package/dist/hooks/keyword-registry.js +3 -0
  123. package/dist/hooks/keyword-registry.js.map +1 -1
  124. package/dist/hooks/session.d.ts +14 -2
  125. package/dist/hooks/session.d.ts.map +1 -1
  126. package/dist/hooks/session.js +120 -16
  127. package/dist/hooks/session.js.map +1 -1
  128. package/dist/hud/__tests__/state.test.js +111 -2
  129. package/dist/hud/__tests__/state.test.js.map +1 -1
  130. package/dist/hud/state.d.ts.map +1 -1
  131. package/dist/hud/state.js +18 -21
  132. package/dist/hud/state.js.map +1 -1
  133. package/dist/mcp/__tests__/bootstrap.test.js +88 -1
  134. package/dist/mcp/__tests__/bootstrap.test.js.map +1 -1
  135. package/dist/mcp/__tests__/server-lifecycle.test.js +3 -0
  136. package/dist/mcp/__tests__/server-lifecycle.test.js.map +1 -1
  137. package/dist/mcp/__tests__/state-paths.test.js +30 -2
  138. package/dist/mcp/__tests__/state-paths.test.js.map +1 -1
  139. package/dist/mcp/__tests__/state-server.test.js +415 -0
  140. package/dist/mcp/__tests__/state-server.test.js.map +1 -1
  141. package/dist/mcp/__tests__/wiki-server.test.d.ts +2 -0
  142. package/dist/mcp/__tests__/wiki-server.test.d.ts.map +1 -0
  143. package/dist/mcp/__tests__/wiki-server.test.js +30 -0
  144. package/dist/mcp/__tests__/wiki-server.test.js.map +1 -0
  145. package/dist/mcp/bootstrap.d.ts +19 -1
  146. package/dist/mcp/bootstrap.d.ts.map +1 -1
  147. package/dist/mcp/bootstrap.js +185 -0
  148. package/dist/mcp/bootstrap.js.map +1 -1
  149. package/dist/mcp/state-paths.d.ts +5 -0
  150. package/dist/mcp/state-paths.d.ts.map +1 -1
  151. package/dist/mcp/state-paths.js +41 -11
  152. package/dist/mcp/state-paths.js.map +1 -1
  153. package/dist/mcp/state-server.d.ts +4 -4
  154. package/dist/mcp/state-server.d.ts.map +1 -1
  155. package/dist/mcp/state-server.js +49 -2
  156. package/dist/mcp/state-server.js.map +1 -1
  157. package/dist/mcp/wiki-server.d.ts +181 -0
  158. package/dist/mcp/wiki-server.d.ts.map +1 -0
  159. package/dist/mcp/wiki-server.js +235 -0
  160. package/dist/mcp/wiki-server.js.map +1 -0
  161. package/dist/modes/__tests__/base-autoresearch-contract.test.js +74 -2
  162. package/dist/modes/__tests__/base-autoresearch-contract.test.js.map +1 -1
  163. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts +2 -0
  164. package/dist/modes/__tests__/base-multi-state-compat.test.d.ts.map +1 -0
  165. package/dist/modes/__tests__/base-multi-state-compat.test.js +38 -0
  166. package/dist/modes/__tests__/base-multi-state-compat.test.js.map +1 -0
  167. package/dist/modes/__tests__/base-tmux-pane.test.js +1 -1
  168. package/dist/modes/__tests__/base-tmux-pane.test.js.map +1 -1
  169. package/dist/modes/base.d.ts +2 -1
  170. package/dist/modes/base.d.ts.map +1 -1
  171. package/dist/modes/base.js +55 -31
  172. package/dist/modes/base.js.map +1 -1
  173. package/dist/notifications/__tests__/formatter.test.js +11 -0
  174. package/dist/notifications/__tests__/formatter.test.js.map +1 -1
  175. package/dist/notifications/__tests__/idle-cooldown.test.js +32 -1
  176. package/dist/notifications/__tests__/idle-cooldown.test.js.map +1 -1
  177. package/dist/notifications/__tests__/index.test.d.ts +2 -0
  178. package/dist/notifications/__tests__/index.test.d.ts.map +1 -0
  179. package/dist/notifications/__tests__/index.test.js +113 -0
  180. package/dist/notifications/__tests__/index.test.js.map +1 -0
  181. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts +2 -0
  182. package/dist/notifications/__tests__/lifecycle-dedupe.test.d.ts.map +1 -0
  183. package/dist/notifications/__tests__/lifecycle-dedupe.test.js +86 -0
  184. package/dist/notifications/__tests__/lifecycle-dedupe.test.js.map +1 -0
  185. package/dist/notifications/__tests__/reply-listener.test.js +174 -0
  186. package/dist/notifications/__tests__/reply-listener.test.js.map +1 -1
  187. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts +2 -0
  188. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.d.ts.map +1 -0
  189. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js +93 -0
  190. package/dist/notifications/__tests__/session-idle-tail-dedupe.test.js.map +1 -0
  191. package/dist/notifications/__tests__/session-registry.test.js +48 -1
  192. package/dist/notifications/__tests__/session-registry.test.js.map +1 -1
  193. package/dist/notifications/__tests__/session-status.test.d.ts +2 -0
  194. package/dist/notifications/__tests__/session-status.test.d.ts.map +1 -0
  195. package/dist/notifications/__tests__/session-status.test.js +159 -0
  196. package/dist/notifications/__tests__/session-status.test.js.map +1 -0
  197. package/dist/notifications/__tests__/tmux.test.js +58 -1
  198. package/dist/notifications/__tests__/tmux.test.js.map +1 -1
  199. package/dist/notifications/idle-cooldown.d.ts +11 -0
  200. package/dist/notifications/idle-cooldown.d.ts.map +1 -1
  201. package/dist/notifications/idle-cooldown.js +42 -8
  202. package/dist/notifications/idle-cooldown.js.map +1 -1
  203. package/dist/notifications/index.d.ts +1 -1
  204. package/dist/notifications/index.d.ts.map +1 -1
  205. package/dist/notifications/index.js +41 -8
  206. package/dist/notifications/index.js.map +1 -1
  207. package/dist/notifications/lifecycle-dedupe.d.ts +8 -0
  208. package/dist/notifications/lifecycle-dedupe.d.ts.map +1 -0
  209. package/dist/notifications/lifecycle-dedupe.js +112 -0
  210. package/dist/notifications/lifecycle-dedupe.js.map +1 -0
  211. package/dist/notifications/reply-listener.d.ts +10 -1
  212. package/dist/notifications/reply-listener.d.ts.map +1 -1
  213. package/dist/notifications/reply-listener.js +49 -11
  214. package/dist/notifications/reply-listener.js.map +1 -1
  215. package/dist/notifications/session-registry.d.ts.map +1 -1
  216. package/dist/notifications/session-registry.js +7 -1
  217. package/dist/notifications/session-registry.js.map +1 -1
  218. package/dist/notifications/session-status.d.ts +23 -0
  219. package/dist/notifications/session-status.d.ts.map +1 -0
  220. package/dist/notifications/session-status.js +187 -0
  221. package/dist/notifications/session-status.js.map +1 -0
  222. package/dist/notifications/tmux.d.ts +10 -0
  223. package/dist/notifications/tmux.d.ts.map +1 -1
  224. package/dist/notifications/tmux.js +59 -5
  225. package/dist/notifications/tmux.js.map +1 -1
  226. package/dist/notifications/types.d.ts +2 -0
  227. package/dist/notifications/types.d.ts.map +1 -1
  228. package/dist/openclaw/__tests__/index.test.js +84 -0
  229. package/dist/openclaw/__tests__/index.test.js.map +1 -1
  230. package/dist/openclaw/index.d.ts.map +1 -1
  231. package/dist/openclaw/index.js +7 -14
  232. package/dist/openclaw/index.js.map +1 -1
  233. package/dist/openclaw/types.d.ts +2 -2
  234. package/dist/openclaw/types.d.ts.map +1 -1
  235. package/dist/scripts/__tests__/codex-native-hook.test.js +692 -40
  236. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  237. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts +2 -0
  238. package/dist/scripts/__tests__/hook-derived-watcher.test.d.ts.map +1 -0
  239. package/dist/scripts/__tests__/hook-derived-watcher.test.js +87 -0
  240. package/dist/scripts/__tests__/hook-derived-watcher.test.js.map +1 -0
  241. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  242. package/dist/scripts/codex-native-hook.js +309 -77
  243. package/dist/scripts/codex-native-hook.js.map +1 -1
  244. package/dist/scripts/hook-derived-watcher.js +43 -1
  245. package/dist/scripts/hook-derived-watcher.js.map +1 -1
  246. package/dist/scripts/notify-fallback-watcher.js +95 -21
  247. package/dist/scripts/notify-fallback-watcher.js.map +1 -1
  248. package/dist/scripts/notify-hook/active-team.d.ts +9 -0
  249. package/dist/scripts/notify-hook/active-team.d.ts.map +1 -0
  250. package/dist/scripts/notify-hook/active-team.js +44 -0
  251. package/dist/scripts/notify-hook/active-team.js.map +1 -0
  252. package/dist/scripts/notify-hook/auto-nudge.d.ts +5 -3
  253. package/dist/scripts/notify-hook/auto-nudge.d.ts.map +1 -1
  254. package/dist/scripts/notify-hook/auto-nudge.js +121 -78
  255. package/dist/scripts/notify-hook/auto-nudge.js.map +1 -1
  256. package/dist/scripts/notify-hook/managed-tmux.d.ts.map +1 -1
  257. package/dist/scripts/notify-hook/managed-tmux.js +18 -4
  258. package/dist/scripts/notify-hook/managed-tmux.js.map +1 -1
  259. package/dist/scripts/notify-hook/operational-events.d.ts.map +1 -1
  260. package/dist/scripts/notify-hook/operational-events.js +21 -0
  261. package/dist/scripts/notify-hook/operational-events.js.map +1 -1
  262. package/dist/scripts/notify-hook/ralph-session-resume.d.ts.map +1 -1
  263. package/dist/scripts/notify-hook/ralph-session-resume.js +3 -2
  264. package/dist/scripts/notify-hook/ralph-session-resume.js.map +1 -1
  265. package/dist/scripts/notify-hook/state-io.d.ts +10 -1
  266. package/dist/scripts/notify-hook/state-io.d.ts.map +1 -1
  267. package/dist/scripts/notify-hook/state-io.js +56 -12
  268. package/dist/scripts/notify-hook/state-io.js.map +1 -1
  269. package/dist/scripts/notify-hook/team-dispatch.d.ts.map +1 -1
  270. package/dist/scripts/notify-hook/team-dispatch.js +305 -167
  271. package/dist/scripts/notify-hook/team-dispatch.js.map +1 -1
  272. package/dist/scripts/notify-hook/team-leader-nudge.d.ts.map +1 -1
  273. package/dist/scripts/notify-hook/team-leader-nudge.js +87 -15
  274. package/dist/scripts/notify-hook/team-leader-nudge.js.map +1 -1
  275. package/dist/scripts/notify-hook/tmux-injection.d.ts.map +1 -1
  276. package/dist/scripts/notify-hook/tmux-injection.js +11 -2
  277. package/dist/scripts/notify-hook/tmux-injection.js.map +1 -1
  278. package/dist/scripts/notify-hook.js +26 -16
  279. package/dist/scripts/notify-hook.js.map +1 -1
  280. package/dist/scripts/run-provider-advisor.js +20 -2
  281. package/dist/scripts/run-provider-advisor.js.map +1 -1
  282. package/dist/scripts/smoke-packed-install.d.ts +1 -8
  283. package/dist/scripts/smoke-packed-install.d.ts.map +1 -1
  284. package/dist/scripts/smoke-packed-install.js +12 -68
  285. package/dist/scripts/smoke-packed-install.js.map +1 -1
  286. package/dist/state/__tests__/operations.test.js +113 -0
  287. package/dist/state/__tests__/operations.test.js.map +1 -1
  288. package/dist/state/__tests__/skill-active.test.js +35 -0
  289. package/dist/state/__tests__/skill-active.test.js.map +1 -1
  290. package/dist/state/__tests__/workflow-transition.test.d.ts +2 -0
  291. package/dist/state/__tests__/workflow-transition.test.d.ts.map +1 -0
  292. package/dist/state/__tests__/workflow-transition.test.js +56 -0
  293. package/dist/state/__tests__/workflow-transition.test.js.map +1 -0
  294. package/dist/state/operations.d.ts +1 -1
  295. package/dist/state/operations.d.ts.map +1 -1
  296. package/dist/state/operations.js +88 -2
  297. package/dist/state/operations.js.map +1 -1
  298. package/dist/state/skill-active.d.ts +2 -2
  299. package/dist/state/skill-active.d.ts.map +1 -1
  300. package/dist/state/skill-active.js +119 -33
  301. package/dist/state/skill-active.js.map +1 -1
  302. package/dist/state/workflow-transition-reconcile.d.ts +15 -0
  303. package/dist/state/workflow-transition-reconcile.d.ts.map +1 -0
  304. package/dist/state/workflow-transition-reconcile.js +100 -0
  305. package/dist/state/workflow-transition-reconcile.js.map +1 -0
  306. package/dist/state/workflow-transition.d.ts +22 -0
  307. package/dist/state/workflow-transition.d.ts.map +1 -0
  308. package/dist/state/workflow-transition.js +188 -0
  309. package/dist/state/workflow-transition.js.map +1 -0
  310. package/dist/team/__tests__/api-interop.test.js +90 -0
  311. package/dist/team/__tests__/api-interop.test.js.map +1 -1
  312. package/dist/team/__tests__/current-task-baseline.test.d.ts +2 -0
  313. package/dist/team/__tests__/current-task-baseline.test.d.ts.map +1 -0
  314. package/dist/team/__tests__/current-task-baseline.test.js +87 -0
  315. package/dist/team/__tests__/current-task-baseline.test.js.map +1 -0
  316. package/dist/team/__tests__/hardening-e2e.test.js +17 -0
  317. package/dist/team/__tests__/hardening-e2e.test.js.map +1 -1
  318. package/dist/team/__tests__/runtime.test.js +673 -65
  319. package/dist/team/__tests__/runtime.test.js.map +1 -1
  320. package/dist/team/__tests__/shutdown-fallback.test.js +11 -1
  321. package/dist/team/__tests__/shutdown-fallback.test.js.map +1 -1
  322. package/dist/team/__tests__/tmux-session.test.js +447 -4
  323. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  324. package/dist/team/api-interop.d.ts.map +1 -1
  325. package/dist/team/api-interop.js +10 -1
  326. package/dist/team/api-interop.js.map +1 -1
  327. package/dist/team/current-task-baseline.d.ts +32 -0
  328. package/dist/team/current-task-baseline.d.ts.map +1 -0
  329. package/dist/team/current-task-baseline.js +85 -0
  330. package/dist/team/current-task-baseline.js.map +1 -0
  331. package/dist/team/delivery-log.d.ts +1 -1
  332. package/dist/team/delivery-log.d.ts.map +1 -1
  333. package/dist/team/delivery-log.js.map +1 -1
  334. package/dist/team/leader-activity.d.ts +1 -0
  335. package/dist/team/leader-activity.d.ts.map +1 -1
  336. package/dist/team/leader-activity.js +4 -2
  337. package/dist/team/leader-activity.js.map +1 -1
  338. package/dist/team/progress-evidence.d.ts +2 -0
  339. package/dist/team/progress-evidence.d.ts.map +1 -0
  340. package/dist/team/progress-evidence.js +77 -0
  341. package/dist/team/progress-evidence.js.map +1 -0
  342. package/dist/team/runtime.d.ts.map +1 -1
  343. package/dist/team/runtime.js +269 -64
  344. package/dist/team/runtime.js.map +1 -1
  345. package/dist/team/scaling.d.ts.map +1 -1
  346. package/dist/team/scaling.js +1 -1
  347. package/dist/team/scaling.js.map +1 -1
  348. package/dist/team/state.d.ts.map +1 -1
  349. package/dist/team/state.js +2 -13
  350. package/dist/team/state.js.map +1 -1
  351. package/dist/team/tmux-session.d.ts +12 -3
  352. package/dist/team/tmux-session.d.ts.map +1 -1
  353. package/dist/team/tmux-session.js +174 -20
  354. package/dist/team/tmux-session.js.map +1 -1
  355. package/dist/team/worktree.d.ts +6 -1
  356. package/dist/team/worktree.d.ts.map +1 -1
  357. package/dist/team/worktree.js +28 -4
  358. package/dist/team/worktree.js.map +1 -1
  359. package/dist/utils/__tests__/agents-md.test.js +21 -1
  360. package/dist/utils/__tests__/agents-md.test.js.map +1 -1
  361. package/dist/utils/__tests__/repo-deps.test.d.ts +2 -0
  362. package/dist/utils/__tests__/repo-deps.test.d.ts.map +1 -0
  363. package/dist/utils/__tests__/repo-deps.test.js +71 -0
  364. package/dist/utils/__tests__/repo-deps.test.js.map +1 -0
  365. package/dist/utils/agents-md.d.ts +1 -0
  366. package/dist/utils/agents-md.d.ts.map +1 -1
  367. package/dist/utils/agents-md.js +7 -3
  368. package/dist/utils/agents-md.js.map +1 -1
  369. package/dist/utils/paths.d.ts +4 -0
  370. package/dist/utils/paths.d.ts.map +1 -1
  371. package/dist/utils/paths.js +20 -0
  372. package/dist/utils/paths.js.map +1 -1
  373. package/dist/utils/repo-deps.d.ts +20 -0
  374. package/dist/utils/repo-deps.d.ts.map +1 -0
  375. package/dist/utils/repo-deps.js +78 -0
  376. package/dist/utils/repo-deps.js.map +1 -0
  377. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts +2 -0
  378. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.d.ts.map +1 -0
  379. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js +54 -0
  380. package/dist/verification/__tests__/dev-merge-issue-close-workflow.test.js.map +1 -0
  381. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts +12 -0
  382. package/dist/wiki/__tests__/cjk-tokenize.test.d.ts.map +1 -0
  383. package/dist/wiki/__tests__/cjk-tokenize.test.js +139 -0
  384. package/dist/wiki/__tests__/cjk-tokenize.test.js.map +1 -0
  385. package/dist/wiki/__tests__/crlf-parse.test.d.ts +2 -0
  386. package/dist/wiki/__tests__/crlf-parse.test.d.ts.map +1 -0
  387. package/dist/wiki/__tests__/crlf-parse.test.js +24 -0
  388. package/dist/wiki/__tests__/crlf-parse.test.js.map +1 -0
  389. package/dist/wiki/__tests__/escape-newline.test.d.ts +2 -0
  390. package/dist/wiki/__tests__/escape-newline.test.d.ts.map +1 -0
  391. package/dist/wiki/__tests__/escape-newline.test.js +45 -0
  392. package/dist/wiki/__tests__/escape-newline.test.js.map +1 -0
  393. package/dist/wiki/__tests__/ingest.test.d.ts +5 -0
  394. package/dist/wiki/__tests__/ingest.test.d.ts.map +1 -0
  395. package/dist/wiki/__tests__/ingest.test.js +181 -0
  396. package/dist/wiki/__tests__/ingest.test.js.map +1 -0
  397. package/dist/wiki/__tests__/lint.test.d.ts +5 -0
  398. package/dist/wiki/__tests__/lint.test.d.ts.map +1 -0
  399. package/dist/wiki/__tests__/lint.test.js +163 -0
  400. package/dist/wiki/__tests__/lint.test.js.map +1 -0
  401. package/dist/wiki/__tests__/query.test.d.ts +5 -0
  402. package/dist/wiki/__tests__/query.test.d.ts.map +1 -0
  403. package/dist/wiki/__tests__/query.test.js +141 -0
  404. package/dist/wiki/__tests__/query.test.js.map +1 -0
  405. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts +2 -0
  406. package/dist/wiki/__tests__/reserved-file-guard.test.d.ts.map +1 -0
  407. package/dist/wiki/__tests__/reserved-file-guard.test.js +44 -0
  408. package/dist/wiki/__tests__/reserved-file-guard.test.js.map +1 -0
  409. package/dist/wiki/__tests__/session-hooks.test.d.ts +5 -0
  410. package/dist/wiki/__tests__/session-hooks.test.d.ts.map +1 -0
  411. package/dist/wiki/__tests__/session-hooks.test.js +36 -0
  412. package/dist/wiki/__tests__/session-hooks.test.js.map +1 -0
  413. package/dist/wiki/__tests__/slug-nonascii.test.d.ts +2 -0
  414. package/dist/wiki/__tests__/slug-nonascii.test.d.ts.map +1 -0
  415. package/dist/wiki/__tests__/slug-nonascii.test.js +24 -0
  416. package/dist/wiki/__tests__/slug-nonascii.test.js.map +1 -0
  417. package/dist/wiki/__tests__/storage.test.d.ts +5 -0
  418. package/dist/wiki/__tests__/storage.test.d.ts.map +1 -0
  419. package/dist/wiki/__tests__/storage.test.js +278 -0
  420. package/dist/wiki/__tests__/storage.test.js.map +1 -0
  421. package/dist/wiki/__tests__/test-helpers.d.ts +31 -0
  422. package/dist/wiki/__tests__/test-helpers.d.ts.map +1 -0
  423. package/dist/wiki/__tests__/test-helpers.js +108 -0
  424. package/dist/wiki/__tests__/test-helpers.js.map +1 -0
  425. package/dist/wiki/index.d.ts +14 -0
  426. package/dist/wiki/index.d.ts.map +1 -0
  427. package/dist/wiki/index.js +17 -0
  428. package/dist/wiki/index.js.map +1 -0
  429. package/dist/wiki/ingest.d.ts +20 -0
  430. package/dist/wiki/ingest.d.ts.map +1 -0
  431. package/dist/wiki/ingest.js +115 -0
  432. package/dist/wiki/ingest.js.map +1 -0
  433. package/dist/wiki/lifecycle.d.ts +20 -0
  434. package/dist/wiki/lifecycle.d.ts.map +1 -0
  435. package/dist/wiki/lifecycle.js +212 -0
  436. package/dist/wiki/lifecycle.js.map +1 -0
  437. package/dist/wiki/lint.d.ts +25 -0
  438. package/dist/wiki/lint.d.ts.map +1 -0
  439. package/dist/wiki/lint.js +166 -0
  440. package/dist/wiki/lint.js.map +1 -0
  441. package/dist/wiki/query.d.ts +36 -0
  442. package/dist/wiki/query.d.ts.map +1 -0
  443. package/dist/wiki/query.js +138 -0
  444. package/dist/wiki/query.js.map +1 -0
  445. package/dist/wiki/storage.d.ts +33 -0
  446. package/dist/wiki/storage.d.ts.map +1 -0
  447. package/dist/wiki/storage.js +321 -0
  448. package/dist/wiki/storage.js.map +1 -0
  449. package/dist/wiki/types.d.ts +83 -0
  450. package/dist/wiki/types.d.ts.map +1 -0
  451. package/dist/wiki/types.js +15 -0
  452. package/dist/wiki/types.js.map +1 -0
  453. package/package.json +3 -1
  454. package/skills/configure-notifications/SKILL.md +1 -0
  455. package/skills/doctor/SKILL.md +11 -0
  456. package/skills/omx-setup/SKILL.md +1 -1
  457. package/skills/wiki/SKILL.md +57 -0
  458. package/src/scripts/__tests__/codex-native-hook.test.ts +920 -56
  459. package/src/scripts/__tests__/hook-derived-watcher.test.ts +111 -0
  460. package/src/scripts/codex-native-hook.ts +377 -83
  461. package/src/scripts/hook-derived-watcher.ts +43 -1
  462. package/src/scripts/notify-fallback-watcher.ts +99 -20
  463. package/src/scripts/notify-hook/active-team.ts +54 -0
  464. package/src/scripts/notify-hook/auto-nudge.ts +132 -79
  465. package/src/scripts/notify-hook/managed-tmux.ts +22 -4
  466. package/src/scripts/notify-hook/operational-events.ts +21 -0
  467. package/src/scripts/notify-hook/ralph-session-resume.ts +3 -2
  468. package/src/scripts/notify-hook/state-io.ts +89 -12
  469. package/src/scripts/notify-hook/team-dispatch.ts +326 -168
  470. package/src/scripts/notify-hook/team-leader-nudge.ts +91 -14
  471. package/src/scripts/notify-hook/tmux-injection.ts +11 -2
  472. package/src/scripts/notify-hook.ts +36 -22
  473. package/src/scripts/run-provider-advisor.ts +20 -2
  474. package/src/scripts/smoke-packed-install.ts +16 -83
  475. package/templates/AGENTS.md +3 -4
@@ -62,6 +62,48 @@ function safeString(value: unknown): string {
62
62
  return typeof value === 'string' ? value : '';
63
63
  }
64
64
 
65
+ function collectMessageTextFragments(value: unknown, fragments: string[]): void {
66
+ if (typeof value === 'string') {
67
+ if (value.trim() !== '') fragments.push(value);
68
+ return;
69
+ }
70
+
71
+ if (Array.isArray(value)) {
72
+ for (const item of value) collectMessageTextFragments(item, fragments);
73
+ return;
74
+ }
75
+
76
+ if (!value || typeof value !== 'object') return;
77
+
78
+ const record = value as Record<string, unknown>;
79
+ let usedPreferredField = false;
80
+ for (const key of ['text', 'message', 'content']) {
81
+ if (!(key in record)) continue;
82
+ usedPreferredField = true;
83
+ collectMessageTextFragments(record[key], fragments);
84
+ }
85
+ if (usedPreferredField) return;
86
+
87
+ for (const child of Object.values(record)) {
88
+ collectMessageTextFragments(child, fragments);
89
+ }
90
+ }
91
+
92
+ function extractMessageText(payload: Record<string, unknown>): string {
93
+ for (const candidate of [payload.text, payload.message, payload.content]) {
94
+ if (typeof candidate === 'string') {
95
+ if (candidate.trim() !== '') return candidate;
96
+ continue;
97
+ }
98
+
99
+ const fragments: string[] = [];
100
+ collectMessageTextFragments(candidate, fragments);
101
+ const text = fragments.join('\n').trim();
102
+ if (text) return text;
103
+ }
104
+ return '';
105
+ }
106
+
65
107
  function derivedLog(entry: Record<string, unknown>): Promise<void> {
66
108
  return appendFile(logPath, `${JSON.stringify({ timestamp: new Date().toISOString(), ...entry })}\n`).catch(() => {});
67
109
  }
@@ -185,7 +227,7 @@ function inferDerivedEvent(parsed: Record<string, unknown> | null, meta: FileMet
185
227
  }
186
228
 
187
229
  if (payloadType === 'assistant_message') {
188
- const message = safeString(payload.text || payload.message || payload.content);
230
+ const message = extractMessageText(payload);
189
231
  const looksLikeQuestion = /\?|\b(can you|could you|please provide|need input|what should)/i.test(message);
190
232
  if (looksLikeQuestion) {
191
233
  return {
@@ -15,6 +15,9 @@ import {
15
15
  normalizeAutoNudgeSignatureText,
16
16
  resolveAutoNudgeSignature,
17
17
  } from './notify-hook/auto-nudge.js';
18
+ import {
19
+ readScopedJsonIfExists,
20
+ } from './notify-hook/state-io.js';
18
21
  import { checkPaneReadyForTeamSendKeys } from './notify-hook/team-tmux-guard.js';
19
22
  import {
20
23
  checkWorkerPanesAlive,
@@ -24,11 +27,13 @@ import {
24
27
  } from './notify-hook/team-leader-nudge.js';
25
28
  import { DEFAULT_MARKER } from './tmux-hook-engine.js';
26
29
  import { isTerminalPhase } from './notify-hook/utils.js';
27
- import { isSessionStale, readSessionState } from '../hooks/session.js';
30
+ import { isSessionStale, isSessionStateAuthoritativeForCwd, readSessionState } from '../hooks/session.js';
28
31
  import {
29
32
  DEFAULT_SUBAGENT_ACTIVE_WINDOW_MS,
30
33
  readSubagentSessionSummary,
31
34
  } from '../subagents/tracker.js';
35
+ import { listNotifyCanonicalActiveTeams } from './notify-hook/active-team.js';
36
+ import { sameFilePath } from '../utils/paths.js';
32
37
 
33
38
  function argValue(name: string, fallback = ''): string {
34
39
  const idx = process.argv.indexOf(name);
@@ -124,6 +129,7 @@ const RALPH_CONTINUE_TEXT = 'Ralph loop active continue';
124
129
  const RALPH_CONTINUE_CADENCE_MS = 60_000;
125
130
  const RALPH_STEER_LOCK_STALE_MS = 30_000;
126
131
  const RALPH_TERMINAL_PHASES = new Set(['complete', 'failed', 'cancelled']);
132
+ const RALPH_STARTING_PHASE_TIMEOUT_MS = RALPH_CONTINUE_CADENCE_MS * 2;
127
133
  const QUIET_ONCE_EVENT_TYPES = new Set(['watcher_start', 'watcher_once_complete']);
128
134
 
129
135
  interface WatcherFileMeta {
@@ -453,10 +459,19 @@ function hasRalphTerminalState(raw: Record<string, unknown> | null | undefined):
453
459
  if (raw.active !== true) return true;
454
460
  const phase = safeString(raw.current_phase).trim().toLowerCase();
455
461
  if (phase && RALPH_TERMINAL_PHASES.has(phase)) return true;
462
+ if (isStaleRalphStartingPhase(raw)) return true;
456
463
  if (safeString(raw.completed_at).trim()) return true;
457
464
  return false;
458
465
  }
459
466
 
467
+ function isStaleRalphStartingPhase(raw: Record<string, unknown>): boolean {
468
+ const phase = safeString(raw.current_phase).trim().toLowerCase();
469
+ if (phase !== 'starting') return false;
470
+ const reference = parseIsoMillis(safeString(raw.last_turn_at)) ?? parseIsoMillis(safeString(raw.started_at));
471
+ if (reference === null) return false;
472
+ return Date.now() - reference > RALPH_STARTING_PHASE_TIMEOUT_MS;
473
+ }
474
+
460
475
  async function loadPersistedWatcherState(): Promise<void> {
461
476
  const persisted = await readFile(statePath, 'utf-8')
462
477
  .then((content) => JSON.parse(content) as Record<string, unknown>)
@@ -507,8 +522,10 @@ async function resolveActiveModeState(mode: string): Promise<ActiveModeResult> {
507
522
  let currentSessionIsLive = false;
508
523
  const session = await readSessionState(cwd);
509
524
  if (session?.session_id) {
510
- currentSessionId = safeString(session.session_id).trim();
511
- currentSessionIsLive = !isSessionStale(session);
525
+ if (isSessionStateAuthoritativeForCwd(session, cwd)) {
526
+ currentSessionId = safeString(session.session_id).trim();
527
+ currentSessionIsLive = !isSessionStale(session);
528
+ }
512
529
  if (currentSessionId && currentSessionIsLive) {
513
530
  candidateDirs.push(join(stateDir, 'sessions', currentSessionId));
514
531
  }
@@ -531,6 +548,14 @@ async function resolveActiveModeState(mode: string): Promise<ActiveModeResult> {
531
548
  .then((content) => JSON.parse(content) as Record<string, unknown>)
532
549
  .catch(() => null);
533
550
  if (!parsed || typeof parsed !== 'object') continue;
551
+ if (mode === 'ralph' && dir !== stateDir && isStaleRalphStartingPhase(parsed)) {
552
+ return {
553
+ active: false,
554
+ reason: 'starting_stale',
555
+ path,
556
+ state: parsed,
557
+ };
558
+ }
534
559
  if (hasRalphTerminalState(parsed)) {
535
560
  return {
536
561
  active: false,
@@ -561,19 +586,23 @@ async function resolveActiveRalphState(): Promise<ActiveModeResult> {
561
586
 
562
587
  async function resolveActiveTeamState(): Promise<ActiveTeamResult> {
563
588
  const candidateDirs: string[] = [];
564
- const sessionPath = join(stateDir, 'session.json');
565
- try {
566
- const session = JSON.parse(await readFile(sessionPath, 'utf-8')) as Record<string, unknown>;
567
- const sessionId = safeString(session?.session_id).trim();
568
- if (sessionId) {
569
- candidateDirs.push(join(stateDir, 'sessions', sessionId));
589
+ let currentSessionId = '';
590
+ let currentSessionIsLive = false;
591
+ const session = await readSessionState(cwd);
592
+ if (session?.session_id) {
593
+ currentSessionId = safeString(session.session_id).trim();
594
+ currentSessionIsLive = !isSessionStale(session);
595
+ if (currentSessionId && currentSessionIsLive) {
596
+ candidateDirs.push(join(stateDir, 'sessions', currentSessionId));
570
597
  }
571
- } catch {
572
- // No active session file; fall back to root state only.
573
598
  }
574
599
  if (!candidateDirs.includes(stateDir)) candidateDirs.push(stateDir);
575
600
 
576
601
  for (const dir of candidateDirs) {
602
+ if (dir === stateDir && currentSessionId) {
603
+ continue;
604
+ }
605
+
577
606
  const path = join(dir, 'team-state.json');
578
607
  if (!existsSync(path)) continue;
579
608
  const parsed = await readFile(path, 'utf-8')
@@ -622,6 +651,52 @@ async function resolveActiveTeamState(): Promise<ActiveTeamResult> {
622
651
  };
623
652
  }
624
653
 
654
+ const canonicalFallbackTeams = await listNotifyCanonicalActiveTeams(cwd, currentSessionId).catch(() => []);
655
+ for (const team of canonicalFallbackTeams) {
656
+ const teamConfigDir = join(stateDir, 'team', team.teamName);
657
+ const manifestPath = join(teamConfigDir, 'manifest.v2.json');
658
+ const configPath = join(teamConfigDir, 'config.json');
659
+ const teamConfigPath = existsSync(manifestPath) ? manifestPath : configPath;
660
+ const teamConfig = existsSync(teamConfigPath)
661
+ ? await readFile(teamConfigPath, 'utf-8')
662
+ .then((content) => JSON.parse(content) as Record<string, unknown>)
663
+ .catch(() => null)
664
+ : null;
665
+ const tmuxSession = safeString(teamConfig?.tmux_session).trim();
666
+ if (!tmuxSession) continue;
667
+
668
+ const workers = Array.isArray(teamConfig?.workers) ? teamConfig.workers as Array<Record<string, unknown>> : [];
669
+ const workerPaneIds: string[] = workers
670
+ .map((worker) => safeString(worker?.pane_id).trim())
671
+ .filter(Boolean);
672
+ const paneStatus = await checkWorkerPanesAlive(tmuxSession, workerPaneIds as any);
673
+ if (!paneStatus.alive) continue;
674
+
675
+ return {
676
+ active: true,
677
+ reason: team.source,
678
+ path: team.path,
679
+ state: {
680
+ active: true,
681
+ team_name: team.teamName,
682
+ current_phase: team.phase,
683
+ },
684
+ team_name: team.teamName,
685
+ pane_count: paneStatus.paneCount,
686
+ };
687
+ }
688
+
689
+ if (currentSessionId) {
690
+ return {
691
+ active: false,
692
+ reason: currentSessionIsLive ? 'blocked_by_current_session' : 'stale_current_session',
693
+ path: '',
694
+ state: null,
695
+ team_name: '',
696
+ pane_count: 0,
697
+ };
698
+ }
699
+
625
700
  return {
626
701
  active: false,
627
702
  reason: 'cleared',
@@ -750,7 +825,7 @@ async function readRalphProgressGate(
750
825
  }
751
826
  }
752
827
 
753
- const hudState = await readJsonObject(join(stateDir, 'hud-state.json'));
828
+ const hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', undefined, null);
754
829
  if (!hudState || typeof hudState !== 'object') {
755
830
  return { allow: false, reason: 'progress_missing', progress_at: '', subagent_session_id: subagentSessionId };
756
831
  }
@@ -853,7 +928,7 @@ async function resolveAuthorityPrimaryWatcherHealth(now = Date.now()): Promise<A
853
928
 
854
929
  const existingRecord = await readPidFileRecord(pidFilePath).catch(() => null);
855
930
  if (!existingRecord) return createAuthorityBackoffState('pid_missing');
856
- if (existingRecord.cwd && resolve(existingRecord.cwd) !== cwd) return createAuthorityBackoffState('cwd_mismatch');
931
+ if (existingRecord.cwd && !sameFilePath(existingRecord.cwd, cwd)) return createAuthorityBackoffState('cwd_mismatch');
857
932
  if (!isPidAlive(existingRecord.pid)) {
858
933
  return createAuthorityBackoffState('pid_stale', {
859
934
  primary_pid: existingRecord.pid,
@@ -948,7 +1023,12 @@ async function runRalphContinueSteerTick(): Promise<void> {
948
1023
  singleton_lock_path: ralphSteerLockPath,
949
1024
  };
950
1025
 
951
- if (!activeRalph.active) return;
1026
+ if (!activeRalph.active) {
1027
+ if (activeRalph.reason === 'starting_stale') {
1028
+ lastRalphContinueSteer.last_reason = 'starting_stale';
1029
+ }
1030
+ return;
1031
+ }
952
1032
 
953
1033
  if (parseIsoMillis(lastRalphContinueSteer.last_sent_at) === null && parseIsoMillis(lastRalphContinueSteer.cooldown_anchor_at) === null) {
954
1034
  lastRalphContinueSteer.cooldown_anchor_at = startupIso;
@@ -1160,19 +1240,18 @@ async function readJsonObject(path: string): Promise<Record<string, unknown> | n
1160
1240
  }
1161
1241
 
1162
1242
  async function readAutoNudgeCount(): Promise<number> {
1163
- const parsed = await readJsonObject(join(stateDir, 'auto-nudge-state.json'));
1243
+ const parsed = await readScopedJsonIfExists(stateDir, 'auto-nudge-state.json', undefined, null);
1164
1244
  return Math.max(0, Math.trunc(asNumber(parsed?.nudgeCount as string | number | undefined, 0)));
1165
1245
  }
1166
1246
 
1167
1247
  async function readAutoNudgeState(): Promise<Record<string, unknown> | null> {
1168
- return readJsonObject(join(stateDir, 'auto-nudge-state.json'));
1248
+ return readScopedJsonIfExists(stateDir, 'auto-nudge-state.json', undefined, null);
1169
1249
  }
1170
1250
 
1171
1251
  async function runFallbackAutoNudgeTick(): Promise<void> {
1172
1252
  const now = Date.now();
1173
1253
  const nowIso = new Date(now).toISOString();
1174
- const hudStatePath = join(stateDir, 'hud-state.json');
1175
- const hudState = await readJsonObject(hudStatePath);
1254
+ const hudState = await readScopedJsonIfExists(stateDir, 'hud-state.json', undefined, null);
1176
1255
 
1177
1256
  lastFallbackAutoNudge = {
1178
1257
  ...lastFallbackAutoNudge,
@@ -1641,8 +1720,8 @@ async function runDispatchDrainTick(): Promise<boolean> {
1641
1720
 
1642
1721
  async function shouldSuppressInteractiveFallbackTicks(): Promise<boolean> {
1643
1722
  const [deepInterviewStateActive, deepInterviewInputLockActive] = await Promise.all([
1644
- isDeepInterviewStateActive(stateDir),
1645
- isDeepInterviewInputLockActive(stateDir),
1723
+ isDeepInterviewStateActive(stateDir, undefined),
1724
+ isDeepInterviewInputLockActive(stateDir, undefined),
1646
1725
  ]);
1647
1726
  return deepInterviewStateActive || deepInterviewInputLockActive;
1648
1727
  }
@@ -0,0 +1,54 @@
1
+ import { existsSync } from 'fs';
2
+ import { readdir } from 'fs/promises';
3
+ import { join } from 'path';
4
+ import { readTeamManifestV2, readTeamPhase } from '../../team/state.js';
5
+ import { resolveCanonicalTeamStateRoot } from '../../team/state-root.js';
6
+ import { isTerminalPhase, safeString } from './utils.js';
7
+
8
+ export interface NotifyCanonicalActiveTeam {
9
+ teamName: string;
10
+ phase: string;
11
+ ownerSessionId: string;
12
+ path: string;
13
+ source: 'canonical_fallback';
14
+ }
15
+
16
+ export async function listNotifyCanonicalActiveTeams(
17
+ cwd: string,
18
+ currentSessionId: string,
19
+ ): Promise<NotifyCanonicalActiveTeam[]> {
20
+ const sessionId = safeString(currentSessionId).trim();
21
+ if (!sessionId) return [];
22
+
23
+ const teamsRoot = join(resolveCanonicalTeamStateRoot(cwd), 'team');
24
+ if (!existsSync(teamsRoot)) return [];
25
+
26
+ const entries = await readdir(teamsRoot, { withFileTypes: true }).catch(() => []);
27
+ const teams: NotifyCanonicalActiveTeam[] = [];
28
+ for (const entry of entries) {
29
+ if (!entry.isDirectory()) continue;
30
+ const teamName = entry.name.trim();
31
+ if (!teamName) continue;
32
+
33
+ const [manifest, phaseState] = await Promise.all([
34
+ readTeamManifestV2(teamName, cwd),
35
+ readTeamPhase(teamName, cwd),
36
+ ]);
37
+ if (!manifest || !phaseState) continue;
38
+
39
+ const ownerSessionId = safeString(manifest.leader?.session_id).trim();
40
+ if (!ownerSessionId || ownerSessionId !== sessionId) continue;
41
+
42
+ const phase = safeString(phaseState.current_phase).trim();
43
+ if (!phase || isTerminalPhase(phase)) continue;
44
+
45
+ teams.push({
46
+ teamName,
47
+ phase,
48
+ ownerSessionId,
49
+ path: join(teamsRoot, teamName, 'phase.json'),
50
+ source: 'canonical_fallback',
51
+ });
52
+ }
53
+ return teams;
54
+ }