crewly 1.20.186 → 1.20.187

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 (271) hide show
  1. package/config/skills/agent/core/remember/SKILL.md +1 -0
  2. package/config/skills/agent/core/remember/execute.sh +12 -0
  3. package/config/skills/agent/core/report-status/SKILL.md +7 -1
  4. package/config/skills/agent/core/report-status/execute.sh +41 -0
  5. package/config/skills/agent/core/slack-post/SKILL.md +1 -0
  6. package/config/skills/agent/core/slack-post/execute.sh +9 -2
  7. package/config/skills/team-leader/_common/lib.sh +45 -0
  8. package/config/skills/team-leader/start-agent/SKILL.md +6 -6
  9. package/config/skills/team-leader/start-agent/execute.sh +3 -12
  10. package/config/skills/team-leader/stop-agent/SKILL.md +6 -6
  11. package/config/skills/team-leader/stop-agent/execute.sh +3 -12
  12. package/dist/backend/backend/src/constants.d.ts +54 -0
  13. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  14. package/dist/backend/backend/src/constants.js +54 -0
  15. package/dist/backend/backend/src/constants.js.map +1 -1
  16. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +62 -0
  18. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/request/open-items.controller.js +1 -1
  20. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  21. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  22. package/dist/backend/backend/src/controllers/slack/slack.controller.js +4 -1
  23. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  24. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts +18 -1
  25. package/dist/backend/backend/src/controllers/standing/standing.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/standing/standing.controller.js +77 -4
  27. package/dist/backend/backend/src/controllers/standing/standing.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts +32 -0
  29. package/dist/backend/backend/src/controllers/system/spend.controller.d.ts.map +1 -0
  30. package/dist/backend/backend/src/controllers/system/spend.controller.js +100 -0
  31. package/dist/backend/backend/src/controllers/system/spend.controller.js.map +1 -0
  32. package/dist/backend/backend/src/controllers/system/system.controller.d.ts +12 -0
  33. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  34. package/dist/backend/backend/src/controllers/system/system.controller.js +28 -3
  35. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +7 -0
  37. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +64 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  40. package/dist/backend/backend/src/index.d.ts.map +1 -1
  41. package/dist/backend/backend/src/index.js +59 -0
  42. package/dist/backend/backend/src/index.js.map +1 -1
  43. package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
  44. package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
  45. package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
  46. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts +51 -0
  47. package/dist/backend/backend/src/scripts/open-items-stale-followups.d.ts.map +1 -0
  48. package/dist/backend/backend/src/scripts/open-items-stale-followups.js +142 -0
  49. package/dist/backend/backend/src/scripts/open-items-stale-followups.js.map +1 -0
  50. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/agent/agent-registration.service.js +32 -1
  52. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  54. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +83 -2
  56. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/memory/memory.service.d.ts +14 -2
  58. package/dist/backend/backend/src/services/memory/memory.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/memory/memory.service.js +12 -1
  60. package/dist/backend/backend/src/services/memory/memory.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts +18 -1
  62. package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/memory/project-memory.service.js +38 -1
  64. package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
  65. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  66. package/dist/backend/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/memory/standing-answers.service.js +40 -2
  68. package/dist/backend/backend/src/services/memory/standing-answers.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts +70 -0
  70. package/dist/backend/backend/src/services/messaging/offline-agent-message.d.ts.map +1 -0
  71. package/dist/backend/backend/src/services/messaging/offline-agent-message.js +92 -0
  72. package/dist/backend/backend/src/services/messaging/offline-agent-message.js.map +1 -0
  73. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +5 -1
  74. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +11 -2
  76. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -0
  79. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  80. package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  81. package/dist/backend/backend/src/services/messaging/queue-processor.service.js +9 -1
  82. package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  83. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  84. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  86. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  87. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  88. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +83 -13
  90. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  91. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +25 -0
  92. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  93. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +45 -1
  94. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  95. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  96. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  97. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +86 -5
  98. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  99. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +2 -1
  100. package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/open-items/open-items-backfill.js +17 -6
  102. package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -1
  103. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +62 -1
  104. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  105. package/dist/backend/backend/src/services/open-items/open-items.service.js +203 -9
  106. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  107. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts +40 -0
  108. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.d.ts.map +1 -0
  109. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js +82 -0
  110. package/dist/backend/backend/src/services/reconciler/idle-holder-surfacer.js.map +1 -0
  111. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +29 -0
  112. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +49 -0
  114. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  115. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  116. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +6 -11
  117. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  118. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +23 -0
  119. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  120. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +55 -1
  121. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  122. package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +10 -4
  124. package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
  125. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  126. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  127. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  128. package/dist/backend/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  129. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts +99 -0
  130. package/dist/backend/backend/src/services/spend/spend-cap-command.d.ts.map +1 -0
  131. package/dist/backend/backend/src/services/spend/spend-cap-command.js +190 -0
  132. package/dist/backend/backend/src/services/spend/spend-cap-command.js.map +1 -0
  133. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts +64 -0
  134. package/dist/backend/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  135. package/dist/backend/backend/src/services/spend/spend-cap.gate.js +71 -0
  136. package/dist/backend/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  137. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts +225 -0
  138. package/dist/backend/backend/src/services/spend/spend-cap.service.d.ts.map +1 -0
  139. package/dist/backend/backend/src/services/spend/spend-cap.service.js +503 -0
  140. package/dist/backend/backend/src/services/spend/spend-cap.service.js.map +1 -0
  141. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts +85 -0
  142. package/dist/backend/backend/src/services/spend/spend-cap.store.d.ts.map +1 -0
  143. package/dist/backend/backend/src/services/spend/spend-cap.store.js +95 -0
  144. package/dist/backend/backend/src/services/spend/spend-cap.store.js.map +1 -0
  145. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts +50 -0
  146. package/dist/backend/backend/src/services/spend/spend-cap.wiring.d.ts.map +1 -0
  147. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js +98 -0
  148. package/dist/backend/backend/src/services/spend/spend-cap.wiring.js.map +1 -0
  149. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts +124 -0
  150. package/dist/backend/backend/src/services/spend/spend-ledger.service.d.ts.map +1 -0
  151. package/dist/backend/backend/src/services/spend/spend-ledger.service.js +189 -0
  152. package/dist/backend/backend/src/services/spend/spend-ledger.service.js.map +1 -0
  153. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts +51 -0
  154. package/dist/backend/backend/src/services/task-pool/claim-target-waker.d.ts.map +1 -0
  155. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js +43 -0
  156. package/dist/backend/backend/src/services/task-pool/claim-target-waker.js.map +1 -0
  157. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  158. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  159. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +73 -1
  160. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  161. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts +44 -0
  162. package/dist/backend/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  163. package/dist/backend/backend/src/services/task-pool/work-item-usage.js +37 -0
  164. package/dist/backend/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  165. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  166. package/dist/backend/backend/src/services/v3/v3-data.service.js +11 -14
  167. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  168. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +25 -0
  169. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +50 -0
  171. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  172. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts +9 -1
  173. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/workflow/scheduler.service.js +16 -2
  175. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  176. package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
  177. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  178. package/dist/backend/backend/src/types/event-bus.types.d.ts +9 -1
  179. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  180. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  181. package/dist/backend/backend/src/types/review-reason.types.d.ts +3 -1
  182. package/dist/backend/backend/src/types/review-reason.types.d.ts.map +1 -1
  183. package/dist/backend/backend/src/types/review-reason.types.js +1 -0
  184. package/dist/backend/backend/src/types/review-reason.types.js.map +1 -1
  185. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +5 -1
  186. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  187. package/dist/backend/backend/src/types/v2/open-item.types.js +1 -1
  188. package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -1
  189. package/dist/backend/build-info.json +2 -2
  190. package/dist/cli/backend/src/constants.d.ts +54 -0
  191. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  192. package/dist/cli/backend/src/constants.js +54 -0
  193. package/dist/cli/backend/src/constants.js.map +1 -1
  194. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  195. package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -1
  196. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  197. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts +28 -0
  198. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  199. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +83 -2
  200. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  201. package/dist/cli/backend/src/services/memory/memory.service.d.ts +14 -2
  202. package/dist/cli/backend/src/services/memory/memory.service.d.ts.map +1 -1
  203. package/dist/cli/backend/src/services/memory/memory.service.js +12 -1
  204. package/dist/cli/backend/src/services/memory/memory.service.js.map +1 -1
  205. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts +18 -1
  206. package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
  207. package/dist/cli/backend/src/services/memory/project-memory.service.js +38 -1
  208. package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
  209. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts +11 -0
  210. package/dist/cli/backend/src/services/memory/standing-answers.service.d.ts.map +1 -1
  211. package/dist/cli/backend/src/services/memory/standing-answers.service.js +40 -2
  212. package/dist/cli/backend/src/services/memory/standing-answers.service.js.map +1 -1
  213. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +5 -1
  214. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
  215. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +11 -2
  216. package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
  217. package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
  218. package/dist/cli/backend/src/services/messaging/queue-processor.service.js +9 -1
  219. package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
  220. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +41 -1
  221. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  222. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +87 -2
  223. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  224. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +30 -12
  225. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  226. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +83 -13
  227. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  228. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts +97 -0
  229. package/dist/cli/backend/src/services/monitoring/model-pricing.d.ts.map +1 -0
  230. package/dist/cli/backend/src/services/monitoring/model-pricing.js +120 -0
  231. package/dist/cli/backend/src/services/monitoring/model-pricing.js.map +1 -0
  232. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +25 -0
  233. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  234. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +45 -1
  235. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  236. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +10 -1
  237. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  238. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +86 -5
  239. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  240. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts +13 -2
  241. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.d.ts.map +1 -1
  242. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js +19 -5
  243. package/dist/cli/backend/src/services/slack/slack-typing-placeholder.service.js.map +1 -1
  244. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts +64 -0
  245. package/dist/cli/backend/src/services/spend/spend-cap.gate.d.ts.map +1 -0
  246. package/dist/cli/backend/src/services/spend/spend-cap.gate.js +71 -0
  247. package/dist/cli/backend/src/services/spend/spend-cap.gate.js.map +1 -0
  248. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +38 -0
  249. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  250. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +73 -1
  251. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  252. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts +44 -0
  253. package/dist/cli/backend/src/services/task-pool/work-item-usage.d.ts.map +1 -0
  254. package/dist/cli/backend/src/services/task-pool/work-item-usage.js +37 -0
  255. package/dist/cli/backend/src/services/task-pool/work-item-usage.js.map +1 -0
  256. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  257. package/dist/cli/backend/src/services/v3/v3-data.service.js +11 -14
  258. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  259. package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
  260. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  261. package/dist/cli/backend/src/types/event-bus.types.d.ts +9 -1
  262. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  263. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  264. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +5 -1
  265. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  266. package/dist/cli/backend/src/types/v2/open-item.types.js +1 -1
  267. package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -1
  268. package/frontend/dist/assets/{index-1ee8a9a2.js → index-15c2faf2.js} +279 -279
  269. package/frontend/dist/assets/{index-a79c7852.css → index-20a67829.css} +1 -1
  270. package/frontend/dist/index.html +2 -2
  271. package/package.json +1 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Spend caps on disk: the owner's caps plus today's bookkeeping (raises,
3
+ * the 80% notices and stop cards already sent). One small JSON file under
4
+ * CREWLY_HOME, written atomically.
5
+ *
6
+ * specs/2026-10-02-spend-cap.md
7
+ *
8
+ * @module services/spend/spend-cap.store
9
+ */
10
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'fs';
11
+ import * as path from 'path';
12
+ /**
13
+ * Caps off, nothing recorded.
14
+ *
15
+ * @param date - Local day
16
+ * @returns Fresh file
17
+ */
18
+ export function emptySpendCapFile(date) {
19
+ return {
20
+ config: { defaultAgentCapUsd: null, totalCapUsd: null, agentCapsUsd: {} },
21
+ day: emptyDay(date),
22
+ };
23
+ }
24
+ /**
25
+ * Empty day state.
26
+ *
27
+ * @param date - Local day
28
+ * @returns State
29
+ */
30
+ export function emptyDay(date) {
31
+ return { date, raised: {}, warned: [], stopped: [], cards: {} };
32
+ }
33
+ /**
34
+ * JSON file store.
35
+ */
36
+ export class FileSpendCapStore {
37
+ file;
38
+ /**
39
+ * @param file - Absolute path
40
+ */
41
+ constructor(file) {
42
+ this.file = file;
43
+ }
44
+ /**
45
+ * @returns The file, or null when absent / unreadable
46
+ */
47
+ read() {
48
+ try {
49
+ if (!existsSync(this.file))
50
+ return null;
51
+ const raw = JSON.parse(readFileSync(this.file, 'utf-8'));
52
+ if (!raw || typeof raw !== 'object' || !raw.config)
53
+ return null;
54
+ return {
55
+ config: {
56
+ defaultAgentCapUsd: raw.config.defaultAgentCapUsd ?? null,
57
+ totalCapUsd: raw.config.totalCapUsd ?? null,
58
+ agentCapsUsd: raw.config.agentCapsUsd ?? {},
59
+ ...(raw.config.updatedAt ? { updatedAt: raw.config.updatedAt } : {}),
60
+ },
61
+ day: {
62
+ ...emptyDay(raw.day?.date ?? ''),
63
+ ...(raw.day ?? {}),
64
+ },
65
+ };
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * @param file - Contents to persist
73
+ */
74
+ write(file) {
75
+ mkdirSync(path.dirname(this.file), { recursive: true });
76
+ const tmp = `${this.file}.tmp`;
77
+ writeFileSync(tmp, JSON.stringify(file, null, 2), 'utf-8');
78
+ renameSync(tmp, this.file);
79
+ }
80
+ }
81
+ /**
82
+ * In-memory store (tests).
83
+ */
84
+ export class MemorySpendCapStore {
85
+ file = null;
86
+ /** @returns Stored copy */
87
+ read() {
88
+ return this.file ? JSON.parse(JSON.stringify(this.file)) : null;
89
+ }
90
+ /** @param file - Contents */
91
+ write(file) {
92
+ this.file = JSON.parse(JSON.stringify(file));
93
+ }
94
+ }
95
+ //# sourceMappingURL=spend-cap.store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Spend caps — the real dependencies, bound to the running backend.
3
+ *
4
+ * Kept apart from the service so the service stays testable with fakes;
5
+ * heavy services are imported lazily so importing this module from index.ts
6
+ * adds no import cycles.
7
+ *
8
+ * specs/2026-10-02-spend-cap.md
9
+ *
10
+ * @module services/spend/spend-cap.wiring
11
+ */
12
+ import { SpendCapService, type SpendCapLogger } from './spend-cap.service.js';
13
+ /** Team facts the wiring reads. */
14
+ interface StorageLike {
15
+ getTeams(): Promise<Array<{
16
+ members: Array<{
17
+ name: string;
18
+ sessionName: string;
19
+ }>;
20
+ }>>;
21
+ }
22
+ /** The registration-service calls the wiring makes. */
23
+ interface RegistrationLike {
24
+ isInProcessRuntimeActive(sessionName: string): boolean;
25
+ sendMessageToAgent(sessionName: string, message: string): Promise<{
26
+ success: boolean;
27
+ queued?: boolean;
28
+ }>;
29
+ }
30
+ /** What index.ts provides. */
31
+ export interface SpendCapWiringInput {
32
+ crewlyHome: string;
33
+ storage: StorageLike;
34
+ registration: () => RegistrationLike | null;
35
+ /** Whether a PTY session exists */
36
+ sessionExists: (sessionName: string) => boolean;
37
+ /** Start a stopped team member (activate-on-send) */
38
+ activate: (sessionName: string) => Promise<unknown>;
39
+ logger: SpendCapLogger;
40
+ }
41
+ /**
42
+ * Build the service, install it as the delivery / wake gate, register the
43
+ * decision-card handler and the orc-DM commands, and start its tick.
44
+ *
45
+ * @param input - Backend context
46
+ * @returns The running service
47
+ */
48
+ export declare function startSpendCaps(input: SpendCapWiringInput): Promise<SpendCapService>;
49
+ export {};
50
+ //# sourceMappingURL=spend-cap.wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.wiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,OAAO,EAAE,eAAe,EAAsB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIlG,mCAAmC;AACnC,UAAU,WAAW;IACnB,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CACvF;AAED,uDAAuD;AACvD,UAAU,gBAAgB;IACxB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IACvD,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3G;AAED,8BAA8B;AAC9B,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAC;IAC5C,mCAAmC;IACnC,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,qDAAqD;IACrD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,EAAE,cAAc,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4EzF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Spend caps — the real dependencies, bound to the running backend.
3
+ *
4
+ * Kept apart from the service so the service stays testable with fakes;
5
+ * heavy services are imported lazily so importing this module from index.ts
6
+ * adds no import cycles.
7
+ *
8
+ * specs/2026-10-02-spend-cap.md
9
+ *
10
+ * @module services/spend/spend-cap.wiring
11
+ */
12
+ import * as path from 'path';
13
+ import { ORCHESTRATOR_SESSION_NAME, SPEND_CAP_CONSTANTS } from '../../constants.js';
14
+ import { DecisionService } from '../decisions/decision.service.js';
15
+ import { TokenUsageService } from '../monitoring/token-usage.service.js';
16
+ import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.service.js';
17
+ import { setSpendCapGate } from './spend-cap.gate.js';
18
+ import { createSpendCapInterceptor } from './spend-cap-command.js';
19
+ import { SpendCapService, setSpendCapService } from './spend-cap.service.js';
20
+ import { FileSpendCapStore } from './spend-cap.store.js';
21
+ import { SpendLedger } from './spend-ledger.service.js';
22
+ /**
23
+ * Build the service, install it as the delivery / wake gate, register the
24
+ * decision-card handler and the orc-DM commands, and start its tick.
25
+ *
26
+ * @param input - Backend context
27
+ * @returns The running service
28
+ */
29
+ export async function startSpendCaps(input) {
30
+ const names = new Map([[ORCHESTRATOR_SESSION_NAME, 'Orc']]);
31
+ const agents = async () => {
32
+ const list = [{ session: ORCHESTRATOR_SESSION_NAME, name: 'Orc' }];
33
+ for (const team of await input.storage.getTeams().catch(() => [])) {
34
+ for (const m of team.members ?? []) {
35
+ if (!m.sessionName)
36
+ continue;
37
+ list.push({ session: m.sessionName, name: m.name || m.sessionName });
38
+ names.set(m.sessionName, m.name || m.sessionName);
39
+ }
40
+ }
41
+ return list;
42
+ };
43
+ const { SlackReloginDmService } = await import('../slack/slack-relogin-dm.service.js');
44
+ const { getSlackService } = await import('../slack/slack.service.js');
45
+ const { getSlackAgentIdentityService } = await import('../slack/slack-agent-identity.service.js');
46
+ const dm = new SlackReloginDmService(() => getSlackService(), undefined, (agentSession) => getSlackAgentIdentityService()?.getInstalled(agentSession)?.botToken ?? null);
47
+ const release = async (sessions) => {
48
+ const reg = input.registration();
49
+ if (!reg)
50
+ return;
51
+ const queue = SubAgentMessageQueue.getInstance();
52
+ for (const session of sessions) {
53
+ if (!queue.hasPending(session))
54
+ continue;
55
+ const live = reg.isInProcessRuntimeActive(session) || input.sessionExists(session);
56
+ if (live || session === ORCHESTRATOR_SESSION_NAME) {
57
+ await queue.flush(session, (data) => reg.sendMessageToAgent(session, data));
58
+ }
59
+ else {
60
+ // Registration flushes the persistent queue once the agent is up.
61
+ await input.activate(session);
62
+ }
63
+ }
64
+ };
65
+ const service = new SpendCapService({
66
+ store: new FileSpendCapStore(path.join(input.crewlyHome, SPEND_CAP_CONSTANTS.STORE_FILE)),
67
+ ledger: new SpendLedger(TokenUsageService.getInstance()),
68
+ notifyOwner: (text) => dm.sendToOwner(text),
69
+ decisions: () => DecisionService.getInstance(),
70
+ displayNameOf: (session) => names.get(session) ?? session,
71
+ knownSessions: async () => (await agents()).map((a) => a.session),
72
+ onReleased: release,
73
+ logger: input.logger,
74
+ });
75
+ setSpendCapService(service);
76
+ setSpendCapGate(service);
77
+ DecisionService.registerKindHandler(SPEND_CAP_CONSTANTS.DECISION_KIND, service);
78
+ try {
79
+ const { getSlackOrchestratorBridge } = await import('../slack/slack-orchestrator-bridge.js');
80
+ getSlackOrchestratorBridge().addInboundInterceptor('the spend cap commands', createSpendCapInterceptor({
81
+ ownerDmScope: (m) => dm.ownerDmScope(m),
82
+ replyTargetOf: (m) => dm.replyTargetOf(m),
83
+ reply: (text, target) => dm.sendToOwner(text, target),
84
+ agents,
85
+ setCaps: (patch) => service.setCaps(patch),
86
+ raiseToday: (target, usd) => service.raiseToday(target, usd),
87
+ orcStop: () => service.stopOf(ORCHESTRATOR_SESSION_NAME),
88
+ onError: (err) => input.logger.warn('Spend cap command failed', { error: err instanceof Error ? err.message : String(err) }),
89
+ }));
90
+ }
91
+ catch (err) {
92
+ input.logger.warn('Spend cap Slack commands not wired (non-critical)', { error: err instanceof Error ? err.message : String(err) });
93
+ }
94
+ await agents().catch(() => undefined);
95
+ service.start();
96
+ return service;
97
+ }
98
+ //# sourceMappingURL=spend-cap.wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-cap.wiring.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-cap.wiring.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Spend ledger — what each agent actually spent, in USD, per local day.
3
+ *
4
+ * Reads the shared token ledger (`~/.crewly/token-usage.json`, held in
5
+ * memory by {@link TokenUsageService}). Both sources of agent usage land
6
+ * there: the in-process Crewly Agent runtime records every run (DeepSeek,
7
+ * cache-aware), and the Claude transcript sync records every Claude Code
8
+ * turn with its cache split. Each event is priced with {@link eventCostUsd},
9
+ * the same computation the ticket autopilot budget and the team budget gate
10
+ * use through `getSessionUsageSince` — there is no second cost formula here.
11
+ *
12
+ * Claude Code under a subscription does not produce a bill at these rates;
13
+ * its figure is the API-equivalent cost (see model-pricing).
14
+ *
15
+ * specs/2026-10-02-spend-cap.md
16
+ *
17
+ * @module services/spend/spend-ledger.service
18
+ */
19
+ import { type TokenUsageEvent } from '../monitoring/token-usage.service.js';
20
+ /** The part of {@link TokenUsageService} the ledger reads. */
21
+ export interface SpendEventSource {
22
+ forEachEvent(visit: (sessionName: string, event: TokenUsageEvent) => void, since?: Date): void;
23
+ getSessionUsageSince(sessionName: string, since: Date, until?: Date): {
24
+ cost: number;
25
+ };
26
+ }
27
+ /** One local day of spend. */
28
+ export interface SpendDay {
29
+ /** `YYYY-MM-DD`, local */
30
+ date: string;
31
+ totalUsd: number;
32
+ /** Session → USD */
33
+ byAgent: Record<string, number>;
34
+ /** Runtime → USD */
35
+ byRuntime: Record<string, number>;
36
+ }
37
+ /** One agent across the window. */
38
+ export interface SpendAgentRow {
39
+ session: string;
40
+ /** Runtimes its usage came from (inferred from the model id) */
41
+ runtimes: string[];
42
+ todayUsd: number;
43
+ windowUsd: number;
44
+ /** USD per day, oldest first, aligned with {@link SpendSummary.days} */
45
+ daily: number[];
46
+ }
47
+ /** What `GET /api/system/spend` returns (before cap info is added). */
48
+ export interface SpendSummary {
49
+ /** Local day of `now` */
50
+ today: string;
51
+ /** Oldest first; the last one is today */
52
+ days: SpendDay[];
53
+ /** Highest window spend first */
54
+ agents: SpendAgentRow[];
55
+ /** Runtime → USD over the window */
56
+ byRuntime: Record<string, number>;
57
+ totalUsd: number;
58
+ todayUsd: number;
59
+ /** 90th percentile of per-agent daily spend (agent-days with any spend), USD */
60
+ p90AgentDayUsd: number;
61
+ }
62
+ /**
63
+ * The runtime a usage event came from, inferred from its model id.
64
+ *
65
+ * @param model - Model id as recorded (`deepseek/deepseek-chat`, `claude-opus-5-5`, `codex-cli-default`)
66
+ * @returns Runtime id, or `other`
67
+ *
68
+ * @example
69
+ * runtimeOfModel('deepseek/deepseek-chat') // 'crewly-agent'
70
+ * runtimeOfModel('claude-sonnet-5') // 'claude-code'
71
+ */
72
+ export declare function runtimeOfModel(model: string): string;
73
+ /**
74
+ * Nearest-rank percentile.
75
+ *
76
+ * @param values - Samples
77
+ * @param p - Percentile (0–100)
78
+ * @returns The value, or 0 for no samples
79
+ */
80
+ export declare function percentile(values: number[], p: number): number;
81
+ /**
82
+ * Round to whole cents.
83
+ *
84
+ * @param usd - Amount
85
+ * @returns Rounded amount
86
+ */
87
+ export declare function cents(usd: number): number;
88
+ /**
89
+ * Per-agent / per-runtime / per-day spend.
90
+ */
91
+ export declare class SpendLedger {
92
+ private readonly source;
93
+ private readonly now;
94
+ private totalCache;
95
+ /**
96
+ * @param source - Token ledger
97
+ * @param now - Clock
98
+ */
99
+ constructor(source: SpendEventSource, now?: () => Date);
100
+ /**
101
+ * USD a session spent since local midnight (the autopilot's computation).
102
+ *
103
+ * @param session - Agent session
104
+ * @returns USD
105
+ */
106
+ spentToday(session: string): number;
107
+ /**
108
+ * USD every agent together spent since local midnight. Cached briefly:
109
+ * the delivery gate asks on every message.
110
+ *
111
+ * @returns USD
112
+ */
113
+ totalToday(): number;
114
+ /** Forget the cached total (after new usage is known). */
115
+ invalidate(): void;
116
+ /**
117
+ * Spend over the last `days` local days, today included.
118
+ *
119
+ * @param days - Window length (clamped to 1…MAX_DAYS)
120
+ * @returns Summary
121
+ */
122
+ summarize(days?: number): SpendSummary;
123
+ }
124
+ //# sourceMappingURL=spend-ledger.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-ledger.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-ledger.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAG1F,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/F,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACxF;AAED,8BAA8B;AAC9B,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,mCAAmC;AACnC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;GAEG;AACH,qBAAa,WAAW;IAQpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IARtB,OAAO,CAAC,UAAU,CAA8D;IAEhF;;;OAGG;gBAEgB,MAAM,EAAE,gBAAgB,EACxB,GAAG,GAAE,MAAM,IAAuB;IAGrD;;;;;OAKG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAQnC;;;;;OAKG;IACH,UAAU,IAAI,MAAM;IAiBpB,0DAA0D;IAC1D,UAAU,IAAI,IAAI;IAIlB;;;;;OAKG;IACH,SAAS,CAAC,IAAI,GAAE,MAAyC,GAAG,YAAY;CAuDzE"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Spend ledger — what each agent actually spent, in USD, per local day.
3
+ *
4
+ * Reads the shared token ledger (`~/.crewly/token-usage.json`, held in
5
+ * memory by {@link TokenUsageService}). Both sources of agent usage land
6
+ * there: the in-process Crewly Agent runtime records every run (DeepSeek,
7
+ * cache-aware), and the Claude transcript sync records every Claude Code
8
+ * turn with its cache split. Each event is priced with {@link eventCostUsd},
9
+ * the same computation the ticket autopilot budget and the team budget gate
10
+ * use through `getSessionUsageSince` — there is no second cost formula here.
11
+ *
12
+ * Claude Code under a subscription does not produce a bill at these rates;
13
+ * its figure is the API-equivalent cost (see model-pricing).
14
+ *
15
+ * specs/2026-10-02-spend-cap.md
16
+ *
17
+ * @module services/spend/spend-ledger.service
18
+ */
19
+ import { SPEND_CAP_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
20
+ import { eventCostUsd } from '../monitoring/token-usage.service.js';
21
+ import { localDateKey, localMidnight } from '../project-tickets/ticket-autopilot-decision.js';
22
+ /**
23
+ * The runtime a usage event came from, inferred from its model id.
24
+ *
25
+ * @param model - Model id as recorded (`deepseek/deepseek-chat`, `claude-opus-5-5`, `codex-cli-default`)
26
+ * @returns Runtime id, or `other`
27
+ *
28
+ * @example
29
+ * runtimeOfModel('deepseek/deepseek-chat') // 'crewly-agent'
30
+ * runtimeOfModel('claude-sonnet-5') // 'claude-code'
31
+ */
32
+ export function runtimeOfModel(model) {
33
+ const m = (model || '').toLowerCase();
34
+ for (const rt of Object.values(RUNTIME_TYPES)) {
35
+ if (m.startsWith(`${rt}-`))
36
+ return rt;
37
+ }
38
+ if (m.includes('/'))
39
+ return RUNTIME_TYPES.CREWLY_AGENT;
40
+ if (/claude|opus|sonnet|haiku|fable|synthetic/.test(m))
41
+ return RUNTIME_TYPES.CLAUDE_CODE;
42
+ if (/gpt|codex|^o\d/.test(m))
43
+ return RUNTIME_TYPES.CODEX_CLI;
44
+ if (/gemini/.test(m))
45
+ return RUNTIME_TYPES.GEMINI_CLI;
46
+ return 'other';
47
+ }
48
+ /**
49
+ * Nearest-rank percentile.
50
+ *
51
+ * @param values - Samples
52
+ * @param p - Percentile (0–100)
53
+ * @returns The value, or 0 for no samples
54
+ */
55
+ export function percentile(values, p) {
56
+ if (values.length === 0)
57
+ return 0;
58
+ const sorted = [...values].sort((a, b) => a - b);
59
+ const rank = Math.ceil((p / 100) * sorted.length);
60
+ return sorted[Math.min(sorted.length, Math.max(1, rank)) - 1];
61
+ }
62
+ /**
63
+ * Round to whole cents.
64
+ *
65
+ * @param usd - Amount
66
+ * @returns Rounded amount
67
+ */
68
+ export function cents(usd) {
69
+ return Math.round(usd * 100) / 100;
70
+ }
71
+ /**
72
+ * Per-agent / per-runtime / per-day spend.
73
+ */
74
+ export class SpendLedger {
75
+ source;
76
+ now;
77
+ totalCache = null;
78
+ /**
79
+ * @param source - Token ledger
80
+ * @param now - Clock
81
+ */
82
+ constructor(source, now = () => new Date()) {
83
+ this.source = source;
84
+ this.now = now;
85
+ }
86
+ /**
87
+ * USD a session spent since local midnight (the autopilot's computation).
88
+ *
89
+ * @param session - Agent session
90
+ * @returns USD
91
+ */
92
+ spentToday(session) {
93
+ try {
94
+ return this.source.getSessionUsageSince(session, localMidnight(this.now())).cost;
95
+ }
96
+ catch {
97
+ return 0;
98
+ }
99
+ }
100
+ /**
101
+ * USD every agent together spent since local midnight. Cached briefly:
102
+ * the delivery gate asks on every message.
103
+ *
104
+ * @returns USD
105
+ */
106
+ totalToday() {
107
+ const now = this.now();
108
+ const dayStart = localMidnight(now).getTime();
109
+ const c = this.totalCache;
110
+ if (c && c.dayStart === dayStart && now.getTime() - c.at < SPEND_CAP_CONSTANTS.TOTAL_CACHE_MS)
111
+ return c.usd;
112
+ let usd = 0;
113
+ try {
114
+ this.source.forEachEvent((_s, e) => {
115
+ usd += eventCostUsd(e);
116
+ }, new Date(dayStart));
117
+ }
118
+ catch {
119
+ usd = 0;
120
+ }
121
+ this.totalCache = { at: now.getTime(), dayStart, usd };
122
+ return usd;
123
+ }
124
+ /** Forget the cached total (after new usage is known). */
125
+ invalidate() {
126
+ this.totalCache = null;
127
+ }
128
+ /**
129
+ * Spend over the last `days` local days, today included.
130
+ *
131
+ * @param days - Window length (clamped to 1…MAX_DAYS)
132
+ * @returns Summary
133
+ */
134
+ summarize(days = SPEND_CAP_CONSTANTS.DEFAULT_DAYS) {
135
+ const n = Math.min(SPEND_CAP_CONSTANTS.MAX_DAYS, Math.max(1, Math.floor(Number.isFinite(days) ? days : SPEND_CAP_CONSTANTS.DEFAULT_DAYS)));
136
+ const now = this.now();
137
+ const keys = [];
138
+ for (let i = n - 1; i >= 0; i--) {
139
+ const d = new Date(now.getTime());
140
+ d.setDate(d.getDate() - i);
141
+ keys.push(localDateKey(d));
142
+ }
143
+ const first = new Date(now.getTime());
144
+ first.setDate(first.getDate() - (n - 1));
145
+ const since = localMidnight(first);
146
+ const index = new Map(keys.map((k, i) => [k, i]));
147
+ const dayRows = keys.map((date) => ({ date, totalUsd: 0, byAgent: {}, byRuntime: {} }));
148
+ const agents = new Map();
149
+ const byRuntime = {};
150
+ this.source.forEachEvent((session, e) => {
151
+ const i = index.get(localDateKey(new Date(e.timestamp)));
152
+ if (i === undefined)
153
+ return;
154
+ const usd = eventCostUsd(e);
155
+ const runtime = runtimeOfModel(e.model);
156
+ const day = dayRows[i];
157
+ day.totalUsd += usd;
158
+ day.byAgent[session] = (day.byAgent[session] ?? 0) + usd;
159
+ day.byRuntime[runtime] = (day.byRuntime[runtime] ?? 0) + usd;
160
+ byRuntime[runtime] = (byRuntime[runtime] ?? 0) + usd;
161
+ let a = agents.get(session);
162
+ if (!a) {
163
+ a = { runtimes: new Set(), daily: keys.map(() => 0) };
164
+ agents.set(session, a);
165
+ }
166
+ a.runtimes.add(runtime);
167
+ a.daily[i] += usd;
168
+ }, since);
169
+ const rows = [...agents].map(([session, a]) => ({
170
+ session,
171
+ runtimes: [...a.runtimes].sort(),
172
+ todayUsd: a.daily[a.daily.length - 1],
173
+ windowUsd: a.daily.reduce((s, v) => s + v, 0),
174
+ daily: a.daily,
175
+ }));
176
+ rows.sort((x, y) => y.windowUsd - x.windowUsd);
177
+ const agentDays = rows.flatMap((r) => r.daily.filter((v) => v > 0));
178
+ return {
179
+ today: keys[keys.length - 1],
180
+ days: dayRows,
181
+ agents: rows,
182
+ byRuntime,
183
+ totalUsd: dayRows.reduce((s, d) => s + d.totalUsd, 0),
184
+ todayUsd: dayRows[dayRows.length - 1].totalUsd,
185
+ p90AgentDayUsd: percentile(agentDays, 90),
186
+ };
187
+ }
188
+ }
189
+ //# sourceMappingURL=spend-ledger.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spend-ledger.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/spend/spend-ledger.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Start the target of a targeted claim that was refused because the target
3
+ * is not running (#929).
4
+ *
5
+ * The orchestrator's delegate-task skill claims the WorkItem it just created
6
+ * on the worker's behalf. When the worker was down (a restart leaves idle
7
+ * agents down), `claimSpecificItem` refused with "agent session not active"
8
+ * and nothing else happened until the reconciler's wake pass, minutes later;
9
+ * on 2026-10-01 the orchestrator restarted Dana by hand instead.
10
+ *
11
+ * The start goes through the normal member-start endpoint with the WorkItem
12
+ * id, so every start gate still applies (the WorkItem is queued for that
13
+ * member, and a dormant team still needs the owner). The claim itself stays
14
+ * refused: the item stays queued and is dispatched once the agent registers.
15
+ *
16
+ * @module services/task-pool/claim-target-waker
17
+ */
18
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
19
+ import type { AssigneeWaker, AssigneeWakeResult } from '../project-tickets/ticket-assignee-waker.js';
20
+ /** What {@link wakeRefusedClaimTarget} needs. */
21
+ export interface ClaimTargetWakerDeps {
22
+ /** Current state of a WorkItem. */
23
+ findWorkItem: (id: string) => Promise<Pick<WorkItem, 'id' | 'status' | 'target'> | null>;
24
+ /** Whether the session has a live PTY (or in-process runtime). */
25
+ sessionLive: (sessionName: string) => boolean;
26
+ /** The team and member bound to a session. */
27
+ findMember: (sessionName: string) => Promise<{
28
+ team: {
29
+ id: string;
30
+ };
31
+ member: {
32
+ id: string;
33
+ };
34
+ } | null>;
35
+ /** Starts the member through the member-start endpoint. */
36
+ wake: AssigneeWaker;
37
+ }
38
+ /**
39
+ * Start the agent a refused targeted claim was for, when it is simply down.
40
+ *
41
+ * @param input - The refused claim and who made it
42
+ * @param deps - Lookups and the waker
43
+ * @returns The start outcome, or null when no start applies (the item is not
44
+ * queued for that agent, the agent is running, or it is no team member)
45
+ */
46
+ export declare function wakeRefusedClaimTarget(input: {
47
+ agentId: string;
48
+ workItemId: string;
49
+ callerSession?: string;
50
+ }, deps: ClaimTargetWakerDeps): Promise<AssigneeWakeResult | null>;
51
+ //# sourceMappingURL=claim-target-waker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim-target-waker.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/task-pool/claim-target-waker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AAErG,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACpC,mCAAmC;IACnC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,kEAAkE;IAClE,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,8CAA8C;IAC9C,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtG,2DAA2D;IAC3D,IAAI,EAAE,aAAa,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAC3C,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,EACtE,IAAI,EAAE,oBAAoB,GACxB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC"}