crewly 1.14.0 → 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 (458) 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 +195 -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 +29 -0
  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 +42 -0
  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 +16 -0
  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 +22 -0
  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/services/wiki/wiki-reflect-trigger.service.d.ts +21 -0
  245. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
  246. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +53 -3
  247. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
  248. package/dist/backend/backend/src/types/event-bus.types.d.ts +4 -2
  249. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  250. package/dist/backend/backend/src/types/event-bus.types.js +15 -0
  251. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  252. package/dist/backend/backend/src/types/index.d.ts +16 -0
  253. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  254. package/dist/backend/backend/src/types/index.js.map +1 -1
  255. package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
  256. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  257. package/dist/backend/backend/src/types/v2/index.js +1 -1
  258. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  259. package/dist/backend/backend/src/types/v2/mission.types.d.ts +41 -0
  260. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  261. package/dist/backend/backend/src/types/v2/mission.types.js +29 -0
  262. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  263. package/dist/backend/backend/src/utils/network-exposure.utils.d.ts +67 -0
  264. package/dist/backend/backend/src/utils/network-exposure.utils.d.ts.map +1 -0
  265. package/dist/backend/backend/src/utils/network-exposure.utils.js +92 -0
  266. package/dist/backend/backend/src/utils/network-exposure.utils.js.map +1 -0
  267. package/dist/backend/build-info.json +2 -2
  268. package/dist/backend/config/constants.d.ts +53 -0
  269. package/dist/backend/config/constants.d.ts.map +1 -1
  270. package/dist/backend/config/constants.js +54 -0
  271. package/dist/backend/config/constants.js.map +1 -1
  272. package/dist/backend/config/index.d.ts +2 -2
  273. package/dist/backend/config/index.d.ts.map +1 -1
  274. package/dist/backend/config/index.js +6 -6
  275. package/dist/backend/config/index.js.map +1 -1
  276. package/dist/cli/backend/src/constants.d.ts +100 -0
  277. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  278. package/dist/cli/backend/src/constants.js +88 -1
  279. package/dist/cli/backend/src/constants.js.map +1 -1
  280. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +68 -0
  281. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  282. package/dist/cli/backend/src/services/agent/agent-registration.service.js +280 -10
  283. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  284. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +7 -0
  285. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -1
  286. package/dist/cli/backend/src/services/agent/claude-runtime.service.js +10 -1
  287. package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -1
  288. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +8 -0
  289. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -1
  290. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +11 -1
  291. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -1
  292. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +36 -1
  293. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  294. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +66 -9
  295. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  296. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +7 -0
  297. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -1
  298. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +10 -1
  299. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -1
  300. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +197 -0
  301. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
  302. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +422 -3
  303. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
  304. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +27 -0
  305. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  306. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +50 -1
  307. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  308. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +35 -0
  309. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  310. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +73 -2
  311. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  312. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +42 -0
  313. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  314. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +33 -0
  315. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  316. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -1
  317. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +13 -1
  318. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -1
  319. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts +26 -2
  320. package/dist/cli/backend/src/services/backup/backup-archive.service.d.ts.map +1 -1
  321. package/dist/cli/backend/src/services/backup/backup-archive.service.js +91 -10
  322. package/dist/cli/backend/src/services/backup/backup-archive.service.js.map +1 -1
  323. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts +15 -2
  324. package/dist/cli/backend/src/services/backup/backup-restore.service.d.ts.map +1 -1
  325. package/dist/cli/backend/src/services/backup/backup-restore.service.js +100 -21
  326. package/dist/cli/backend/src/services/backup/backup-restore.service.js.map +1 -1
  327. package/dist/cli/backend/src/services/backup/backup.types.d.ts +85 -2
  328. package/dist/cli/backend/src/services/backup/backup.types.d.ts.map +1 -1
  329. package/dist/cli/backend/src/services/backup/backup.types.js +21 -0
  330. package/dist/cli/backend/src/services/backup/backup.types.js.map +1 -1
  331. package/dist/cli/backend/src/services/backup/project-file-filter.d.ts +35 -0
  332. package/dist/cli/backend/src/services/backup/project-file-filter.d.ts.map +1 -0
  333. package/dist/cli/backend/src/services/backup/project-file-filter.js +90 -0
  334. package/dist/cli/backend/src/services/backup/project-file-filter.js.map +1 -0
  335. package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts +165 -0
  336. package/dist/cli/backend/src/services/budget/team-budget-gate.service.d.ts.map +1 -0
  337. package/dist/cli/backend/src/services/budget/team-budget-gate.service.js +364 -0
  338. package/dist/cli/backend/src/services/budget/team-budget-gate.service.js.map +1 -0
  339. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +29 -0
  340. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  341. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +42 -0
  342. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  343. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +16 -0
  344. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  345. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +22 -0
  346. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  347. package/dist/cli/backend/src/services/core/api-token.service.d.ts +78 -0
  348. package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -0
  349. package/dist/cli/backend/src/services/core/api-token.service.js +149 -0
  350. package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -0
  351. package/dist/cli/backend/src/services/core/logger.service.d.ts +10 -1
  352. package/dist/cli/backend/src/services/core/logger.service.d.ts.map +1 -1
  353. package/dist/cli/backend/src/services/core/logger.service.js +18 -3
  354. package/dist/cli/backend/src/services/core/logger.service.js.map +1 -1
  355. package/dist/cli/backend/src/services/core/storage.service.d.ts +11 -0
  356. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  357. package/dist/cli/backend/src/services/core/storage.service.js +34 -0
  358. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  359. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +27 -3
  360. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -1
  361. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +42 -7
  362. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -1
  363. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +47 -0
  364. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
  365. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +67 -1
  366. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
  367. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +7 -1
  368. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -1
  369. package/dist/cli/backend/src/services/session/pty/pty-session.js +9 -3
  370. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -1
  371. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +27 -0
  372. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -1
  373. package/dist/cli/backend/src/services/session/session-handoff.service.js +110 -22
  374. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -1
  375. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +52 -0
  376. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  377. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +132 -6
  378. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  379. package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -1
  380. package/dist/cli/backend/src/services/v3/kr-tracking.service.js +3 -6
  381. package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -1
  382. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +5 -0
  383. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -1
  384. package/dist/cli/backend/src/services/v3/mission-executor.service.js +36 -0
  385. package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -1
  386. package/dist/cli/backend/src/services/v3/mission-paths.d.ts +69 -0
  387. package/dist/cli/backend/src/services/v3/mission-paths.d.ts.map +1 -0
  388. package/dist/cli/backend/src/services/v3/mission-paths.js +92 -0
  389. package/dist/cli/backend/src/services/v3/mission-paths.js.map +1 -0
  390. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +6 -2
  391. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
  392. package/dist/cli/backend/src/services/v3/v3-data.service.js +14 -9
  393. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
  394. package/dist/cli/backend/src/types/event-bus.types.d.ts +4 -2
  395. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  396. package/dist/cli/backend/src/types/event-bus.types.js +15 -0
  397. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  398. package/dist/cli/backend/src/types/index.d.ts +16 -0
  399. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  400. package/dist/cli/backend/src/types/index.js.map +1 -1
  401. package/dist/cli/backend/src/types/v2/index.d.ts +1 -1
  402. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  403. package/dist/cli/backend/src/types/v2/index.js +1 -1
  404. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  405. package/dist/cli/backend/src/types/v2/mission.types.d.ts +41 -0
  406. package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
  407. package/dist/cli/backend/src/types/v2/mission.types.js +29 -0
  408. package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
  409. package/dist/cli/cli/src/commands/backup.d.ts +25 -0
  410. package/dist/cli/cli/src/commands/backup.d.ts.map +1 -1
  411. package/dist/cli/cli/src/commands/backup.js +120 -6
  412. package/dist/cli/cli/src/commands/backup.js.map +1 -1
  413. package/dist/cli/cli/src/commands/doctor.d.ts +58 -0
  414. package/dist/cli/cli/src/commands/doctor.d.ts.map +1 -0
  415. package/dist/cli/cli/src/commands/doctor.js +163 -0
  416. package/dist/cli/cli/src/commands/doctor.js.map +1 -0
  417. package/dist/cli/cli/src/commands/service.d.ts +68 -11
  418. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  419. package/dist/cli/cli/src/commands/service.js +183 -51
  420. package/dist/cli/cli/src/commands/service.js.map +1 -1
  421. package/dist/cli/cli/src/commands/token.d.ts +53 -0
  422. package/dist/cli/cli/src/commands/token.d.ts.map +1 -0
  423. package/dist/cli/cli/src/commands/token.js +70 -0
  424. package/dist/cli/cli/src/commands/token.js.map +1 -0
  425. package/dist/cli/cli/src/index.js +40 -5
  426. package/dist/cli/cli/src/index.js.map +1 -1
  427. package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts +21 -0
  428. package/dist/cli/cli/src/scripts/check-native-toolchain.d.ts.map +1 -0
  429. package/dist/cli/cli/src/scripts/check-native-toolchain.js +40 -0
  430. package/dist/cli/cli/src/scripts/check-native-toolchain.js.map +1 -0
  431. package/dist/cli/cli/src/utils/native-toolchain.d.ts +111 -0
  432. package/dist/cli/cli/src/utils/native-toolchain.d.ts.map +1 -0
  433. package/dist/cli/cli/src/utils/native-toolchain.js +146 -0
  434. package/dist/cli/cli/src/utils/native-toolchain.js.map +1 -0
  435. package/dist/cli/cli/src/utils/package-root.d.ts +55 -0
  436. package/dist/cli/cli/src/utils/package-root.d.ts.map +1 -0
  437. package/dist/cli/cli/src/utils/package-root.js +107 -0
  438. package/dist/cli/cli/src/utils/package-root.js.map +1 -0
  439. package/dist/cli/cli/src/utils/version-check.d.ts +18 -2
  440. package/dist/cli/cli/src/utils/version-check.d.ts.map +1 -1
  441. package/dist/cli/cli/src/utils/version-check.js +51 -4
  442. package/dist/cli/cli/src/utils/version-check.js.map +1 -1
  443. package/dist/cli/config/constants.d.ts +53 -0
  444. package/dist/cli/config/constants.d.ts.map +1 -1
  445. package/dist/cli/config/constants.js +54 -0
  446. package/dist/cli/config/constants.js.map +1 -1
  447. package/dist/cli/config/index.d.ts +2 -2
  448. package/dist/cli/config/index.d.ts.map +1 -1
  449. package/dist/cli/config/index.js +6 -6
  450. package/dist/cli/config/index.js.map +1 -1
  451. package/frontend/dist/assets/index-203224f9.js +4961 -0
  452. package/frontend/dist/assets/index-dcaf6c88.css +42 -0
  453. package/frontend/dist/index.html +2 -2
  454. package/package.json +3 -2
  455. package/config/constants.d.ts.map +0 -1
  456. package/config/index.d.ts.map +0 -1
  457. package/frontend/dist/assets/index-190a957f.js +0 -4961
  458. 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
