crewly 1.14.1 → 1.15.0

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 (452) hide show
  1. package/README.md +28 -0
  2. package/config/constants.ts +57 -0
  3. package/config/index.ts +6 -2
  4. package/config/roles/architect/soul.md +31 -0
  5. package/config/roles/auditor/soul.md +30 -0
  6. package/config/roles/backend-developer/soul.md +30 -0
  7. package/config/roles/content-strategist/soul.md +29 -0
  8. package/config/roles/designer/soul.md +30 -0
  9. package/config/roles/developer/soul.md +4 -1
  10. package/config/roles/frontend-developer/soul.md +28 -0
  11. package/config/roles/fullstack-dev/soul.md +28 -0
  12. package/config/roles/generalist/soul.md +28 -0
  13. package/config/roles/ops/soul.md +31 -0
  14. package/config/roles/orchestrator/fragments/lifecycle.md +2 -22
  15. package/config/roles/orchestrator/fragments/recovery.md +1 -1
  16. package/config/roles/orchestrator/prompt.md +18 -49
  17. package/config/roles/orchestrator/soul.md +2 -1
  18. package/config/roles/product-manager/prompt.md +1 -1
  19. package/config/roles/product-manager/soul.md +30 -0
  20. package/config/roles/qa/soul.md +31 -0
  21. package/config/roles/qa-engineer/soul.md +31 -0
  22. package/config/roles/researcher/soul.md +4 -1
  23. package/config/roles/sales/soul.md +30 -0
  24. package/config/roles/support/soul.md +30 -0
  25. package/config/roles/team-leader/prompt.md +1 -1
  26. package/config/roles/team-leader/soul.md +32 -0
  27. package/config/roles/tpm/soul.md +31 -0
  28. package/config/roles/ux-designer/soul.md +31 -0
  29. package/config/skills/_common/lib.sh +124 -2
  30. package/config/skills/_common/lib.test.sh +68 -1
  31. package/config/skills/orchestrator/delegate-task/SKILL.md +17 -21
  32. package/config/skills/orchestrator/delegate-task/execute.sh +18 -9
  33. package/config/skills/orchestrator/delegate-task/execute.test.sh +1 -1
  34. package/config/skills/orchestrator/wiki-migrate/SKILL.md +33 -3
  35. package/config/skills/orchestrator/wiki-migrate/compact.jq +36 -0
  36. package/config/skills/orchestrator/wiki-migrate/execute.sh +35 -5
  37. package/config/skills/orchestrator/wiki-migrate/execute.test.sh +124 -0
  38. package/config/skills/team-leader/verify-output/execute.sh +14 -6
  39. package/config/skills/team-leader/verify-output/execute.test.sh +117 -0
  40. package/dist/backend/backend/src/constants.d.ts +100 -0
  41. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  42. package/dist/backend/backend/src/constants.js +88 -1
  43. package/dist/backend/backend/src/constants.js.map +1 -1
  44. package/dist/backend/backend/src/controllers/mission/mission-policy.controller.d.ts.map +1 -1
  45. package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js +4 -6
  46. package/dist/backend/backend/src/controllers/mission/mission-policy.controller.js.map +1 -1
  47. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts +10 -0
  48. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts.map +1 -1
  49. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +78 -16
  50. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
  51. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.d.ts.map +1 -1
  52. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js +11 -1
  53. package/dist/backend/backend/src/controllers/orchestrator/orchestrator.controller.js.map +1 -1
  54. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +14 -0
  55. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  56. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +59 -0
  57. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  58. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts +9 -0
  59. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  60. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +14 -1
  61. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  62. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  63. package/dist/backend/backend/src/controllers/team/team.controller.js +16 -1
  64. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  65. package/dist/backend/backend/src/index.d.ts +12 -0
  66. package/dist/backend/backend/src/index.d.ts.map +1 -1
  67. package/dist/backend/backend/src/index.js +187 -9
  68. package/dist/backend/backend/src/index.js.map +1 -1
  69. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +139 -0
  70. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -0
  71. package/dist/backend/backend/src/middleware/api-token.middleware.js +301 -0
  72. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -0
  73. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  74. package/dist/backend/backend/src/routes/api.routes.js +3 -1
  75. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  76. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +68 -0
  77. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/agent/agent-registration.service.js +280 -10
  79. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  80. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
  81. package/dist/backend/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/agent/claude-runtime.service.js +10 -1
  83. package/dist/backend/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  84. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
  85. package/dist/backend/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/agent/codex-runtime.service.js +11 -1
  87. package/dist/backend/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
  89. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
  91. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  92. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
  93. package/dist/backend/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js +10 -1
  95. package/dist/backend/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  96. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
  97. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  98. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +422 -3
  99. package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  100. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
  101. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +50 -1
  103. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  104. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +1 -1
  105. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/ai/prompt-modules/index.js +1 -1
  107. package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
  108. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
  109. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  110. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
  111. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  112. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +42 -0
  113. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  114. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
  115. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  116. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
  118. package/dist/backend/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  119. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts +26 -2
  120. package/dist/backend/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/backup/backup-archive.service.js +91 -10
  122. package/dist/backend/backend/src/services/backup/backup-archive.service.js.map +1 -1
  123. package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts +15 -2
  124. package/dist/backend/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/backup/backup-restore.service.js +100 -21
  126. package/dist/backend/backend/src/services/backup/backup-restore.service.js.map +1 -1
  127. package/dist/backend/backend/src/services/backup/backup.types.d.ts +85 -2
  128. package/dist/backend/backend/src/services/backup/backup.types.d.ts.map +1 -1
  129. package/dist/backend/backend/src/services/backup/backup.types.js +21 -0
  130. package/dist/backend/backend/src/services/backup/backup.types.js.map +1 -1
  131. package/dist/backend/backend/src/services/backup/project-file-filter.d.ts +35 -0
  132. package/dist/backend/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
  133. package/dist/backend/backend/src/services/backup/project-file-filter.js +90 -0
  134. package/dist/backend/backend/src/services/backup/project-file-filter.js.map +1 -0
  135. package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
  136. package/dist/backend/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
  137. package/dist/backend/backend/src/services/budget/team-budget-gate.service.js +364 -0
  138. package/dist/backend/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
  139. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -3
  140. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  141. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +34 -3
  142. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  143. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +5 -3
  144. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  145. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +6 -4
  146. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  147. package/dist/backend/backend/src/services/core/api-token.service.d.ts +78 -0
  148. package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -0
  149. package/dist/backend/backend/src/services/core/api-token.service.js +149 -0
  150. package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -0
  151. package/dist/backend/backend/src/services/core/logger.service.d.ts +10 -1
  152. package/dist/backend/backend/src/services/core/logger.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/core/logger.service.js +18 -3
  154. package/dist/backend/backend/src/services/core/logger.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/core/storage.service.d.ts +11 -0
  156. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/core/storage.service.js +34 -0
  158. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  159. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +7 -1
  160. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +29 -7
  162. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts +140 -0
  164. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js +346 -0
  166. package/dist/backend/backend/src/services/hierarchy/hierarchy-escalation-monitor.service.js.map +1 -0
  167. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
  168. package/dist/backend/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  169. package/dist/backend/backend/src/services/monitoring/token-usage.service.js +42 -7
  170. package/dist/backend/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  171. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -0
  172. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  173. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +67 -1
  174. package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  175. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +22 -15
  176. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  177. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +24 -15
  178. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  179. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts +7 -1
  180. package/dist/backend/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/session/pty/pty-session.js +9 -3
  182. package/dist/backend/backend/src/services/session/pty/pty-session.js.map +1 -1
  183. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts +27 -0
  184. package/dist/backend/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/session/session-handoff.service.js +110 -22
  186. package/dist/backend/backend/src/services/session/session-handoff.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -1
  188. package/dist/backend/backend/src/services/skill/skill-catalog.service.js +7 -1
  189. package/dist/backend/backend/src/services/skill/skill-catalog.service.js.map +1 -1
  190. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
  191. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  192. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +132 -6
  193. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  194. package/dist/backend/backend/src/services/v3/escalation-boot.d.ts +87 -0
  195. package/dist/backend/backend/src/services/v3/escalation-boot.d.ts.map +1 -0
  196. package/dist/backend/backend/src/services/v3/escalation-boot.js +128 -0
  197. package/dist/backend/backend/src/services/v3/escalation-boot.js.map +1 -0
  198. package/dist/backend/backend/src/services/v3/escalation.service.d.ts +1 -1
  199. package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
  200. package/dist/backend/backend/src/services/v3/escalation.service.js +4 -4
  201. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  202. package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts +118 -0
  203. package/dist/backend/backend/src/services/v3/kr-completion.subscriber.d.ts.map +1 -0
  204. package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js +277 -0
  205. package/dist/backend/backend/src/services/v3/kr-completion.subscriber.js.map +1 -0
  206. package/dist/backend/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
  207. package/dist/backend/backend/src/services/v3/kr-tracking.service.js +3 -6
  208. package/dist/backend/backend/src/services/v3/kr-tracking.service.js.map +1 -1
  209. package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts +5 -0
  210. package/dist/backend/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
  211. package/dist/backend/backend/src/services/v3/mission-executor.service.js +36 -0
  212. package/dist/backend/backend/src/services/v3/mission-executor.service.js.map +1 -1
  213. package/dist/backend/backend/src/services/v3/mission-paths.d.ts +69 -0
  214. package/dist/backend/backend/src/services/v3/mission-paths.d.ts.map +1 -0
  215. package/dist/backend/backend/src/services/v3/mission-paths.js +92 -0
  216. package/dist/backend/backend/src/services/v3/mission-paths.js.map +1 -0
  217. package/dist/backend/backend/src/services/v3/mission-period.service.d.ts.map +1 -1
  218. package/dist/backend/backend/src/services/v3/mission-period.service.js +1 -12
  219. package/dist/backend/backend/src/services/v3/mission-period.service.js.map +1 -1
  220. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +74 -2
  221. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
  222. package/dist/backend/backend/src/services/v3/mission-reminder.service.js +251 -9
  223. package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
  224. package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts +6 -4
  225. package/dist/backend/backend/src/services/v3/okr-cascade.service.d.ts.map +1 -1
  226. package/dist/backend/backend/src/services/v3/okr-cascade.service.js +11 -10
  227. package/dist/backend/backend/src/services/v3/okr-cascade.service.js.map +1 -1
  228. package/dist/backend/backend/src/services/v3/okr-review.service.d.ts +24 -0
  229. package/dist/backend/backend/src/services/v3/okr-review.service.d.ts.map +1 -1
  230. package/dist/backend/backend/src/services/v3/okr-review.service.js +63 -3
  231. package/dist/backend/backend/src/services/v3/okr-review.service.js.map +1 -1
  232. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts +17 -0
  233. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
  234. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +62 -13
  235. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
  236. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts +6 -2
  237. package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  238. package/dist/backend/backend/src/services/v3/v3-data.service.js +14 -9
  239. package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
  240. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +14 -0
  241. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  242. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +31 -0
  243. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  244. package/dist/backend/backend/src/types/event-bus.types.d.ts +4 -2
  245. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  246. package/dist/backend/backend/src/types/event-bus.types.js +15 -0
  247. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  248. package/dist/backend/backend/src/types/index.d.ts +16 -0
  249. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  250. package/dist/backend/backend/src/types/index.js.map +1 -1
  251. package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
  252. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  253. package/dist/backend/backend/src/types/v2/index.js +1 -1
  254. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  255. package/dist/backend/backend/src/types/v2/mission.types.d.ts +41 -0
  256. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  257. package/dist/backend/backend/src/types/v2/mission.types.js +29 -0
  258. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  259. package/dist/backend/backend/src/utils/network-exposure.utils.d.ts +67 -0
  260. package/dist/backend/backend/src/utils/network-exposure.utils.d.ts.map +1 -0
  261. package/dist/backend/backend/src/utils/network-exposure.utils.js +92 -0
  262. package/dist/backend/backend/src/utils/network-exposure.utils.js.map +1 -0
  263. package/dist/backend/build-info.json +2 -2
  264. package/dist/backend/config/constants.d.ts +53 -0
  265. package/dist/backend/config/constants.d.ts.map +1 -1
  266. package/dist/backend/config/constants.js +54 -0
  267. package/dist/backend/config/constants.js.map +1 -1
  268. package/dist/backend/config/index.d.ts +2 -2
  269. package/dist/backend/config/index.d.ts.map +1 -1
  270. package/dist/backend/config/index.js +6 -6
  271. package/dist/backend/config/index.js.map +1 -1
  272. package/dist/cli/backend/src/constants.d.ts +100 -0
  273. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  274. package/dist/cli/backend/src/constants.js +88 -1
  275. package/dist/cli/backend/src/constants.js.map +1 -1
  276. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +68 -0
  277. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  278. package/dist/cli/backend/src/services/agent/agent-registration.service.js +280 -10
  279. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  280. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
  281. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  282. package/dist/cli/backend/src/services/agent/claude-runtime.service.js +10 -1
  283. package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  284. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
  285. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  286. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +11 -1
  287. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  288. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
  289. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  290. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
  291. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  292. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
  293. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  294. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +10 -1
  295. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  296. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
  297. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  298. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +422 -3
  299. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  300. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
  301. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  302. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +50 -1
  303. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  304. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
  305. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  306. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
  307. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  308. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +42 -0
  309. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  310. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
  311. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  312. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  313. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
  314. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  315. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +26 -2
  316. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  317. package/dist/cli/backend/src/services/backup/backup-archive.service.js +91 -10
  318. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  319. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +15 -2
  320. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
  321. package/dist/cli/backend/src/services/backup/backup-restore.service.js +100 -21
  322. package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -1
  323. package/dist/cli/backend/src/services/backup/backup.types.d.ts +85 -2
  324. package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
  325. package/dist/cli/backend/src/services/backup/backup.types.js +21 -0
  326. package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
  327. package/dist/cli/backend/src/services/backup/project-file-filter.d.ts +35 -0
  328. package/dist/cli/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
  329. package/dist/cli/backend/src/services/backup/project-file-filter.js +90 -0
  330. package/dist/cli/backend/src/services/backup/project-file-filter.js.map +1 -0
  331. package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
  332. package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
  333. package/dist/cli/backend/src/services/budget/team-budget-gate.service.js +364 -0
  334. package/dist/cli/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
  335. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +23 -3
  336. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  337. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +34 -3
  338. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  339. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +5 -3
  340. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  341. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +6 -4
  342. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  343. package/dist/cli/backend/src/services/core/api-token.service.d.ts +78 -0
  344. package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -0
  345. package/dist/cli/backend/src/services/core/api-token.service.js +149 -0
  346. package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -0
  347. package/dist/cli/backend/src/services/core/logger.service.d.ts +10 -1
  348. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
  349. package/dist/cli/backend/src/services/core/logger.service.js +18 -3
  350. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
  351. package/dist/cli/backend/src/services/core/storage.service.d.ts +11 -0
  352. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  353. package/dist/cli/backend/src/services/core/storage.service.js +34 -0
  354. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  355. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
  356. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  357. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +42 -7
  358. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  359. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -0
  360. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  361. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +67 -1
  362. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  363. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +7 -1
  364. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  365. package/dist/cli/backend/src/services/session/pty/pty-session.js +9 -3
  366. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  367. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +27 -0
  368. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  369. package/dist/cli/backend/src/services/session/session-handoff.service.js +110 -22
  370. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
  371. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
  372. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  373. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +132 -6
  374. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  375. package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
  376. package/dist/cli/backend/src/services/v3/kr-tracking.service.js +3 -6
  377. package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -1
  378. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +5 -0
  379. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
  380. package/dist/cli/backend/src/services/v3/mission-executor.service.js +36 -0
  381. package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
  382. package/dist/cli/backend/src/services/v3/mission-paths.d.ts +69 -0
  383. package/dist/cli/backend/src/services/v3/mission-paths.d.ts.map +1 -0
  384. package/dist/cli/backend/src/services/v3/mission-paths.js +92 -0
  385. package/dist/cli/backend/src/services/v3/mission-paths.js.map +1 -0
  386. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +6 -2
  387. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  388. package/dist/cli/backend/src/services/v3/v3-data.service.js +14 -9
  389. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  390. package/dist/cli/backend/src/types/event-bus.types.d.ts +4 -2
  391. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  392. package/dist/cli/backend/src/types/event-bus.types.js +15 -0
  393. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  394. package/dist/cli/backend/src/types/index.d.ts +16 -0
  395. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  396. package/dist/cli/backend/src/types/index.js.map +1 -1
  397. package/dist/cli/backend/src/types/v2/index.d.ts +1 -1
  398. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  399. package/dist/cli/backend/src/types/v2/index.js +1 -1
  400. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  401. package/dist/cli/backend/src/types/v2/mission.types.d.ts +41 -0
  402. package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
  403. package/dist/cli/backend/src/types/v2/mission.types.js +29 -0
  404. package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
  405. package/dist/cli/cli/src/commands/backup.d.ts +25 -0
  406. package/dist/cli/cli/src/commands/backup.d.ts.map +1 -1
  407. package/dist/cli/cli/src/commands/backup.js +120 -6
  408. package/dist/cli/cli/src/commands/backup.js.map +1 -1
  409. package/dist/cli/cli/src/commands/doctor.d.ts +58 -0
  410. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -0
  411. package/dist/cli/cli/src/commands/doctor.js +163 -0
  412. package/dist/cli/cli/src/commands/doctor.js.map +1 -0
  413. package/dist/cli/cli/src/commands/service.d.ts +68 -11
  414. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  415. package/dist/cli/cli/src/commands/service.js +183 -51
  416. package/dist/cli/cli/src/commands/service.js.map +1 -1
  417. package/dist/cli/cli/src/commands/token.d.ts +53 -0
  418. package/dist/cli/cli/src/commands/token.d.ts.map +1 -0
  419. package/dist/cli/cli/src/commands/token.js +70 -0
  420. package/dist/cli/cli/src/commands/token.js.map +1 -0
  421. package/dist/cli/cli/src/index.js +40 -5
  422. package/dist/cli/cli/src/index.js.map +1 -1
  423. package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts +21 -0
  424. package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts.map +1 -0
  425. package/dist/cli/cli/src/scripts/check-native-toolchain.js +40 -0
  426. package/dist/cli/cli/src/scripts/check-native-toolchain.js.map +1 -0
  427. package/dist/cli/cli/src/utils/native-toolchain.d.ts +111 -0
  428. package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -0
  429. package/dist/cli/cli/src/utils/native-toolchain.js +146 -0
  430. package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -0
  431. package/dist/cli/cli/src/utils/package-root.d.ts +55 -0
  432. package/dist/cli/cli/src/utils/package-root.d.ts.map +1 -0
  433. package/dist/cli/cli/src/utils/package-root.js +107 -0
  434. package/dist/cli/cli/src/utils/package-root.js.map +1 -0
  435. package/dist/cli/cli/src/utils/version-check.d.ts +18 -2
  436. package/dist/cli/cli/src/utils/version-check.d.ts.map +1 -1
  437. package/dist/cli/cli/src/utils/version-check.js +51 -4
  438. package/dist/cli/cli/src/utils/version-check.js.map +1 -1
  439. package/dist/cli/config/constants.d.ts +53 -0
  440. package/dist/cli/config/constants.d.ts.map +1 -1
  441. package/dist/cli/config/constants.js +54 -0
  442. package/dist/cli/config/constants.js.map +1 -1
  443. package/dist/cli/config/index.d.ts +2 -2
  444. package/dist/cli/config/index.d.ts.map +1 -1
  445. package/dist/cli/config/index.js +6 -6
  446. package/dist/cli/config/index.js.map +1 -1
  447. package/frontend/dist/assets/index-203224f9.js +4961 -0
  448. package/frontend/dist/assets/index-dcaf6c88.css +42 -0
  449. package/frontend/dist/index.html +2 -2
  450. package/package.json +3 -2
  451. package/frontend/dist/assets/index-190a957f.js +0 -4961
  452. package/frontend/dist/assets/index-88feb412.css +0 -42
