claudecode-omc 4.4.5 → 4.4.7

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 (859) hide show
  1. package/.mcp.json +2 -6
  2. package/README.es.md +64 -8
  3. package/README.ja.md +64 -8
  4. package/README.ko.md +64 -8
  5. package/README.pt.md +29 -0
  6. package/README.vi.md +29 -0
  7. package/README.zh.md +64 -8
  8. package/agents/architect.md +17 -7
  9. package/agents/code-reviewer.md +6 -7
  10. package/agents/critic.md +14 -1
  11. package/agents/deep-executor.md +6 -7
  12. package/agents/designer.md +6 -8
  13. package/agents/executor.md +6 -7
  14. package/agents/planner.md +21 -0
  15. package/agents/quality-reviewer.md +6 -7
  16. package/agents/security-reviewer.md +6 -7
  17. package/agents/test-engineer.md +6 -7
  18. package/bridge/mcp-server.cjs +517 -202
  19. package/bridge/runtime-cli.cjs +1550 -0
  20. package/bridge/team-bridge.cjs +362 -103
  21. package/bridge/{gemini-server.cjs → team-mcp.cjs} +10914 -10240
  22. package/dist/__tests__/auto-update.test.js +1 -1
  23. package/dist/__tests__/auto-update.test.js.map +1 -1
  24. package/dist/__tests__/cli-win32-warning.test.d.ts +2 -0
  25. package/dist/__tests__/cli-win32-warning.test.d.ts.map +1 -0
  26. package/dist/__tests__/cli-win32-warning.test.js +46 -0
  27. package/dist/__tests__/cli-win32-warning.test.js.map +1 -0
  28. package/dist/__tests__/codex-callsite-normalization.test.js +112 -0
  29. package/dist/__tests__/consensus-execution-handoff.test.d.ts +2 -0
  30. package/dist/__tests__/consensus-execution-handoff.test.d.ts.map +1 -1
  31. package/dist/__tests__/consensus-execution-handoff.test.js +48 -0
  32. package/dist/__tests__/consensus-execution-handoff.test.js.map +1 -1
  33. package/dist/__tests__/context-safety.test.d.ts +2 -0
  34. package/dist/__tests__/context-safety.test.d.ts.map +1 -0
  35. package/dist/__tests__/context-safety.test.js +59 -0
  36. package/dist/__tests__/context-safety.test.js.map +1 -0
  37. package/dist/__tests__/hooks.test.js +15 -0
  38. package/dist/__tests__/hooks.test.js.map +1 -1
  39. package/dist/__tests__/hud/call-counts.test.js +0 -3
  40. package/dist/__tests__/hud/call-counts.test.js.map +1 -1
  41. package/dist/__tests__/hud/defaults.test.js +3 -5
  42. package/dist/__tests__/hud/defaults.test.js.map +1 -1
  43. package/dist/__tests__/hud/prompt-time.test.d.ts +2 -0
  44. package/dist/__tests__/hud/prompt-time.test.d.ts.map +1 -0
  45. package/dist/__tests__/hud/prompt-time.test.js +24 -0
  46. package/dist/__tests__/hud/prompt-time.test.js.map +1 -0
  47. package/dist/__tests__/hud/render.test.js +0 -1
  48. package/dist/__tests__/hud/render.test.js.map +1 -1
  49. package/dist/__tests__/hud/usage-api.test.js +5 -0
  50. package/dist/__tests__/hud/usage-api.test.js.map +1 -1
  51. package/dist/__tests__/hud/version-display.test.js +1 -0
  52. package/dist/__tests__/hud/version-display.test.js.map +1 -1
  53. package/dist/__tests__/hud/windows-platform.test.js +0 -4
  54. package/dist/__tests__/hud/windows-platform.test.js.map +1 -1
  55. package/dist/__tests__/hud-windows.test.js +5 -3
  56. package/dist/__tests__/hud-windows.test.js.map +1 -1
  57. package/dist/__tests__/installer-hud-skip.test.js +12 -2
  58. package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
  59. package/dist/__tests__/installer.test.js +1 -1
  60. package/dist/__tests__/installer.test.js.map +1 -1
  61. package/dist/__tests__/job-management-sqlite.test.js +0 -15
  62. package/dist/__tests__/job-management-sqlite.test.js.map +1 -1
  63. package/dist/__tests__/job-management.test.js +0 -16
  64. package/dist/__tests__/job-management.test.js.map +1 -1
  65. package/dist/__tests__/load-agent-prompt.test.js +0 -23
  66. package/dist/__tests__/load-agent-prompt.test.js.map +1 -1
  67. package/dist/__tests__/model-routing.test.js +3 -2
  68. package/dist/__tests__/model-routing.test.js.map +1 -1
  69. package/dist/__tests__/omc-tools-server-interop.test.js +1 -1
  70. package/dist/__tests__/omc-tools-server-interop.test.js.map +1 -1
  71. package/dist/__tests__/pre-tool-enforcer.test.d.ts +2 -0
  72. package/dist/__tests__/pre-tool-enforcer.test.d.ts.map +1 -0
  73. package/dist/__tests__/pre-tool-enforcer.test.js +194 -0
  74. package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -0
  75. package/dist/__tests__/prompt-injection.test.js +0 -26
  76. package/dist/__tests__/prompt-injection.test.js.map +1 -1
  77. package/dist/__tests__/purge-stale-cache.test.js +3 -2
  78. package/dist/__tests__/purge-stale-cache.test.js.map +1 -1
  79. package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts +2 -0
  80. package/dist/__tests__/run-cjs-graceful-fallback.test.d.ts.map +1 -0
  81. package/dist/__tests__/run-cjs-graceful-fallback.test.js +167 -0
  82. package/dist/__tests__/run-cjs-graceful-fallback.test.js.map +1 -0
  83. package/dist/__tests__/session-start-cache-cleanup.test.d.ts +2 -0
  84. package/dist/__tests__/session-start-cache-cleanup.test.d.ts.map +1 -0
  85. package/dist/__tests__/session-start-cache-cleanup.test.js +150 -0
  86. package/dist/__tests__/session-start-cache-cleanup.test.js.map +1 -0
  87. package/dist/__tests__/skills.test.js +7 -10
  88. package/dist/__tests__/skills.test.js.map +1 -1
  89. package/dist/__tests__/team-server-validation.test.d.ts +2 -0
  90. package/dist/__tests__/team-server-validation.test.d.ts.map +1 -0
  91. package/dist/__tests__/team-server-validation.test.js +122 -0
  92. package/dist/__tests__/team-server-validation.test.js.map +1 -0
  93. package/dist/agents/index.d.ts +0 -1
  94. package/dist/agents/index.d.ts.map +1 -1
  95. package/dist/agents/index.js +0 -2
  96. package/dist/agents/index.js.map +1 -1
  97. package/dist/agents/prompt-helpers.d.ts +74 -0
  98. package/dist/agents/prompt-helpers.d.ts.map +1 -0
  99. package/dist/agents/prompt-helpers.js +187 -0
  100. package/dist/agents/prompt-helpers.js.map +1 -0
  101. package/dist/agents/utils.d.ts +1 -5
  102. package/dist/agents/utils.d.ts.map +1 -1
  103. package/dist/agents/utils.js +1 -34
  104. package/dist/agents/utils.js.map +1 -1
  105. package/dist/cli/__tests__/launch.test.d.ts +1 -2
  106. package/dist/cli/__tests__/launch.test.d.ts.map +1 -1
  107. package/dist/cli/__tests__/launch.test.js +442 -48
  108. package/dist/cli/__tests__/launch.test.js.map +1 -1
  109. package/dist/cli/__tests__/teleport-help.test.d.ts +2 -0
  110. package/dist/cli/__tests__/teleport-help.test.d.ts.map +1 -0
  111. package/dist/cli/__tests__/teleport-help.test.js +17 -0
  112. package/dist/cli/__tests__/teleport-help.test.js.map +1 -0
  113. package/dist/cli/commands/teleport.d.ts +2 -1
  114. package/dist/cli/commands/teleport.d.ts.map +1 -1
  115. package/dist/cli/commands/teleport.js +6 -3
  116. package/dist/cli/commands/teleport.js.map +1 -1
  117. package/dist/cli/index.js +40 -290
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/cli/launch.d.ts +83 -3
  120. package/dist/cli/launch.d.ts.map +1 -1
  121. package/dist/cli/launch.js +213 -48
  122. package/dist/cli/launch.js.map +1 -1
  123. package/dist/cli/win32-warning.d.ts +6 -0
  124. package/dist/cli/win32-warning.d.ts.map +1 -0
  125. package/dist/cli/win32-warning.js +15 -0
  126. package/dist/cli/win32-warning.js.map +1 -0
  127. package/dist/config/loader.d.ts +9 -1
  128. package/dist/config/loader.d.ts.map +1 -1
  129. package/dist/config/loader.js +29 -19
  130. package/dist/config/loader.js.map +1 -1
  131. package/dist/config/models.d.ts +33 -0
  132. package/dist/config/models.d.ts.map +1 -0
  133. package/dist/config/models.js +49 -0
  134. package/dist/config/models.js.map +1 -0
  135. package/dist/constants/names.d.ts +2 -0
  136. package/dist/constants/names.d.ts.map +1 -1
  137. package/dist/constants/names.js +2 -0
  138. package/dist/constants/names.js.map +1 -1
  139. package/dist/features/auto-update.d.ts.map +1 -1
  140. package/dist/features/auto-update.js +21 -11
  141. package/dist/features/auto-update.js.map +1 -1
  142. package/dist/features/background-agent/manager.d.ts.map +1 -1
  143. package/dist/features/background-agent/manager.js +1 -2
  144. package/dist/features/background-agent/manager.js.map +1 -1
  145. package/dist/features/boulder-state/storage.d.ts.map +1 -1
  146. package/dist/features/boulder-state/storage.js +9 -5
  147. package/dist/features/boulder-state/storage.js.map +1 -1
  148. package/dist/features/boulder-state/types.d.ts +4 -0
  149. package/dist/features/boulder-state/types.d.ts.map +1 -1
  150. package/dist/features/builtin-skills/skills.d.ts.map +1 -1
  151. package/dist/features/builtin-skills/skills.js +25 -78
  152. package/dist/features/builtin-skills/skills.js.map +1 -1
  153. package/dist/features/delegation-enforcer.d.ts.map +1 -1
  154. package/dist/features/delegation-enforcer.js +4 -1
  155. package/dist/features/delegation-enforcer.js.map +1 -1
  156. package/dist/features/delegation-routing/__tests__/resolver.test.js +47 -122
  157. package/dist/features/delegation-routing/__tests__/resolver.test.js.map +1 -1
  158. package/dist/features/delegation-routing/resolver.d.ts.map +1 -1
  159. package/dist/features/delegation-routing/resolver.js +24 -47
  160. package/dist/features/delegation-routing/resolver.js.map +1 -1
  161. package/dist/features/delegation-routing/types.d.ts.map +1 -1
  162. package/dist/features/delegation-routing/types.js +2 -0
  163. package/dist/features/delegation-routing/types.js.map +1 -1
  164. package/dist/features/model-routing/external-model-policy.d.ts.map +1 -1
  165. package/dist/features/model-routing/external-model-policy.js.map +1 -1
  166. package/dist/features/model-routing/router.d.ts.map +1 -1
  167. package/dist/features/model-routing/router.js +12 -2
  168. package/dist/features/model-routing/router.js.map +1 -1
  169. package/dist/features/model-routing/types.d.ts +5 -1
  170. package/dist/features/model-routing/types.d.ts.map +1 -1
  171. package/dist/features/model-routing/types.js +7 -6
  172. package/dist/features/model-routing/types.js.map +1 -1
  173. package/dist/features/rate-limit-wait/daemon.d.ts.map +1 -1
  174. package/dist/features/rate-limit-wait/daemon.js +40 -4
  175. package/dist/features/rate-limit-wait/daemon.js.map +1 -1
  176. package/dist/features/task-decomposer/index.js +14 -4
  177. package/dist/features/task-decomposer/index.js.map +1 -1
  178. package/dist/hooks/__tests__/bridge-openclaw.test.d.ts +2 -0
  179. package/dist/hooks/__tests__/bridge-openclaw.test.d.ts.map +1 -0
  180. package/dist/hooks/__tests__/bridge-openclaw.test.js +124 -0
  181. package/dist/hooks/__tests__/bridge-openclaw.test.js.map +1 -0
  182. package/dist/hooks/__tests__/bridge-security.test.js +1 -1
  183. package/dist/hooks/__tests__/bridge-security.test.js.map +1 -1
  184. package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
  185. package/dist/hooks/auto-slash-command/executor.js +38 -61
  186. package/dist/hooks/auto-slash-command/executor.js.map +1 -1
  187. package/dist/hooks/bridge.d.ts +11 -0
  188. package/dist/hooks/bridge.d.ts.map +1 -1
  189. package/dist/hooks/bridge.js +154 -82
  190. package/dist/hooks/bridge.js.map +1 -1
  191. package/dist/hooks/comment-checker/index.d.ts.map +1 -1
  192. package/dist/hooks/comment-checker/index.js +3 -1
  193. package/dist/hooks/comment-checker/index.js.map +1 -1
  194. package/dist/hooks/conductor/__tests__/state.test.js +4 -2
  195. package/dist/hooks/conductor/__tests__/state.test.js.map +1 -1
  196. package/dist/hooks/keyword-detector/__tests__/index.test.js +348 -1
  197. package/dist/hooks/keyword-detector/__tests__/index.test.js.map +1 -1
  198. package/dist/hooks/keyword-detector/index.d.ts +29 -0
  199. package/dist/hooks/keyword-detector/index.d.ts.map +1 -1
  200. package/dist/hooks/keyword-detector/index.js +123 -1
  201. package/dist/hooks/keyword-detector/index.js.map +1 -1
  202. package/dist/hooks/learner/bridge.d.ts.map +1 -1
  203. package/dist/hooks/learner/bridge.js +19 -4
  204. package/dist/hooks/learner/bridge.js.map +1 -1
  205. package/dist/hooks/learner/finder.d.ts.map +1 -1
  206. package/dist/hooks/learner/finder.js +19 -4
  207. package/dist/hooks/learner/finder.js.map +1 -1
  208. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +40 -0
  209. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
  210. package/dist/hooks/mode-registry/index.d.ts.map +1 -1
  211. package/dist/hooks/mode-registry/index.js +135 -52
  212. package/dist/hooks/mode-registry/index.js.map +1 -1
  213. package/dist/hooks/notepad/index.d.ts.map +1 -1
  214. package/dist/hooks/notepad/index.js +5 -3
  215. package/dist/hooks/notepad/index.js.map +1 -1
  216. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts +2 -0
  217. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.d.ts.map +1 -0
  218. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js +73 -0
  219. package/dist/hooks/persistent-mode/__tests__/cancel-race.test.js.map +1 -0
  220. package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js +89 -13
  221. package/dist/hooks/persistent-mode/__tests__/idle-cooldown.test.js.map +1 -1
  222. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts +2 -0
  223. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.d.ts.map +1 -0
  224. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js +156 -0
  225. package/dist/hooks/persistent-mode/__tests__/skill-state-stop.test.js.map +1 -0
  226. package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts +2 -3
  227. package/dist/hooks/persistent-mode/idle-cooldown.test.d.ts.map +1 -1
  228. package/dist/hooks/persistent-mode/idle-cooldown.test.js +19 -4
  229. package/dist/hooks/persistent-mode/idle-cooldown.test.js.map +1 -1
  230. package/dist/hooks/persistent-mode/index.d.ts +2 -2
  231. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  232. package/dist/hooks/persistent-mode/index.js +144 -26
  233. package/dist/hooks/persistent-mode/index.js.map +1 -1
  234. package/dist/hooks/plugin-patterns/index.d.ts.map +1 -1
  235. package/dist/hooks/plugin-patterns/index.js +22 -31
  236. package/dist/hooks/plugin-patterns/index.js.map +1 -1
  237. package/dist/hooks/pre-compact/index.js +1 -1
  238. package/dist/hooks/preemptive-compaction/index.d.ts.map +1 -1
  239. package/dist/hooks/preemptive-compaction/index.js +3 -1
  240. package/dist/hooks/preemptive-compaction/index.js.map +1 -1
  241. package/dist/hooks/project-memory/index.d.ts.map +1 -1
  242. package/dist/hooks/project-memory/index.js +9 -0
  243. package/dist/hooks/project-memory/index.js.map +1 -1
  244. package/dist/hooks/project-memory/learner.d.ts.map +1 -1
  245. package/dist/hooks/project-memory/learner.js +107 -85
  246. package/dist/hooks/project-memory/learner.js.map +1 -1
  247. package/dist/hooks/project-memory/storage.d.ts.map +1 -1
  248. package/dist/hooks/project-memory/storage.js +3 -2
  249. package/dist/hooks/project-memory/storage.js.map +1 -1
  250. package/dist/hooks/recovery/context-window.d.ts +4 -0
  251. package/dist/hooks/recovery/context-window.d.ts.map +1 -1
  252. package/dist/hooks/recovery/context-window.js +22 -1
  253. package/dist/hooks/recovery/context-window.js.map +1 -1
  254. package/dist/hooks/recovery/session-recovery.js +1 -1
  255. package/dist/hooks/recovery/session-recovery.js.map +1 -1
  256. package/dist/hooks/session-end/index.d.ts.map +1 -1
  257. package/dist/hooks/session-end/index.js +13 -22
  258. package/dist/hooks/session-end/index.js.map +1 -1
  259. package/dist/hooks/setup/__tests__/windows-patch.test.d.ts +2 -0
  260. package/dist/hooks/setup/__tests__/windows-patch.test.d.ts.map +1 -0
  261. package/dist/hooks/setup/__tests__/windows-patch.test.js +110 -0
  262. package/dist/hooks/setup/__tests__/windows-patch.test.js.map +1 -0
  263. package/dist/hooks/setup/index.d.ts +18 -0
  264. package/dist/hooks/setup/index.d.ts.map +1 -1
  265. package/dist/hooks/setup/index.js +59 -1
  266. package/dist/hooks/setup/index.js.map +1 -1
  267. package/dist/hooks/skill-bridge.cjs +17 -3
  268. package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts +2 -0
  269. package/dist/hooks/skill-state/__tests__/skill-state.test.d.ts.map +1 -0
  270. package/dist/hooks/skill-state/__tests__/skill-state.test.js +301 -0
  271. package/dist/hooks/skill-state/__tests__/skill-state.test.js.map +1 -0
  272. package/dist/hooks/skill-state/index.d.ts +79 -0
  273. package/dist/hooks/skill-state/index.d.ts.map +1 -0
  274. package/dist/hooks/skill-state/index.js +245 -0
  275. package/dist/hooks/skill-state/index.js.map +1 -0
  276. package/dist/hooks/team-pipeline/state.d.ts.map +1 -1
  277. package/dist/hooks/team-pipeline/state.js +5 -0
  278. package/dist/hooks/team-pipeline/state.js.map +1 -1
  279. package/dist/hooks/todo-continuation/index.d.ts +17 -0
  280. package/dist/hooks/todo-continuation/index.d.ts.map +1 -1
  281. package/dist/hooks/todo-continuation/index.js +44 -2
  282. package/dist/hooks/todo-continuation/index.js.map +1 -1
  283. package/dist/hud/elements/call-counts.d.ts.map +1 -1
  284. package/dist/hud/elements/call-counts.js +6 -4
  285. package/dist/hud/elements/call-counts.js.map +1 -1
  286. package/dist/hud/elements/index.d.ts +1 -0
  287. package/dist/hud/elements/index.d.ts.map +1 -1
  288. package/dist/hud/elements/index.js +1 -0
  289. package/dist/hud/elements/index.js.map +1 -1
  290. package/dist/hud/elements/prompt-time.d.ts +13 -0
  291. package/dist/hud/elements/prompt-time.d.ts.map +1 -0
  292. package/dist/hud/elements/prompt-time.js +21 -0
  293. package/dist/hud/elements/prompt-time.js.map +1 -0
  294. package/dist/hud/index.d.ts +2 -1
  295. package/dist/hud/index.d.ts.map +1 -1
  296. package/dist/hud/index.js +40 -215
  297. package/dist/hud/index.js.map +1 -1
  298. package/dist/hud/render.d.ts.map +1 -1
  299. package/dist/hud/render.js +7 -108
  300. package/dist/hud/render.js.map +1 -1
  301. package/dist/hud/state.d.ts.map +1 -1
  302. package/dist/hud/state.js +4 -3
  303. package/dist/hud/state.js.map +1 -1
  304. package/dist/hud/stdin.d.ts +10 -0
  305. package/dist/hud/stdin.d.ts.map +1 -1
  306. package/dist/hud/stdin.js +43 -0
  307. package/dist/hud/stdin.js.map +1 -1
  308. package/dist/hud/types.d.ts +6 -18
  309. package/dist/hud/types.d.ts.map +1 -1
  310. package/dist/hud/types.js +6 -46
  311. package/dist/hud/types.js.map +1 -1
  312. package/dist/hud/usage-api.d.ts.map +1 -1
  313. package/dist/hud/usage-api.js +12 -0
  314. package/dist/hud/usage-api.js.map +1 -1
  315. package/dist/index.d.ts +1 -1
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +2 -11
  318. package/dist/index.js.map +1 -1
  319. package/dist/installer/hooks.d.ts +5 -0
  320. package/dist/installer/hooks.d.ts.map +1 -1
  321. package/dist/installer/hooks.js +8 -0
  322. package/dist/installer/hooks.js.map +1 -1
  323. package/dist/installer/index.d.ts.map +1 -1
  324. package/dist/installer/index.js +26 -11
  325. package/dist/installer/index.js.map +1 -1
  326. package/dist/interop/omx-team-state.d.ts.map +1 -1
  327. package/dist/interop/omx-team-state.js +38 -6
  328. package/dist/interop/omx-team-state.js.map +1 -1
  329. package/dist/interop/shared-state.d.ts.map +1 -1
  330. package/dist/interop/shared-state.js +58 -7
  331. package/dist/interop/shared-state.js.map +1 -1
  332. package/dist/lib/__tests__/worktree-paths.test.js +250 -1
  333. package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
  334. package/dist/lib/job-state-db.d.ts +150 -0
  335. package/dist/lib/job-state-db.d.ts.map +1 -0
  336. package/dist/lib/job-state-db.js +650 -0
  337. package/dist/lib/job-state-db.js.map +1 -0
  338. package/dist/lib/mode-names.d.ts +46 -0
  339. package/dist/lib/mode-names.d.ts.map +1 -0
  340. package/dist/lib/mode-names.js +73 -0
  341. package/dist/lib/mode-names.js.map +1 -0
  342. package/dist/lib/session-isolation.d.ts +32 -0
  343. package/dist/lib/session-isolation.d.ts.map +1 -0
  344. package/dist/lib/session-isolation.js +39 -0
  345. package/dist/lib/session-isolation.js.map +1 -0
  346. package/dist/lib/worktree-paths.d.ts +38 -8
  347. package/dist/lib/worktree-paths.d.ts.map +1 -1
  348. package/dist/lib/worktree-paths.js +124 -56
  349. package/dist/lib/worktree-paths.js.map +1 -1
  350. package/dist/mcp/__tests__/team-cleanup.test.d.ts +11 -0
  351. package/dist/mcp/__tests__/team-cleanup.test.d.ts.map +1 -0
  352. package/dist/mcp/__tests__/team-cleanup.test.js +228 -0
  353. package/dist/mcp/__tests__/team-cleanup.test.js.map +1 -0
  354. package/dist/mcp/cli-detection.d.ts +4 -8
  355. package/dist/mcp/cli-detection.d.ts.map +1 -1
  356. package/dist/mcp/cli-detection.js +5 -8
  357. package/dist/mcp/cli-detection.js.map +1 -1
  358. package/dist/mcp/codex-request-normalizer.js +59 -0
  359. package/dist/mcp/codex-server.js +16 -4
  360. package/dist/mcp/codex-standalone-server.js +13 -4
  361. package/dist/mcp/index.d.ts +2 -4
  362. package/dist/mcp/index.d.ts.map +1 -1
  363. package/dist/mcp/index.js +1 -5
  364. package/dist/mcp/index.js.map +1 -1
  365. package/dist/mcp/job-management.d.ts.map +1 -1
  366. package/dist/mcp/job-management.js +11 -9
  367. package/dist/mcp/job-management.js.map +1 -1
  368. package/dist/mcp/job-state-db.d.ts +1 -149
  369. package/dist/mcp/job-state-db.d.ts.map +1 -1
  370. package/dist/mcp/job-state-db.js +2 -649
  371. package/dist/mcp/job-state-db.js.map +1 -1
  372. package/dist/mcp/mcp-config.d.ts +1 -1
  373. package/dist/mcp/mcp-config.js +1 -1
  374. package/dist/mcp/prompt-injection.d.ts +14 -76
  375. package/dist/mcp/prompt-injection.d.ts.map +1 -1
  376. package/dist/mcp/prompt-injection.js +34 -175
  377. package/dist/mcp/prompt-injection.js.map +1 -1
  378. package/dist/mcp/standalone-server.js +2 -0
  379. package/dist/mcp/standalone-server.js.map +1 -1
  380. package/dist/mcp/team-server.d.ts +16 -0
  381. package/dist/mcp/team-server.d.ts.map +1 -0
  382. package/dist/mcp/team-server.js +356 -0
  383. package/dist/mcp/team-server.js.map +1 -0
  384. package/dist/notifications/__tests__/formatter.test.js +62 -0
  385. package/dist/notifications/__tests__/formatter.test.js.map +1 -1
  386. package/dist/notifications/__tests__/hook-config.test.d.ts +14 -0
  387. package/dist/notifications/__tests__/hook-config.test.d.ts.map +1 -0
  388. package/dist/notifications/__tests__/hook-config.test.js +210 -0
  389. package/dist/notifications/__tests__/hook-config.test.js.map +1 -0
  390. package/dist/notifications/__tests__/platform-gating.test.d.ts +12 -0
  391. package/dist/notifications/__tests__/platform-gating.test.d.ts.map +1 -0
  392. package/dist/notifications/__tests__/platform-gating.test.js +140 -0
  393. package/dist/notifications/__tests__/platform-gating.test.js.map +1 -0
  394. package/dist/notifications/__tests__/template-engine.test.d.ts +13 -0
  395. package/dist/notifications/__tests__/template-engine.test.d.ts.map +1 -0
  396. package/dist/notifications/__tests__/template-engine.test.js +378 -0
  397. package/dist/notifications/__tests__/template-engine.test.js.map +1 -0
  398. package/dist/notifications/config.d.ts.map +1 -1
  399. package/dist/notifications/config.js +54 -18
  400. package/dist/notifications/config.js.map +1 -1
  401. package/dist/notifications/dispatcher.d.ts +2 -2
  402. package/dist/notifications/dispatcher.d.ts.map +1 -1
  403. package/dist/notifications/dispatcher.js +10 -6
  404. package/dist/notifications/dispatcher.js.map +1 -1
  405. package/dist/notifications/formatter.d.ts.map +1 -1
  406. package/dist/notifications/formatter.js +22 -0
  407. package/dist/notifications/formatter.js.map +1 -1
  408. package/dist/notifications/hook-config-types.d.ts +44 -0
  409. package/dist/notifications/hook-config-types.d.ts.map +1 -0
  410. package/dist/notifications/hook-config-types.js +8 -0
  411. package/dist/notifications/hook-config-types.js.map +1 -0
  412. package/dist/notifications/hook-config.d.ts +36 -0
  413. package/dist/notifications/hook-config.d.ts.map +1 -0
  414. package/dist/notifications/hook-config.js +95 -0
  415. package/dist/notifications/hook-config.js.map +1 -0
  416. package/dist/notifications/index.d.ts +3 -0
  417. package/dist/notifications/index.d.ts.map +1 -1
  418. package/dist/notifications/index.js +31 -3
  419. package/dist/notifications/index.js.map +1 -1
  420. package/dist/notifications/reply-listener.d.ts.map +1 -1
  421. package/dist/notifications/reply-listener.js +1 -0
  422. package/dist/notifications/reply-listener.js.map +1 -1
  423. package/dist/notifications/session-registry.d.ts.map +1 -1
  424. package/dist/notifications/session-registry.js +13 -5
  425. package/dist/notifications/session-registry.js.map +1 -1
  426. package/dist/notifications/template-engine.d.ts +34 -0
  427. package/dist/notifications/template-engine.d.ts.map +1 -0
  428. package/dist/notifications/template-engine.js +248 -0
  429. package/dist/notifications/template-engine.js.map +1 -0
  430. package/dist/notifications/types.d.ts +0 -2
  431. package/dist/notifications/types.d.ts.map +1 -1
  432. package/dist/openclaw/__tests__/config.test.d.ts +2 -0
  433. package/dist/openclaw/__tests__/config.test.d.ts.map +1 -0
  434. package/dist/openclaw/__tests__/config.test.js +200 -0
  435. package/dist/openclaw/__tests__/config.test.js.map +1 -0
  436. package/dist/openclaw/__tests__/dispatcher.test.d.ts +2 -0
  437. package/dist/openclaw/__tests__/dispatcher.test.d.ts.map +1 -0
  438. package/dist/openclaw/__tests__/dispatcher.test.js +348 -0
  439. package/dist/openclaw/__tests__/dispatcher.test.js.map +1 -0
  440. package/dist/openclaw/__tests__/index.test.d.ts +2 -0
  441. package/dist/openclaw/__tests__/index.test.d.ts.map +1 -0
  442. package/dist/openclaw/__tests__/index.test.js +235 -0
  443. package/dist/openclaw/__tests__/index.test.js.map +1 -0
  444. package/dist/openclaw/config.d.ts +33 -0
  445. package/dist/openclaw/config.d.ts.map +1 -0
  446. package/dist/openclaw/config.js +83 -0
  447. package/dist/openclaw/config.js.map +1 -0
  448. package/dist/openclaw/dispatcher.d.ts +47 -0
  449. package/dist/openclaw/dispatcher.d.ts.map +1 -0
  450. package/dist/openclaw/dispatcher.js +138 -0
  451. package/dist/openclaw/dispatcher.js.map +1 -0
  452. package/dist/openclaw/index.d.ts +25 -0
  453. package/dist/openclaw/index.d.ts.map +1 -0
  454. package/dist/openclaw/index.js +132 -0
  455. package/dist/openclaw/index.js.map +1 -0
  456. package/dist/openclaw/types.d.ts +102 -0
  457. package/dist/openclaw/types.d.ts.map +1 -0
  458. package/dist/openclaw/types.js +8 -0
  459. package/dist/openclaw/types.js.map +1 -0
  460. package/dist/platform/index.d.ts +5 -0
  461. package/dist/platform/index.d.ts.map +1 -1
  462. package/dist/platform/index.js +17 -0
  463. package/dist/platform/index.js.map +1 -1
  464. package/dist/platform/process-utils.d.ts.map +1 -1
  465. package/dist/platform/process-utils.js +55 -9
  466. package/dist/platform/process-utils.js.map +1 -1
  467. package/dist/shared/types.d.ts +7 -5
  468. package/dist/shared/types.d.ts.map +1 -1
  469. package/dist/team/__tests__/bridge-integration.test.js +10 -8
  470. package/dist/team/__tests__/bridge-integration.test.js.map +1 -1
  471. package/dist/team/__tests__/edge-cases.test.js +40 -29
  472. package/dist/team/__tests__/edge-cases.test.js.map +1 -1
  473. package/dist/team/__tests__/idle-nudge.test.d.ts +11 -0
  474. package/dist/team/__tests__/idle-nudge.test.d.ts.map +1 -0
  475. package/dist/team/__tests__/idle-nudge.test.js +282 -0
  476. package/dist/team/__tests__/idle-nudge.test.js.map +1 -0
  477. package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js +2 -2
  478. package/dist/team/__tests__/mcp-team-bridge.spawn-args.test.js.map +1 -1
  479. package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts +2 -0
  480. package/dist/team/__tests__/mcp-team-bridge.usage.test.d.ts.map +1 -0
  481. package/dist/team/__tests__/mcp-team-bridge.usage.test.js +49 -0
  482. package/dist/team/__tests__/mcp-team-bridge.usage.test.js.map +1 -0
  483. package/dist/team/__tests__/merge-coordinator.test.js +1 -1
  484. package/dist/team/__tests__/merge-coordinator.test.js.map +1 -1
  485. package/dist/team/__tests__/model-contract.test.d.ts +2 -0
  486. package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
  487. package/dist/team/__tests__/model-contract.test.js +121 -0
  488. package/dist/team/__tests__/model-contract.test.js.map +1 -0
  489. package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
  490. package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
  491. package/dist/team/__tests__/phase-controller.test.js +45 -0
  492. package/dist/team/__tests__/phase-controller.test.js.map +1 -0
  493. package/dist/team/__tests__/runtime-assign.test.d.ts +2 -0
  494. package/dist/team/__tests__/runtime-assign.test.d.ts.map +1 -0
  495. package/dist/team/__tests__/runtime-assign.test.js +43 -0
  496. package/dist/team/__tests__/runtime-assign.test.js.map +1 -0
  497. package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts +2 -0
  498. package/dist/team/__tests__/runtime-gemini-prompt.test.d.ts.map +1 -0
  499. package/dist/team/__tests__/runtime-gemini-prompt.test.js +153 -0
  500. package/dist/team/__tests__/runtime-gemini-prompt.test.js.map +1 -0
  501. package/dist/team/__tests__/runtime-prompt-mode.test.d.ts +2 -0
  502. package/dist/team/__tests__/runtime-prompt-mode.test.d.ts.map +1 -0
  503. package/dist/team/__tests__/runtime-prompt-mode.test.js +162 -0
  504. package/dist/team/__tests__/runtime-prompt-mode.test.js.map +1 -0
  505. package/dist/team/__tests__/runtime.test.d.ts +2 -0
  506. package/dist/team/__tests__/runtime.test.d.ts.map +1 -0
  507. package/dist/team/__tests__/runtime.test.js +37 -0
  508. package/dist/team/__tests__/runtime.test.js.map +1 -0
  509. package/dist/team/__tests__/task-file-ops.test.js +63 -59
  510. package/dist/team/__tests__/task-file-ops.test.js.map +1 -1
  511. package/dist/team/__tests__/team-name.test.d.ts +2 -0
  512. package/dist/team/__tests__/team-name.test.d.ts.map +1 -0
  513. package/dist/team/__tests__/team-name.test.js +18 -0
  514. package/dist/team/__tests__/team-name.test.js.map +1 -0
  515. package/dist/team/__tests__/team-status.test.js +52 -6
  516. package/dist/team/__tests__/team-status.test.js.map +1 -1
  517. package/dist/team/__tests__/tmux-comm.test.d.ts +2 -0
  518. package/dist/team/__tests__/tmux-comm.test.d.ts.map +1 -0
  519. package/dist/team/__tests__/tmux-comm.test.js +26 -0
  520. package/dist/team/__tests__/tmux-comm.test.js.map +1 -0
  521. package/dist/team/__tests__/tmux-session.create-team.test.d.ts +2 -0
  522. package/dist/team/__tests__/tmux-session.create-team.test.d.ts.map +1 -0
  523. package/dist/team/__tests__/tmux-session.create-team.test.js +104 -0
  524. package/dist/team/__tests__/tmux-session.create-team.test.js.map +1 -0
  525. package/dist/team/__tests__/tmux-session.spawn.test.d.ts +2 -0
  526. package/dist/team/__tests__/tmux-session.spawn.test.d.ts.map +1 -0
  527. package/dist/team/__tests__/tmux-session.spawn.test.js +61 -0
  528. package/dist/team/__tests__/tmux-session.spawn.test.js.map +1 -0
  529. package/dist/team/__tests__/tmux-session.test.js +161 -2
  530. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  531. package/dist/team/__tests__/worker-bootstrap.test.d.ts +2 -0
  532. package/dist/team/__tests__/worker-bootstrap.test.d.ts.map +1 -0
  533. package/dist/team/__tests__/worker-bootstrap.test.js +58 -0
  534. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -0
  535. package/dist/team/bridge-entry.d.ts.map +1 -1
  536. package/dist/team/bridge-entry.js +4 -0
  537. package/dist/team/bridge-entry.js.map +1 -1
  538. package/dist/team/capabilities.d.ts.map +1 -1
  539. package/dist/team/capabilities.js +3 -0
  540. package/dist/team/capabilities.js.map +1 -1
  541. package/dist/team/cli-detection.d.ts +9 -0
  542. package/dist/team/cli-detection.d.ts.map +1 -0
  543. package/dist/team/cli-detection.js +29 -0
  544. package/dist/team/cli-detection.js.map +1 -0
  545. package/dist/team/fs-utils.d.ts.map +1 -1
  546. package/dist/team/fs-utils.js +25 -4
  547. package/dist/team/fs-utils.js.map +1 -1
  548. package/dist/team/idle-nudge.d.ts +53 -0
  549. package/dist/team/idle-nudge.d.ts.map +1 -0
  550. package/dist/team/idle-nudge.js +124 -0
  551. package/dist/team/idle-nudge.js.map +1 -0
  552. package/dist/team/inbox-outbox.d.ts.map +1 -1
  553. package/dist/team/inbox-outbox.js +7 -3
  554. package/dist/team/inbox-outbox.js.map +1 -1
  555. package/dist/team/index.d.ts +14 -1
  556. package/dist/team/index.d.ts.map +1 -1
  557. package/dist/team/index.js +12 -1
  558. package/dist/team/index.js.map +1 -1
  559. package/dist/team/mcp-team-bridge.d.ts +9 -0
  560. package/dist/team/mcp-team-bridge.d.ts.map +1 -1
  561. package/dist/team/mcp-team-bridge.js +82 -3
  562. package/dist/team/mcp-team-bridge.js.map +1 -1
  563. package/dist/team/model-contract.d.ts +37 -0
  564. package/dist/team/model-contract.d.ts.map +1 -0
  565. package/dist/team/model-contract.js +139 -0
  566. package/dist/team/model-contract.js.map +1 -0
  567. package/dist/team/phase-controller.d.ts +33 -0
  568. package/dist/team/phase-controller.d.ts.map +1 -0
  569. package/dist/team/phase-controller.js +79 -0
  570. package/dist/team/phase-controller.js.map +1 -0
  571. package/dist/team/runtime-cli.d.ts +9 -0
  572. package/dist/team/runtime-cli.d.ts.map +1 -0
  573. package/dist/team/runtime-cli.js +188 -0
  574. package/dist/team/runtime-cli.js.map +1 -0
  575. package/dist/team/runtime.d.ts +95 -0
  576. package/dist/team/runtime.d.ts.map +1 -0
  577. package/dist/team/runtime.js +692 -0
  578. package/dist/team/runtime.js.map +1 -0
  579. package/dist/team/state-paths.d.ts +72 -0
  580. package/dist/team/state-paths.d.ts.map +1 -0
  581. package/dist/team/state-paths.js +87 -0
  582. package/dist/team/state-paths.js.map +1 -0
  583. package/dist/team/task-file-ops.d.ts +27 -7
  584. package/dist/team/task-file-ops.d.ts.map +1 -1
  585. package/dist/team/task-file-ops.js +116 -55
  586. package/dist/team/task-file-ops.js.map +1 -1
  587. package/dist/team/team-name.d.ts +2 -0
  588. package/dist/team/team-name.d.ts.map +1 -0
  589. package/dist/team/team-name.js +8 -0
  590. package/dist/team/team-name.js.map +1 -0
  591. package/dist/team/team-registration.d.ts +1 -1
  592. package/dist/team/team-registration.d.ts.map +1 -1
  593. package/dist/team/team-registration.js.map +1 -1
  594. package/dist/team/team-status.d.ts +11 -1
  595. package/dist/team/team-status.d.ts.map +1 -1
  596. package/dist/team/team-status.js +32 -3
  597. package/dist/team/team-status.js.map +1 -1
  598. package/dist/team/tmux-comm.d.ts +36 -0
  599. package/dist/team/tmux-comm.d.ts.map +1 -0
  600. package/dist/team/tmux-comm.js +115 -0
  601. package/dist/team/tmux-comm.js.map +1 -0
  602. package/dist/team/tmux-session.d.ts +92 -0
  603. package/dist/team/tmux-session.d.ts.map +1 -1
  604. package/dist/team/tmux-session.js +533 -2
  605. package/dist/team/tmux-session.js.map +1 -1
  606. package/dist/team/types.d.ts +10 -3
  607. package/dist/team/types.d.ts.map +1 -1
  608. package/dist/team/unified-team.d.ts.map +1 -1
  609. package/dist/team/unified-team.js +13 -3
  610. package/dist/team/unified-team.js.map +1 -1
  611. package/dist/team/worker-bootstrap.d.ts +39 -0
  612. package/dist/team/worker-bootstrap.d.ts.map +1 -0
  613. package/dist/team/worker-bootstrap.js +117 -0
  614. package/dist/team/worker-bootstrap.js.map +1 -0
  615. package/dist/team/worker-health.d.ts.map +1 -1
  616. package/dist/team/worker-health.js +15 -3
  617. package/dist/team/worker-health.js.map +1 -1
  618. package/dist/tools/ast-tools.js +1 -1
  619. package/dist/tools/ast-tools.js.map +1 -1
  620. package/dist/tools/diagnostics/lsp-aggregator.d.ts.map +1 -1
  621. package/dist/tools/diagnostics/lsp-aggregator.js +4 -2
  622. package/dist/tools/diagnostics/lsp-aggregator.js.map +1 -1
  623. package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts +2 -0
  624. package/dist/tools/lsp/__tests__/client-handle-data.test.d.ts.map +1 -0
  625. package/dist/tools/lsp/__tests__/client-handle-data.test.js +138 -0
  626. package/dist/tools/lsp/__tests__/client-handle-data.test.js.map +1 -0
  627. package/dist/tools/lsp/client.d.ts +13 -0
  628. package/dist/tools/lsp/client.d.ts.map +1 -1
  629. package/dist/tools/lsp/client.js +64 -8
  630. package/dist/tools/lsp/client.js.map +1 -1
  631. package/dist/tools/lsp/servers.d.ts.map +1 -1
  632. package/dist/tools/lsp/servers.js +4 -9
  633. package/dist/tools/lsp/servers.js.map +1 -1
  634. package/dist/tools/lsp-tools.d.ts.map +1 -1
  635. package/dist/tools/lsp-tools.js +4 -0
  636. package/dist/tools/lsp-tools.js.map +1 -1
  637. package/dist/tools/python-repl/bridge-manager.d.ts.map +1 -1
  638. package/dist/tools/python-repl/bridge-manager.js +15 -1
  639. package/dist/tools/python-repl/bridge-manager.js.map +1 -1
  640. package/dist/tools/python-repl/session-lock.d.ts.map +1 -1
  641. package/dist/tools/python-repl/session-lock.js +35 -15
  642. package/dist/tools/python-repl/session-lock.js.map +1 -1
  643. package/dist/tools/state-tools.d.ts.map +1 -1
  644. package/dist/tools/state-tools.js +10 -0
  645. package/dist/tools/state-tools.js.map +1 -1
  646. package/dist/utils/__tests__/frontmatter.test.d.ts +2 -0
  647. package/dist/utils/__tests__/frontmatter.test.d.ts.map +1 -0
  648. package/dist/utils/__tests__/frontmatter.test.js +147 -0
  649. package/dist/utils/__tests__/frontmatter.test.js.map +1 -0
  650. package/dist/utils/frontmatter.d.ts +24 -0
  651. package/dist/utils/frontmatter.d.ts.map +1 -0
  652. package/dist/utils/frontmatter.js +62 -0
  653. package/dist/utils/frontmatter.js.map +1 -0
  654. package/dist/utils/paths.d.ts.map +1 -1
  655. package/dist/utils/paths.js +4 -2
  656. package/dist/utils/paths.js.map +1 -1
  657. package/dist/utils/string-width.d.ts.map +1 -1
  658. package/dist/utils/string-width.js +15 -4
  659. package/dist/utils/string-width.js.map +1 -1
  660. package/dist/verification/tier-selector.js +1 -1
  661. package/dist/verification/tier-selector.js.map +1 -1
  662. package/docs/AGENTS.md +4 -2
  663. package/docs/CLAUDE.md +8 -48
  664. package/docs/MIGRATION.md +114 -0
  665. package/docs/REFERENCE.md +35 -102
  666. package/hooks/hooks.json +23 -23
  667. package/package.json +8 -8
  668. package/scripts/build-runtime-cli.mjs +24 -0
  669. package/scripts/build-team-server.mjs +28 -0
  670. package/scripts/cleanup-orphans.mjs +22 -5
  671. package/scripts/context-safety.mjs +5 -1
  672. package/scripts/demo-team.mjs +26 -0
  673. package/scripts/keyword-detector.mjs +6 -76
  674. package/scripts/openclaw-gateway-demo.mjs +168 -0
  675. package/scripts/persistent-mode.cjs +30 -4
  676. package/scripts/persistent-mode.mjs +48 -3
  677. package/scripts/plugin-setup.mjs +66 -3
  678. package/scripts/post-tool-use-failure.mjs +20 -2
  679. package/scripts/post-tool-verifier.mjs +57 -6
  680. package/scripts/pre-tool-enforcer.mjs +125 -5
  681. package/scripts/run.cjs +114 -0
  682. package/scripts/session-start.mjs +56 -7
  683. package/scripts/status.mjs +144 -0
  684. package/scripts/test-codex-gemini-team.mjs +78 -0
  685. package/skills/AGENTS.md +5 -2
  686. package/skills/analyze/SKILL.md +5 -11
  687. package/skills/autopilot/SKILL.md +5 -6
  688. package/skills/ccg/SKILL.md +88 -99
  689. package/skills/configure-notifications/SKILL.md +177 -0
  690. package/skills/configure-openclaw/SKILL.md +320 -0
  691. package/skills/external-context/SKILL.md +7 -83
  692. package/skills/hud/SKILL.md +68 -46
  693. package/skills/omc-setup/SKILL.md +58 -19
  694. package/skills/omc-teams/SKILL.md +178 -0
  695. package/skills/pipeline/SKILL.md +4 -4
  696. package/skills/plan/SKILL.md +28 -16
  697. package/skills/ralph/SKILL.md +3 -4
  698. package/skills/ralph-init/SKILL.md +3 -1
  699. package/skills/ralplan/SKILL.md +93 -8
  700. package/skills/security-review/SKILL.md +5 -6
  701. package/skills/tdd/SKILL.md +5 -6
  702. package/skills/team/SKILL.md +35 -34
  703. package/templates/hooks/keyword-detector.mjs +11 -82
  704. package/templates/hooks/persistent-mode.mjs +120 -3
  705. package/templates/hooks/post-tool-use-failure.mjs +20 -2
  706. package/templates/hooks/session-start.mjs +2 -16
  707. package/dist/__tests__/analytics/backfill-dedup.test.d.ts +0 -2
  708. package/dist/__tests__/analytics/backfill-dedup.test.d.ts.map +0 -1
  709. package/dist/__tests__/analytics/backfill-dedup.test.js +0 -179
  710. package/dist/__tests__/analytics/backfill-dedup.test.js.map +0 -1
  711. package/dist/__tests__/analytics/backfill-engine.test.d.ts +0 -2
  712. package/dist/__tests__/analytics/backfill-engine.test.d.ts.map +0 -1
  713. package/dist/__tests__/analytics/backfill-engine.test.js +0 -362
  714. package/dist/__tests__/analytics/backfill-engine.test.js.map +0 -1
  715. package/dist/__tests__/analytics/output-estimator.test.d.ts +0 -2
  716. package/dist/__tests__/analytics/output-estimator.test.d.ts.map +0 -1
  717. package/dist/__tests__/analytics/output-estimator.test.js +0 -124
  718. package/dist/__tests__/analytics/output-estimator.test.js.map +0 -1
  719. package/dist/__tests__/analytics/token-extractor.test.d.ts +0 -2
  720. package/dist/__tests__/analytics/token-extractor.test.d.ts.map +0 -1
  721. package/dist/__tests__/analytics/token-extractor.test.js +0 -165
  722. package/dist/__tests__/analytics/token-extractor.test.js.map +0 -1
  723. package/dist/__tests__/analytics/token-tracker.test.d.ts +0 -2
  724. package/dist/__tests__/analytics/token-tracker.test.d.ts.map +0 -1
  725. package/dist/__tests__/analytics/token-tracker.test.js +0 -189
  726. package/dist/__tests__/analytics/token-tracker.test.js.map +0 -1
  727. package/dist/__tests__/analytics/tokscale-adapter.test.d.ts +0 -2
  728. package/dist/__tests__/analytics/tokscale-adapter.test.d.ts.map +0 -1
  729. package/dist/__tests__/analytics/tokscale-adapter.test.js +0 -79
  730. package/dist/__tests__/analytics/tokscale-adapter.test.js.map +0 -1
  731. package/dist/__tests__/analytics/transcript-parser.test.d.ts +0 -2
  732. package/dist/__tests__/analytics/transcript-parser.test.d.ts.map +0 -1
  733. package/dist/__tests__/analytics/transcript-parser.test.js +0 -285
  734. package/dist/__tests__/analytics/transcript-parser.test.js.map +0 -1
  735. package/dist/__tests__/analytics/transcript-scanner.test.d.ts +0 -2
  736. package/dist/__tests__/analytics/transcript-scanner.test.d.ts.map +0 -1
  737. package/dist/__tests__/analytics/transcript-scanner.test.js +0 -443
  738. package/dist/__tests__/analytics/transcript-scanner.test.js.map +0 -1
  739. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts +0 -2
  740. package/dist/__tests__/analytics/transcript-token-extractor.test.d.ts.map +0 -1
  741. package/dist/__tests__/analytics/transcript-token-extractor.test.js +0 -177
  742. package/dist/__tests__/analytics/transcript-token-extractor.test.js.map +0 -1
  743. package/dist/analytics/analytics-summary.d.ts +0 -47
  744. package/dist/analytics/analytics-summary.d.ts.map +0 -1
  745. package/dist/analytics/analytics-summary.js +0 -171
  746. package/dist/analytics/analytics-summary.js.map +0 -1
  747. package/dist/analytics/backfill-dedup.d.ts +0 -49
  748. package/dist/analytics/backfill-dedup.d.ts.map +0 -1
  749. package/dist/analytics/backfill-dedup.js +0 -115
  750. package/dist/analytics/backfill-dedup.js.map +0 -1
  751. package/dist/analytics/backfill-engine.d.ts +0 -59
  752. package/dist/analytics/backfill-engine.d.ts.map +0 -1
  753. package/dist/analytics/backfill-engine.js +0 -172
  754. package/dist/analytics/backfill-engine.js.map +0 -1
  755. package/dist/analytics/cost-estimator.d.ts +0 -29
  756. package/dist/analytics/cost-estimator.d.ts.map +0 -1
  757. package/dist/analytics/cost-estimator.js +0 -135
  758. package/dist/analytics/cost-estimator.js.map +0 -1
  759. package/dist/analytics/export.d.ts +0 -7
  760. package/dist/analytics/export.d.ts.map +0 -1
  761. package/dist/analytics/export.js +0 -93
  762. package/dist/analytics/export.js.map +0 -1
  763. package/dist/analytics/index.d.ts +0 -24
  764. package/dist/analytics/index.d.ts.map +0 -1
  765. package/dist/analytics/index.js +0 -30
  766. package/dist/analytics/index.js.map +0 -1
  767. package/dist/analytics/metrics-collector.d.ts +0 -30
  768. package/dist/analytics/metrics-collector.d.ts.map +0 -1
  769. package/dist/analytics/metrics-collector.js +0 -96
  770. package/dist/analytics/metrics-collector.js.map +0 -1
  771. package/dist/analytics/output-estimator.d.ts +0 -26
  772. package/dist/analytics/output-estimator.d.ts.map +0 -1
  773. package/dist/analytics/output-estimator.js +0 -65
  774. package/dist/analytics/output-estimator.js.map +0 -1
  775. package/dist/analytics/query-engine.d.ts +0 -35
  776. package/dist/analytics/query-engine.d.ts.map +0 -1
  777. package/dist/analytics/query-engine.js +0 -239
  778. package/dist/analytics/query-engine.js.map +0 -1
  779. package/dist/analytics/session-catalog.d.ts +0 -45
  780. package/dist/analytics/session-catalog.d.ts.map +0 -1
  781. package/dist/analytics/session-catalog.js +0 -153
  782. package/dist/analytics/session-catalog.js.map +0 -1
  783. package/dist/analytics/session-manager.d.ts +0 -58
  784. package/dist/analytics/session-manager.d.ts.map +0 -1
  785. package/dist/analytics/session-manager.js +0 -396
  786. package/dist/analytics/session-manager.js.map +0 -1
  787. package/dist/analytics/session-types.d.ts +0 -37
  788. package/dist/analytics/session-types.d.ts.map +0 -1
  789. package/dist/analytics/session-types.js +0 -2
  790. package/dist/analytics/session-types.js.map +0 -1
  791. package/dist/analytics/token-extractor.d.ts +0 -31
  792. package/dist/analytics/token-extractor.d.ts.map +0 -1
  793. package/dist/analytics/token-extractor.js +0 -57
  794. package/dist/analytics/token-extractor.js.map +0 -1
  795. package/dist/analytics/token-tracker.d.ts +0 -33
  796. package/dist/analytics/token-tracker.d.ts.map +0 -1
  797. package/dist/analytics/token-tracker.js +0 -443
  798. package/dist/analytics/token-tracker.js.map +0 -1
  799. package/dist/analytics/tokscale-adapter.d.ts +0 -71
  800. package/dist/analytics/tokscale-adapter.d.ts.map +0 -1
  801. package/dist/analytics/tokscale-adapter.js +0 -223
  802. package/dist/analytics/tokscale-adapter.js.map +0 -1
  803. package/dist/analytics/transcript-parser.d.ts +0 -42
  804. package/dist/analytics/transcript-parser.d.ts.map +0 -1
  805. package/dist/analytics/transcript-parser.js +0 -90
  806. package/dist/analytics/transcript-parser.js.map +0 -1
  807. package/dist/analytics/transcript-scanner.d.ts +0 -51
  808. package/dist/analytics/transcript-scanner.d.ts.map +0 -1
  809. package/dist/analytics/transcript-scanner.js +0 -279
  810. package/dist/analytics/transcript-scanner.js.map +0 -1
  811. package/dist/analytics/transcript-token-extractor.d.ts +0 -35
  812. package/dist/analytics/transcript-token-extractor.d.ts.map +0 -1
  813. package/dist/analytics/transcript-token-extractor.js +0 -136
  814. package/dist/analytics/transcript-token-extractor.js.map +0 -1
  815. package/dist/analytics/types.d.ts +0 -119
  816. package/dist/analytics/types.d.ts.map +0 -1
  817. package/dist/analytics/types.js +0 -32
  818. package/dist/analytics/types.js.map +0 -1
  819. package/dist/cli/analytics.d.ts +0 -3
  820. package/dist/cli/analytics.d.ts.map +0 -1
  821. package/dist/cli/analytics.js +0 -105
  822. package/dist/cli/analytics.js.map +0 -1
  823. package/dist/cli/commands/agents.d.ts +0 -5
  824. package/dist/cli/commands/agents.d.ts.map +0 -1
  825. package/dist/cli/commands/agents.js +0 -31
  826. package/dist/cli/commands/agents.js.map +0 -1
  827. package/dist/cli/commands/backfill.d.ts +0 -15
  828. package/dist/cli/commands/backfill.d.ts.map +0 -1
  829. package/dist/cli/commands/backfill.js +0 -146
  830. package/dist/cli/commands/backfill.js.map +0 -1
  831. package/dist/cli/commands/cleanup.d.ts +0 -4
  832. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  833. package/dist/cli/commands/cleanup.js +0 -31
  834. package/dist/cli/commands/cleanup.js.map +0 -1
  835. package/dist/cli/commands/cost.d.ts +0 -4
  836. package/dist/cli/commands/cost.d.ts.map +0 -1
  837. package/dist/cli/commands/cost.js +0 -53
  838. package/dist/cli/commands/cost.js.map +0 -1
  839. package/dist/cli/commands/export.d.ts +0 -5
  840. package/dist/cli/commands/export.d.ts.map +0 -1
  841. package/dist/cli/commands/export.js +0 -30
  842. package/dist/cli/commands/export.js.map +0 -1
  843. package/dist/cli/commands/sessions.d.ts +0 -5
  844. package/dist/cli/commands/sessions.d.ts.map +0 -1
  845. package/dist/cli/commands/sessions.js +0 -89
  846. package/dist/cli/commands/sessions.js.map +0 -1
  847. package/dist/cli/commands/stats.d.ts +0 -5
  848. package/dist/cli/commands/stats.d.ts.map +0 -1
  849. package/dist/cli/commands/stats.js +0 -84
  850. package/dist/cli/commands/stats.js.map +0 -1
  851. package/dist/cli/utils/tokscale-launcher.d.ts +0 -25
  852. package/dist/cli/utils/tokscale-launcher.d.ts.map +0 -1
  853. package/dist/cli/utils/tokscale-launcher.js +0 -70
  854. package/dist/cli/utils/tokscale-launcher.js.map +0 -1
  855. package/dist/hud/analytics-display.d.ts +0 -63
  856. package/dist/hud/analytics-display.d.ts.map +0 -1
  857. package/dist/hud/analytics-display.js +0 -190
  858. package/dist/hud/analytics-display.js.map +0 -1
  859. package/scripts/build-codex-server.mjs +0 -95