@@ -405,6 +434,14 @@ export class CrewlyServer {
405
434
  intervalMs: reflectInterval,
406
435
  quietWindowMs: reflectQuiet,
407
436
  debounceMs: reflectDebounce,
437
+ // Only wake ORC when someone has actually said something since
438
+ // the last nudge — the sweep is over recent conversation, and an
439
+ // hourly nudge with nothing to sweep was the largest remaining
440
+ // full-price wake-up after the 2026-09-16 fixes.
441
+ hasConversationSince: async (sinceMs) => {
442
+ const { getChatV2Service } = await import('./services/chat-v2/chat-v2.singleton.js');
443
+ return getChatV2Service().hasConversationSince(sinceMs);
444
+ },
408
445
  // One message per tick listing every quiet vault, not one per
409
446
  // vault: six vaults used to cost ORC six model turns per cycle.
410
447
  batchFireFn: async (metas) => {
@@ -471,6 +508,10 @@ export class CrewlyServer {
471
508
  // actually delivers OR the budget is exhausted.
472
509
  try {
473
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
+ ]);
474
515
  const enforcer = new OrcDeliveryEnforcerService({
475
516
  reminderSink: ({ conversationId, text }) => {
476
517
  if (!this.messageQueueService)
@@ -481,6 +522,12 @@ export class CrewlyServer {
481
522
  source: 'system_event',
482
523
  });
483
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)),
484
531
  });
