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
@@ -22,7 +22,7 @@ import { TerminalGateway, setTerminalGateway } from './websocket/terminal.gatewa
22
22
  import { initializeChatGateway } from './websocket/chat.gateway.js';
23
23
  import { LoggerService } from './services/core/logger.service.js';
24
24
  import { retryWithBackoff } from './services/core/retry.util.js';
25
- import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, } from './constants.js';
25
+ import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, API_SECURITY_CONSTANTS, } from './constants.js';
26
26
  import { getSettingsService } from './services/settings/index.js';
27
27
  import { MemoryService } from './services/memory/memory.service.js';
28
28
  import { getImprovementStartupService } from './services/orchestrator/improvement-startup.service.js';
@@ -35,6 +35,12 @@ import { MessageQueueService, QueueProcessorService, ResponseRouterService } fro
35
35
  import { ThreadStatusQueueService } from './services/messaging/thread-status-queue.service.js';
36
36
  import { EventBusService } from './services/event-bus/index.js';
37
37
  import { EventToWorkItemBridge } from './services/event-bus/event-to-workitem-bridge.service.js';
38
+ import { KRCompletionSubscriber } from './services/v3/kr-completion.subscriber.js';
39
+ import { MissionReminderService } from './services/v3/mission-reminder.service.js';
40
+ import { OKRReviewService } from './services/v3/okr-review.service.js';
41
+ import { bootEscalationService } from './services/v3/escalation-boot.js';
42
+ import { TeamBudgetGateService } from './services/budget/team-budget-gate.service.js';
43
+ import { HierarchyEscalationMonitor } from './services/hierarchy/hierarchy-escalation-monitor.service.js';
38
44
  import { AutoLearningSubscriber } from './services/memory/auto-learning.subscriber.js';
39
45
  import { MilestoneNotificationSubscriber } from './services/notification/milestone-notification.subscriber.js';
40
46
  import { RequestSlaSubscriber, setRequestSlaSubscriber, getRequestSlaSubscriber, } from './services/v3/request-sla.subscriber.js';
@@ -56,6 +62,9 @@ import { setMessageQueueService as setMessagingControllerQueueService } from './
56
62
  import { SystemResourceAlertService } from './services/monitoring/system-resource-alert.service.js';
57
63
  import { TokenUsageService } from './services/monitoring/token-usage.service.js';
58
64
  import { agentHeartbeatMiddleware } from './middleware/agent-heartbeat.middleware.js';
65
+ import { apiTokenMiddleware, socketIoAllowRequest, installWebSocketGate, } from './middleware/api-token.middleware.js';
66
+ import { resolveApiToken } from './services/core/api-token.service.js';
67
+ import { isHeadlessEnvironment, describeNetworkExposure } from './utils/network-exposure.utils.js';
59
68
  import { RedisCacheService } from './services/cache/redis-cache.service.js';
60
69
  import { OrchestratorRestartService } from './services/orchestrator/orchestrator-restart.service.js';
61
70
  import { setOrchestratorSetupDependencies } from './services/orchestrator/orchestrator-setup.service.js';
@@ -66,6 +75,7 @@ import { OrchestratorHeartbeatMonitorService } from './services/orchestrator/orc
66
75
  import { RuntimeExitMonitorService } from './services/agent/runtime-exit-monitor.service.js';
67
76
  import { ContextWindowMonitorService } from './services/agent/context-window-monitor.service.js';
68
77
  import { OAuthReloginMonitorService } from './services/agent/oauth-relogin-monitor.service.js';
78
+ import { getChatV2Service } from './services/chat-v2/chat-v2.singleton.js';
69
79
  import { findPackageRoot } from './utils/package-root.js';
70
80
  import { assertBuildProvenance } from './utils/build-provenance.js';
71
81
  import { isNativeBindingFatalError } from './utils/native-binding.utils.js';
