crewly 1.20.186 → 1.20.188

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 (321) hide show
  1. package/config/skills/agent/core/project-tickets/SKILL.md +3 -2
  2. package/config/skills/agent/core/project-tickets/execute.sh +4 -4
  3. package/config/skills/agent/core/project-tickets/execute.test.sh +2 -2
  4. package/config/skills/agent/core/remember/SKILL.md +1 -0
  5. package/config/skills/agent/core/remember/execute.sh +12 -0
  6. package/config/skills/agent/core/report-status/SKILL.md +7 -1
  7. package/config/skills/agent/core/report-status/execute.sh +41 -0
  8. package/config/skills/agent/core/slack-post/SKILL.md +1 -0
  9. package/config/skills/agent/core/slack-post/execute.sh +9 -2
  10. package/config/skills/team-leader/_common/lib.sh +45 -0
  11. package/config/skills/team-leader/start-agent/SKILL.md +6 -6
  12. package/config/skills/team-leader/start-agent/execute.sh +3 -12
  13. package/config/skills/team-leader/stop-agent/SKILL.md +6 -6
  14. package/config/skills/team-leader/stop-agent/execute.sh +3 -12
  15. package/dist/backend/backend/src/constants.d.ts +114 -2
  16. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  17. package/dist/backend/backend/src/constants.js +114 -2
  18. package/dist/backend/backend/src/constants.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +62 -0
  21. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
  23. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +5 -1
  25. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +1 -1
  27. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +1 -1
  28. package/dist/backend/backend/src/controllers/request/open-items.controller.js +1 -1
  29. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  31. package/dist/backend/backend/src/controllers/slack/slack.controller.js +4 -1
  32. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  33. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +18 -1
  34. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
  35. package/dist/backend/backend/src/controllers/standing/standing.controller.js +77 -4
  36. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
  37. package/dist/backend/backend/src/controllers/system/system.controller.d.ts +12 -0
  38. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/system/system.controller.js +28 -3
  40. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/system/usage.controller.d.ts +46 -0
  42. package/dist/backend/backend/src/controllers/system/usage.controller.d.ts.map +1 -0
  43. package/dist/backend/backend/src/controllers/system/usage.controller.js +181 -0
  44. package/dist/backend/backend/src/controllers/system/usage.controller.js.map +1 -0
  45. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +7 -0
  46. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  47. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +64 -1
  48. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  49. package/dist/backend/backend/src/index.d.ts +7 -0
  50. package/dist/backend/backend/src/index.d.ts.map +1 -1
  51. package/dist/backend/backend/src/index.js +115 -1
  52. package/dist/backend/backend/src/index.js.map +1 -1
  53. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  54. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  55. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  56. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts +51 -0
  57. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts.map +1 -0
  58. package/dist/backend/backend/src/scripts/open-items-stale-followups.js +142 -0
  59. package/dist/backend/backend/src/scripts/open-items-stale-followups.js.map +1 -0
  60. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/agent/agent-registration.service.js +32 -1
  62. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  63. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  64. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  65. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +83 -2
  66. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  67. package/dist/backend/backend/src/services/memory/memory.service.d.ts +14 -2
  68. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  69. package/dist/backend/backend/src/services/memory/memory.service.js +12 -1
  70. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  71. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +18 -1
  72. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  73. package/dist/backend/backend/src/services/memory/project-memory.service.js +38 -1
  74. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  75. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  76. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  77. package/dist/backend/backend/src/services/memory/standing-answers.service.js +40 -2
  78. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts +70 -0
  80. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts.map +1 -0
  81. package/dist/backend/backend/src/services/messaging/offline-agent-message.js +92 -0
  82. package/dist/backend/backend/src/services/messaging/offline-agent-message.js.map +1 -0
  83. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +7 -1
  84. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +16 -2
  86. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  87. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -0
  89. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  90. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +9 -1
  92. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  93. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  94. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  96. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  98. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +87 -15
  100. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  101. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts +130 -0
  102. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.d.ts.map +1 -0
  103. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js +274 -0
  104. package/dist/backend/backend/src/services/monitoring/antigravity-usage-sync.service.js.map +1 -0
  105. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts +152 -0
  106. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.d.ts.map +1 -0
  107. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js +311 -0
  108. package/dist/backend/backend/src/services/monitoring/codex-rollout-sync.service.js.map +1 -0
  109. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +78 -1
  110. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  111. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +96 -4
  112. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  113. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  114. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +86 -5
  116. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  117. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +2 -1
  118. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +17 -6
  120. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -1
  121. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +62 -1
  122. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/open-items/open-items.service.js +203 -9
  124. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +4 -4
  126. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +1 -1
  128. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  129. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts +4 -3
  130. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.d.ts.map +1 -1
  131. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js +7 -4
  132. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-messages.js.map +1 -1
  133. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +40 -9
  134. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  135. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +68 -20
  136. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  137. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts +40 -0
  138. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts.map +1 -0
  139. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js +82 -0
  140. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js.map +1 -0
  141. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +29 -0
  142. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  143. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +49 -0
  144. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  145. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  146. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -11
  147. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  148. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +23 -0
  149. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  150. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +55 -1
  151. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  152. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +10 -4
  154. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  156. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  158. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  159. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +129 -0
  160. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/spend/spend-cap-command.js +323 -0
  162. package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -0
  163. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +60 -0
  164. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/spend/spend-cap.gate.js +66 -0
  166. package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  167. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +340 -0
  168. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/spend/spend-cap.service.js +760 -0
  170. package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -0
  171. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +126 -0
  172. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/spend/spend-cap.store.js +141 -0
  174. package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -0
  175. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +52 -0
  176. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +112 -0
  178. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -0
  179. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +145 -0
  180. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/spend/spend-ledger.service.js +214 -0
  182. package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -0
  183. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts +51 -0
  184. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js +43 -0
  186. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js.map +1 -0
  187. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  188. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +73 -1
  190. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  191. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +53 -0
  192. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  193. package/dist/backend/backend/src/services/task-pool/work-item-usage.js +39 -0
  194. package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  195. package/dist/backend/backend/src/services/usage/token-format.d.ts +49 -0
  196. package/dist/backend/backend/src/services/usage/token-format.d.ts.map +1 -0
  197. package/dist/backend/backend/src/services/usage/token-format.js +81 -0
  198. package/dist/backend/backend/src/services/usage/token-format.js.map +1 -0
  199. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts +132 -0
  200. package/dist/backend/backend/src/services/usage/usage-stats.service.d.ts.map +1 -0
  201. package/dist/backend/backend/src/services/usage/usage-stats.service.js +226 -0
  202. package/dist/backend/backend/src/services/usage/usage-stats.service.js.map +1 -0
  203. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  204. package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -14
  205. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  206. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +25 -0
  207. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  208. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +50 -0
  209. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  210. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +9 -1
  211. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/workflow/scheduler.service.js +16 -2
  213. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  214. package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
  215. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  216. package/dist/backend/backend/src/types/event-bus.types.d.ts +9 -1
  217. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  218. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  219. package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
  220. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
  221. package/dist/backend/backend/src/types/review-reason.types.js +1 -0
  222. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
  223. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +24 -7
  224. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  225. package/dist/backend/backend/src/types/ticket-autopilot.types.js +29 -13
  226. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  227. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +5 -1
  228. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  229. package/dist/backend/backend/src/types/v2/open-item.types.js +1 -1
  230. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -1
  231. package/dist/backend/build-info.json +2 -2
  232. package/dist/cli/backend/src/constants.d.ts +114 -2
  233. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  234. package/dist/cli/backend/src/constants.js +114 -2
  235. package/dist/cli/backend/src/constants.js.map +1 -1
  236. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  237. package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -1
  238. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  239. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  240. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  241. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +83 -2
  242. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  243. package/dist/cli/backend/src/services/memory/memory.service.d.ts +14 -2
  244. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  245. package/dist/cli/backend/src/services/memory/memory.service.js +12 -1
  246. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  247. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +18 -1
  248. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  249. package/dist/cli/backend/src/services/memory/project-memory.service.js +38 -1
  250. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  251. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  252. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  253. package/dist/cli/backend/src/services/memory/standing-answers.service.js +40 -2
  254. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
  255. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +7 -1
  256. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  257. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +16 -2
  258. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  259. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  260. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +9 -1
  261. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  262. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  263. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  264. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  265. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  266. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  267. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  268. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +87 -15
  269. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  270. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +97 -0
  271. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -0
  272. package/dist/cli/backend/src/services/monitoring/model-pricing.js +120 -0
  273. package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -0
  274. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +78 -1
  275. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  276. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +96 -4
  277. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  278. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  279. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  280. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +86 -5
  281. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  282. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  283. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  284. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  285. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  286. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +60 -0
  287. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  288. package/dist/cli/backend/src/services/spend/spend-cap.gate.js +66 -0
  289. package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  290. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  291. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  292. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +73 -1
  293. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  294. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +53 -0
  295. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  296. package/dist/cli/backend/src/services/task-pool/work-item-usage.js +39 -0
  297. package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  298. package/dist/cli/backend/src/services/usage/token-format.d.ts +49 -0
  299. package/dist/cli/backend/src/services/usage/token-format.d.ts.map +1 -0
  300. package/dist/cli/backend/src/services/usage/token-format.js +81 -0
  301. package/dist/cli/backend/src/services/usage/token-format.js.map +1 -0
  302. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  303. package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -14
  304. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  305. package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
  306. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  307. package/dist/cli/backend/src/types/event-bus.types.d.ts +9 -1
  308. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  309. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  310. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +24 -7
  311. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  312. package/dist/cli/backend/src/types/ticket-autopilot.types.js +29 -13
  313. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  314. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +5 -1
  315. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  316. package/dist/cli/backend/src/types/v2/open-item.types.js +1 -1
  317. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -1
  318. package/frontend/dist/assets/{index-a79c7852.css → index-20a67829.css} +1 -1
  319. package/frontend/dist/assets/{index-1ee8a9a2.js → index-49f50b45.js} +282 -282
  320. package/frontend/dist/index.html +2 -2
  321. package/package.json +1 -1
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Token caps and boosts from the owner's DM with the orc. Handled by the
3
+ * backend, not the orc — so it works while the orc itself is stopped:
4
+ *
5
+ * Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
6
+ * - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
7
+ * - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
8
+ * - `set daily total cap to 200M` (all agents together)
9
+ * - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
10
+ *
11
+ * Boosts (until local midnight):
12
+ * - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
13
+ * - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
14
+ * - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
15
+ *
16
+ * A target is everyone, a team (by name) or an agent (by name / session);
17
+ * a name that is both a team and an agent means the team. Replies are
18
+ * English (harness text rule).
19
+ *
20
+ * While the orc is stopped by a cap, every other owner DM to it gets one
21
+ * harness line saying so (the message itself stays queued for the orc).
22
+ *
23
+ * specs/2026-10-02-spend-cap.md
24
+ *
25
+ * @module services/spend/spend-cap-command
26
+ */
27
+ import type { SlackIncomingMessage } from '../../types/slack.types.js';
28
+ import { type SpendStop } from './spend-cap.gate.js';
29
+ import { type BoostInput, type SpendCapPatch } from './spend-cap.service.js';
30
+ /** A parsed command. `target` is the name as typed (resolved later). */
31
+ export type SpendCapCommand = {
32
+ kind: 'set';
33
+ target: string | null;
34
+ team?: boolean;
35
+ tokens: number;
36
+ } | {
37
+ kind: 'set_total';
38
+ tokens: number;
39
+ } | {
40
+ kind: 'remove';
41
+ target: string | null;
42
+ team?: boolean;
43
+ } | {
44
+ kind: 'remove_total';
45
+ } | {
46
+ kind: 'boost';
47
+ target: string;
48
+ tokens: number;
49
+ } | {
50
+ kind: 'unlimited';
51
+ target: string;
52
+ } | {
53
+ kind: 'usd_hint';
54
+ };
55
+ /**
56
+ * Parse a cap / boost command.
57
+ *
58
+ * @param text - Message text
59
+ * @returns The command, or null when the message is not one
60
+ *
61
+ * @example
62
+ * parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
63
+ * parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
64
+ */
65
+ export declare function parseSpendCapCommand(text: string | undefined): SpendCapCommand | null;
66
+ /** An agent the owner can name. */
67
+ export interface NamedAgent {
68
+ session: string;
69
+ name: string;
70
+ }
71
+ /** A team the owner can name. */
72
+ export interface NamedTeam {
73
+ id: string;
74
+ name: string;
75
+ }
76
+ /**
77
+ * Resolve the agent the owner named.
78
+ *
79
+ * @param who - Session name, member name, or "orc" / "orchestrator"
80
+ * @param agents - Configured agents
81
+ * @returns Session, or null when unknown / ambiguous
82
+ */
83
+ export declare function resolveAgent(who: string, agents: NamedAgent[]): string | null;
84
+ /**
85
+ * Resolve the team the owner named.
86
+ *
87
+ * @param who - Team name or id (`team CE` works too)
88
+ * @param teams - Teams
89
+ * @returns Team, or null when unknown / ambiguous
90
+ */
91
+ export declare function resolveTeam(who: string, teams: NamedTeam[]): NamedTeam | null;
92
+ /** What the interceptor needs. */
93
+ export interface SpendCapCommandDeps {
94
+ /** `orc` when the message is the owner writing in their DM with the orc */
95
+ ownerDmScope: (message: SlackIncomingMessage) => 'orc' | 'agent' | null;
96
+ replyTargetOf: (message: SlackIncomingMessage) => unknown;
97
+ reply: (text: string, target: unknown) => Promise<unknown>;
98
+ /** Configured agents (orc included) */
99
+ agents: () => Promise<NamedAgent[]>;
100
+ teams: () => Promise<NamedTeam[]>;
101
+ setCaps: (patch: SpendCapPatch) => Promise<unknown>;
102
+ boost: (input: BoostInput) => Promise<unknown>;
103
+ /** The orc's stop, or null */
104
+ orcStop: () => SpendStop | null;
105
+ onError?: (err: unknown) => void;
106
+ }
107
+ /**
108
+ * The orc's harness line while it is stopped by a cap.
109
+ *
110
+ * @param stop - The orc's stop
111
+ * @returns One line
112
+ */
113
+ export declare function orcCappedReply(stop: SpendStop): string;
114
+ /**
115
+ * Run a parsed command.
116
+ *
117
+ * @param cmd - Command
118
+ * @param deps - Collaborators
119
+ * @returns The owner's one-line answer
120
+ */
121
+ export declare function runSpendCapCommand(cmd: SpendCapCommand, deps: Pick<SpendCapCommandDeps, 'agents' | 'teams' | 'setCaps' | 'boost'>): Promise<string>;
122
+ /**
123
+ * The Slack bridge interceptor for the owner's orc DM.
124
+ *
125
+ * @param deps - Collaborators
126
+ * @returns Interceptor: true when the message was a cap command (consumed)
127
+ */
128
+ export declare function createSpendCapInterceptor(deps: SpendCapCommandDeps): (message: SlackIncomingMessage) => boolean;
129
+ //# sourceMappingURL=spend-cap-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap-command.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Token caps and boosts from the owner's DM with the orc. Handled by the
3
+ * backend, not the orc — so it works while the orc itself is stopped:
4
+ *
5
+ * Caps (amounts in tokens: `5M`, `500k`, `2000万`, `5000000`):
6
+ * - `set daily cap for Ella to 5M` / `set daily cap to 5M` (default per agent)
7
+ * - `set team cap for CE to 50M` / `set daily cap for team CE to 50M`
8
+ * - `set daily total cap to 200M` (all agents together)
9
+ * - `remove daily cap for Ella` / `remove team cap for CE` / `remove daily cap` / `remove daily total cap`
10
+ *
11
+ * Boosts (until local midnight):
12
+ * - `boost CE by 20M today` / `boost Ella by 5M` / `boost everyone by 10M today`
13
+ * - `unlimited today for everyone` / `unlimited today for CE` / `CE unlimited today`
14
+ * - `放开 CE 今天` / `今天放开 CE` / `今天全部放开` / `给 CE 加 20M` / `CE 今天加 2000万`
15
+ *
16
+ * A target is everyone, a team (by name) or an agent (by name / session);
17
+ * a name that is both a team and an agent means the team. Replies are
18
+ * English (harness text rule).
19
+ *
20
+ * While the orc is stopped by a cap, every other owner DM to it gets one
21
+ * harness line saying so (the message itself stays queued for the orc).
22
+ *
23
+ * specs/2026-10-02-spend-cap.md
24
+ *
25
+ * @module services/spend/spend-cap-command
26
+ */
27
+ import { ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
28
+ import { compactTokens, formatTokens, parseTokenAmount } from '../usage/token-format.js';
29
+ import { spendCapReason } from './spend-cap.gate.js';
30
+ import { suggestedBoost } from './spend-cap.service.js';
31
+ /** A name a boost may target from free text: short ASCII, or an "everyone" word. */
32
+ const NAME = /^[a-z0-9][a-z0-9 _.@-]{0,39}$/;
33
+ /**
34
+ * Whether free text after a boost keyword is a plausible target (so an
35
+ * ordinary sentence that happens to start with 放开 / ends with "unlimited
36
+ * today" still goes to the orc).
37
+ *
38
+ * @param who - Candidate target
39
+ * @returns True when it may be a team / agent name or "everyone"
40
+ */
41
+ function plausibleTarget(who) {
42
+ return EVERYONE.has(who) || NAME.test(who);
43
+ }
44
+ /** Words for "everyone". */
45
+ const EVERYONE = new Set(['everyone', 'everybody', 'all', 'all agents', 'every agent', 'the whole crew', 'total', '所有人', '全部', '大家', '所有', '全员', '全部人']);
46
+ const AMOUNT = String.raw `(\d+(?:\.\d+)?\s*(?:k|m|mil|million|b|bn|billion|万|亿)?)(?:\s*tokens?)?`;
47
+ const CAP = String.raw `(?:daily\s+)?(?:token\s+|spend(?:ing)?\s+|usage\s+)?cap`;
48
+ const TODAY = String.raw `(?:\s*(?:for\s+)?today)?`;
49
+ /**
50
+ * Normalise a message for matching.
51
+ *
52
+ * @param text - Raw text
53
+ * @returns Lower-cased, mentions and trailing punctuation removed
54
+ */
55
+ function norm(text) {
56
+ return text
57
+ .replace(/<@[A-Z0-9]+>/g, '')
58
+ .replace(/[`*_]/g, '')
59
+ .toLowerCase()
60
+ .replace(/[\s.。!!~~]+$/u, '')
61
+ .replace(/^(?:please|pls|请)\s*/u, '')
62
+ .replace(/\s+/g, ' ')
63
+ .trim();
64
+ }
65
+ /**
66
+ * Amount text → tokens.
67
+ *
68
+ * @param text - e.g. `20m`, `2000万`
69
+ * @returns Tokens, or null
70
+ */
71
+ function amount(text) {
72
+ return parseTokenAmount(text.replace(/\s+/g, ''));
73
+ }
74
+ /**
75
+ * Parse a cap / boost command.
76
+ *
77
+ * @param text - Message text
78
+ * @returns The command, or null when the message is not one
79
+ *
80
+ * @example
81
+ * parseSpendCapCommand('boost CE by 20M today') // { kind: 'boost', target: 'ce', tokens: 20000000 }
82
+ * parseSpendCapCommand('放开 CE 今天') // { kind: 'unlimited', target: 'ce' }
83
+ */
84
+ export function parseSpendCapCommand(text) {
85
+ if (!text)
86
+ return null;
87
+ const t = norm(text);
88
+ if (!t)
89
+ return null;
90
+ let m;
91
+ const num = (s) => amount(s);
92
+ // ---- caps
93
+ m = new RegExp(String.raw `^set (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap to ${AMOUNT}$`).exec(t);
94
+ if (m && num(m[1]))
95
+ return { kind: 'set_total', tokens: num(m[1]) };
96
+ m = new RegExp(String.raw `^set (?:the )?(?:daily )?team (?:token )?cap for (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
97
+ if (m && num(m[2]))
98
+ return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
99
+ m = new RegExp(String.raw `^set (?:the )?${CAP} for team (.+?) to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
100
+ if (m && num(m[2]))
101
+ return { kind: 'set', target: m[1].trim(), team: true, tokens: num(m[2]) };
102
+ m = new RegExp(String.raw `^set (?:the )?${CAP}(?: for (.+?))? to ${AMOUNT}(?: (?:a|per) day)?$`).exec(t);
103
+ if (m && num(m[2]))
104
+ return { kind: 'set', target: m[1]?.trim() || null, tokens: num(m[2]) };
105
+ m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily total|total daily|total)(?: token| spend(?:ing)?)? cap$/.exec(t);
106
+ if (m)
107
+ return { kind: 'remove_total' };
108
+ m = /^(?:remove|clear|turn off|disable) (?:the )?(?:daily )?team cap for (.+)$/.exec(t) ?? new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP} for team (.+)$`).exec(t);
109
+ if (m)
110
+ return { kind: 'remove', target: m[1].trim(), team: true };
111
+ m = new RegExp(String.raw `^(?:remove|clear|turn off|disable) (?:the )?${CAP}(?: for (.+))?$`).exec(t);
112
+ if (m)
113
+ return { kind: 'remove', target: m[1]?.trim() || null };
114
+ // ---- boosts (English)
115
+ m = new RegExp(String.raw `^boost (.+?) (?:by |\+)\s*${AMOUNT}${TODAY}$`).exec(t);
116
+ if (m && num(m[2]))
117
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
118
+ m = new RegExp(String.raw `^give (.+?) (?:\+)?${AMOUNT} (?:more|extra)${TODAY}$`).exec(t);
119
+ if (m && num(m[2]))
120
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
121
+ m = /^(?:unlimited|no (?:token )?cap|no limit)(?: tokens?)? (?:for )?today(?: for (.+))?$/.exec(t);
122
+ if (m)
123
+ return { kind: 'unlimited', target: m[1]?.trim() || 'everyone' };
124
+ m = /^(?:unlimited|no (?:token )?cap|no limit) (?:tokens? )?for (.+?)(?: (?:for )?today)?$/.exec(t);
125
+ if (m)
126
+ return { kind: 'unlimited', target: m[1].trim() };
127
+ m = /^(?:lift|remove|drop) (?:the )?(?:daily )?(?:token )?caps? (?:for|on) (.+?) (?:for )?today$/.exec(t);
128
+ if (m)
129
+ return { kind: 'unlimited', target: m[1].trim() };
130
+ m = /^(.+?) unlimited today$/.exec(t);
131
+ if (m && plausibleTarget(m[1].trim()))
132
+ return { kind: 'unlimited', target: m[1].trim() };
133
+ // ---- boosts (Chinese)
134
+ const zh = t.replace(/\s+/g, ' ');
135
+ m = /^(?:今天)?\s*(?:全部|全都|所有人|大家)?\s*放开(?:吧)?\s*(.*?)\s*(?:今天|今日)?(?:吧)?$/u.exec(zh);
136
+ if (m) {
137
+ const who = m[1].trim();
138
+ const all = /^(?:今天|今日)?\s*(?:全部|全都|所有人|大家)/u.test(zh) || EVERYONE.has(who) || who === '';
139
+ if (all)
140
+ return { kind: 'unlimited', target: 'everyone' };
141
+ if (plausibleTarget(who))
142
+ return { kind: 'unlimited', target: who };
143
+ }
144
+ m = /^(.+?)\s*(?:今天|今日)\s*(?:不限|不封顶|放开)$/u.exec(zh);
145
+ if (m && plausibleTarget(m[1].trim()))
146
+ return { kind: 'unlimited', target: m[1].trim() };
147
+ m = new RegExp(String.raw `^(?:今天)?\s*给\s*(.+?)\s*(?:今天)?\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
148
+ if (m && num(m[2]) && plausibleTarget(m[1].trim()))
149
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
150
+ m = new RegExp(String.raw `^(.+?)\s*(?:今天|今日)\s*(?:加|多加|增加)\s*${AMOUNT}$`, 'u').exec(zh);
151
+ if (m && num(m[2]) && plausibleTarget(m[1].trim()))
152
+ return { kind: 'boost', target: m[1].trim(), tokens: num(m[2]) };
153
+ // ---- the pre-token dollar forms: answer with the token form instead of passing them on
154
+ if (/^(?:set|raise|remove) .*cap.*\$\s*\d/.test(t))
155
+ return { kind: 'usd_hint' };
156
+ return null;
157
+ }
158
+ /**
159
+ * Resolve the agent the owner named.
160
+ *
161
+ * @param who - Session name, member name, or "orc" / "orchestrator"
162
+ * @param agents - Configured agents
163
+ * @returns Session, or null when unknown / ambiguous
164
+ */
165
+ export function resolveAgent(who, agents) {
166
+ const w = who.trim().toLowerCase().replace(/^@/, '');
167
+ if (['orc', 'the orc', 'orchestrator', 'the orchestrator', 'crewly orc', ORCHESTRATOR_SESSION_NAME].includes(w))
168
+ return ORCHESTRATOR_SESSION_NAME;
169
+ const bySession = agents.find((a) => a.session.toLowerCase() === w);
170
+ if (bySession)
171
+ return bySession.session;
172
+ const byName = agents.filter((a) => a.name.toLowerCase() === w);
173
+ return byName.length === 1 ? byName[0].session : null;
174
+ }
175
+ /**
176
+ * Resolve the team the owner named.
177
+ *
178
+ * @param who - Team name or id (`team CE` works too)
179
+ * @param teams - Teams
180
+ * @returns Team, or null when unknown / ambiguous
181
+ */
182
+ export function resolveTeam(who, teams) {
183
+ const w = who.trim().toLowerCase().replace(/^(?:the )?team\s+/, '').replace(/\s+team$/, '');
184
+ const byId = teams.find((t) => t.id.toLowerCase() === w);
185
+ if (byId)
186
+ return byId;
187
+ const byName = teams.filter((t) => t.name.toLowerCase() === w);
188
+ return byName.length === 1 ? byName[0] : null;
189
+ }
190
+ /**
191
+ * The orc's harness line while it is stopped by a cap.
192
+ *
193
+ * @param stop - The orc's stop
194
+ * @returns One line
195
+ */
196
+ export function orcCappedReply(stop) {
197
+ const extra = compactTokens(suggestedBoost(stop.capTokens));
198
+ const who = stop.scope === 'total' ? 'everyone' : stop.scope === 'team' ? (stop.teamName ?? 'the team') : 'orc';
199
+ return `${spendCapReason(stop, 'Orc')}. No new turns start until midnight; your message is queued. To lift it for today, reply \`boost ${who} by ${extra} today\` or \`unlimited today for ${who}\` (or Settings → System → Usage).`;
200
+ }
201
+ /**
202
+ * Run a parsed command.
203
+ *
204
+ * @param cmd - Command
205
+ * @param deps - Collaborators
206
+ * @returns The owner's one-line answer
207
+ */
208
+ export async function runSpendCapCommand(cmd, deps) {
209
+ const agents = await deps.agents();
210
+ const teams = await deps.teams();
211
+ const agentOf = (target) => {
212
+ const session = resolveAgent(target, agents);
213
+ if (!session)
214
+ return null;
215
+ return { session, name: session === ORCHESTRATOR_SESSION_NAME ? 'Orc' : (agents.find((a) => a.session === session)?.name ?? session) };
216
+ };
217
+ const unknown = (target) => `I don't know a team or agent called "${target}". Use a team name (e.g. ${teams[0]?.name ?? 'CE'}), an agent's name or session name, or "everyone".`;
218
+ const resolve = (target, preferTeam) => {
219
+ if (EVERYONE.has(target.trim().toLowerCase()))
220
+ return { scope: 'all' };
221
+ const team = resolveTeam(target, teams);
222
+ const agent = agentOf(target);
223
+ if (team && (preferTeam || !agent))
224
+ return { scope: 'team', team };
225
+ if (agent)
226
+ return { scope: 'agent', ...agent };
227
+ return unknown(target);
228
+ };
229
+ const label = (t) => (t.scope === 'all' ? 'everyone' : t.scope === 'team' ? `team ${t.team.name}` : t.name);
230
+ const boostInput = (t) => t.scope === 'all' ? { scope: 'all' } : t.scope === 'team' ? { scope: 'team', id: t.team.id } : { scope: 'agent', id: t.session };
231
+ switch (cmd.kind) {
232
+ case 'usd_hint':
233
+ return 'Caps are counted in tokens now, not dollars. Try `set daily cap for orc to 5M`, `set team cap for CE to 50M`, or `boost CE by 20M today`.';
234
+ case 'set_total':
235
+ await deps.setCaps({ totalCapTokens: cmd.tokens });
236
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
237
+ case 'remove_total':
238
+ await deps.setCaps({ totalCapTokens: null });
239
+ return 'Daily total token cap removed.';
240
+ case 'set': {
241
+ if (!cmd.target) {
242
+ await deps.setCaps({ defaultAgentCapTokens: cmd.tokens });
243
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} per agent (agents with their own cap keep it).`;
244
+ }
245
+ const t = resolve(cmd.target, cmd.team === true);
246
+ if (typeof t === 'string')
247
+ return t;
248
+ if (t.scope === 'all') {
249
+ await deps.setCaps({ totalCapTokens: cmd.tokens });
250
+ return `Daily token cap set to ${formatTokens(cmd.tokens)} for all agents together.`;
251
+ }
252
+ if (t.scope === 'team') {
253
+ await deps.setCaps({ teams: { [t.team.id]: cmd.tokens } });
254
+ return `Daily token cap for team ${t.team.name} set to ${formatTokens(cmd.tokens)} (all its members together).`;
255
+ }
256
+ await deps.setCaps({ agents: { [t.session]: cmd.tokens } });
257
+ return `Daily token cap for ${t.name} set to ${formatTokens(cmd.tokens)}.`;
258
+ }
259
+ case 'remove': {
260
+ if (!cmd.target) {
261
+ await deps.setCaps({ defaultAgentCapTokens: null });
262
+ return 'Default daily token cap removed (agents with their own cap keep it).';
263
+ }
264
+ const t = resolve(cmd.target, cmd.team === true);
265
+ if (typeof t === 'string')
266
+ return t;
267
+ if (t.scope === 'all') {
268
+ await deps.setCaps({ totalCapTokens: null });
269
+ return 'Daily total token cap removed.';
270
+ }
271
+ if (t.scope === 'team') {
272
+ await deps.setCaps({ teams: { [t.team.id]: null } });
273
+ return `Team ${t.team.name} has no daily token cap now.`;
274
+ }
275
+ await deps.setCaps({ agents: { [t.session]: null } });
276
+ return `${t.name} has no daily token cap now.`;
277
+ }
278
+ case 'boost': {
279
+ const t = resolve(cmd.target, true);
280
+ if (typeof t === 'string')
281
+ return t;
282
+ await deps.boost({ ...boostInput(t), extraTokens: cmd.tokens, by: 'orc-dm' });
283
+ return `Boosted ${label(t)} by +${formatTokens(cmd.tokens)} until midnight. Queued messages are being delivered.`;
284
+ }
285
+ case 'unlimited': {
286
+ const t = resolve(cmd.target, true);
287
+ if (typeof t === 'string')
288
+ return t;
289
+ await deps.boost({ ...boostInput(t), unlimited: true, by: 'orc-dm' });
290
+ return `No token cap for ${label(t)} until midnight. Queued messages are being delivered.`;
291
+ }
292
+ }
293
+ }
294
+ /**
295
+ * The Slack bridge interceptor for the owner's orc DM.
296
+ *
297
+ * @param deps - Collaborators
298
+ * @returns Interceptor: true when the message was a cap command (consumed)
299
+ */
300
+ export function createSpendCapInterceptor(deps) {
301
+ return (message) => {
302
+ if (deps.ownerDmScope(message) !== 'orc')
303
+ return false;
304
+ const target = deps.replyTargetOf(message);
305
+ const cmd = message.hasFiles ? null : parseSpendCapCommand(message.text);
306
+ if (cmd) {
307
+ void runSpendCapCommand(cmd, deps)
308
+ .then((text) => deps.reply(text, target))
309
+ .catch((err) => {
310
+ deps.onError?.(err);
311
+ return deps.reply(`Couldn't change the cap: ${err instanceof Error ? err.message : String(err)}`, target).catch(() => undefined);
312
+ });
313
+ return true;
314
+ }
315
+ const stop = deps.orcStop();
316
+ if (stop) {
317
+ // Not consumed: the message goes on to the orc's queue and waits there.
318
+ void deps.reply(orcCappedReply(stop), target).catch((err) => deps.onError?.(err));
319
+ }
320
+ return false;
321
+ };
322
+ }
323
+ //# sourceMappingURL=spend-cap-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap-command.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Token cap gate — the process-wide hook the delivery and wake paths ask
3
+ * "may this agent start a new turn?". Kept apart from the service so the
4
+ * hot paths (agent registration, the orc queue processor, the owner-message
5
+ * watchdog) import a tiny module with no dependencies of its own.
6
+ *
7
+ * specs/2026-10-02-spend-cap.md
8
+ *
9
+ * @module services/spend/spend-cap.gate
10
+ */
11
+ /** Why an agent may not start a new turn today. */
12
+ export interface SpendStop {
13
+ session: string;
14
+ /** `agent`: its own cap; `team`: its team's cap; `total`: the all-agents cap */
15
+ scope: 'agent' | 'team' | 'total';
16
+ /** The cap in force (tokens, boosts included) */
17
+ capTokens: number;
18
+ /** Tokens used today against it */
19
+ usedTokens: number;
20
+ /** For a team stop: the team */
21
+ teamId?: string;
22
+ teamName?: string;
23
+ }
24
+ /** What the service exposes to the gate. */
25
+ export interface SpendCapGate {
26
+ /** The stop in force for a session, or null when it may run */
27
+ stopOf(session: string): SpendStop | null;
28
+ /** Owner-facing name of a session ("Orc", "Ella") */
29
+ displayNameOf?(session: string): string;
30
+ }
31
+ /**
32
+ * Install (or clear) the gate.
33
+ *
34
+ * @param next - Gate, or null
35
+ */
36
+ export declare function setSpendCapGate(next: SpendCapGate | null): void;
37
+ /**
38
+ * The stop in force for a session. Never throws: a broken gate lets the
39
+ * agent run rather than silently dropping its work.
40
+ *
41
+ * @param session - Agent session
42
+ * @returns Stop, or null
43
+ */
44
+ export declare function spendCapStopOf(session: string): SpendStop | null;
45
+ /**
46
+ * Owner-facing name of a session.
47
+ *
48
+ * @param session - Agent session
49
+ * @returns Name (the session name when unknown)
50
+ */
51
+ export declare function spendCapNameOf(session: string): string;
52
+ /**
53
+ * The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
54
+ *
55
+ * @param stop - The stop
56
+ * @param name - Owner-facing name (default: looked up)
57
+ * @returns Reason text
58
+ */
59
+ export declare function spendCapReason(stop: SpendStop, name?: string): string;
60
+ //# sourceMappingURL=spend-cap.gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap.gate.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,qDAAqD;IACrD,aAAa,CAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CACzC;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMtD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,GAAE,MAAqC,GAAG,MAAM,CAQnG"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Token cap gate — the process-wide hook the delivery and wake paths ask
3
+ * "may this agent start a new turn?". Kept apart from the service so the
4
+ * hot paths (agent registration, the orc queue processor, the owner-message
5
+ * watchdog) import a tiny module with no dependencies of its own.
6
+ *
7
+ * specs/2026-10-02-spend-cap.md
8
+ *
9
+ * @module services/spend/spend-cap.gate
10
+ */
11
+ import { formatTokens } from '../usage/token-format.js';
12
+ let gate = null;
13
+ /**
14
+ * Install (or clear) the gate.
15
+ *
16
+ * @param next - Gate, or null
17
+ */
18
+ export function setSpendCapGate(next) {
19
+ gate = next;
20
+ }
21
+ /**
22
+ * The stop in force for a session. Never throws: a broken gate lets the
23
+ * agent run rather than silently dropping its work.
24
+ *
25
+ * @param session - Agent session
26
+ * @returns Stop, or null
27
+ */
28
+ export function spendCapStopOf(session) {
29
+ try {
30
+ return gate?.stopOf(session) ?? null;
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ /**
37
+ * Owner-facing name of a session.
38
+ *
39
+ * @param session - Agent session
40
+ * @returns Name (the session name when unknown)
41
+ */
42
+ export function spendCapNameOf(session) {
43
+ try {
44
+ return gate?.displayNameOf?.(session) || session;
45
+ }
46
+ catch {
47
+ return session;
48
+ }
49
+ }
50
+ /**
51
+ * The one-line reason, e.g. "Orc hit its daily token cap (5M tokens)".
52
+ *
53
+ * @param stop - The stop
54
+ * @param name - Owner-facing name (default: looked up)
55
+ * @returns Reason text
56
+ */
57
+ export function spendCapReason(stop, name = spendCapNameOf(stop.session)) {
58
+ if (stop.scope === 'total') {
59
+ return `${name} is stopped: all agents together hit the daily token cap (${formatTokens(stop.capTokens)})`;
60
+ }
61
+ if (stop.scope === 'team') {
62
+ return `${name} is stopped: team ${stop.teamName ?? stop.teamId ?? ''} hit its daily token cap (${formatTokens(stop.capTokens)})`;
63
+ }
64
+ return `${name} hit its daily token cap (${formatTokens(stop.capTokens)})`;
65
+ }
66
+ //# sourceMappingURL=spend-cap.gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap.gate.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAwBxD,IAAI,IAAI,GAAwB,IAAI,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,aAAa,EAAE,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAe,EAAE,OAAe,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;IACzF,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,6DAA6D,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IAC7G,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,qBAAqB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;IACpI,CAAC;IACD,OAAO,GAAG,IAAI,6BAA6B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;AAC7E,CAAC"}