485
532
  OrcDeliveryEnforcerService.setInstance(enforcer);
486
533
  enforcer.start();
@@ -513,6 +560,23 @@ export class CrewlyServer {
513
560
  // for idempotency contract + retry cap + cron-recursion guard.
514
561
  this.eventToWorkItemBridge = EventToWorkItemBridge.boot(this.eventBusService);
515
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();
516
580
  // LEARN-1: subscribe to terminal task / mission:replanned events and
517
581
  // auto-record a learning entry via MemoryService.recordLearning. Closes
518
582
  // the prompt-driven "agents-forget-to-record" gap. See
@@ -900,6 +964,10 @@ export class CrewlyServer {
900
964
  // Note: Static files are configured in configureRoutes() after API routes
901
965
  }
902
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);
903
971
  // Agent heartbeat middleware - any API call with X-Agent-Session header updates heartbeat
904
972
  this.app.use('/api', agentHeartbeatMiddleware);
905
973
  // API routes
@@ -1283,12 +1351,44 @@ export class CrewlyServer {
1283
1351
  error: error instanceof Error ? error.message : String(error),
1284
1352
  });
1285
1353
  }
1286
- // 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).
1287
1357
  try {
1288
- 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();
1289
1389
  }
1290
1390
  catch (error) {
1291
- this.logger.warn('Failed to wire OAuthReloginMonitorService EventBus (non-critical)', {
1391
+ this.logger.warn('Failed to wire OAuthReloginMonitorService (non-critical)', {
1292
1392
  error: error instanceof Error ? error.message : String(error),
1293
1393
  });
1294
1394
  }
@@ -1824,6 +1924,15 @@ export class CrewlyServer {
1824
1924
  });
1825
1925
  await triggerEngine.start();
1826
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
+ });
1827
1936
  // Wire team-scoped triggers: reconcile declarative Team.triggers spec