@@ -0,0 +1,364 @@
1
+ /**
2
+ * Team Budget Gate
3
+ *
4
+ * Evaluates a team's `Team.budget` (`maxTokensPerDay`, `maxUsdPerMonth`,
5
+ * `alertThreshold`) against the live token ledger in
6
+ * {@link TokenUsageService}. The budget was stored and injected into agent
7
+ * prompts but never evaluated anywhere — this service is the single
8
+ * evaluator, consulted by:
9
+ *
10
+ * - `WorkItemDispatchSubscriber.dispatchTo` — skip pushing a brief to an
11
+ * agent whose team is over budget.
12
+ * - `TaskPoolService.claimFromPool` — refuse the claim with
13
+ * `reason: 'team_budget_exceeded'`.
14
+ *
15
+ * and it is the single notifier: crossing `alertThreshold` (warn) or 100 %
16
+ * (blocked) publishes one `team:budget_exceeded` event per team per UTC day
17
+ * per level and enqueues an owner-facing `[BUDGET]` message to the
18
+ * orchestrator queue (`source: 'system_event'`).
19
+ *
20
+ * Cost: one `getTeams()` + one ledger scan per member session, cached per
21
+ * team for {@link TEAM_BUDGET_CACHE_TTL_MS} so the claim/dispatch hot paths
22
+ * stay cheap.
23
+ *
24
+ * @module services/budget/team-budget-gate.service
25
+ */
26
+ import { LoggerService } from '../core/logger.service.js';
27
+ import { StorageService } from '../core/storage.service.js';
28
+ import { TokenUsageService } from '../monitoring/token-usage.service.js';
29
+ import { MESSAGE_SOURCES, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
30
+ import { formatError } from '../../utils/format-error.js';
31
+ // ---------------------------------------------------------------------------
32
+ // Constants
33
+ // ---------------------------------------------------------------------------
34
+ /** How long a team's computed usage is reused before re-scanning the ledger. */
35
+ export const TEAM_BUDGET_CACHE_TTL_MS = 60_000;
36
+ /** Refusal reason surfaced by the claim / dispatch gates. */
37
+ export const TEAM_BUDGET_EXCEEDED_REASON = 'team_budget_exceeded';
38
+ /** Envelope prefix for the owner-facing queue message. */
39
+ export const BUDGET_ENVELOPE_PREFIX = '[BUDGET]';
40
+ /** Conversation id stamped on `[BUDGET]` queue messages. */
41
+ export const BUDGET_CONVERSATION_ID = 'system_budget';
42
+ /** Default alert threshold (percent) when `Team.budget.alertThreshold` is unset. */
43
+ export const DEFAULT_ALERT_THRESHOLD_PCT = 80;
44
+ /** Fully-consumed budget, in percent. */
45
+ const FULL_BUDGET_PCT = 100;
46
+ /** Bounded size of the per-day notification dedup list. */
47
+ const NOTIFY_DEDUP_CAPACITY = 1000;
48
+ /** Thrown by `claimFromPool` when the claiming agent's team is over budget. */
49
+ export class TeamBudgetExceededError extends Error {
50
+ reason = TEAM_BUDGET_EXCEEDED_REASON;
51
+ check;
52
+ constructor(check) {
53
+ super(check.detail ?? `Team ${check.teamId} budget exceeded`);
54
+ this.name = 'TeamBudgetExceededError';
55
+ this.check = check;
56
+ }
57
+ }
58
+ // ---------------------------------------------------------------------------
59
+ // Helpers
60
+ // ---------------------------------------------------------------------------
61
+ /** UTC midnight of the given instant. */
62
+ function startOfUtcDay(now) {
63
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
64
+ }
65
+ /** First instant of the given instant's UTC month. */
66
+ function startOfUtcMonth(now) {
67
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1));
68
+ }
69
+ /** `YYYY-MM-DD` in UTC. */
70
+ function dayKey(now) {
71
+ return now.toISOString().slice(0, 10);
72
+ }
73
+ /** Percentage of `used` against `cap`, rounded to one decimal. */
74
+ function pct(used, cap) {
75
+ if (cap <= 0)
76
+ return 0;
77
+ return Math.round((used / cap) * 1000) / 10;
78
+ }
79
+ /** Whether a budget carries at least one enforceable cap. */
80
+ function hasCaps(budget) {
81
+ if (!budget)
82
+ return false;
83
+ return ((typeof budget.maxTokensPerDay === 'number' && budget.maxTokensPerDay > 0) ||
84
+ (typeof budget.maxUsdPerMonth === 'number' && budget.maxUsdPerMonth > 0));
85
+ }
86
+ // ---------------------------------------------------------------------------
87
+ // Service
88
+ // ---------------------------------------------------------------------------
89
+ /**
90
+ * Evaluates and enforces per-team token / USD budgets. See module docs.
91
+ */
92
+ export class TeamBudgetGateService {
93
+ static instance = null;
94
+ logger;
95
+ getTeams;
96
+ ledger;
97
+ now;
98
+ cache = new Map();
99
+ /** Teams snapshot shared by check()/checkForSession(), same TTL as the per-team cache. */
100
+ teamsSnapshot = null;
101
+ /** `<teamId>:<level>:<YYYY-MM-DD>` notifications already sent (FIFO-bounded). */
102
+ notified = [];
103
+ eventBus = null;
104
+ messageQueue = null;
105
+ constructor(deps = {}) {
106
+ this.logger =
107
+ deps.logger ?? LoggerService.getInstance().createComponentLogger('TeamBudgetGate');
108
+ this.getTeams = deps.getTeams ?? (() => StorageService.getInstance().getTeams());
109
+ this.ledger = deps.ledger ?? TokenUsageService.getInstance();
110
+ this.now = deps.now ?? (() => new Date());
111
+ }
112
+ /** Singleton accessor (production). Tests construct directly. */
113
+ static getInstance() {
114
+ if (!TeamBudgetGateService.instance) {
115
+ TeamBudgetGateService.instance = new TeamBudgetGateService();
116
+ }
117
+ return TeamBudgetGateService.instance;
118
+ }
119
+ /** Drop the singleton (tests). */
120
+ static resetInstance() {
121
+ TeamBudgetGateService.instance = null;
122
+ }
123
+ /**
124
+ * Wire the notification legs. Either may be null; the gate still
125
+ * enforces without them.
126
+ *
127
+ * @param deps - EventBus for `team:budget_exceeded`, queue for `[BUDGET]`
128
+ */
129
+ setNotifiers(deps) {
130
+ if (deps.eventBus !== undefined)
131
+ this.eventBus = deps.eventBus;
132
+ if (deps.messageQueue !== undefined)
133
+ this.messageQueue = deps.messageQueue;
134
+ }
135
+ /** Forget cached usage + teams snapshot (tests / after a budget edit). */
136
+ invalidate(teamId) {
137
+ if (teamId)
138
+ this.cache.delete(teamId);
139
+ else
140
+ this.cache.clear();
141
+ this.teamsSnapshot = null;
142
+ }
143
+ /** Teams list, re-read at most once per {@link TEAM_BUDGET_CACHE_TTL_MS}. */
144
+ async loadTeams() {
145
+ const nowMs = this.now().getTime();
146
+ if (this.teamsSnapshot && nowMs - this.teamsSnapshot.at < TEAM_BUDGET_CACHE_TTL_MS) {
147
+ return this.teamsSnapshot.teams;
148
+ }
149
+ const teams = await this.getTeams();
150
+ this.teamsSnapshot = { at: nowMs, teams };
151
+ return teams;
152
+ }
153
+ /**
154
+ * Check a team's budget. Cached per team for {@link TEAM_BUDGET_CACHE_TTL_MS}.
155
+ *
156
+ * @param teamId - Team to evaluate
157
+ * @returns The check; `allowed: true` when the team is unknown or has no caps
158
+ */
159
+ async check(teamId) {
160
+ const nowMs = this.now().getTime();
161
+ const cached = this.cache.get(teamId);
162
+ if (cached && nowMs - cached.at < TEAM_BUDGET_CACHE_TTL_MS) {
163
+ return cached.check;
164
+ }
165
+ let check;
166
+ try {
167
+ const teams = await this.loadTeams();
168
+ const team = teams.find((t) => t.id === teamId);
169
+ check = team ? this.evaluate(team) : this.allowedFor(teamId, '', []);
170
+ }
171
+ catch (err) {
172
+ // Fail OPEN: a ledger/storage hiccup must never freeze every team.
173
+ this.logger.warn('Team budget check failed — allowing (fail-open)', {
174
+ teamId,
175
+ error: formatError(err),
176
+ });
177
+ check = this.allowedFor(teamId, '', []);
178
+ }
179
+ this.cache.set(teamId, { at: nowMs, check });
180
+ if (check.level !== 'ok') {
181
+ this.notify(check);
182
+ }
183
+ return check;
184
+ }
185
+ /**
186
+ * Check the budget of the team that owns `sessionName`. Sessions that map
187
+ * to no team (orchestrator, unknown) are always allowed.
188
+ *
189
+ * @param sessionName - Agent PTY session name
190
+ * @returns The team's check, or an allowed check when unresolvable
191
+ */
192
+ async checkForSession(sessionName) {
193
+ let teamId = null;
194
+ try {
195
+ const teams = await this.loadTeams();
196
+ const team = teams.find((t) => t.members.some((m) => m.sessionName === sessionName));
197
+ teamId = team?.id ?? null;
198
+ }
199
+ catch (err) {
200
+ this.logger.warn('Team lookup for budget check failed — allowing (fail-open)', {
201
+ sessionName,
202
+ error: formatError(err),
203
+ });
204
+ }
205
+ if (!teamId)
206
+ return this.allowedFor('', '', [sessionName]);
207
+ return this.check(teamId);
208
+ }
209
+ // -------------------------------------------------------------------------
210
+ // Internals
211
+ // -------------------------------------------------------------------------
212
+ allowedFor(teamId, teamName, sessions) {
213
+ return {
214
+ allowed: true,
215
+ level: 'ok',
216
+ teamId,
217
+ teamName,
218
+ usage: { tokensToday: 0, usdThisMonth: 0, sessions },
219
+ };
220
+ }
221
+ /** Aggregate the team's sessions over the two windows and grade the result. */
222
+ evaluate(team) {
223
+ const sessions = team.members.map((m) => m.sessionName).filter((s) => !!s);
224
+ if (!hasCaps(team.budget)) {
225
+ return this.allowedFor(team.id, team.name, sessions);
226
+ }
227
+ const now = this.now();
228
+ const dayStart = startOfUtcDay(now);
229
+ const monthStart = startOfUtcMonth(now);
230
+ let tokensToday = 0;
231
+ let usdThisMonth = 0;
232
+ for (const session of sessions) {
233
+ const day = this.ledger.getSessionUsageSince(session, dayStart, now);
234
+ tokensToday += day.inputTokens + day.outputTokens;
235
+ const month = this.ledger.getSessionUsageSince(session, monthStart, now);
236
+ usdThisMonth += month.cost;
237
+ }
238
+ const budget = team.budget;
239
+ const maxTokensPerDay = typeof budget.maxTokensPerDay === 'number' && budget.maxTokensPerDay > 0
240
+ ? budget.maxTokensPerDay
241
+ : undefined;
242
+ const maxUsdPerMonth = typeof budget.maxUsdPerMonth === 'number' && budget.maxUsdPerMonth > 0
243
+ ? budget.maxUsdPerMonth
244
+ : undefined;
245
+ const tokenPct = maxTokensPerDay !== undefined ? pct(tokensToday, maxTokensPerDay) : undefined;
246
+ const usdPct = maxUsdPerMonth !== undefined ? pct(usdThisMonth, maxUsdPerMonth) : undefined;
247
+ const alertThreshold = typeof budget.alertThreshold === 'number' && budget.alertThreshold > 0
248
+ ? budget.alertThreshold
249
+ : DEFAULT_ALERT_THRESHOLD_PCT;
250
+ const worstPct = Math.max(tokenPct ?? 0, usdPct ?? 0);
251
+ const usage = {
252
+ tokensToday,
253
+ usdThisMonth,
254
+ maxTokensPerDay,
255
+ maxUsdPerMonth,
256
+ tokenPct,
257
+ usdPct,
258
+ sessions,
259
+ };
260
+ if (worstPct >= FULL_BUDGET_PCT) {
261
+ const which = tokenPct !== undefined && tokenPct >= FULL_BUDGET_PCT
262
+ ? `${tokensToday} tokens today ≥ ${maxTokensPerDay}/day`
263
+ : `$${usdThisMonth.toFixed(2)} this month ≥ $${maxUsdPerMonth}/month`;
264
+ return {
265
+ allowed: false,
266
+ reason: TEAM_BUDGET_EXCEEDED_REASON,
267
+ detail: `Team "${team.name}" (${team.id}) is over budget: ${which}`,
268
+ level: 'blocked',
269
+ usage,
270
+ teamId: team.id,
271
+ teamName: team.name,
272
+ };
273
+ }
274
+ if (worstPct >= alertThreshold) {
275
+ return {
276
+ allowed: true,
277
+ detail: `Team "${team.name}" (${team.id}) has used ${worstPct}% of its budget ` +
278
+ `(alert threshold ${alertThreshold}%)`,
279
+ level: 'warn',
280
+ usage,
281
+ teamId: team.id,
282
+ teamName: team.name,
283
+ };
284
+ }
285
+ return {
286
+ allowed: true,
287
+ level: 'ok',
288
+ usage,
289
+ teamId: team.id,
290
+ teamName: team.name,
291
+ };
292
+ }
293
+ /**
294
+ * Publish `team:budget_exceeded` + enqueue `[BUDGET]` once per team per
295
+ * level per UTC day. `warn` and `blocked` are separate keys so a team
296
+ * that crosses the alert line and later the hard cap gets both notices.
297
+ */
298
+ notify(check) {
299
+ const now = this.now();
300
+ const key = `${check.teamId}:${check.level}:${dayKey(now)}`;
301
+ if (this.notified.includes(key))
302
+ return;
303
+ this.notified.push(key);
304
+ if (this.notified.length > NOTIFY_DEDUP_CAPACITY)
305
+ this.notified.shift();
306
+ const content = this.formatEnvelope(check);
307
+ if (this.eventBus) {
308
+ try {
309
+ this.eventBus.publish({
310
+ id: `team:budget_exceeded:${key}`,
311
+ type: 'team:budget_exceeded',
312
+ timestamp: now.toISOString(),
313
+ teamId: check.teamId,
314
+ teamName: check.teamName,
315
+ memberId: '',
316
+ memberName: '',
317
+ sessionName: '',
318
+ previousValue: 'ok',
319
+ newValue: check.level,
320
+ changedField: 'taskStatus',
321
+ });
322
+ }
323
+ catch (err) {
324
+ this.logger.warn('team:budget_exceeded publish threw', { error: formatError(err) });
325
+ }
326
+ }
327
+ if (this.messageQueue) {
328
+ try {
329
+ this.messageQueue.enqueue({
330
+ content,
331
+ conversationId: BUDGET_CONVERSATION_ID,
332
+ source: MESSAGE_SOURCES.SYSTEM_EVENT,
333
+ targetSession: ORCHESTRATOR_SESSION_NAME,
334
+ sourceMetadata: {
335
+ teamId: check.teamId,
336
+ level: check.level,
337
+ tokensToday: check.usage.tokensToday,
338
+ usdThisMonth: check.usage.usdThisMonth,
339
+ },
340
+ });
341
+ }
342
+ catch (err) {
343
+ this.logger.warn('[BUDGET] enqueue failed (non-fatal)', { error: formatError(err) });
344
+ }
345
+ }
346
+ this.logger.info('Team budget notification', { teamId: check.teamId, level: check.level });
347
+ }
348
+ /** Owner-facing one-liner. */
349
+ formatEnvelope(check) {
350
+ const u = check.usage;
351
+ const parts = [];
352
+ if (u.maxTokensPerDay !== undefined) {
353
+ parts.push(`${u.tokensToday}/${u.maxTokensPerDay} tokens today (${u.tokenPct}%)`);
354
+ }
355
+ if (u.maxUsdPerMonth !== undefined) {
356
+ parts.push(`$${u.usdThisMonth.toFixed(2)}/$${u.maxUsdPerMonth} this month (${u.usdPct}%)`);
357
+ }
358
+ const state = check.level === 'blocked'
359
+ ? 'BLOCKED — new work will not be dispatched or claimed until the window resets or the budget is raised.'
360
+ : 'WARNING — approaching the cap.';
361
+ return `${BUDGET_ENVELOPE_PREFIX} Team "${check.teamName}" (${check.teamId}) ${state} ${parts.join('; ')}`;
362
+ }
363
+ }
364
+ //# sourceMappingURL=team-budget-gate.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-budget-gate.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/budget/team-budget-gate.service.ts"],"names":[],"mappings":"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"}
@@ -261,9 +261,10 @@ export declare class ChatV2Service extends EventEmitter {
261
261
  */
262
262
  countAllMessages(): number;
263
263
  /**
264
- * Whether anyone (a person or an agent) has said anything since `sinceMs`.
265
- * System rows do not count. Bypasses principal scoping on purpose — this
266
- * is a global "is there new conversation to reflect on" probe.
264
+ * Whether a person has said anything since `sinceMs`. Agent and system
265
+ * rows do not count (an agent's own echo must not re-arm the nudge that
266
+ * produced it). Bypasses principal scoping on purpose — this is a global
267
+ * "is there new conversation to reflect on" probe.
267
268
  *
268
269
  * @param sinceMs - Epoch ms lower bound (exclusive)
269
270
  * @returns True when at least one user/agent message is newer
@@ -690,6 +691,25 @@ export declare class ChatV2Service extends EventEmitter {
690
691
  * @returns Owner message contents, newest first.
691
692
  */
692
693
  getRecentOwnerMessageContents(sinceMs: number, limit?: number): string[];
694
+ /**
695
+ * Returns when the owner last spoke on a channel and when it was last
696
+ * replied to by anyone else (agent/orc/system), as epoch ms.
697
+ *
698
+ * Purpose: the OrcDeliveryEnforcer (issue #731) must not demand a
699
+ * deliverable in a Slack thread the owner abandoned long ago, and must stop
700
+ * nagging once a reply has landed on the thread through ANY path — every
701
+ * outbound Slack reply is mirrored here, so this is the single place that
702
+ * knows. Server-internal read; no per-channel authorization.
703
+ *
704
+ * @param channelId - chat-v2 channel id (for Slack threads this is the
705
+ * synthesized `slack-<channel>-<ts>` conversation id).
706
+ * @returns Both timestamps (`null` when no such row), or `null` when the
707
+ * channel itself does not exist.
708
+ */
709
+ getChannelActivity(channelId: string): {
710
+ lastOwnerMessageAt: number | null;
711
+ lastReplyAt: number | null;
712
+ } | null;
693
713
  /**
694
714
  * Persist a message sent by the caller. The server decides `sender_type`
695
715
  * and `sender_id` from the auth principal; client fields are ignored.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-v2.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-v2.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.service.ts"],"names":[],"mappings":"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"}
@@ -108,9 +108,10 @@ export class ChatV2Service extends EventEmitter {
108
108
  return this.messages.countAll();
109
109
  }
110
110
  /**
111
- * Whether anyone (a person or an agent) has said anything since `sinceMs`.
112
- * System rows do not count. Bypasses principal scoping on purpose — this
113
- * is a global "is there new conversation to reflect on" probe.
111
+ * Whether a person has said anything since `sinceMs`. Agent and system
112
+ * rows do not count (an agent's own echo must not re-arm the nudge that
113
+ * produced it). Bypasses principal scoping on purpose — this is a global
114
+ * "is there new conversation to reflect on" probe.
114
115
  *
115
116
  * @param sinceMs - Epoch ms lower bound (exclusive)
116
117
  * @returns True when at least one user/agent message is newer
@@ -919,6 +920,36 @@ export class ChatV2Service extends EventEmitter {
919
920
  .all(sinceMs, capped);
920
921
  return rows.map((r) => r.content);
921
922
  }
923
+ /**
924
+ * Returns when the owner last spoke on a channel and when it was last
925
+ * replied to by anyone else (agent/orc/system), as epoch ms.
926
+ *
927
+ * Purpose: the OrcDeliveryEnforcer (issue #731) must not demand a
928
+ * deliverable in a Slack thread the owner abandoned long ago, and must stop
929
+ * nagging once a reply has landed on the thread through ANY path — every
930
+ * outbound Slack reply is mirrored here, so this is the single place that
931
+ * knows. Server-internal read; no per-channel authorization.
932
+ *
933
+ * @param channelId - chat-v2 channel id (for Slack threads this is the
934
+ * synthesized `slack-<channel>-<ts>` conversation id).
935
+ * @returns Both timestamps (`null` when no such row), or `null` when the
936
+ * channel itself does not exist.
937
+ */
938
+ getChannelActivity(channelId) {
939
+ if (!this.channels.getById(channelId))
940
+ return null;
941
+ const row = this.db
942
+ .prepare(`SELECT
943
+ MAX(CASE WHEN sender_type = 'user' THEN created_at END) AS last_owner_at,
944
+ MAX(CASE WHEN sender_type <> 'user' THEN created_at END) AS last_reply_at
945
+ FROM chat_messages
946
+ WHERE channel_id = ?`)
947
+ .get(channelId);
948
+ return {
949
+ lastOwnerMessageAt: row?.last_owner_at ?? null,
950
+ lastReplyAt: row?.last_reply_at ?? null,
951
+ };
952
+ }
922
953
  // -------------------------------------------------------------------------
923
954
  // Message operations
924
955
  // -------------------------------------------------------------------------