@@ -146,6 +156,9 @@ export class CrewlyServer {
146
156
  eventBusService;
147
157
  /** BRIDGE-1: subscribes to autonomy events and creates WorkItems. */
148
158
  eventToWorkItemBridge = null;
159
+ krCompletionSubscriber = null;
160
+ escalationService = null;
161
+ hierarchyEscalationMonitor = null;
149
162
  /** LEARN-1: subscribes to terminal task / mission:replanned events and auto-records learnings. */
150
163
  autoLearningSubscriber = null;
151
164
  // DF-1 #438 — symmetric to AutoLearningSubscriber; surfaces milestones
@@ -188,6 +201,9 @@ export class CrewlyServer {
188
201
  parseIntWithFallback(process.env.DEFAULT_CHECK_INTERVAL, 30, 'DEFAULT_CHECK_INTERVAL'),
189
202
  autoCommitInterval: config?.autoCommitInterval || parseIntWithFallback(process.env.AUTO_COMMIT_INTERVAL, 30, 'AUTO_COMMIT_INTERVAL'),
190
203
  headless: config?.headless ?? process.env.CREWLY_HEADLESS === 'true',
204
+ bindHost: config?.bindHost ||
205
+ process.env[API_SECURITY_CONSTANTS.ENV.BIND_HOST] ||
206
+ API_SECURITY_CONSTANTS.DEFAULT_BIND_HOST,
191
207
  };
192
208
  this.app = express();
193
209
  this.httpServer = createServer(this.app);
@@ -214,6 +230,10 @@ export class CrewlyServer {
214
230
  // that doesn't match /socket.io/ — killing Crewly in Chrome connections before
215
231
  // any data is exchanged (manifests as "Invalid frame header" errors).
216
232
  destroyUpgrade: false,
233
+ // Non-loopback clients must present the API token (query `token`
234
+ // or the `crewly_token` cookie). Engine.IO's polling handshake
235
+ // bypasses Express, so the gate has to live here as well.
236
+ allowRequest: socketIoAllowRequest,
217
237
  });
218
238
  this.initializeServices();
219
239
  this.configureMiddleware();