1828
1937
  // against the running engine on every team save, and cancel all of a
1829
1938
  // team's triggers when it's deleted. Listener is fire-and-forget.
@@ -1886,6 +1995,7 @@ export class CrewlyServer {
1886
1995
  try {
1887
1996
  const { WorkItemDispatchSubscriber } = await import('./services/v3/workitem-dispatch.subscriber.js');
1888
1997
  const dispatchSubscriber = WorkItemDispatchSubscriber.getInstance();
1998
+ dispatchSubscriber.setTeamBudgetGate(TeamBudgetGateService.getInstance());
1889
1999
  dispatchSubscriber.initialize(this.eventBusService);
1890
2000
  dispatchSubscriber.start();
1891
2001
  this.logger.info('WorkItemDispatchSubscriber started — workitem:queued events push to target sessions');
@@ -2059,6 +2169,12 @@ export class CrewlyServer {
2059
2169
  const loadedAddons = await addonLoader.loadAddons(this.app, this.httpServer);
2060
2170
  if (loadedAddons.length > 0) {
2061
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);
2062
2178
  }
2063
2179
  }
2064
2180
  catch (addonErr) {
@@ -2661,9 +2777,9 @@ export class CrewlyServer {
2661
2777
  const { createServer } = await import('net');
2662
2778
  const testServer = createServer();
2663
2779
  return new Promise((resolve, reject) => {
2664
- testServer.listen(this.config.webPort, () => {
2780
+ testServer.listen(this.config.webPort, this.config.bindHost, () => {
2665
2781
  testServer.close(() => {
2666
- 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 });
2667
2783
  resolve();
2668
2784
  });
2669
2785
  });
@@ -2677,18 +2793,63 @@ export class CrewlyServer {
2677
2793
  });
2678
2794
  });
2679
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
+ }
2680
2834
  async startHttpServer() {
2681
2835
  return new Promise((resolve, reject) => {
2682
2836
  const startTime = Date.now();
2683
- 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, () => {
2684
2842
  const duration = Date.now() - startTime;
2685
2843
  this.logger.info('Crewly server started', {
2844
+ host: this.config.bindHost,
2686
2845
  port: this.config.webPort,
2846
+ listening: `${this.config.bindHost}:${this.config.webPort}`,
2687
2847
  durationMs: duration,
2688
2848
  dashboardUrl: `http://localhost:${this.config.webPort}`,
2689
2849
  websocketUrl: `ws://localhost:${this.config.webPort}`,
2690
2850
  home: this.config.crewlyHome
2691
2851
  });
2852
+ this.logNetworkExposure();
2692
2853
  // B0 (interim) per `.crewly/specs/2026-05-05-trigger-persistence-bug.md`:
2693
2854
  // Broadcast `system:backend_restarted` exactly once per boot. The
2694
2855
  // trigger engine (`backend/src/services/v3/trigger-engine.service.ts`)
@@ -2823,7 +2984,6 @@ export class CrewlyServer {
2823
2984
  // Scans active missions and sends Slack alerts for off-track KRs
2824
2985
  setInterval(async () => {
2825
2986
  try {
2826
- const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
2827
2987
  await MissionReminderService.getInstance().runSweep();
2828
2988
  }
2829
2989
  catch (err) {
@@ -2836,7 +2996,6 @@ export class CrewlyServer {
2836
2996
  setTimeout(() => this.purgeCompletedData(), 30 * 1000);
2837
2997
  setTimeout(async () => {
2838
2998
  try {
2839
- const { MissionReminderService } = await import('./services/v3/mission-reminder.service.js');
2840
2999
  await MissionReminderService.getInstance().runSweep();
2841
3000
  }
2842
3001
  catch (err) {
@@ -3179,6 +3338,21 @@ export class CrewlyServer {
3179
3338
  this.eventToWorkItemBridge.stop();
3180
3339
  this.eventToWorkItemBridge = null;
3181
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
+ }
3182
3356
  // LEARN-1: stop the AutoLearningSubscriber on the same window as the
3183
3357
  // bridge so its in-flight recordLearning calls drain before the bus
3184
3358
  // is cleaned.
@@ -3247,6 +3421,18 @@ export class CrewlyServer {
3247
3421
  LogRotationService.getInstance().stop();
3248
3422
  // Stop auditor scheduler
3249
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
+ }
3250
3436
  // Flush and shutdown OpenTelemetry tracing
3251
3437
  try {
3252
3438
  const { TracingService: TracingSvc } = await import('./services/core/tracing.service.js');