oh-my-copilot 4.13.1 → 4.13.21

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 (507) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +3 -3
  4. package/bridge/cli.cjs +4709 -1961
  5. package/bridge/mcp-server.cjs +112 -11
  6. package/bridge/runtime-cli.cjs +4917 -2645
  7. package/bridge/team-bridge.cjs +6 -4
  8. package/bridge/team-mcp.cjs +19607 -0
  9. package/bridge/team.js +4895 -2215
  10. package/dist/__tests__/auto-slash-aliases.test.js +91 -0
  11. package/dist/__tests__/auto-slash-aliases.test.js.map +1 -1
  12. package/dist/__tests__/hooks/learner/bridge.test.js +25 -0
  13. package/dist/__tests__/hooks/learner/bridge.test.js.map +1 -1
  14. package/dist/__tests__/hooks/learner/parser.test.js +30 -0
  15. package/dist/__tests__/hooks/learner/parser.test.js.map +1 -1
  16. package/dist/__tests__/hud/extra-usage.test.js +42 -0
  17. package/dist/__tests__/hud/extra-usage.test.js.map +1 -1
  18. package/dist/__tests__/hud/labels.test.d.ts +2 -0
  19. package/dist/__tests__/hud/labels.test.d.ts.map +1 -0
  20. package/dist/__tests__/hud/labels.test.js +158 -0
  21. package/dist/__tests__/hud/labels.test.js.map +1 -0
  22. package/dist/__tests__/hud/render-enterprise.test.d.ts +5 -0
  23. package/dist/__tests__/hud/render-enterprise.test.d.ts.map +1 -0
  24. package/dist/__tests__/hud/render-enterprise.test.js +232 -0
  25. package/dist/__tests__/hud/render-enterprise.test.js.map +1 -0
  26. package/dist/__tests__/hud/render-rate-limits-priority.test.js +185 -0
  27. package/dist/__tests__/hud/render-rate-limits-priority.test.js.map +1 -1
  28. package/dist/__tests__/hud/stdin-session-scope.test.d.ts +2 -0
  29. package/dist/__tests__/hud/stdin-session-scope.test.d.ts.map +1 -0
  30. package/dist/__tests__/hud/stdin-session-scope.test.js +169 -0
  31. package/dist/__tests__/hud/stdin-session-scope.test.js.map +1 -0
  32. package/dist/__tests__/hud/usage-api.test.js +111 -1
  33. package/dist/__tests__/hud/usage-api.test.js.map +1 -1
  34. package/dist/__tests__/hud-marketplace-resolution.test.js +34 -0
  35. package/dist/__tests__/hud-marketplace-resolution.test.js.map +1 -1
  36. package/dist/__tests__/installer-hud-skip.test.js +6 -0
  37. package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
  38. package/dist/__tests__/installer-omc-reference.test.js +1 -1
  39. package/dist/__tests__/installer-omc-reference.test.js.map +1 -1
  40. package/dist/__tests__/keyword-detector-echo-guard.test.d.ts +2 -0
  41. package/dist/__tests__/keyword-detector-echo-guard.test.d.ts.map +1 -0
  42. package/dist/__tests__/keyword-detector-echo-guard.test.js +218 -0
  43. package/dist/__tests__/keyword-detector-echo-guard.test.js.map +1 -0
  44. package/dist/__tests__/mnemosyne/detector.test.js +2 -0
  45. package/dist/__tests__/mnemosyne/detector.test.js.map +1 -1
  46. package/dist/__tests__/notepad.test.js +2 -2
  47. package/dist/__tests__/notepad.test.js.map +1 -1
  48. package/dist/__tests__/pre-tool-enforcer.test.js +84 -1
  49. package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -1
  50. package/dist/__tests__/preemptive-compaction-hook.test.js +63 -0
  51. package/dist/__tests__/preemptive-compaction-hook.test.js.map +1 -1
  52. package/dist/__tests__/ralph-prd-mandatory.test.js +11 -1
  53. package/dist/__tests__/ralph-prd-mandatory.test.js.map +1 -1
  54. package/dist/__tests__/ralph-prd.test.js +40 -2
  55. package/dist/__tests__/ralph-prd.test.js.map +1 -1
  56. package/dist/__tests__/skills.test.js +363 -4
  57. package/dist/__tests__/skills.test.js.map +1 -1
  58. package/dist/__tests__/state-root-resolution.test.js +120 -6
  59. package/dist/__tests__/state-root-resolution.test.js.map +1 -1
  60. package/dist/autoresearch/__tests__/runtime.test.js +225 -28
  61. package/dist/autoresearch/__tests__/runtime.test.js.map +1 -1
  62. package/dist/autoresearch/runtime.d.ts.map +1 -1
  63. package/dist/autoresearch/runtime.js +9 -5
  64. package/dist/autoresearch/runtime.js.map +1 -1
  65. package/dist/cli/__tests__/team-status-worktree.test.d.ts +2 -0
  66. package/dist/cli/__tests__/team-status-worktree.test.d.ts.map +1 -0
  67. package/dist/cli/__tests__/team-status-worktree.test.js +96 -0
  68. package/dist/cli/__tests__/team-status-worktree.test.js.map +1 -0
  69. package/dist/cli/__tests__/team.test.js +164 -0
  70. package/dist/cli/__tests__/team.test.js.map +1 -1
  71. package/dist/cli/autoresearch.d.ts +1 -1
  72. package/dist/cli/autoresearch.d.ts.map +1 -1
  73. package/dist/cli/autoresearch.js +4 -4
  74. package/dist/cli/commands/team.d.ts +1 -0
  75. package/dist/cli/commands/team.d.ts.map +1 -1
  76. package/dist/cli/commands/team.js +15 -3
  77. package/dist/cli/commands/team.js.map +1 -1
  78. package/dist/cli/index.js +3 -0
  79. package/dist/cli/index.js.map +1 -1
  80. package/dist/cli/team.d.ts +6 -0
  81. package/dist/cli/team.d.ts.map +1 -1
  82. package/dist/cli/team.js +126 -5
  83. package/dist/cli/team.js.map +1 -1
  84. package/dist/cli/utils/formatting.d.ts +0 -10
  85. package/dist/cli/utils/formatting.d.ts.map +1 -1
  86. package/dist/cli/utils/formatting.js +0 -52
  87. package/dist/cli/utils/formatting.js.map +1 -1
  88. package/dist/config/__tests__/loader.test.js.map +1 -1
  89. package/dist/features/boulder-state/constants.d.ts +1 -1
  90. package/dist/features/boulder-state/constants.d.ts.map +1 -1
  91. package/dist/features/builtin-skills/skills.d.ts.map +1 -1
  92. package/dist/features/builtin-skills/skills.js +11 -3
  93. package/dist/features/builtin-skills/skills.js.map +1 -1
  94. package/dist/features/builtin-skills/types.d.ts +7 -0
  95. package/dist/features/builtin-skills/types.d.ts.map +1 -1
  96. package/dist/features/delegation-enforcer.d.ts +2 -0
  97. package/dist/features/delegation-enforcer.d.ts.map +1 -1
  98. package/dist/features/delegation-enforcer.js +10 -0
  99. package/dist/features/delegation-enforcer.js.map +1 -1
  100. package/dist/features/magic-keywords.d.ts.map +1 -1
  101. package/dist/features/magic-keywords.js +30 -1
  102. package/dist/features/magic-keywords.js.map +1 -1
  103. package/dist/features/rate-limit-wait/tmux-detector.d.ts +4 -4
  104. package/dist/features/rate-limit-wait/tmux-detector.js +9 -9
  105. package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -1
  106. package/dist/hooks/__tests__/bridge-routing.test.js +156 -0
  107. package/dist/hooks/__tests__/bridge-routing.test.js.map +1 -1
  108. package/dist/hooks/auto-slash-command/constants.d.ts.map +1 -1
  109. package/dist/hooks/auto-slash-command/constants.js +1 -0
  110. package/dist/hooks/auto-slash-command/constants.js.map +1 -1
  111. package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
  112. package/dist/hooks/auto-slash-command/executor.js +29 -0
  113. package/dist/hooks/auto-slash-command/executor.js.map +1 -1
  114. package/dist/hooks/bridge.d.ts.map +1 -1
  115. package/dist/hooks/bridge.js +184 -1
  116. package/dist/hooks/bridge.js.map +1 -1
  117. package/dist/hooks/learner/bridge.d.ts.map +1 -1
  118. package/dist/hooks/learner/bridge.js +4 -109
  119. package/dist/hooks/learner/bridge.js.map +1 -1
  120. package/dist/hooks/learner/detector.js +1 -1
  121. package/dist/hooks/learner/parser.d.ts +9 -0
  122. package/dist/hooks/learner/parser.d.ts.map +1 -1
  123. package/dist/hooks/learner/parser.js +18 -5
  124. package/dist/hooks/learner/parser.js.map +1 -1
  125. package/dist/hooks/learner/types.d.ts +6 -0
  126. package/dist/hooks/learner/types.d.ts.map +1 -1
  127. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +16 -0
  128. package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
  129. package/dist/hooks/notepad/index.d.ts +4 -1
  130. package/dist/hooks/notepad/index.d.ts.map +1 -1
  131. package/dist/hooks/notepad/index.js +7 -4
  132. package/dist/hooks/notepad/index.js.map +1 -1
  133. package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js +70 -3
  134. package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js.map +1 -1
  135. package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
  136. package/dist/hooks/persistent-mode/index.js +17 -13
  137. package/dist/hooks/persistent-mode/index.js.map +1 -1
  138. package/dist/hooks/persistent-mode/stop-hook-blocking.test.js +175 -3
  139. package/dist/hooks/persistent-mode/stop-hook-blocking.test.js.map +1 -1
  140. package/dist/hooks/project-memory/__tests__/integration.test.js +117 -3
  141. package/dist/hooks/project-memory/__tests__/integration.test.js.map +1 -1
  142. package/dist/hooks/project-memory/__tests__/storage.test.js +11 -11
  143. package/dist/hooks/project-memory/__tests__/storage.test.js.map +1 -1
  144. package/dist/hooks/project-memory/index.d.ts.map +1 -1
  145. package/dist/hooks/project-memory/index.js +24 -12
  146. package/dist/hooks/project-memory/index.js.map +1 -1
  147. package/dist/hooks/ralph/index.d.ts +1 -1
  148. package/dist/hooks/ralph/index.d.ts.map +1 -1
  149. package/dist/hooks/ralph/index.js +1 -1
  150. package/dist/hooks/ralph/index.js.map +1 -1
  151. package/dist/hooks/ralph/loop.d.ts +6 -6
  152. package/dist/hooks/ralph/loop.d.ts.map +1 -1
  153. package/dist/hooks/ralph/loop.js +18 -18
  154. package/dist/hooks/ralph/loop.js.map +1 -1
  155. package/dist/hooks/ralph/prd.d.ts +23 -12
  156. package/dist/hooks/ralph/prd.d.ts.map +1 -1
  157. package/dist/hooks/ralph/prd.js +88 -42
  158. package/dist/hooks/ralph/prd.js.map +1 -1
  159. package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js +20 -0
  160. package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js.map +1 -1
  161. package/dist/hooks/session-end/index.d.ts +9 -0
  162. package/dist/hooks/session-end/index.d.ts.map +1 -1
  163. package/dist/hooks/session-end/index.js +110 -0
  164. package/dist/hooks/session-end/index.js.map +1 -1
  165. package/dist/hooks/skill-bridge.cjs +114 -92
  166. package/dist/hooks/skill-state/index.d.ts.map +1 -1
  167. package/dist/hooks/skill-state/index.js +1 -0
  168. package/dist/hooks/skill-state/index.js.map +1 -1
  169. package/dist/hud/__tests__/enterprise-cost.test.d.ts +5 -0
  170. package/dist/hud/__tests__/enterprise-cost.test.d.ts.map +1 -0
  171. package/dist/hud/__tests__/enterprise-cost.test.js +151 -0
  172. package/dist/hud/__tests__/enterprise-cost.test.js.map +1 -0
  173. package/dist/hud/__tests__/git-status.test.js +18 -0
  174. package/dist/hud/__tests__/git-status.test.js.map +1 -1
  175. package/dist/hud/__tests__/usage-api-enterprise.test.d.ts +5 -0
  176. package/dist/hud/__tests__/usage-api-enterprise.test.d.ts.map +1 -0
  177. package/dist/hud/__tests__/usage-api-enterprise.test.js +249 -0
  178. package/dist/hud/__tests__/usage-api-enterprise.test.js.map +1 -0
  179. package/dist/hud/elements/background.d.ts +3 -3
  180. package/dist/hud/elements/background.d.ts.map +1 -1
  181. package/dist/hud/elements/background.js +5 -4
  182. package/dist/hud/elements/background.js.map +1 -1
  183. package/dist/hud/elements/call-counts.d.ts +2 -2
  184. package/dist/hud/elements/call-counts.d.ts.map +1 -1
  185. package/dist/hud/elements/call-counts.js +7 -6
  186. package/dist/hud/elements/call-counts.js.map +1 -1
  187. package/dist/hud/elements/context.d.ts +3 -3
  188. package/dist/hud/elements/context.d.ts.map +1 -1
  189. package/dist/hud/elements/context.js +5 -4
  190. package/dist/hud/elements/context.js.map +1 -1
  191. package/dist/hud/elements/enterprise-cost.d.ts +16 -0
  192. package/dist/hud/elements/enterprise-cost.d.ts.map +1 -0
  193. package/dist/hud/elements/enterprise-cost.js +63 -0
  194. package/dist/hud/elements/enterprise-cost.js.map +1 -0
  195. package/dist/hud/elements/git.d.ts +2 -1
  196. package/dist/hud/elements/git.d.ts.map +1 -1
  197. package/dist/hud/elements/git.js +7 -6
  198. package/dist/hud/elements/git.js.map +1 -1
  199. package/dist/hud/elements/permission.d.ts.map +1 -1
  200. package/dist/hud/elements/permission.js +2 -5
  201. package/dist/hud/elements/permission.js.map +1 -1
  202. package/dist/hud/elements/ralph.d.ts +2 -2
  203. package/dist/hud/elements/ralph.d.ts.map +1 -1
  204. package/dist/hud/elements/ralph.js +3 -2
  205. package/dist/hud/elements/ralph.js.map +1 -1
  206. package/dist/hud/elements/session.d.ts.map +1 -1
  207. package/dist/hud/elements/session.js +5 -9
  208. package/dist/hud/elements/session.js.map +1 -1
  209. package/dist/hud/elements/thinking.d.ts +2 -2
  210. package/dist/hud/elements/thinking.d.ts.map +1 -1
  211. package/dist/hud/elements/thinking.js +3 -2
  212. package/dist/hud/elements/thinking.js.map +1 -1
  213. package/dist/hud/elements/token-usage.d.ts +2 -2
  214. package/dist/hud/elements/token-usage.d.ts.map +1 -1
  215. package/dist/hud/elements/token-usage.js +3 -2
  216. package/dist/hud/elements/token-usage.js.map +1 -1
  217. package/dist/hud/index.d.ts.map +1 -1
  218. package/dist/hud/index.js +5 -1
  219. package/dist/hud/index.js.map +1 -1
  220. package/dist/hud/render.d.ts.map +1 -1
  221. package/dist/hud/render.js +43 -10
  222. package/dist/hud/render.js.map +1 -1
  223. package/dist/hud/state.d.ts.map +1 -1
  224. package/dist/hud/state.js +18 -1
  225. package/dist/hud/state.js.map +1 -1
  226. package/dist/hud/stdin.d.ts.map +1 -1
  227. package/dist/hud/stdin.js +49 -5
  228. package/dist/hud/stdin.js.map +1 -1
  229. package/dist/hud/types.d.ts +42 -0
  230. package/dist/hud/types.d.ts.map +1 -1
  231. package/dist/hud/types.js +59 -1
  232. package/dist/hud/types.js.map +1 -1
  233. package/dist/hud/usage-api.d.ts +19 -1
  234. package/dist/hud/usage-api.d.ts.map +1 -1
  235. package/dist/hud/usage-api.js +101 -18
  236. package/dist/hud/usage-api.js.map +1 -1
  237. package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts +2 -0
  238. package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts.map +1 -0
  239. package/dist/installer/__tests__/hud-cache-wrapper.test.js +235 -0
  240. package/dist/installer/__tests__/hud-cache-wrapper.test.js.map +1 -0
  241. package/dist/installer/__tests__/standalone-hook-reconcile.test.js +2 -0
  242. package/dist/installer/__tests__/standalone-hook-reconcile.test.js.map +1 -1
  243. package/dist/installer/index.d.ts +1 -0
  244. package/dist/installer/index.d.ts.map +1 -1
  245. package/dist/installer/index.js +83 -31
  246. package/dist/installer/index.js.map +1 -1
  247. package/dist/lib/__tests__/worktree-paths.test.js +162 -39
  248. package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
  249. package/dist/lib/worktree-paths.d.ts +87 -9
  250. package/dist/lib/worktree-paths.d.ts.map +1 -1
  251. package/dist/lib/worktree-paths.js +209 -27
  252. package/dist/lib/worktree-paths.js.map +1 -1
  253. package/dist/mcp/__tests__/team-server-artifact-convergence.test.js +156 -4
  254. package/dist/mcp/__tests__/team-server-artifact-convergence.test.js.map +1 -1
  255. package/dist/mcp/omc-tools-server.d.ts +11 -17
  256. package/dist/mcp/omc-tools-server.d.ts.map +1 -1
  257. package/dist/mcp/omc-tools-server.js +22 -32
  258. package/dist/mcp/omc-tools-server.js.map +1 -1
  259. package/dist/mcp/team-job-convergence.d.ts +9 -2
  260. package/dist/mcp/team-job-convergence.d.ts.map +1 -1
  261. package/dist/mcp/team-job-convergence.js +35 -14
  262. package/dist/mcp/team-job-convergence.js.map +1 -1
  263. package/dist/mcp/team-server.d.ts.map +1 -1
  264. package/dist/mcp/team-server.js +93 -13
  265. package/dist/mcp/team-server.js.map +1 -1
  266. package/dist/ralphthon/prd.d.ts.map +1 -1
  267. package/dist/ralphthon/prd.js +13 -17
  268. package/dist/ralphthon/prd.js.map +1 -1
  269. package/dist/shared/types.d.ts +2 -0
  270. package/dist/shared/types.d.ts.map +1 -1
  271. package/dist/team/__tests__/api-interop.cleanup.test.d.ts +2 -0
  272. package/dist/team/__tests__/api-interop.cleanup.test.d.ts.map +1 -0
  273. package/dist/team/__tests__/api-interop.cleanup.test.js +234 -0
  274. package/dist/team/__tests__/api-interop.cleanup.test.js.map +1 -0
  275. package/dist/team/__tests__/api-interop.dispatch.test.js +2 -1
  276. package/dist/team/__tests__/api-interop.dispatch.test.js.map +1 -1
  277. package/dist/team/__tests__/auto-merge-restart.test.d.ts +2 -0
  278. package/dist/team/__tests__/auto-merge-restart.test.d.ts.map +1 -0
  279. package/dist/team/__tests__/auto-merge-restart.test.js +128 -0
  280. package/dist/team/__tests__/auto-merge-restart.test.js.map +1 -0
  281. package/dist/team/__tests__/auto-merge.perf.test.d.ts +2 -0
  282. package/dist/team/__tests__/auto-merge.perf.test.d.ts.map +1 -0
  283. package/dist/team/__tests__/auto-merge.perf.test.js +85 -0
  284. package/dist/team/__tests__/auto-merge.perf.test.js.map +1 -0
  285. package/dist/team/__tests__/conflict-mailbox.test.d.ts +2 -0
  286. package/dist/team/__tests__/conflict-mailbox.test.d.ts.map +1 -0
  287. package/dist/team/__tests__/conflict-mailbox.test.js +238 -0
  288. package/dist/team/__tests__/conflict-mailbox.test.js.map +1 -0
  289. package/dist/team/__tests__/git-worktree.test.js +164 -3
  290. package/dist/team/__tests__/git-worktree.test.js.map +1 -1
  291. package/dist/team/__tests__/helpers/git-fixture.d.ts +72 -0
  292. package/dist/team/__tests__/helpers/git-fixture.d.ts.map +1 -0
  293. package/dist/team/__tests__/helpers/git-fixture.js +252 -0
  294. package/dist/team/__tests__/helpers/git-fixture.js.map +1 -0
  295. package/dist/team/__tests__/leader-inbox.test.d.ts +2 -0
  296. package/dist/team/__tests__/leader-inbox.test.d.ts.map +1 -0
  297. package/dist/team/__tests__/leader-inbox.test.js +152 -0
  298. package/dist/team/__tests__/leader-inbox.test.js.map +1 -0
  299. package/dist/team/__tests__/merge-orchestrator.test.d.ts +2 -0
  300. package/dist/team/__tests__/merge-orchestrator.test.d.ts.map +1 -0
  301. package/dist/team/__tests__/merge-orchestrator.test.js +779 -0
  302. package/dist/team/__tests__/merge-orchestrator.test.js.map +1 -0
  303. package/dist/team/__tests__/model-contract.test.js +35 -21
  304. package/dist/team/__tests__/model-contract.test.js.map +1 -1
  305. package/dist/team/__tests__/rebase-smoke.test.d.ts +2 -0
  306. package/dist/team/__tests__/rebase-smoke.test.d.ts.map +1 -0
  307. package/dist/team/__tests__/rebase-smoke.test.js +272 -0
  308. package/dist/team/__tests__/rebase-smoke.test.js.map +1 -0
  309. package/dist/team/__tests__/runtime-cli.test.js +11 -3
  310. package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
  311. package/dist/team/__tests__/runtime-prompt-mode.test.js +14 -16
  312. package/dist/team/__tests__/runtime-prompt-mode.test.js.map +1 -1
  313. package/dist/team/__tests__/runtime-v2-role-routing.test.js +7 -1
  314. package/dist/team/__tests__/runtime-v2-role-routing.test.js.map +1 -1
  315. package/dist/team/__tests__/runtime-v2.dispatch.test.js +293 -15
  316. package/dist/team/__tests__/runtime-v2.dispatch.test.js.map +1 -1
  317. package/dist/team/__tests__/runtime-v2.monitor.test.d.ts +2 -0
  318. package/dist/team/__tests__/runtime-v2.monitor.test.d.ts.map +1 -0
  319. package/dist/team/__tests__/runtime-v2.monitor.test.js +219 -0
  320. package/dist/team/__tests__/runtime-v2.monitor.test.js.map +1 -0
  321. package/dist/team/__tests__/runtime-v2.shutdown.test.d.ts +2 -0
  322. package/dist/team/__tests__/runtime-v2.shutdown.test.d.ts.map +1 -0
  323. package/dist/team/__tests__/runtime-v2.shutdown.test.js +292 -0
  324. package/dist/team/__tests__/runtime-v2.shutdown.test.js.map +1 -0
  325. package/dist/team/__tests__/scaling-launch-config.test.js +203 -3
  326. package/dist/team/__tests__/scaling-launch-config.test.js.map +1 -1
  327. package/dist/team/__tests__/team-summary-worktree.test.d.ts +2 -0
  328. package/dist/team/__tests__/team-summary-worktree.test.d.ts.map +1 -0
  329. package/dist/team/__tests__/team-summary-worktree.test.js +85 -0
  330. package/dist/team/__tests__/team-summary-worktree.test.js.map +1 -0
  331. package/dist/team/__tests__/teardown-invariant.test.d.ts +2 -0
  332. package/dist/team/__tests__/teardown-invariant.test.d.ts.map +1 -0
  333. package/dist/team/__tests__/teardown-invariant.test.js +176 -0
  334. package/dist/team/__tests__/teardown-invariant.test.js.map +1 -0
  335. package/dist/team/__tests__/tmux-session-liveness.test.d.ts +2 -0
  336. package/dist/team/__tests__/tmux-session-liveness.test.d.ts.map +1 -0
  337. package/dist/team/__tests__/tmux-session-liveness.test.js +37 -0
  338. package/dist/team/__tests__/tmux-session-liveness.test.js.map +1 -0
  339. package/dist/team/__tests__/worker-bootstrap.test.js +47 -1
  340. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  341. package/dist/team/__tests__/worker-commit-cadence.test.d.ts +2 -0
  342. package/dist/team/__tests__/worker-commit-cadence.test.d.ts.map +1 -0
  343. package/dist/team/__tests__/worker-commit-cadence.test.js +315 -0
  344. package/dist/team/__tests__/worker-commit-cadence.test.js.map +1 -0
  345. package/dist/team/__tests__/worktree-contract-fields.test.d.ts +2 -0
  346. package/dist/team/__tests__/worktree-contract-fields.test.d.ts.map +1 -0
  347. package/dist/team/__tests__/worktree-contract-fields.test.js +157 -0
  348. package/dist/team/__tests__/worktree-contract-fields.test.js.map +1 -0
  349. package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts +2 -0
  350. package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts.map +1 -0
  351. package/dist/team/__tests__/worktree-runtime-e2e.test.js +182 -0
  352. package/dist/team/__tests__/worktree-runtime-e2e.test.js.map +1 -0
  353. package/dist/team/api-interop.d.ts +2 -1
  354. package/dist/team/api-interop.d.ts.map +1 -1
  355. package/dist/team/api-interop.js +121 -14
  356. package/dist/team/api-interop.js.map +1 -1
  357. package/dist/team/capabilities.d.ts.map +1 -1
  358. package/dist/team/capabilities.js +2 -0
  359. package/dist/team/capabilities.js.map +1 -1
  360. package/dist/team/cli-worker-contract.d.ts +7 -6
  361. package/dist/team/cli-worker-contract.d.ts.map +1 -1
  362. package/dist/team/cli-worker-contract.js +7 -6
  363. package/dist/team/cli-worker-contract.js.map +1 -1
  364. package/dist/team/conflict-mailbox.d.ts +49 -0
  365. package/dist/team/conflict-mailbox.d.ts.map +1 -0
  366. package/dist/team/conflict-mailbox.js +98 -0
  367. package/dist/team/conflict-mailbox.js.map +1 -0
  368. package/dist/team/events.d.ts +3 -0
  369. package/dist/team/events.d.ts.map +1 -1
  370. package/dist/team/events.js +2 -1
  371. package/dist/team/events.js.map +1 -1
  372. package/dist/team/git-worktree.d.ts +78 -10
  373. package/dist/team/git-worktree.d.ts.map +1 -1
  374. package/dist/team/git-worktree.js +453 -97
  375. package/dist/team/git-worktree.js.map +1 -1
  376. package/dist/team/governance.d.ts +3 -2
  377. package/dist/team/governance.d.ts.map +1 -1
  378. package/dist/team/governance.js.map +1 -1
  379. package/dist/team/leader-inbox.d.ts +28 -0
  380. package/dist/team/leader-inbox.d.ts.map +1 -0
  381. package/dist/team/leader-inbox.js +68 -0
  382. package/dist/team/leader-inbox.js.map +1 -0
  383. package/dist/team/merge-coordinator.d.ts +6 -0
  384. package/dist/team/merge-coordinator.d.ts.map +1 -1
  385. package/dist/team/merge-coordinator.js +6 -2
  386. package/dist/team/merge-coordinator.js.map +1 -1
  387. package/dist/team/merge-orchestrator.d.ts +41 -0
  388. package/dist/team/merge-orchestrator.d.ts.map +1 -0
  389. package/dist/team/merge-orchestrator.js +736 -0
  390. package/dist/team/merge-orchestrator.js.map +1 -0
  391. package/dist/team/model-contract.d.ts +18 -2
  392. package/dist/team/model-contract.d.ts.map +1 -1
  393. package/dist/team/model-contract.js +55 -28
  394. package/dist/team/model-contract.js.map +1 -1
  395. package/dist/team/monitor.d.ts.map +1 -1
  396. package/dist/team/monitor.js +47 -3
  397. package/dist/team/monitor.js.map +1 -1
  398. package/dist/team/runtime-cli.d.ts +1 -0
  399. package/dist/team/runtime-cli.d.ts.map +1 -1
  400. package/dist/team/runtime-cli.js +15 -2
  401. package/dist/team/runtime-cli.js.map +1 -1
  402. package/dist/team/runtime-flags.d.ts +5 -0
  403. package/dist/team/runtime-flags.d.ts.map +1 -0
  404. package/dist/team/runtime-flags.js +12 -0
  405. package/dist/team/runtime-flags.js.map +1 -0
  406. package/dist/team/runtime-v2.d.ts +16 -1
  407. package/dist/team/runtime-v2.d.ts.map +1 -1
  408. package/dist/team/runtime-v2.js +531 -127
  409. package/dist/team/runtime-v2.js.map +1 -1
  410. package/dist/team/runtime.d.ts.map +1 -1
  411. package/dist/team/runtime.js +4 -1
  412. package/dist/team/runtime.js.map +1 -1
  413. package/dist/team/scaling.d.ts.map +1 -1
  414. package/dist/team/scaling.js +110 -13
  415. package/dist/team/scaling.js.map +1 -1
  416. package/dist/team/state/tasks.d.ts.map +1 -1
  417. package/dist/team/state/tasks.js +1 -0
  418. package/dist/team/state/tasks.js.map +1 -1
  419. package/dist/team/team-ops.d.ts.map +1 -1
  420. package/dist/team/team-ops.js +112 -16
  421. package/dist/team/team-ops.js.map +1 -1
  422. package/dist/team/tmux-session.d.ts +17 -29
  423. package/dist/team/tmux-session.d.ts.map +1 -1
  424. package/dist/team/tmux-session.js +117 -108
  425. package/dist/team/tmux-session.js.map +1 -1
  426. package/dist/team/types.d.ts +31 -17
  427. package/dist/team/types.d.ts.map +1 -1
  428. package/dist/team/types.js.map +1 -1
  429. package/dist/team/worker-bootstrap.d.ts +11 -0
  430. package/dist/team/worker-bootstrap.d.ts.map +1 -1
  431. package/dist/team/worker-bootstrap.js +37 -14
  432. package/dist/team/worker-bootstrap.js.map +1 -1
  433. package/dist/team/worker-canonicalization.d.ts.map +1 -1
  434. package/dist/team/worker-canonicalization.js +2 -0
  435. package/dist/team/worker-canonicalization.js.map +1 -1
  436. package/dist/team/worker-commit-cadence.d.ts +70 -0
  437. package/dist/team/worker-commit-cadence.d.ts.map +1 -0
  438. package/dist/team/worker-commit-cadence.js +271 -0
  439. package/dist/team/worker-commit-cadence.js.map +1 -0
  440. package/dist/tools/__tests__/memory-tools.test.js +4 -4
  441. package/dist/tools/__tests__/memory-tools.test.js.map +1 -1
  442. package/dist/tools/__tests__/state-tools.test.js +13 -1
  443. package/dist/tools/__tests__/state-tools.test.js.map +1 -1
  444. package/dist/utils/frontmatter.d.ts.map +1 -1
  445. package/dist/utils/frontmatter.js +1 -16
  446. package/dist/utils/frontmatter.js.map +1 -1
  447. package/dist/utils/resolve-node.d.ts.map +1 -1
  448. package/dist/utils/resolve-node.js +22 -28
  449. package/dist/utils/resolve-node.js.map +1 -1
  450. package/docs/GETTING-STARTED.md +415 -0
  451. package/docs/MIGRATION.md +1003 -0
  452. package/docs/REFERENCE.md +21 -4
  453. package/docs/TEAM-WORKTREE-MODE.md +86 -0
  454. package/docs/company-context-interface.md +5 -16
  455. package/docs/copilot-instructions.md +1 -1
  456. package/package.json +1 -1
  457. package/scripts/keyword-detector.mjs +168 -20
  458. package/scripts/lib/hud-cache-wrapper.sh +122 -0
  459. package/scripts/persistent-mode.cjs +28 -2
  460. package/scripts/persistent-mode.mjs +28 -2
  461. package/scripts/plugin-setup.mjs +10 -1
  462. package/scripts/post-tool-verifier.mjs +153 -3
  463. package/scripts/pre-tool-enforcer.mjs +54 -6
  464. package/scripts/session-start.mjs +194 -2
  465. package/skills/AGENTS.md +22 -91
  466. package/skills/ai-slop-cleaner/SKILL.md +118 -120
  467. package/skills/ask/SKILL.md +6 -8
  468. package/skills/autopilot/SKILL.md +1 -28
  469. package/skills/autoresearch/SKILL.md +5 -5
  470. package/skills/cancel/SKILL.md +13 -13
  471. package/skills/cccg/SKILL.md +1 -0
  472. package/skills/configure-notifications/SKILL.md +80 -215
  473. package/skills/debug/SKILL.md +3 -2
  474. package/skills/deep-dive/SKILL.md +20 -9
  475. package/skills/deep-interview/SKILL.md +32 -4
  476. package/skills/deepinit/SKILL.md +1 -0
  477. package/skills/external-context/SKILL.md +2 -1
  478. package/skills/hud/SKILL.md +22 -52
  479. package/skills/learner/SKILL.md +90 -57
  480. package/skills/mcp-setup/SKILL.md +45 -60
  481. package/skills/omc-doctor/SKILL.md +1 -1
  482. package/skills/omc-reference/SKILL.md +6 -6
  483. package/skills/omc-setup/SKILL.md +30 -74
  484. package/skills/omc-setup/phases/01-install-claude-md.md +97 -0
  485. package/skills/omc-setup/phases/02-configure.md +25 -40
  486. package/skills/omc-setup/phases/03-integrations.md +100 -69
  487. package/skills/omc-setup/phases/04-welcome.md +102 -44
  488. package/skills/omc-teams/SKILL.md +63 -26
  489. package/skills/plan/SKILL.md +11 -9
  490. package/skills/ralph/SKILL.md +42 -41
  491. package/skills/ralplan/SKILL.md +3 -10
  492. package/skills/release/SKILL.md +168 -57
  493. package/skills/remember/SKILL.md +2 -1
  494. package/skills/sciomc/SKILL.md +12 -11
  495. package/skills/self-improve/SKILL.md +4 -4
  496. package/skills/setup/SKILL.md +1 -0
  497. package/skills/skill/SKILL.md +21 -20
  498. package/skills/skillify/SKILL.md +34 -3
  499. package/skills/team/SKILL.md +62 -44
  500. package/skills/ultraqa/SKILL.md +1 -2
  501. package/skills/ultrawork/SKILL.md +28 -21
  502. package/skills/verify/SKILL.md +2 -1
  503. package/skills/writer-memory/SKILL.md +2 -1
  504. package/templates/hooks/keyword-detector.mjs +129 -11
  505. package/templates/hooks/persistent-mode.mjs +28 -2
  506. package/templates/hooks/pre-tool-use.mjs +144 -45
  507. package/templates/hooks/session-start.mjs +25 -1