@@ -275,6 +295,15 @@ export class CrewlyServer {
275
295
  // triggers addToPool — the slack listener / TaskPool router below both
276
296
  // depend on this for the auto-close path b chain. Idempotent.
277
297
  TaskPoolService.getInstance().setEventBusService(this.eventBusService);
298
+ // Team budget gate (Team.budget was stored + prompt-injected but never
299
+ // evaluated). Enforced in claimFromPool + WorkItemDispatchSubscriber;
300
+ // here we give it the bus + queue so cap crossings reach the owner.
301
+ const teamBudgetGate = TeamBudgetGateService.getInstance();
302
+ teamBudgetGate.setNotifiers({
303
+ eventBus: this.eventBusService,
304
+ messageQueue: this.messageQueueService,
305
+ });
306
+ TaskPoolService.getInstance().setTeamBudgetGate(teamBudgetGate);
278
307
  // Memory: TaskHistorySubscriber listens on the bus for
279
308
  // task:done_by_worker / task:rejected / task:cancelled and writes
280
309
  // the resulting TaskHistoryEntry into ProjectMemory. This is the
@@ -479,6 +508,10 @@ export class CrewlyServer {
479
508
  // actually delivers OR the budget is exhausted.
480
509
  try {
481
510
  const { OrcDeliveryEnforcerService } = await import('./services/orc/orc-delivery-enforcer.service.js');
511
+ const [{ getChatV2Service }, { synthesizeSlackConversationId }] = await Promise.all([
512
+ import('./services/chat-v2/chat-v2.singleton.js'),
513
+ import('./services/chat-v2/legacy-dto.utils.js'),
514
+ ]);
482
515
  const enforcer = new OrcDeliveryEnforcerService({
483
516
  reminderSink: ({ conversationId, text }) => {
484
517
  if (!this.messageQueueService)
@@ -489,6 +522,12 @@ export class CrewlyServer {
489
522
  source: 'system_event',
490
523
  });
491
524
  },
525
+ // Issue #731: let the enforcer see the thread's real activity
526
+ // (owner silence → don't track; reply via any path → stop).
527
+ // Every Slack thread is a chat-v2 channel keyed by its
528
+ // synthesized conversation id, and every outbound Slack
529
+ // reply is mirrored into it.
530
+ threadActivityProvider: ({ channelId, threadTs }) => getChatV2Service().getChannelActivity(synthesizeSlackConversationId(channelId, threadTs)),
492
531
  });
493
532
  OrcDeliveryEnforcerService.setInstance(enforcer);
494
533
  enforcer.start();
@@ -521,6 +560,23 @@ export class CrewlyServer {
521
560
  // for idempotency contract + retry cap + cron-recursion guard.
522
561
  this.eventToWorkItemBridge = EventToWorkItemBridge.boot(this.eventBusService);
523
562
  this.eventToWorkItemBridge.start();
563
+ // OKR loop closure: auto-measure `task_completion` KRs from task:done /
564
+ // task:verified and publish `team:all_tasks_done` when a mission has no
565
+ // active WorkItems left (the bridge turns that into a review WI). See
566
+ // `kr-completion.subscriber.ts`.
567
+ this.krCompletionSubscriber = KRCompletionSubscriber.boot(this.eventBusService);
568
+ this.krCompletionSubscriber.start();
569
+ // OKR loop closure: give the reminder sweep (mission:stale) and the
570
+ // review service (mission:replanned) a bus to publish on. Both were
571
+ // declared + bridged events with no publisher before this.
572
+ MissionReminderService.getInstance().setEventBusService(this.eventBusService);
573
+ OKRReviewService.getInstance().setEventBusService(this.eventBusService);
574
+ // Hierarchy escalation: a TL that has not acted on a worker's
575
+ // verification handoff within 15 min triggers the documented bypass to
576
+ // the orchestrator (`hierarchy:escalation` + [ESCALATION] queue message).
577
+ // HierarchyEscalationService had the rules but no runtime consumer.
578
+ this.hierarchyEscalationMonitor = HierarchyEscalationMonitor.boot(this.eventBusService, this.messageQueueService);
579
+ this.hierarchyEscalationMonitor.start();
524
580
  // LEARN-1: subscribe to terminal task / mission:replanned events and
525
581
  // auto-record a learning entry via MemoryService.recordLearning. Closes
526
582
  // the prompt-driven "agents-forget-to-record" gap. See
@@ -908,6 +964,10 @@ export class CrewlyServer {
908
964
  // Note: Static files are configured in configureRoutes() after API routes
909
965
  }
910
966
  configureRoutes() {
967
+ // API token gate — loopback callers (local skills, local dashboard)
968
+ // pass; every other address must present the API token. `/health`,
969
+ // static assets and the SPA shell are outside `/api` and stay open.
970
+ this.app.use('/api', apiTokenMiddleware);
911
971
  // Agent heartbeat middleware - any API call with X-Agent-Session header updates heartbeat
912
972
  this.app.use('/api', agentHeartbeatMiddleware);
913
973
  // API routes
@@ -1291,12 +1351,44 @@ export class CrewlyServer {
1291
1351
  error: error instanceof Error ? error.message : String(error),
1292
1352
  });
1293
1353
  }
1294
- // Wire OAuthReloginMonitorService EventBus dependency
1354
+ // Wire OAuthReloginMonitorService: event bus, orchestrator queue,
1355
+ // chat + Slack sinks for the owner-facing login notice, and the
1356
+ // boot-level sign-in-screen sweep (server-install finding 7).
1295
1357
  try {
1296
- OAuthReloginMonitorService.getInstance().setEventBusService(this.eventBusService);
1358
+ const oauthMonitor = OAuthReloginMonitorService.getInstance();
1359
+ oauthMonitor.setEventBusService(this.eventBusService);
1360
+ oauthMonitor.setNoticeQueue(this.messageQueueService);
1361
+ oauthMonitor.setSlackProvider(async () => {
1362
+ const slack = getSlackService();
1363
+ return slack.isConnected() ? slack : null;
1364
+ });
1365
+ oauthMonitor.setChatProvider(() => {
1366
+ const gateway = this.terminalGateway;
1367
+ if (!gateway)
1368
+ return null;
1369
+ return {
1370
+ getActiveConversationId: () => gateway.getActiveConversationId(),
1371
+ recordSystemTurn: (conversationId, content) => {
1372
+ const chatV2 = getChatV2Service();
1373
+ const channel = chatV2.ensureChannelForLegacyConversation({
1374
+ conversationId,
1375
+ agentSession: ORCHESTRATOR_SESSION_NAME,
1376
+ });
1377
+ chatV2.recordTurn({
1378
+ channelId: channel.id,
1379
+ senderType: 'system',
1380
+ senderId: 'system',
1381
+ content,
1382
+ metadata: { source: 'system' },
1383
+ });
1384
+ },
1385
+ broadcastSystemNotification: (message, type) => gateway.broadcastSystemNotification(message, type),
1386
+ };
1387
+ });
1388
+ oauthMonitor.start();
1297
1389
  }
1298
1390
  catch (error) {
1299
- this.logger.warn('Failed to wire OAuthReloginMonitorService EventBus (non-critical)', {
1391
+ this.logger.warn('Failed to wire OAuthReloginMonitorService (non-critical)', {
1300
1392
  error: error instanceof Error ? error.message : String(error),
1301
1393
  });
1302
1394
  }
@@ -1832,6 +1924,15 @@ export class CrewlyServer {
1832
1924
  });
1833
1925
  await triggerEngine.start();
1834
1926
  this.logger.info('TriggerEngine started with action handler wired');
1927
+ // MissionPolicy escalation loop (every 5 min: cost/time/failure rules →
1928
+ // notify/pause/block). Sequenced AFTER the action handler above because
1929
+ // EscalationService.start() wraps the installed handler and delegates
1930
+ // non-escalation triggers back to it. Gated by CREWLY_ESCALATION_ENABLED
1931
+ // (default on); a no-op when no mission carries escalation rules.
1932
+ this.escalationService = await bootEscalationService({
1933
+ messageQueue: this.messageQueueService,
1934
+ logger: this.logger,
1935
+ });
1835
1936
  // Wire team-scoped triggers: reconcile declarative Team.triggers spec
1836
1937
  // against the running engine on every team save, and cancel all of a
1837
1938
  // team's triggers when it's deleted. Listener is fire-and-forget.
@@ -1894,6 +1995,7 @@ export class CrewlyServer {
1894
1995
  try {
1895
1996
  const { WorkItemDispatchSubscriber } = await import('./services/v3/workitem-dispatch.subscriber.js');
1896
1997
  const dispatchSubscriber = WorkItemDispatchSubscriber.getInstance();
1998
+ dispatchSubscriber.setTeamBudgetGate(TeamBudgetGateService.getInstance());
1897
1999
  dispatchSubscriber.initialize(this.eventBusService);
1898
2000
  dispatchSubscriber.start();
1899
2001
  this.logger.info('WorkItemDispatchSubscriber started — workitem:queued events push to target sessions');
@@ -2067,6 +2169,12 @@ export class CrewlyServer {
2067
2169
  const loadedAddons = await addonLoader.loadAddons(this.app, this.httpServer);
2068
2170
  if (loadedAddons.length > 0) {
2069
2171
  this.logger.info('Addons loaded successfully', { addons: loadedAddons });
2172
+ // An addon that attaches its own WebSocket gateway wraps
2173
+ // `httpServer.emit` after our gate did; re-install so the
2174
+ // gate is outermost again (double-wrapping is harmless —
2175
+ // an allowed upgrade passes both, a refused one is
2176
+ // answered once by the outer wrapper).
2177
+ installWebSocketGate(this.httpServer);
2070
2178
  }
2071
2179
  }
2072
2180
  catch (addonErr) {
@@ -2669,9 +2777,9 @@ export class CrewlyServer {
2669
2777
  const { createServer } = await import('net');
2670
2778
  const testServer = createServer();
2671
2779
  return new Promise((resolve, reject) => {
2672
- testServer.listen(this.config.webPort, () => {
2780
+ testServer.listen(this.config.webPort, this.config.bindHost, () => {
2673
2781
  testServer.close(() => {
2674
- this.logger.info('Port is available', { port: this.config.webPort });
2782
+ this.logger.info('Port is available', { port: this.config.webPort, host: this.config.bindHost });
2675
2783
  resolve();
2676
2784
  });
2677
2785
  });
@@ -2685,18 +2793,63 @@ export class CrewlyServer {
2685
2793
  });
2686
2794
  });
2687
2795
  }
2796
+ /**
2797
+ * Log where the API token lives and how reachable the API is.
2798
+ *
2799
+ * Resolving the token here also performs the first-boot generation so
2800
+ * the file exists (0600) before the first non-loopback caller arrives.
2801
+ * Emits a WARN for a headless install that binds every interface with
2802
+ * neither `CREWLY_BIND_HOST` nor `CREWLY_API_TOKEN` set.
2803
+ */
2804
+ logNetworkExposure() {
2805
+ try {
2806
+ const token = resolveApiToken();
2807
+ const summary = describeNetworkExposure({
2808
+ bindHost: this.config.bindHost,
2809
+ port: this.config.webPort,
2810
+ bindHostExplicit: Boolean(process.env[API_SECURITY_CONSTANTS.ENV.BIND_HOST]),
2811
+ tokenSource: token.source,
2812
+ tokenFilePath: token.filePath,
2813
+ headless: this.config.headless || isHeadlessEnvironment(),
2814
+ });
2815
+ if (token.source === 'generated') {
2816
+ this.logger.info('Generated API token for non-loopback callers', {
2817
+ file: token.filePath,
2818
+ usage: 'crewly token | curl -H "X-Crewly-Token: $(crewly token)" http://<host>:<port>/api/teams',
2819
+ });
2820
+ }
2821
+ if (summary.level === 'warn') {
2822
+ this.logger.warn(summary.message, summary.details);
2823
+ }
2824
+ else {
2825
+ this.logger.info(summary.message, summary.details);
2826
+ }
2827
+ }
2828
+ catch (error) {
2829
+ this.logger.error('Failed to resolve API token', {
2830
+ error: error instanceof Error ? error.message : String(error),
2831
+ });
2832
+ }
2833
+ }
2688
2834
  async startHttpServer() {
2689
2835
  return new Promise((resolve, reject) => {
2690
2836
  const startTime = Date.now();
2691
- this.httpServer.listen(this.config.webPort, () => {
2837
+ // Outermost upgrade wrapper: every gateway (Socket.IO, browser
2838
+ // bridge, chat-v2, terminal) has attached by now, so this gate
2839
+ // runs before any of them sees a non-loopback upgrade.
2840
+ installWebSocketGate(this.httpServer);
2841
+ this.httpServer.listen(this.config.webPort, this.config.bindHost, () => {
2692
2842
  const duration = Date.now() - startTime;
2693
2843
  this.logger.info('Crewly server started', {
2844
+ host: this.config.bindHost,
2694
2845
  port: this.config.webPort,
2846
+ listening: `${this.config.bindHost}:${this.config.webPort}`,
2695
2847
  durationMs: duration,
2696
2848
  dashboardUrl: `http://localhost:${this.config.webPort}`,
2697
2849
  websocketUrl: `ws://localhost:${this.config.webPort}`,
2698
2850
  home: this.config.crewlyHome
2699
2851
  });
2852
+ this.logNetworkExposure();
2700
2853
  // B0 (interim) per `.crewly/specs/2026-05-05-trigger-persistence-bug.md`:
2701
2854
  // Broadcast `system:backend_restarted` exactly once per boot. The
2702
2855
  // trigger engine (`backend/src/services/v3/trigger-engine.service.ts`)
@@ -2831,7 +2984,6 @@ export class CrewlyServer {
2831
2984
  // Scans active missions and sends Slack alerts for off-track KRs
2832
2985
  setInterval(async () => {
2833
2986
  try {
2834
- const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
2835
2987
  await MissionReminderService.getInstance().runSweep();
2836
2988
  }
2837
2989
  catch (err) {
@@ -2844,7 +2996,6 @@ export class CrewlyServer {
2844
2996
  setTimeout(() => this.purgeCompletedData(), 30 * 1000);
2845
2997
  setTimeout(async () => {
2846
2998
  try {
2847
- const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
2848
2999
  await MissionReminderService.getInstance().runSweep();
2849
3000
  }
2850
3001
  catch (err) {
@@ -3187,6 +3338,21 @@ export class CrewlyServer {
3187
3338
  this.eventToWorkItemBridge.stop();
3188
3339
  this.eventToWorkItemBridge = null;
3189
3340
  }
3341
+ if (this.krCompletionSubscriber) {
3342
+ this.krCompletionSubscriber.stop();
3343
+ this.krCompletionSubscriber = null;
3344
+ }
3345
+ if (this.escalationService) {
3346
+ try {
3347
+ await this.escalationService.stop();
3348
+ }
3349
+ catch { /* best-effort */ }
3350
+ this.escalationService = null;
3351
+ }
3352
+ if (this.hierarchyEscalationMonitor) {
3353
+ this.hierarchyEscalationMonitor.stop();
3354
+ this.hierarchyEscalationMonitor = null;
3355
+ }
3190
3356
  // LEARN-1: stop the AutoLearningSubscriber on the same window as the
3191
3357
  // bridge so its in-flight recordLearning calls drain before the bus
3192
3358
  // is cleaned.
@@ -3255,6 +3421,18 @@ export class CrewlyServer {
3255
3421
  LogRotationService.getInstance().stop();
3256
3422
  // Stop auditor scheduler
3257
3423
  AuditorSchedulerService.getInstance().stop();
3424
+ // Persist the token ledger: it flushes every 5 minutes, so a restart
3425
+ // used to drop everything recorded since the last tick (2026-09-18).
3426
+ try {
3427
+ const ledger = TokenUsageService.getInstance();
3428
+ ledger.stopPeriodicFlush();
3429
+ await ledger.flushToDisk();
3430
+ }
3431
+ catch (flushErr) {
3432
+ this.logger.warn('Token ledger flush on shutdown failed (non-fatal)', {
3433
+ error: flushErr instanceof Error ? flushErr.message : String(flushErr),
3434
+ });
3435
+ }
3258
3436
  // Flush and shutdown OpenTelemetry tracing
3259
3437
  try {
3260
3438
  const { TracingService: TracingSvc } = await import('./services/core/tracing.service.js');