@@ -12,9 +12,11 @@ try {
12
12
  } catch (_e) { /* npm not available - native modules will gracefully degrade */ }
13
13
 
14
14
  "use strict";
15
+ var __create = Object.create;
15
16
  var __defProp = Object.defineProperty;
16
17
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
17
18
  var __getOwnPropNames = Object.getOwnPropertyNames;
19
+ var __getProtoOf = Object.getPrototypeOf;
18
20
  var __hasOwnProp = Object.prototype.hasOwnProperty;
19
21
  var __export = (target, all) => {
20
22
  for (var name in all)
@@ -28,6 +30,14 @@ var __copyProps = (to, from, except, desc) => {
28
30
  }
29
31
  return to;
30
32
  };
33
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
34
+ // If the importer is in node compatibility mode or this is not an ESM
35
+ // file that has been converted to a CommonJS file using a Babel-
36
+ // compatible transform (i.e. "__esModule" has not been set), then set
37
+ // "default" to the CommonJS "module.exports" for node compatibility.
38
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
39
+ mod
40
+ ));
31
41
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
42
 
33
43
  // src/team/bridge-entry.ts
@@ -37,13 +47,13 @@ __export(bridge_entry_exports, {
37
47
  });
38
48
  module.exports = __toCommonJS(bridge_entry_exports);