@@ -0,0 +1,232 @@
1
+ /**
2
+ * Tests for enterprise cost rendering in render.ts
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { render } from '../../hud/render.js';
6
+ import { DEFAULT_HUD_CONFIG } from '../../hud/types.js';
7
+ // Mock git elements
8
+ vi.mock('../../hud/elements/git.js', () => ({
9
+ renderGitRepo: vi.fn(() => null),
10
+ renderGitBranch: vi.fn(() => null),
11
+ renderGitStatus: vi.fn(() => null),
12
+ }));
13
+ vi.mock('../../hud/elements/cwd.js', () => ({
14
+ renderCwd: vi.fn(() => null),
15
+ }));
16
+ // Strip ANSI codes for readable assertions
17
+ function strip(s) {
18
+ return s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
19
+ }
20
+ function createContext(overrides = {}) {
21
+ return {
22
+ contextPercent: 30,
23
+ modelName: 'claude-sonnet-4-5',
24
+ ralph: null,
25
+ ultrawork: null,
26
+ prd: null,
27
+ autopilot: null,
28
+ activeAgents: [],
29
+ todos: [],
30
+ backgroundTasks: [],
31
+ cwd: '/home/user/project',
32
+ lastSkill: null,
33
+ rateLimitsResult: null,
34
+ customBuckets: null,
35
+ pendingPermission: null,
36
+ thinkingState: null,
37
+ sessionHealth: null,
38
+ omcVersion: null,
39
+ updateAvailable: null,
40
+ toolCallCount: 0,
41
+ agentCallCount: 0,
42
+ skillCallCount: 0,
43
+ promptTime: null,
44
+ apiKeySource: null,
45
+ profileName: null,
46
+ sessionSummary: null,
47
+ ...overrides,
48
+ };
49
+ }
50
+ function createConfig(overrides = {}) {
51
+ return {
52
+ ...DEFAULT_HUD_CONFIG,
53
+ elements: {
54
+ ...DEFAULT_HUD_CONFIG.elements,
55
+ omcLabel: false,
56
+ rateLimits: false,
57
+ ralph: false,
58
+ autopilot: false,
59
+ prdStory: false,
60
+ activeSkills: false,
61
+ contextBar: false,
62
+ agents: false,
63
+ backgroundTasks: false,
64
+ todos: false,
65
+ promptTime: false,
66
+ sessionHealth: false,
67
+ showCallCounts: false,
68
+ thinking: false,
69
+ ...overrides,
70
+ },
71
+ };
72
+ }
73
+ describe('render - enterprise cost branch', () => {
74
+ beforeEach(() => {
75
+ vi.clearAllMocks();
76
+ });
77
+ it('renders spent:$ when subscriptionType is enterprise and enterpriseSpentUsd is set', async () => {
78
+ const context = createContext({
79
+ subscriptionType: 'enterprise',
80
+ rateLimitsResult: {
81
+ rateLimits: {
82
+ fiveHourPercent: 0,
83
+ enterpriseSpentUsd: 3323.93,
84
+ enterpriseLimitUsd: null,
85
+ enterpriseCurrency: 'USD',
86
+ },
87
+ stale: false,
88
+ },
89
+ });
90
+ const config = createConfig({ showEnterpriseCost: true });
91
+ const output = await render(context, config);
92
+ const plain = strip(output);
93
+ expect(plain).toContain('spent:$3,323.93');
94
+ });
95
+ it('does NOT render tok: when enterprise cost renders successfully', async () => {
96
+ const context = createContext({
97
+ subscriptionType: 'enterprise',
98
+ rateLimitsResult: {
99
+ rateLimits: {
100
+ fiveHourPercent: 0,
101
+ enterpriseSpentUsd: 100,
102
+ enterpriseLimitUsd: null,
103
+ enterpriseCurrency: 'USD',
104
+ },
105
+ },
106
+ lastRequestTokenUsage: { inputTokens: 1200, outputTokens: 340 },
107
+ });
108
+ const config = createConfig({ showTokens: true, showEnterpriseCost: true });
109
+ const output = await render(context, config);
110
+ const plain = strip(output);
111
+ expect(plain).not.toContain('tok:');
112
+ expect(plain).toContain('spent:');
113
+ });
114
+ it('detects enterprise via rateLimitTier containing claude_zero', async () => {
115
+ const context = createContext({
116
+ rateLimitTier: 'default_claude_zero',
117
+ rateLimitsResult: {
118
+ rateLimits: {
119
+ fiveHourPercent: 0,
120
+ enterpriseSpentUsd: 50,
121
+ enterpriseLimitUsd: null,
122
+ enterpriseCurrency: 'USD',
123
+ },
124
+ },
125
+ });
126
+ const config = createConfig({ showEnterpriseCost: true });
127
+ const output = await render(context, config);
128
+ const plain = strip(output);
129
+ expect(plain).toContain('spent:$50.00');
130
+ });
131
+ it('falls back to token rendering when enterprise but no cost data (API error)', async () => {
132
+ const context = createContext({
133
+ subscriptionType: 'enterprise',
134
+ rateLimitsResult: {
135
+ rateLimits: null,
136
+ error: 'network',
137
+ },
138
+ lastRequestTokenUsage: { inputTokens: 1200, outputTokens: 340 },
139
+ });
140
+ const config = createConfig({ showTokens: true, showEnterpriseCost: true });
141
+ const output = await render(context, config);
142
+ const plain = strip(output);
143
+ // No cost data available → fall back to tokens
144
+ expect(plain).toContain('tok:');
145
+ });
146
+ it('does not render enterprise cost when showEnterpriseCost is false', async () => {
147
+ const context = createContext({
148
+ subscriptionType: 'enterprise',
149
+ rateLimitsResult: {
150
+ rateLimits: {
151
+ fiveHourPercent: 0,
152
+ enterpriseSpentUsd: 100,
153
+ enterpriseLimitUsd: null,
154
+ enterpriseCurrency: 'USD',
155
+ },
156
+ },
157
+ });
158
+ const config = createConfig({ showEnterpriseCost: false });
159
+ const output = await render(context, config);
160
+ const plain = strip(output);
161
+ expect(plain).not.toContain('spent:');
162
+ });
163
+ it('does not render enterprise cost when enterpriseMode is forced false', async () => {
164
+ const context = createContext({
165
+ subscriptionType: 'enterprise',
166
+ rateLimitsResult: {
167
+ rateLimits: {
168
+ fiveHourPercent: 0,
169
+ enterpriseSpentUsd: 100,
170
+ enterpriseLimitUsd: null,
171
+ enterpriseCurrency: 'USD',
172
+ },
173
+ },
174
+ });
175
+ const config = createConfig({ enterpriseMode: false });
176
+ const output = await render(context, config);
177
+ const plain = strip(output);
178
+ expect(plain).not.toContain('spent:');
179
+ });
180
+ it('suppresses 5h/wk rate-limit display when enterprise cost data is present', async () => {
181
+ // Regression: enterprise API returns five_hour: null, so clamp(null) produced
182
+ // fiveHourPercent: 0 which rendered a misleading "5h:0% wk:0%" alongside the cost.
183
+ const context = createContext({
184
+ subscriptionType: 'enterprise',
185
+ rateLimitsResult: {
186
+ rateLimits: {
187
+ fiveHourPercent: 0,
188
+ weeklyPercent: 0,
189
+ enterpriseSpentUsd: 3323.93,
190
+ enterpriseLimitUsd: null,
191
+ enterpriseCurrency: 'USD',
192
+ },
193
+ },
194
+ });
195
+ const config = createConfig({
196
+ rateLimits: true,
197
+ showEnterpriseCost: true,
198
+ });
199
+ const output = await render(context, config);
200
+ const plain = strip(output);
201
+ expect(plain).toContain('spent:$3,323.93');
202
+ expect(plain).not.toMatch(/5h:\s*0%/);
203
+ expect(plain).not.toMatch(/wk:\s*0%/);
204
+ });
205
+ it('still renders 5h/wk for non-enterprise users (no regression on Pro/Max)', async () => {
206
+ const context = createContext({
207
+ subscriptionType: 'pro',
208
+ rateLimitsResult: {
209
+ rateLimits: {
210
+ fiveHourPercent: 45,
211
+ weeklyPercent: 12,
212
+ },
213
+ },
214
+ });
215
+ const config = createConfig({ rateLimits: true });
216
+ const output = await render(context, config);
217
+ const plain = strip(output);
218
+ expect(plain).toMatch(/5h:\s*45%/);
219
+ });
220
+ it('renders token usage for non-enterprise user even with showEnterpriseCost: true', async () => {
221
+ const context = createContext({
222
+ subscriptionType: 'pro',
223
+ lastRequestTokenUsage: { inputTokens: 1200, outputTokens: 340 },
224
+ });
225
+ const config = createConfig({ showTokens: true, showEnterpriseCost: true });
226
+ const output = await render(context, config);
227
+ const plain = strip(output);
228
+ expect(plain).toContain('tok:');
229
+ expect(plain).not.toContain('spent:');
230
+ });
231
+ });
232
+ //# sourceMappingURL=render-enterprise.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-enterprise.test.js","sourceRoot":"","sources":["../../../src/__tests__/hud/render-enterprise.test.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,9 @@ function makeContext(overrides = {}) {
45
45
  ...overrides,
46
46
  };
47
47
  }
48
+ function stripAnsi(value) {
49
+ return value.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '');
50
+ }
48
51
  function makeConfig(overrides = {}) {
49
52
  return {
50
53
  ...DEFAULT_HUD_CONFIG,
@@ -78,6 +81,188 @@ describe('render: rate limits display priority', () => {
78
81
  expect(output).toContain('45%');
79
82
  expect(output).not.toContain('[API 429]');
80
83
  });
84
+ it('renders 5h/wk/sn rate limits when subscription info is unavailable', async () => {
85
+ const context = makeContext({
86
+ subscriptionType: null,
87
+ rateLimitTier: null,
88
+ rateLimitsResult: {
89
+ rateLimits: {
90
+ fiveHourPercent: 36,
91
+ weeklyPercent: 32,
92
+ sonnetWeeklyPercent: 8,
93
+ },
94
+ },
95
+ });
96
+ const output = await render(context, makeConfig());
97
+ expect(output).toContain('5h:');
98
+ expect(output).toContain('36%');
99
+ expect(output).toContain('wk:');
100
+ expect(output).toContain('32%');
101
+ expect(output).toContain('sn:');
102
+ expect(output).toContain('8%');
103
+ });
104
+ it('renders exact Max 20x cache-shaped rate limits when legacy enterprise spend fields are present', async () => {
105
+ const context = makeContext({
106
+ subscriptionType: 'max',
107
+ rateLimitTier: 'default_claude_max_20x',
108
+ rateLimitsResult: {
109
+ rateLimits: {
110
+ fiveHourPercent: 4,
111
+ weeklyPercent: 6,
112
+ enterpriseSpentUsd: 200.5,
113
+ enterpriseLimitUsd: 200,
114
+ enterpriseUtilization: 100,
115
+ },
116
+ },
117
+ });
118
+ const output = await render(context, makeConfig());
119
+ const plain = stripAnsi(output);
120
+ expect(plain.trim()).not.toBe('');
121
+ expect(plain).toContain('5h:');
122
+ expect(plain).toContain('4%');
123
+ expect(plain).toContain('wk:');
124
+ expect(plain).toContain('6%');
125
+ expect(plain).not.toContain('spent:');
126
+ });
127
+ it('renders Max 20x 5h/wk/sn limits when enterprise spent exists but enterprise limit is null', async () => {
128
+ const context = makeContext({
129
+ subscriptionType: 'max',
130
+ rateLimitTier: 'default_claude_max_20x',
131
+ rateLimitsResult: {
132
+ rateLimits: {
133
+ fiveHourPercent: 36,
134
+ weeklyPercent: 32,
135
+ sonnetWeeklyPercent: 8,
136
+ enterpriseSpentUsd: 12.34,
137
+ enterpriseLimitUsd: null,
138
+ enterpriseCurrency: 'USD',
139
+ },
140
+ },
141
+ });
142
+ const output = await render(context, makeConfig());
143
+ const plain = stripAnsi(output);
144
+ expect(plain.trim()).not.toBe('');
145
+ expect(plain).toContain('5h:');
146
+ expect(plain).toContain('36%');
147
+ expect(plain).toContain('wk:');
148
+ expect(plain).toContain('32%');
149
+ expect(plain).toContain('sn:');
150
+ expect(plain).toContain('8%');
151
+ expect(plain).not.toContain('spent:');
152
+ });
153
+ it.each([
154
+ ['zero', 0],
155
+ ['negative', -1],
156
+ ['null', null],
157
+ ['undefined', undefined],
158
+ ])('renders normal rate limits for Max-like responses with %s enterprise limit', async (_caseName, enterpriseLimitUsd) => {
159
+ const context = makeContext({
160
+ subscriptionType: 'max',
161
+ rateLimitTier: null,
162
+ rateLimitsResult: {
163
+ rateLimits: {
164
+ fiveHourPercent: 36,
165
+ weeklyPercent: 32,
166
+ sonnetWeeklyPercent: 8,
167
+ enterpriseSpentUsd: 12.34,
168
+ enterpriseLimitUsd,
169
+ enterpriseCurrency: 'USD',
170
+ },
171
+ },
172
+ });
173
+ const output = await render(context, makeConfig());
174
+ expect(output).toContain('5h:');
175
+ expect(output).toContain('36%');
176
+ expect(output).toContain('wk:');
177
+ expect(output).toContain('32%');
178
+ expect(output).toContain('sn:');
179
+ expect(output).toContain('8%');
180
+ expect(output).not.toContain('spent:');
181
+ });
182
+ it.each(['pro', 'max'])('renders normal 5h/wk limits for non-enterprise %s when enterprise spend is nonzero', async (subscriptionType) => {
183
+ const context = makeContext({
184
+ subscriptionType,
185
+ rateLimitTier: null,
186
+ rateLimitsResult: {
187
+ rateLimits: {
188
+ fiveHourPercent: 36,
189
+ weeklyPercent: 32,
190
+ enterpriseSpentUsd: 12.34,
191
+ enterpriseLimitUsd: 50,
192
+ enterpriseCurrency: 'USD',
193
+ },
194
+ },
195
+ });
196
+ const output = await render(context, makeConfig());
197
+ expect(output).toContain('5h:');
198
+ expect(output).toContain('36%');
199
+ expect(output).toContain('wk:');
200
+ expect(output).toContain('32%');
201
+ expect(output).not.toContain('spent:');
202
+ });
203
+ it.each(['pro', 'max'])('renders normal 5h/wk limits for non-enterprise %s when enterprise spend is zero', async (subscriptionType) => {
204
+ const context = makeContext({
205
+ subscriptionType,
206
+ rateLimitTier: null,
207
+ rateLimitsResult: {
208
+ rateLimits: {
209
+ fiveHourPercent: 10,
210
+ weeklyPercent: 2,
211
+ enterpriseSpentUsd: 0,
212
+ enterpriseLimitUsd: 50,
213
+ enterpriseCurrency: 'USD',
214
+ },
215
+ },
216
+ });
217
+ const output = await render(context, makeConfig());
218
+ expect(output).toContain('5h:');
219
+ expect(output).toContain('10%');
220
+ expect(output).toContain('wk:');
221
+ expect(output).toContain('2%');
222
+ expect(output).not.toContain('spent:');
223
+ });
224
+ it('renders enterprise cost only for actual enterprise with the same billing fields', async () => {
225
+ const context = makeContext({
226
+ subscriptionType: 'enterprise',
227
+ rateLimitTier: null,
228
+ rateLimitsResult: {
229
+ rateLimits: {
230
+ fiveHourPercent: 4,
231
+ weeklyPercent: 6,
232
+ enterpriseSpentUsd: 200.5,
233
+ enterpriseLimitUsd: 200,
234
+ enterpriseUtilization: 100,
235
+ },
236
+ },
237
+ });
238
+ const output = await render(context, makeConfig());
239
+ const plain = stripAnsi(output);
240
+ expect(plain).toContain('spent:');
241
+ expect(plain).toContain('$200.50/$200.00');
242
+ expect(plain).toContain('(100%)');
243
+ expect(plain).not.toContain('5h:');
244
+ expect(plain).not.toContain('wk:');
245
+ });
246
+ it('uses enterprise cost instead of double-rendering 5h/wk for actual enterprise zero spend', async () => {
247
+ const context = makeContext({
248
+ subscriptionType: 'enterprise',
249
+ rateLimitTier: null,
250
+ rateLimitsResult: {
251
+ rateLimits: {
252
+ fiveHourPercent: 10,
253
+ weeklyPercent: 2,
254
+ enterpriseSpentUsd: 0,
255
+ enterpriseLimitUsd: 50,
256
+ enterpriseCurrency: 'USD',
257
+ },
258
+ },
259
+ });
260
+ const output = await render(context, makeConfig());
261
+ expect(output).toContain('spent:');
262
+ expect(output).toContain('$0.00/$50.00');
263
+ expect(output).not.toContain('5h:');
264
+ expect(output).not.toContain('wk:');
265
+ });
81
266
  it('shows [API 429] when error=rate_limited and rateLimits is null', async () => {
82
267
  const context = makeContext({
83
268
  rateLimitsResult: {
@@ -1 +1 @@
1
- {"version":3,"file":"render-rate-limits-priority.test.js","sourceRoot":"","sources":["../../../src/__tests__/hud/render-rate-limits-priority.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render-rate-limits-priority.test.js","sourceRoot":"","sources":["../../../src/__tests__/hud/render-rate-limits-priority.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,oEAAoE;AACpE,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;IACzB,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;CAC5B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI;CACtB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,SAAS,WAAW,CAAC,YAAuC,EAAE;IAC5D,OAAO;QACL,cAAc,EAAE,EAAE;QAClB,SAAS,EAAE,MAAM;QACjB,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,IAAI;QACT,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,EAAE;QAChB,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,EAAE;QACnB,GAAG,EAAE,WAAW;QAChB,SAAS,EAAE,IAAI;QACf,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE,IAAI;QACvB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,OAAO;QACnB,eAAe,EAAE,IAAI;QACrB,aAAa,EAAE,CAAC;QAChB,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC;QACjB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,IAAI;QACpB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,YAAgC,EAAE;IACpD,OAAO;QACL,GAAG,kBAAkB;QACrB,QAAQ,EAAE;YACR,GAAG,kBAAkB,CAAC,QAAQ;YAC9B,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,KAAK;YACb,eAAe,EAAE,KAAK;YACtB,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,KAAK;YAChB,aAAa,EAAE,KAAK;YACpB,UAAU,EAAE,KAAK;YACjB,cAAc,EAAE,KAAK;SACtB;QACD,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;gBACtD,KAAK,EAAE,cAAc;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,6CAA6C;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,EAAE;oBACjB,mBAAmB,EAAE,CAAC;iBACvB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;QAC9G,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,wBAAwB;YACvC,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,CAAC;oBAClB,aAAa,EAAE,CAAC;oBAChB,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB,EAAE,GAAG;oBACvB,qBAAqB,EAAE,GAAG;iBAC3B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,wBAAwB;YACvC,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,EAAE;oBACjB,mBAAmB,EAAE,CAAC;oBACtB,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB,EAAE,IAAI;oBACxB,kBAAkB,EAAE,KAAK;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,MAAM,EAAE,CAAC,CAAC;QACX,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAChB,CAAC,MAAM,EAAE,IAAI,CAAC;QACd,CAAC,WAAW,EAAE,SAAS,CAAC;KAChB,CAAC,CACT,4EAA4E,EAC5E,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE;QACtC,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,KAAK;YACvB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,EAAE;oBACjB,mBAAmB,EAAE,CAAC;oBACtB,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB;oBAClB,kBAAkB,EAAE,KAAK;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAU,CAAC,CAC9B,oFAAoF,EACpF,KAAK,EAAE,gBAAgB,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,EAAE;oBACjB,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB,EAAE,EAAE;oBACtB,kBAAkB,EAAE,KAAK;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAU,CAAC,CAC9B,iFAAiF,EACjF,KAAK,EAAE,gBAAgB,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,CAAC;oBAChB,kBAAkB,EAAE,CAAC;oBACrB,kBAAkB,EAAE,EAAE;oBACtB,kBAAkB,EAAE,KAAK;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,YAAY;YAC9B,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,CAAC;oBAClB,aAAa,EAAE,CAAC;oBAChB,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB,EAAE,GAAG;oBACvB,qBAAqB,EAAE,GAAG;iBAC3B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yFAAyF,EAAE,KAAK,IAAI,EAAE;QACvG,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE,YAAY;YAC9B,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,UAAU,EAAE;oBACV,eAAe,EAAE,EAAE;oBACnB,aAAa,EAAE,CAAC;oBAChB,kBAAkB,EAAE,CAAC;oBACrB,kBAAkB,EAAE,EAAE;oBACtB,kBAAkB,EAAE,KAAK;iBAC1B;aACF;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,cAAc;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,SAAS;aACjB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,MAAM;aACd;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE;aACvD;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,OAAO,GAAG,WAAW,CAAC;YAC1B,gBAAgB,EAAE;gBAChB,UAAU,EAAE,IAAI;gBAChB,KAAK,EAAE,gBAAgB;aACxB;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stdin-session-scope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin-session-scope.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/hud/stdin-session-scope.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,169 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'fs';
3
+ import { tmpdir } from 'os';
4
+ import { join } from 'path';
5
+ import { execSync } from 'child_process';
6
+ import { readStdinCache, writeStdinCache } from '../../hud/stdin.js';
7
+ function makeStdin(overrides = {}) {
8
+ return {
9
+ model: { display_name: 'Sonnet' },
10
+ workspace: { current_dir: '/tmp' },
11
+ cwd: '/tmp',
12
+ transcript_path: '/tmp/session.jsonl',
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe('HUD stdin cache path is session-scoped', () => {
17
+ let tmpRoot;
18
+ let originalCwd;
19
+ const envKeys = ['CLAUDE_SESSION_ID', 'CLAUDECODE_SESSION_ID'];
20
+ const savedEnv = {};
21
+ beforeEach(() => {
22
+ tmpRoot = mkdtempSync(join(tmpdir(), 'omc-hud-stdin-cache-'));
23
+ // Make a real git repo so getWorktreeRoot() (which shells out to git
24
+ // rev-parse) deterministically returns tmpRoot instead of leaking into
25
+ // the surrounding workspace.
26
+ execSync('git init --quiet', { cwd: tmpRoot });
27
+ originalCwd = process.cwd();
28
+ process.chdir(tmpRoot);
29
+ for (const key of envKeys) {
30
+ savedEnv[key] = process.env[key];
31
+ delete process.env[key];
32
+ }
33
+ });
34
+ afterEach(() => {
35
+ process.chdir(originalCwd);
36
+ for (const key of envKeys) {
37
+ if (savedEnv[key] === undefined) {
38
+ delete process.env[key];
39
+ }
40
+ else {
41
+ process.env[key] = savedEnv[key];
42
+ }
43
+ }
44
+ rmSync(tmpRoot, { recursive: true, force: true });
45
+ });
46
+ it('writes to a session-scoped path when CLAUDE_SESSION_ID is set', () => {
47
+ process.env.CLAUDE_SESSION_ID = 'test-session-aaa';
48
+ const stdin = makeStdin({ cwd: tmpRoot });
49
+ writeStdinCache(stdin);
50
+ const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'test-session-aaa', 'hud-stdin-cache.json');
51
+ expect(existsSync(expected)).toBe(true);
52
+ const loaded = JSON.parse(readFileSync(expected, 'utf-8'));
53
+ expect(loaded.cwd).toBe(tmpRoot);
54
+ });
55
+ it('falls back to the legacy flat path when no session env var is set', () => {
56
+ const stdin = makeStdin({ cwd: tmpRoot });
57
+ writeStdinCache(stdin);
58
+ const expected = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
59
+ expect(existsSync(expected)).toBe(true);
60
+ const sessionScoped = join(tmpRoot, '.omcp', 'state', 'sessions');
61
+ expect(existsSync(sessionScoped)).toBe(false);
62
+ });
63
+ it('accepts CLAUDECODE_SESSION_ID as the session id source', () => {
64
+ process.env.CLAUDECODE_SESSION_ID = 'test-session-bbb';
65
+ const stdin = makeStdin({ cwd: tmpRoot });
66
+ writeStdinCache(stdin);
67
+ const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'test-session-bbb', 'hud-stdin-cache.json');
68
+ expect(existsSync(expected)).toBe(true);
69
+ });
70
+ it('prevents two concurrent sessions from clobbering each other', () => {
71
+ process.env.CLAUDE_SESSION_ID = 'session-alpha';
72
+ const alpha = makeStdin({ cwd: tmpRoot, transcript_path: `${tmpRoot}/alpha.jsonl` });
73
+ writeStdinCache(alpha);
74
+ process.env.CLAUDE_SESSION_ID = 'session-beta';
75
+ const beta = makeStdin({ cwd: tmpRoot, transcript_path: `${tmpRoot}/beta.jsonl` });
76
+ writeStdinCache(beta);
77
+ // Reading back from each session must return its own snapshot.
78
+ process.env.CLAUDE_SESSION_ID = 'session-alpha';
79
+ expect(readStdinCache()?.transcript_path).toBe(`${tmpRoot}/alpha.jsonl`);
80
+ process.env.CLAUDE_SESSION_ID = 'session-beta';
81
+ expect(readStdinCache()?.transcript_path).toBe(`${tmpRoot}/beta.jsonl`);
82
+ });
83
+ it('readStdinCache ignores a legacy flat file when a session id is set', () => {
84
+ const stateDir = join(tmpRoot, '.omcp', 'state');
85
+ mkdirSync(stateDir, { recursive: true });
86
+ // Simulate a stale legacy cache written by an older build.
87
+ const legacy = makeStdin({ cwd: '/legacy/cwd' });
88
+ writeFileSync(join(stateDir, 'hud-stdin-cache.json'), JSON.stringify(legacy));
89
+ process.env.CLAUDE_SESSION_ID = 'fresh-session';
90
+ // Without a session file yet, read should miss rather than return the
91
+ // legacy (cross-session) value.
92
+ expect(readStdinCache()).toBeNull();
93
+ });
94
+ // Unsafe / malformed session ids must NOT escape the session-scoped directory.
95
+ // `getStdinCachePath` delegates validation to the shared `getSessionStateDir`
96
+ // helper (which calls `validateSessionId`), so any id that fails the repo-wide
97
+ // contract should fall back to the legacy flat path rather than being
98
+ // interpolated into a filesystem path.
99
+ it.each([
100
+ ['path traversal with ..', '../../../etc/passwd'],
101
+ ['path traversal with parent only', '..'],
102
+ ['forward slash', 'foo/bar'],
103
+ ['backslash (Windows traversal)', 'foo\\bar'],
104
+ ['leading underscore (regex first-char violation)', '_foo'],
105
+ ['overlong id (>256 chars)', 'a'.repeat(300)],
106
+ ])('rejects unsafe CLAUDE_SESSION_ID (%s) and falls back to the legacy path', (_label, unsafeId) => {
107
+ process.env.CLAUDE_SESSION_ID = unsafeId;
108
+ const stdin = makeStdin({ cwd: tmpRoot });
109
+ writeStdinCache(stdin);
110
+ // Nothing may be written to the session-scoped tree at all.
111
+ const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
112
+ expect(existsSync(sessionsDir)).toBe(false);
113
+ // And in particular, nothing outside the intended state dir.
114
+ const etcProbe = join(tmpRoot, 'etc', 'passwd');
115
+ expect(existsSync(etcProbe)).toBe(false);
116
+ // Legacy flat fallback should be populated instead.
117
+ const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
118
+ expect(existsSync(legacy)).toBe(true);
119
+ });
120
+ it('treats whitespace-only CLAUDE_SESSION_ID as unset and falls back', () => {
121
+ process.env.CLAUDE_SESSION_ID = ' ';
122
+ const stdin = makeStdin({ cwd: tmpRoot });
123
+ writeStdinCache(stdin);
124
+ const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
125
+ expect(existsSync(sessionsDir)).toBe(false);
126
+ const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
127
+ expect(existsSync(legacy)).toBe(true);
128
+ });
129
+ it('falls through to CLAUDECODE_SESSION_ID when CLAUDE_SESSION_ID is empty', () => {
130
+ // Regression: `??` alone would accept "" as defined and never consult
131
+ // the secondary variable.
132
+ process.env.CLAUDE_SESSION_ID = '';
133
+ process.env.CLAUDECODE_SESSION_ID = 'secondary-session';
134
+ const stdin = makeStdin({ cwd: tmpRoot });
135
+ writeStdinCache(stdin);
136
+ const expected = join(tmpRoot, '.omcp', 'state', 'sessions', 'secondary-session', 'hud-stdin-cache.json');
137
+ expect(existsSync(expected)).toBe(true);
138
+ });
139
+ it('falls through to CLAUDECODE_SESSION_ID when CLAUDE_SESSION_ID is present but invalid', () => {
140
+ // Regression: a non-empty-but-invalid primary must not silently bypass
141
+ // a valid secondary. The previous implementation resolved the primary
142
+ // first, then fell straight to the legacy path when validation threw,
143
+ // never giving the secondary a chance.
144
+ process.env.CLAUDE_SESSION_ID = '../../../etc/passwd';
145
+ process.env.CLAUDECODE_SESSION_ID = 'valid-secondary';
146
+ const stdin = makeStdin({ cwd: tmpRoot });
147
+ writeStdinCache(stdin);
148
+ const expectedSecondary = join(tmpRoot, '.omcp', 'state', 'sessions', 'valid-secondary', 'hud-stdin-cache.json');
149
+ expect(existsSync(expectedSecondary)).toBe(true);
150
+ // And in particular, the legacy flat path must NOT have been used —
151
+ // otherwise concurrent sessions could still clobber each other.
152
+ const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
153
+ expect(existsSync(legacy)).toBe(false);
154
+ // Safety probe: traversal from primary must not have escaped.
155
+ const etcProbe = join(tmpRoot, 'etc', 'passwd');
156
+ expect(existsSync(etcProbe)).toBe(false);
157
+ });
158
+ it('falls back to the legacy path only when every candidate is invalid', () => {
159
+ process.env.CLAUDE_SESSION_ID = '../traverse';
160
+ process.env.CLAUDECODE_SESSION_ID = 'foo/bar';
161
+ const stdin = makeStdin({ cwd: tmpRoot });
162
+ writeStdinCache(stdin);
163
+ const legacy = join(tmpRoot, '.omcp', 'state', 'hud-stdin-cache.json');
164
+ expect(existsSync(legacy)).toBe(true);
165
+ const sessionsDir = join(tmpRoot, '.omcp', 'state', 'sessions');
166
+ expect(existsSync(sessionsDir)).toBe(false);
167
+ });
168
+ });
169
+ //# sourceMappingURL=stdin-session-scope.test.js.map