39
49
  var import_fs10 = require("fs");
40
- var import_path10 = require("path");
50
+ var import_path12 = require("path");
41
51
  var import_os2 = require("os");
42
52
 
43
53
  // src/team/mcp-team-bridge.ts
44
54
  var import_child_process2 = require("child_process");
45
55
  var import_fs8 = require("fs");
46
- var import_path8 = require("path");
56
+ var import_path10 = require("path");
47
57
 
48
58
  // src/team/fs-utils.ts
49
59
  var import_fs = require("fs");
@@ -69,31 +79,34 @@ function appendFileWithMode(filePath, data, mode = 384) {
69
79
  function ensureDirWithMode(dirPath, mode = 448) {
70
80
  if (!(0, import_fs.existsSync)(dirPath)) (0, import_fs.mkdirSync)(dirPath, { recursive: true, mode });
71
81
  }
72
- function safeRealpath(p) {
73
- try {
74
- return (0, import_fs.realpathSync)(p);
75
- } catch {
76
- const parent = (0, import_path.dirname)(p);
77
- const name = (0, import_path.basename)(p);
82
+ function canonicalizePath(p) {
83
+ const absInput = (0, import_path.resolve)(p);
84
+ const tail = [];
85
+ let probe = absInput;
86
+ while (true) {
78
87
  try {
79
- return (0, import_path.resolve)((0, import_fs.realpathSync)(parent), name);
88
+ const realBase = (0, import_fs.realpathSync)(probe);
89
+ return tail.reduce((acc, seg) => (0, import_path.resolve)(acc, seg), realBase);
80
90
  } catch {
81
- return (0, import_path.resolve)(p);
91
+ const parent = (0, import_path.dirname)(probe);
92
+ if (parent === probe) return absInput;
93
+ tail.unshift((0, import_path.basename)(probe));
94
+ probe = parent;
82
95
  }
83
96
  }
84
97
  }
85
98
  function validateResolvedPath(resolvedPath, expectedBase) {
86
- const absResolved = safeRealpath(resolvedPath);
87
- const absBase = safeRealpath(expectedBase);
99
+ const absResolved = canonicalizePath(resolvedPath);
100
+ const absBase = canonicalizePath(expectedBase);
88
101
  const rel = (0, import_path.relative)(absBase, absResolved);
89
- if (rel.startsWith("..") || (0, import_path.resolve)(absBase, rel) !== absResolved) {
102
+ if (rel !== "" && (rel.startsWith("..") || (0, import_path.isAbsolute)(rel) || (0, import_path.resolve)(absBase, rel) !== absResolved)) {
90
103
  throw new Error(`Path traversal detected: "${resolvedPath}" escapes base "${expectedBase}"`);
91
104
  }
92
105
  }
93
106
 
94
107
  // src/team/task-file-ops.ts
95
108
  var import_fs3 = require("fs");
96
- var import_path3 = require("path");
109
+ var import_path5 = require("path");
97
110
 
98
111
  // src/utils/paths.ts
99
112
  var import_path2 = require("path");
@@ -111,11 +124,16 @@ function getConfigDir() {
111
124
  function getClaudeConfigDir() {
112
125
  return getConfigDir();
113
126
  }
114
- var STALE_THRESHOLD_MS = 60 * 60 * 1e3;
127
+ var STALE_THRESHOLD_MS = 24 * 60 * 60 * 1e3;
115
128
 
116
129
  // src/team/tmux-session.ts
117
130
  var import_child_process = require("child_process");
131
+ var import_path3 = require("path");
132
+ var import_util = require("util");
133
+ var import_promises = __toESM(require("fs/promises"), 1);
118
134
  var TMUX_SESSION_PREFIX = "omc-team";
135
+ var promisifiedExec = (0, import_util.promisify)(import_child_process.exec);
136
+ var promisifiedExecFile = (0, import_util.promisify)(import_child_process.execFile);
119
137
  function sanitizeName(name) {
120
138
  const sanitized = name.replace(/[^a-zA-Z0-9-]/g, "");
121
139
  if (sanitized.length === 0) {
@@ -137,6 +155,38 @@ function killSession(teamName, workerName) {
137
155
  }
138
156
  }
139
157
 
158
+ // src/team/state-paths.ts
159
+ var import_path4 = require("path");
160
+ var TeamPaths = {
161
+ root: (teamName) => `.omc/state/team/${teamName}`,
162
+ config: (teamName) => `.omc/state/team/${teamName}/config.json`,
163
+ shutdown: (teamName) => `.omc/state/team/${teamName}/shutdown.json`,
164
+ tasks: (teamName) => `.omc/state/team/${teamName}/tasks`,
165
+ taskFile: (teamName, taskId) => `.omc/state/team/${teamName}/tasks/${taskId}.json`,
166
+ workers: (teamName) => `.omc/state/team/${teamName}/workers`,
167
+ workerDir: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}`,
168
+ heartbeat: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/heartbeat.json`,
169
+ inbox: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/inbox.md`,
170
+ outbox: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/outbox.jsonl`,
171
+ ready: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/.ready`,
172
+ overlay: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/AGENTS.md`,
173
+ shutdownAck: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/shutdown-ack.json`,
174
+ done: (teamName, workerName) => `.omc/state/team/${teamName}/workers/${workerName}/done.json`,
175
+ mailbox: (teamName, workerName) => `.omc/state/team/${teamName}/mailbox/${workerName}.jsonl`
176
+ };
177
+ function getTaskStoragePath(cwd, teamName, taskId) {
178
+ if (taskId !== void 0) {
179
+ return (0, import_path4.join)(cwd, TeamPaths.taskFile(teamName, taskId));
180
+ }
181
+ return (0, import_path4.join)(cwd, TeamPaths.tasks(teamName));
182
+ }
183
+ function getLegacyTaskStoragePath(claudeConfigDir, teamName, taskId) {
184
+ if (taskId !== void 0) {
185
+ return (0, import_path4.join)(claudeConfigDir, "tasks", teamName, `${taskId}.json`);
186
+ }
187
+ return (0, import_path4.join)(claudeConfigDir, "tasks", teamName);
188
+ }
189
+
140
190
  // src/team/task-file-ops.ts
141
191
  var DEFAULT_STALE_LOCK_MS = 3e4;
142
192
  function isPidAlive(pid) {
@@ -151,9 +201,9 @@ function isPidAlive(pid) {
151
201
  }
152
202
  function acquireTaskLock(teamName, taskId, opts) {
153
203
  const staleLockMs = opts?.staleLockMs ?? DEFAULT_STALE_LOCK_MS;
154
- const dir = tasksDir(teamName);
204
+ const dir = canonicalTasksDir(teamName, opts?.cwd);
155
205
  ensureDirWithMode(dir);
156
- const lockPath = (0, import_path3.join)(dir, `${sanitizeTaskId(taskId)}.lock`);
206
+ const lockPath = (0, import_path5.join)(dir, `${sanitizeTaskId(taskId)}.lock`);
157
207
  for (let attempt = 0; attempt < 2; attempt++) {
158
208
  try {
159
209
  const fd = (0, import_fs3.openSync)(lockPath, import_fs3.constants.O_CREAT | import_fs3.constants.O_EXCL | import_fs3.constants.O_WRONLY, 384);
@@ -212,19 +262,33 @@ function sanitizeTaskId(taskId) {
212
262
  }
213
263
  return taskId;
214
264
  }
215
- function tasksDir(teamName) {
216
- const result = (0, import_path3.join)(getClaudeConfigDir(), "tasks", sanitizeName(teamName));
217
- validateResolvedPath(result, (0, import_path3.join)(getClaudeConfigDir(), "tasks"));
218
- return result;
265
+ function canonicalTasksDir(teamName, cwd) {
266
+ const root = cwd ?? process.cwd();
267
+ const dir = getTaskStoragePath(root, sanitizeName(teamName));
268
+ validateResolvedPath(dir, (0, import_path5.join)(root, ".omc", "state", "team"));
269
+ return dir;
219
270
  }
220
- function taskPath(teamName, taskId) {
221
- return (0, import_path3.join)(tasksDir(teamName), `${sanitizeTaskId(taskId)}.json`);
271
+ function legacyTasksDir(teamName) {
272
+ const claudeConfigDir = getClaudeConfigDir();
273
+ const dir = getLegacyTaskStoragePath(claudeConfigDir, sanitizeName(teamName));
274
+ validateResolvedPath(dir, (0, import_path5.join)(claudeConfigDir, "tasks"));
275
+ return dir;
276
+ }
277
+ function resolveTaskPathForRead(teamName, taskId, cwd) {
278
+ const canonical = (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.json`);
279
+ if ((0, import_fs3.existsSync)(canonical)) return canonical;
280
+ const legacy = (0, import_path5.join)(legacyTasksDir(teamName), `${sanitizeTaskId(taskId)}.json`);
281
+ if ((0, import_fs3.existsSync)(legacy)) return legacy;
282
+ return canonical;
283
+ }
284
+ function resolveTaskPathForWrite(teamName, taskId, cwd) {
285
+ return (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.json`);
222
286
  }
223
- function failureSidecarPath(teamName, taskId) {
224
- return (0, import_path3.join)(tasksDir(teamName), `${sanitizeTaskId(taskId)}.failure.json`);
287
+ function failureSidecarPath(teamName, taskId, cwd) {
288
+ return (0, import_path5.join)(canonicalTasksDir(teamName, cwd), `${sanitizeTaskId(taskId)}.failure.json`);
225
289
  }
226
- function readTask(teamName, taskId) {
227
- const filePath = taskPath(teamName, taskId);
290
+ function readTask(teamName, taskId, opts) {
291
+ const filePath = resolveTaskPathForRead(teamName, taskId, opts?.cwd);
228
292
  if (!(0, import_fs3.existsSync)(filePath)) return null;
229
293
  try {
230
294
  const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
@@ -236,10 +300,10 @@ function readTask(teamName, taskId) {
236
300
  function updateTask(teamName, taskId, updates, opts) {
237
301
  const useLock = opts?.useLock ?? true;
238
302
  const doUpdate = () => {
239
- const filePath = taskPath(teamName, taskId);
303
+ const readPath = resolveTaskPathForRead(teamName, taskId, opts?.cwd);
240
304
  let task;
241
305
  try {
242
- const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
306
+ const raw = (0, import_fs3.readFileSync)(readPath, "utf-8");
243
307
  task = JSON.parse(raw);
244
308
  } catch {
245
309
  throw new Error(`Task file not found or malformed: ${taskId}`);
@@ -249,13 +313,14 @@ function updateTask(teamName, taskId, updates, opts) {
249
313
  task[key] = value;
250
314
  }
251
315
  }
252
- atomicWriteJson(filePath, task);
316
+ const writePath = resolveTaskPathForWrite(teamName, taskId, opts?.cwd);
317
+ atomicWriteJson(writePath, task);
253
318
  };
254
319
  if (!useLock) {
255
320
  doUpdate();
256
321
  return;
257
322
  }
258
- const handle = acquireTaskLock(teamName, taskId);
323
+ const handle = acquireTaskLock(teamName, taskId, { cwd: opts?.cwd });
259
324
  if (!handle) {
260
325
  if (typeof process !== "undefined" && process.stderr) {
261
326
  process.stderr.write(`[task-file-ops] WARN: could not acquire lock for task ${taskId}, updating without lock
@@ -270,27 +335,28 @@ function updateTask(teamName, taskId, updates, opts) {
270
335
  releaseTaskLock(handle);
271
336
  }
272
337
  }
273
- async function findNextTask(teamName, workerName) {
274
- const dir = tasksDir(teamName);
338
+ async function findNextTask(teamName, workerName, opts) {
339
+ const dir = canonicalTasksDir(teamName, opts?.cwd);
275
340
  if (!(0, import_fs3.existsSync)(dir)) return null;
276
- const taskIds = listTaskIds(teamName);
341
+ const taskIds = listTaskIds(teamName, opts);
277
342
  for (const id of taskIds) {
278
- const task = readTask(teamName, id);
343
+ const task = readTask(teamName, id, opts);
279
344
  if (!task) continue;
280
345
  if (task.status !== "pending") continue;
281
346
  if (task.owner !== workerName) continue;
282
- if (!areBlockersResolved(teamName, task.blockedBy)) continue;
283
- const handle = acquireTaskLock(teamName, id, { workerName });
347
+ if (!areBlockersResolved(teamName, task.blockedBy, opts)) continue;
348
+ const handle = acquireTaskLock(teamName, id, { workerName, cwd: opts?.cwd });
284
349
  if (!handle) continue;
285
350
  try {
286
- const freshTask = readTask(teamName, id);
287
- if (!freshTask || freshTask.status !== "pending" || freshTask.owner !== workerName || !areBlockersResolved(teamName, freshTask.blockedBy)) {
351
+ const freshTask = readTask(teamName, id, opts);
352
+ if (!freshTask || freshTask.status !== "pending" || freshTask.owner !== workerName || !areBlockersResolved(teamName, freshTask.blockedBy, opts)) {
288
353
  continue;
289
354
  }
290
- const filePath = (0, import_path3.join)(tasksDir(teamName), `${sanitizeTaskId(id)}.json`);
355
+ const filePath = resolveTaskPathForWrite(teamName, id, opts?.cwd);
291
356
  let taskData;
292
357
  try {
293
- const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
358
+ const readPath = resolveTaskPathForRead(teamName, id, opts?.cwd);
359
+ const raw = (0, import_fs3.readFileSync)(readPath, "utf-8");
294
360
  taskData = JSON.parse(raw);
295
361
  } catch {
296
362
  continue;
@@ -307,17 +373,17 @@ async function findNextTask(teamName, workerName) {
307
373
  }
308
374
  return null;
309
375
  }
310
- function areBlockersResolved(teamName, blockedBy) {
376
+ function areBlockersResolved(teamName, blockedBy, opts) {
311
377
  if (!blockedBy || blockedBy.length === 0) return true;
312
378
  for (const blockerId of blockedBy) {
313
- const blocker = readTask(teamName, blockerId);
379
+ const blocker = readTask(teamName, blockerId, opts);
314
380
  if (!blocker || blocker.status !== "completed") return false;
315
381
  }
316
382
  return true;
317
383
  }
318
- function writeTaskFailure(teamName, taskId, error) {
319
- const filePath = failureSidecarPath(teamName, taskId);
320
- const existing = readTaskFailure(teamName, taskId);
384
+ function writeTaskFailure(teamName, taskId, error, opts) {
385
+ const filePath = failureSidecarPath(teamName, taskId, opts?.cwd);
386
+ const existing = readTaskFailure(teamName, taskId, opts);
321
387
  const sidecar = {
322
388
  taskId,
323
389
  lastError: error,
@@ -326,8 +392,8 @@ function writeTaskFailure(teamName, taskId, error) {
326
392
  };
327
393
  atomicWriteJson(filePath, sidecar);
328
394
  }
329
- function readTaskFailure(teamName, taskId) {
330
- const filePath = failureSidecarPath(teamName, taskId);
395
+ function readTaskFailure(teamName, taskId, opts) {
396
+ const filePath = failureSidecarPath(teamName, taskId, opts?.cwd);
331
397
  if (!(0, import_fs3.existsSync)(filePath)) return null;
332
398
  try {
333
399
  const raw = (0, import_fs3.readFileSync)(filePath, "utf-8");
@@ -337,52 +403,58 @@ function readTaskFailure(teamName, taskId) {
337
403
  }
338
404
  }
339
405
  var DEFAULT_MAX_TASK_RETRIES = 5;
340
- function isTaskRetryExhausted(teamName, taskId, maxRetries = DEFAULT_MAX_TASK_RETRIES) {
341
- const failure = readTaskFailure(teamName, taskId);
406
+ function isTaskRetryExhausted(teamName, taskId, maxRetries = DEFAULT_MAX_TASK_RETRIES, opts) {
407
+ const failure = readTaskFailure(teamName, taskId, opts);
342
408
  if (!failure) return false;
343
409
  return failure.retryCount >= maxRetries;
344
410
  }
345
- function listTaskIds(teamName) {
346
- const dir = tasksDir(teamName);
347
- if (!(0, import_fs3.existsSync)(dir)) return [];
348
- try {
349
- return (0, import_fs3.readdirSync)(dir).filter((f) => f.endsWith(".json") && !f.includes(".tmp.") && !f.includes(".failure.")).map((f) => f.replace(".json", "")).sort((a, b) => {
350
- const numA = parseInt(a, 10);
351
- const numB = parseInt(b, 10);
352
- if (!isNaN(numA) && !isNaN(numB)) return numA - numB;
353
- return a.localeCompare(b);
354
- });
355
- } catch {
356
- return [];
357
- }
411
+ function listTaskIds(teamName, opts) {
412
+ const scanDir = (dir) => {
413
+ if (!(0, import_fs3.existsSync)(dir)) return [];
414
+ try {
415
+ return (0, import_fs3.readdirSync)(dir).filter((f) => f.endsWith(".json") && !f.includes(".tmp.") && !f.includes(".failure.") && !f.endsWith(".lock")).map((f) => f.replace(".json", ""));
416
+ } catch {
417
+ return [];
418
+ }
419
+ };
420
+ let ids = scanDir(canonicalTasksDir(teamName, opts?.cwd));
421
+ if (ids.length === 0) {
422
+ ids = scanDir(legacyTasksDir(teamName));
423
+ }
424
+ return ids.sort((a, b) => {
425
+ const numA = parseInt(a, 10);
426
+ const numB = parseInt(b, 10);
427
+ if (!isNaN(numA) && !isNaN(numB)) return numA - numB;
428
+ return a.localeCompare(b);
429
+ });
358
430
  }
359
431
 
360
432
  // src/team/inbox-outbox.ts
361
433
  var import_fs4 = require("fs");
362
- var import_path4 = require("path");
434
+ var import_path6 = require("path");
363
435
  var MAX_INBOX_READ_SIZE = 10 * 1024 * 1024;
364
436
  function teamsDir(teamName) {
365
- const result = (0, import_path4.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName));
366
- validateResolvedPath(result, (0, import_path4.join)(getClaudeConfigDir(), "teams"));
437
+ const result = (0, import_path6.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName));
438
+ validateResolvedPath(result, (0, import_path6.join)(getClaudeConfigDir(), "teams"));
367
439
  return result;
368
440
  }
369
441
  function inboxPath(teamName, workerName) {
370
- return (0, import_path4.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.jsonl`);
442
+ return (0, import_path6.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.jsonl`);
371
443
  }
372
444
  function inboxCursorPath(teamName, workerName) {
373
- return (0, import_path4.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.offset`);
445
+ return (0, import_path6.join)(teamsDir(teamName), "inbox", `${sanitizeName(workerName)}.offset`);
374
446
  }
375
447
  function outboxPath(teamName, workerName) {
376
- return (0, import_path4.join)(teamsDir(teamName), "outbox", `${sanitizeName(workerName)}.jsonl`);
448
+ return (0, import_path6.join)(teamsDir(teamName), "outbox", `${sanitizeName(workerName)}.jsonl`);
377
449
  }
378
450
  function signalPath(teamName, workerName) {
379
- return (0, import_path4.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.shutdown`);
451
+ return (0, import_path6.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.shutdown`);
380
452
  }
381
453
  function drainSignalPath(teamName, workerName) {
382
- return (0, import_path4.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.drain`);
454
+ return (0, import_path6.join)(teamsDir(teamName), "signals", `${sanitizeName(workerName)}.drain`);
383
455
  }
384
456
  function ensureDir(filePath) {
385
- const dir = (0, import_path4.dirname)(filePath);
457
+ const dir = (0, import_path6.dirname)(filePath);
386
458
  ensureDirWithMode(dir);
387
459
  }
388
460
  function appendOutbox(teamName, workerName, message) {
@@ -398,7 +470,7 @@ function rotateOutboxIfNeeded(teamName, workerName, maxLines) {
398
470
  const lines = content.split("\n").filter((l) => l.trim());
399
471
  if (lines.length <= maxLines) return;
400
472
  const keepCount = Math.floor(maxLines / 2);
401
- const kept = lines.slice(-keepCount);
473
+ const kept = keepCount === 0 ? [] : lines.slice(-keepCount);
402
474
  const tmpPath = `${filePath}.tmp.${process.pid}.${Date.now()}`;
403
475
  writeFileWithMode(tmpPath, kept.join("\n") + "\n");
404
476
  (0, import_fs4.renameSync)(tmpPath, filePath);
@@ -475,7 +547,8 @@ function readNewInboxMessages(teamName, workerName) {
475
547
  messages.push(JSON.parse(cleanLine));
476
548
  bytesProcessed += lineBytes;
477
549
  } catch {
478
- break;
550
+ console.warn(`[inbox-outbox] Skipping malformed JSONL line for ${workerName}: ${cleanLine.slice(0, 80)}`);
551
+ bytesProcessed += lineBytes;
479
552
  }
480
553
  }
481
554
  const newOffset = offset + (bytesProcessed > 0 ? bytesProcessed : 0);
@@ -525,15 +598,15 @@ function deleteDrainSignal(teamName, workerName) {
525
598
 
526
599
  // src/team/team-registration.ts
527
600
  var import_fs5 = require("fs");
528
- var import_path5 = require("path");
601
+ var import_path7 = require("path");
529
602
  function configPath(teamName) {
530
- const result = (0, import_path5.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName), "config.json");
531
- validateResolvedPath(result, (0, import_path5.join)(getClaudeConfigDir(), "teams"));
603
+ const result = (0, import_path7.join)(getClaudeConfigDir(), "teams", sanitizeName(teamName), "config.json");
604
+ validateResolvedPath(result, (0, import_path7.join)(getClaudeConfigDir(), "teams"));
532
605
  return result;
533
606
  }
534
607
  function shadowRegistryPath(workingDirectory) {
535
- const result = (0, import_path5.join)(workingDirectory, ".omc", "state", "team-mcp-workers.json");
536
- validateResolvedPath(result, (0, import_path5.join)(workingDirectory, ".omc", "state"));
608
+ const result = (0, import_path7.join)(workingDirectory, ".omc", "state", "team-mcp-workers.json");
609
+ validateResolvedPath(result, (0, import_path7.join)(workingDirectory, ".omc", "state"));
537
610
  return result;
538
611
  }
539
612
  function unregisterMcpWorker(teamName, workerName, workingDirectory) {
@@ -592,9 +665,9 @@ function listMcpWorkers(teamName, workingDirectory) {
592
665
 
593
666
  // src/team/heartbeat.ts
594
667
  var import_fs6 = require("fs");
595
- var import_path6 = require("path");
668
+ var import_path8 = require("path");
596
669
  function heartbeatPath(workingDirectory, teamName, workerName) {
597
- return (0, import_path6.join)(workingDirectory, ".omc", "state", "team-bridge", sanitizeName(teamName), `${sanitizeName(workerName)}.heartbeat.json`);
670
+ return (0, import_path8.join)(workingDirectory, ".omc", "state", "team-bridge", sanitizeName(teamName), `${sanitizeName(workerName)}.heartbeat.json`);
598
671
  }
599
672
  function writeHeartbeat(workingDirectory, data) {
600
673
  const filePath = heartbeatPath(workingDirectory, data.teamName, data.workerName);
@@ -767,11 +840,96 @@ function findPermissionViolations(changedPaths, permissions, cwd) {
767
840
 
768
841
  // src/team/team-status.ts
769
842
  var import_fs7 = require("fs");
770
- var import_path7 = require("path");
843
+ var import_path9 = require("path");
844
+
845
+ // src/team/usage-tracker.ts
846
+ var import_node_fs = require("node:fs");
847
+ var import_node_path4 = require("node:path");
848
+ function getUsageLogPath(workingDirectory, teamName) {
849
+ return (0, import_node_path4.join)(workingDirectory, ".omc", "logs", `team-usage-${teamName}.jsonl`);
850
+ }
851
+ function recordTaskUsage(workingDirectory, teamName, record) {
852
+ const logPath = getUsageLogPath(workingDirectory, teamName);
853
+ const dir = (0, import_node_path4.join)(workingDirectory, ".omc", "logs");
854
+ validateResolvedPath(logPath, workingDirectory);
855
+ ensureDirWithMode(dir);
856
+ appendFileWithMode(logPath, JSON.stringify(record) + "\n");
857
+ }
858
+ function measureCharCounts(promptFilePath, outputFilePath) {
859
+ let promptChars = 0;
860
+ let responseChars = 0;
861
+ try {
862
+ if ((0, import_node_fs.existsSync)(promptFilePath)) {
863
+ promptChars = (0, import_node_fs.statSync)(promptFilePath).size;
864
+ }
865
+ } catch {
866
+ }
867
+ try {
868
+ if ((0, import_node_fs.existsSync)(outputFilePath)) {
869
+ responseChars = (0, import_node_fs.statSync)(outputFilePath).size;
870
+ }
871
+ } catch {
872
+ }
873
+ return { promptChars, responseChars };
874
+ }
875
+ function readUsageRecords(workingDirectory, teamName) {
876
+ const logPath = getUsageLogPath(workingDirectory, teamName);
877
+ if (!(0, import_node_fs.existsSync)(logPath)) return [];
878
+ const content = (0, import_node_fs.readFileSync)(logPath, "utf-8");
879
+ const lines = content.split("\n").filter((l) => l.trim());
880
+ const records = [];
881
+ for (const line of lines) {
882
+ try {
883
+ records.push(JSON.parse(line));
884
+ } catch {
885
+ }
886
+ }
887
+ return records;
888
+ }
889
+ function generateUsageReport(workingDirectory, teamName) {
890
+ const records = readUsageRecords(workingDirectory, teamName);
891
+ const workerMap = /* @__PURE__ */ new Map();
892
+ for (const r of records) {
893
+ const existing = workerMap.get(r.workerName);
894
+ if (existing) {
895
+ existing.taskCount++;
896
+ existing.totalWallClockMs += r.wallClockMs;
897
+ existing.totalPromptChars += r.promptChars;
898
+ existing.totalResponseChars += r.responseChars;
899
+ } else {
900
+ workerMap.set(r.workerName, {
901
+ workerName: r.workerName,
902
+ provider: r.provider,
903
+ model: r.model,
904
+ taskCount: 1,
905
+ totalWallClockMs: r.wallClockMs,
906
+ totalPromptChars: r.promptChars,
907
+ totalResponseChars: r.responseChars
908
+ });
909
+ }
910
+ }
911
+ const workers = Array.from(workerMap.values());
912
+ return {
913
+ teamName,
914
+ totalWallClockMs: workers.reduce((sum, w) => sum + w.totalWallClockMs, 0),
915
+ taskCount: workers.reduce((sum, w) => sum + w.taskCount, 0),
916
+ workers
917
+ };
918
+ }
919
+
920
+ // src/team/team-status.ts
921
+ function emptyUsageReport(teamName) {
922
+ return {
923
+ teamName,
924
+ totalWallClockMs: 0,
925
+ taskCount: 0,
926
+ workers: []
927
+ };
928
+ }
771
929
  function peekRecentOutboxMessages(teamName, workerName, maxMessages = 10) {
772
930
  const safeName = sanitizeName(teamName);
773
931
  const safeWorker = sanitizeName(workerName);
774
- const outboxPath2 = (0, import_path7.join)(getClaudeConfigDir(), "teams", safeName, "outbox", `${safeWorker}.jsonl`);
932
+ const outboxPath2 = (0, import_path9.join)(getClaudeConfigDir(), "teams", safeName, "outbox", `${safeWorker}.jsonl`);
775
933
  if (!(0, import_fs7.existsSync)(outboxPath2)) return [];
776
934
  try {
777
935
  const content = (0, import_fs7.readFileSync)(outboxPath2, "utf-8");
@@ -789,14 +947,18 @@ function peekRecentOutboxMessages(teamName, workerName, maxMessages = 10) {
789
947
  return [];
790
948
  }
791
949
  }
792
- function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
950
+ function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4, options) {
951
+ const startedAt = Date.now();
793
952
  const mcpWorkers = listMcpWorkers(teamName, workingDirectory);
794
- const taskIds = listTaskIds(teamName);
953
+ const taskScanStartedAt = Date.now();
954
+ const taskIds = listTaskIds(teamName, { cwd: workingDirectory });
795
955
  const tasks = [];
796
956
  for (const id of taskIds) {
797
- const task = readTask(teamName, id);
957
+ const task = readTask(teamName, id, { cwd: workingDirectory });
798
958
  if (task) tasks.push(task);
799
959
  }
960
+ const taskScanMs = Date.now() - taskScanStartedAt;
961
+ const workerScanStartedAt = Date.now();
800
962
  const workers = mcpWorkers.map((w) => {
801
963
  const heartbeat = readHeartbeat(workingDirectory, teamName, w.name);
802
964
  const alive = isWorkerAlive(workingDirectory, teamName, w.name, heartbeatMaxAgeMs);
@@ -821,6 +983,15 @@ function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
821
983
  taskStats
822
984
  };
823
985
  });
986
+ const workerScanMs = Date.now() - workerScanStartedAt;
987
+ const includeUsage = options?.includeUsage ?? true;
988
+ let usage = emptyUsageReport(teamName);
989
+ let usageReadMs = 0;
990
+ if (includeUsage) {
991
+ const usageReadStartedAt = Date.now();
992
+ usage = generateUsageReport(workingDirectory, teamName);
993
+ usageReadMs = Date.now() - usageReadStartedAt;
994
+ }
824
995
  const totalFailed = tasks.filter((t) => t.status === "completed" && t.metadata?.permanentlyFailed === true).length;
825
996
  const taskSummary = {
826
997
  total: tasks.length,
@@ -833,6 +1004,13 @@ function getTeamStatus(teamName, workingDirectory, heartbeatMaxAgeMs = 3e4) {
833
1004
  teamName,
834
1005
  workers,
835
1006
  taskSummary,
1007
+ usage,
1008
+ performance: {
1009
+ taskScanMs,
1010
+ workerScanMs,
1011
+ usageReadMs,
1012
+ totalMs: Date.now() - startedAt
1013
+ },
836
1014
  lastUpdated: (/* @__PURE__ */ new Date()).toISOString()
837
1015
  };
838
1016
  }
@@ -989,18 +1167,18 @@ function buildTaskPrompt(task, messages, config) {
989
1167
  return result;
990
1168
  }
991
1169
  function writePromptFile(config, taskId, prompt) {
992
- const dir = (0, import_path8.join)(config.workingDirectory, ".omc", "prompts");
1170
+ const dir = (0, import_path10.join)(config.workingDirectory, ".omc", "prompts");
993
1171
  ensureDirWithMode(dir);
994
1172
  const filename = `team-${config.teamName}-task-${taskId}-${Date.now()}.md`;
995
- const filePath = (0, import_path8.join)(dir, filename);
1173
+ const filePath = (0, import_path10.join)(dir, filename);
996
1174
  writeFileWithMode(filePath, prompt);
997
1175
  return filePath;
998
1176
  }
999
1177
  function getOutputPath(config, taskId) {
1000
- const dir = (0, import_path8.join)(config.workingDirectory, ".omc", "outputs");
1178
+ const dir = (0, import_path10.join)(config.workingDirectory, ".omc", "outputs");
1001
1179
  ensureDirWithMode(dir);
1002
1180
  const suffix = Math.random().toString(36).slice(2, 8);
1003
- return (0, import_path8.join)(dir, `team-${config.teamName}-task-${taskId}-${Date.now()}-${suffix}.md`);
1181
+ return (0, import_path10.join)(dir, `team-${config.teamName}-task-${taskId}-${Date.now()}-${suffix}.md`);
1004
1182
  }
1005
1183
  function readOutputSummary(outputFile) {
1006
1184
  try {
@@ -1022,6 +1200,22 @@ function readOutputSummary(outputFile) {
1022
1200
  return "(error reading output)";
1023
1201
  }
1024
1202
  }
1203
+ function recordTaskCompletionUsage(args) {
1204
+ const completedAt = (/* @__PURE__ */ new Date()).toISOString();
1205
+ const wallClockMs = Math.max(0, Date.now() - args.startedAt);
1206
+ const { promptChars, responseChars } = measureCharCounts(args.promptFile, args.outputFile);
1207
+ recordTaskUsage(args.config.workingDirectory, args.config.teamName, {
1208
+ taskId: args.taskId,
1209
+ workerName: args.config.workerName,
1210
+ provider: args.provider,
1211
+ model: args.config.model ?? "default",
1212
+ startedAt: args.startedAtIso,
1213
+ completedAt,
1214
+ wallClockMs,
1215
+ promptChars,
1216
+ responseChars
1217
+ });
1218
+ }
1025
1219
  var MAX_CODEX_OUTPUT_SIZE = 1024 * 1024;
1026
1220
  function parseCodexOutput(output) {
1027
1221
  const lines = output.trim().split("\n").filter((l) => l.trim());
@@ -1065,7 +1259,7 @@ function spawnCliProcess(provider, prompt, model, cwd, timeoutMs) {
1065
1259
  let cmd;
1066
1260
  if (provider === "codex") {
1067
1261
  cmd = "codex";
1068
- args = ["exec", "-m", model || "gpt-5.3-codex", "--json", "--full-auto", "--skip-git-repo-check"];
1262
+ args = ["exec", "-m", model || "gpt-5.3-codex", "--json", "--dangerously-bypass-approvals-and-sandbox", "--skip-git-repo-check"];
1069
1263
  } else {
1070
1264
  cmd = "gemini";
1071
1265
  args = ["--yolo"];
@@ -1240,8 +1434,10 @@ async function runBridge(config) {
1240
1434
  await handleShutdown(config, shutdownBeforeSpawn, null);
1241
1435
  return;
1242
1436
  }
1437
+ const taskStartedAt = Date.now();
1438
+ const taskStartedAtIso = new Date(taskStartedAt).toISOString();
1243
1439
  const prompt = buildTaskPrompt(task, messages, config);
1244
- const _promptFile = writePromptFile(config, task.id, prompt);
1440
+ const promptFile = writePromptFile(config, task.id, prompt);
1245
1441
  const outputFile = getOutputPath(config, task.id);
1246
1442
  log(`[bridge] Executing task ${task.id}: ${task.subject}`);
1247
1443
  try {
@@ -1295,6 +1491,19 @@ ${violationSummary}`,
1295
1491
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1296
1492
  });
1297
1493
  log(`[bridge] Task ${task.id} failed: permission violations (enforce mode)`);
1494
+ try {
1495
+ recordTaskCompletionUsage({
1496
+ config,
1497
+ taskId: task.id,
1498
+ promptFile,
1499
+ outputFile,
1500
+ provider,
1501
+ startedAt: taskStartedAt,
1502
+ startedAtIso: taskStartedAtIso
1503
+ });
1504
+ } catch (usageErr) {
1505
+ log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
1506
+ }
1298
1507
  consecutiveErrors = 0;
1299
1508
  } else {
1300
1509
  audit(config, "permission_audit", task.id, {
@@ -1314,6 +1523,19 @@ ${violationSummary}`);
1314
1523
  [AUDIT WARNING: ${violations.length} permission violation(s) detected]`,
1315
1524
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1316
1525
  });
1526
+ try {
1527
+ recordTaskCompletionUsage({
1528
+ config,
1529
+ taskId: task.id,
1530
+ promptFile,
1531
+ outputFile,
1532
+ provider,
1533
+ startedAt: taskStartedAt,
1534
+ startedAtIso: taskStartedAtIso
1535
+ });
1536
+ } catch (usageErr) {
1537
+ log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
1538
+ }
1317
1539
  log(`[bridge] Task ${task.id} completed (with ${violations.length} audit warning(s))`);
1318
1540
  }
1319
1541
  } else {
@@ -1327,6 +1549,19 @@ ${violationSummary}`);
1327
1549
  summary,
1328
1550
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1329
1551
  });
1552
+ try {
1553
+ recordTaskCompletionUsage({
1554
+ config,
1555
+ taskId: task.id,
1556
+ promptFile,
1557
+ outputFile,
1558
+ provider,
1559
+ startedAt: taskStartedAt,
1560
+ startedAtIso: taskStartedAtIso
1561
+ });
1562
+ } catch (usageErr) {
1563
+ log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
1564
+ }
1330
1565
  log(`[bridge] Task ${task.id} completed`);
1331
1566
  }
1332
1567
  } catch (err) {
@@ -1358,6 +1593,19 @@ ${violationSummary}`);
1358
1593
  error: `Task permanently failed after ${attempt} attempts: ${errorMsg}`,
1359
1594
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1360
1595
  });
1596
+ try {
1597
+ recordTaskCompletionUsage({
1598
+ config,
1599
+ taskId: task.id,
1600
+ promptFile,
1601
+ outputFile,
1602
+ provider,
1603
+ startedAt: taskStartedAt,
1604
+ startedAtIso: taskStartedAtIso
1605
+ });
1606
+ } catch (usageErr) {
1607
+ log(`[bridge] usage tracking failed for task ${task.id}: ${usageErr.message}`);
1608
+ }
1361
1609
  log(`[bridge] Task ${task.id} permanently failed after ${attempt} attempts`);
1362
1610
  } else {
1363
1611
  updateTask(teamName, task.id, { status: "pending" });
@@ -1382,7 +1630,7 @@ ${violationSummary}`);
1382
1630
  idleNotified = true;
1383
1631
  }
1384
1632
  try {
1385
- const teamStatus = getTeamStatus(teamName, workingDirectory);
1633
+ const teamStatus = getTeamStatus(teamName, workingDirectory, 3e4, { includeUsage: false });
1386
1634
  if (teamStatus.taskSummary.total > 0 && teamStatus.taskSummary.pending === 0 && teamStatus.taskSummary.inProgress === 0) {
1387
1635
  log(`[bridge] All team tasks complete. Auto-terminating worker.`);
1388
1636
  appendOutbox(teamName, workerName, {
@@ -1410,14 +1658,19 @@ ${violationSummary}`);
1410
1658
  }
1411
1659
 
1412
1660
  // src/lib/worktree-paths.ts
1661
+ var import_crypto = require("crypto");
1413
1662
  var import_child_process3 = require("child_process");
1414
1663
  var import_fs9 = require("fs");
1415
- var import_path9 = require("path");
1416
- var worktreeCache = null;
1664
+ var import_path11 = require("path");
1665
+ var MAX_WORKTREE_CACHE_SIZE = 8;
1666
+ var worktreeCacheMap = /* @__PURE__ */ new Map();
1417
1667
  function getWorktreeRoot(cwd) {
1418
1668
  const effectiveCwd = cwd || process.cwd();
1419
- if (worktreeCache && worktreeCache.cwd === effectiveCwd) {
1420
- return worktreeCache.root || null;
1669
+ if (worktreeCacheMap.has(effectiveCwd)) {
1670
+ const root = worktreeCacheMap.get(effectiveCwd);
1671
+ worktreeCacheMap.delete(effectiveCwd);
1672
+ worktreeCacheMap.set(effectiveCwd, root);
1673
+ return root || null;
1421
1674
  }
1422
1675
  try {
1423
1676
  const root = (0, import_child_process3.execSync)("git rev-parse --show-toplevel", {
@@ -1425,7 +1678,13 @@ function getWorktreeRoot(cwd) {
1425
1678
  encoding: "utf-8",
1426
1679
  stdio: ["pipe", "pipe", "pipe"]
1427
1680
  }).trim();
1428
- worktreeCache = { cwd: effectiveCwd, root };
1681
+ if (worktreeCacheMap.size >= MAX_WORKTREE_CACHE_SIZE) {
1682
+ const oldest = worktreeCacheMap.keys().next().value;
1683
+ if (oldest !== void 0) {
1684
+ worktreeCacheMap.delete(oldest);
1685
+ }
1686
+ }
1687
+ worktreeCacheMap.set(effectiveCwd, root);
1429
1688
  return root;
1430
1689
  } catch {
1431
1690
  return null;
@@ -1434,15 +1693,15 @@ function getWorktreeRoot(cwd) {
1434
1693
 
1435
1694
  // src/team/bridge-entry.ts
1436
1695
  function validateConfigPath(configPath2, homeDir, claudeConfigDir) {
1437
- const resolved = (0, import_path10.resolve)(configPath2);
1696
+ const resolved = (0, import_path12.resolve)(configPath2);
1438
1697
  const isUnderHome = resolved.startsWith(homeDir + "/") || resolved === homeDir;
1439
- const normalizedConfigDir = (0, import_path10.resolve)(claudeConfigDir);
1440
- const normalizedOmcDir = (0, import_path10.resolve)(homeDir, ".omc");
1698
+ const normalizedConfigDir = (0, import_path12.resolve)(claudeConfigDir);
1699
+ const normalizedOmcDir = (0, import_path12.resolve)(homeDir, ".omc");
1441
1700
  const hasOmcComponent = resolved.includes("/.omc/") || resolved.endsWith("/.omc");
1442
1701
  const isTrustedSubpath = resolved === normalizedConfigDir || resolved.startsWith(normalizedConfigDir + "/") || resolved === normalizedOmcDir || resolved.startsWith(normalizedOmcDir + "/") || hasOmcComponent;
1443
1702
  if (!isUnderHome || !isTrustedSubpath) return false;
1444
1703
  try {
1445
- const parentDir = (0, import_path10.resolve)(resolved, "..");
1704
+ const parentDir = (0, import_path12.resolve)(resolved, "..");
1446
1705
  const realParent = (0, import_fs10.realpathSync)(parentDir);
1447
1706
  if (!realParent.startsWith(homeDir + "/") && realParent !== homeDir) {
1448
1707
  return false;
@@ -1477,7 +1736,7 @@ function main() {
1477
1736
  console.error("Usage: node bridge-entry.js --config <path-to-config.json>");
1478
1737
  process.exit(1);
1479
1738
  }
1480
- const configPath2 = (0, import_path10.resolve)(process.argv[configIdx + 1]);
1739
+ const configPath2 = (0, import_path12.resolve)(process.argv[configIdx + 1]);
1481
1740
  const home = (0, import_os2.homedir)();
1482
1741
  const claudeConfigDir = getClaudeConfigDir();
1483
1742
  if (!validateConfigPath(configPath2, home, claudeConfigDir)) {