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
@@ -7,7 +7,7 @@ import { createSessionCommandHelper, getSessionBackendSync, createSessionBackend
7
7
  import { RuntimeServiceFactory } from './runtime-service.factory.js';
8
8
  import { registerInProcessRuntime, unregisterInProcessRuntime, } from './crewly-agent/in-process-runtime-registry.js';
9
9
  import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
10
- import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, } from '../../constants.js';
10
+ import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, RUNTIME_TYPES, SESSION_COMMAND_DELAYS, EVENT_DELIVERY_CONSTANTS, TERMINAL_PATTERNS, GEMINI_SHELL_MODE_CONSTANTS, GEMINI_STUCK_CONNECTIVITY_PATTERN, GEMINI_ERROR_STATE_CONSTANTS, REGISTRATION_DELIVERY_CONSTANTS, } from '../../constants.js';
11
11
  import { WEB_CONSTANTS } from '../../../../config/constants.js';
12
12
  import { delay } from '../../utils/async.utils.js';
13
13
  import { getSettingsService } from '../settings/settings.service.js';
@@ -20,6 +20,7 @@ import { SubAgentMessageQueue } from '../messaging/sub-agent-message-queue.servi
20
20
  import { AgentSuspendService } from './agent-suspend.service.js';
21
21
  import { PromptBuilderService, buildModuleConfigFromTeamMember, } from '../ai/prompt-builder.service.js';
22
22
  import { PromptAssemblyService } from '../ai/prompt-modules/prompt-assembly.service.js';
23
+ import { resolveOrcPromptProfile, ORC_PROMPT_PROFILE_ENV, } from '../ai/prompt-modules/prompt-module.interface.js';
23
24
  import { stripAnsiCodes } from '../../utils/terminal-output.utils.js';
24
25
  import { isPromptLine, containsSpinnerOrWorkingIndicator, containsProcessingIndicator, containsBusyStatusBar, containsRewindMode, extractChatPrefix, stripTuiLineBorders, matchTuiPromptLine, } from '../../utils/terminal-string-ops.js';
25
26
  import { PtyActivityTrackerService } from './pty-activity-tracker.service.js';
@@ -620,6 +621,16 @@ export class AgentRegistrationService {
620
621
  getCheckInterval() {
621
622
  return process.env.NODE_ENV === 'test' ? 1000 : 2000;
622
623
  }
624
+ /**
625
+ * Use the short test-environment cadence under Jest, otherwise the given
626
+ * production interval.
627
+ *
628
+ * @param productionMs - Interval to use outside the test environment
629
+ * @returns Interval in milliseconds
630
+ */
631
+ testAwareInterval(productionMs) {
632
+ return process.env.NODE_ENV === 'test' ? this.getCheckInterval() : productionMs;
633
+ }
623
634
  /**
624
635
  * Update agent status with safe error handling (non-blocking).
625
636
  * Returns true if successful, false if failed.
@@ -658,6 +669,49 @@ export class AgentRegistrationService {
658
669
  ['tl', 'team-leader'],
659
670
  ['team-lead', 'team-leader'],
660
671
  ]);
672
+ /**
673
+ * Assemble the orchestrator prompt at the *other* profile and log the
674
+ * module count + token estimate of both tiers side by side, so the
675
+ * operator can judge what `CREWLY_ORC_PROMPT_PROFILE=lite` would save (or
676
+ * did save) without diffing prompts by hand. Read-only and best-effort:
677
+ * a failure here never affects the prompt that was already assembled.
678
+ *
679
+ * @param assembler - The assembler used for the live prompt
680
+ * @param moduleConfig - Config the live prompt was assembled from
681
+ * @param liveReport - Report of the live (selected-profile) assembly
682
+ */
683
+ async logPromptProfileComparison(assembler, moduleConfig, liveReport) {
684
+ const otherProfile = liveReport.profile === 'lite' ? 'full' : 'lite';
685
+ try {
686
+ const { report: other } = await assembler.assemble({
687
+ ...moduleConfig,
688
+ promptProfile: otherProfile,
689
+ });
690
+ const byProfile = {
691
+ [liveReport.profile]: {
692
+ moduleCount: liveReport.moduleBreakdown.length,
693
+ estimatedTokens: liveReport.totalTokens,
694
+ },
695
+ [otherProfile]: {
696
+ moduleCount: other.moduleBreakdown.length,
697
+ estimatedTokens: other.totalTokens,
698
+ },
699
+ };
700
+ this.logger.info('Orchestrator prompt profile comparison', {
701
+ sessionName: moduleConfig.sessionName,
702
+ selected: liveReport.profile,
703
+ env: ORC_PROMPT_PROFILE_ENV,
704
+ ...byProfile,
705
+ liteSavesTokens: (byProfile.full?.estimatedTokens ?? 0) - (byProfile.lite?.estimatedTokens ?? 0),
706
+ });
707
+ }
708
+ catch (error) {
709
+ this.logger.debug('Prompt profile comparison skipped', {
710
+ sessionName: moduleConfig.sessionName,
711
+ error: error instanceof Error ? error.message : String(error),
712
+ });
713
+ }
714
+ }
661
715
  /**
662
716
  * Get prompt file path for a specific role
663
717
  * Uses the unified config/roles/{role}/prompt.md structure
@@ -1052,6 +1106,14 @@ export class AgentRegistrationService {
1052
1106
  this.logger.info('Registration prompt loaded, sending to agent', {
1053
1107
  sessionName, role, runtimeType, promptLength: prompt.length,
1054
1108
  });
1109
+ // Gate on the runtime actually accepting input. `waitForRuntimeReady`
1110
+ // (already passed by the caller) matches banner text that is on screen
1111
+ // while the TUI is still booting — with Codex the instruction landed
1112
+ // ~2 s after spawn, during `model: loading`, and was swallowed while
1113
+ // every log line still said "sent successfully" (server-install finding 3).
1114
+ if (controller.signal.aborted)
1115
+ return;
1116
+ await this.waitForRuntimeInputReady(sessionName, runtimeType, controller.signal);
1055
1117
  if (controller.signal.aborted)
1056
1118
  return;
1057
1119
  const sent = await this.sendPromptRobustly(sessionName, prompt, runtimeType, controller.signal);
@@ -1061,6 +1123,10 @@ export class AgentRegistrationService {
1061
1123
  else {
1062
1124
  this.logger.warn('Registration prompt delivery returned false', { sessionName, role, runtimeType });
1063
1125
  }
1126
+ // Make a silent non-registration loud, and re-deliver once. Previously a
1127
+ // swallowed instruction left the agent at `started` / readyAt null forever
1128
+ // with no log line saying so.
1129
+ await this.redeliverIfUnregistered(sessionName, role, prompt, runtimeType, controller.signal);
1064
1130
  }
1065
1131
  catch (error) {
1066
1132
  if (controller.signal.aborted) {
@@ -1077,6 +1143,134 @@ export class AgentRegistrationService {
1077
1143
  this.registrationAbortControllers.delete(sessionName);
1078
1144
  }
1079
1145
  }
1146
+ /**
1147
+ * Poll the PTY screen until the runtime is idle at its input prompt
1148
+ * (`RuntimeAgentService.isReadyForInput`) or the timeout elapses.
1149
+ *
1150
+ * On timeout we log a warning and return `false` but the caller still
1151
+ * sends the instruction — a late instruction is recoverable (re-delivery,
1152
+ * `POST /api/terminal/:s/deliver`), a never-sent one is not.
1153
+ *
1154
+ * @param sessionName - PTY session name
1155
+ * @param runtimeType - Runtime whose prompt heuristics to use
1156
+ * @param abortSignal - Aborts the wait when the runtime exits
1157
+ * @param timeoutMs - Maximum time to wait (defaults to RUNTIME_INPUT_READY_TIMEOUT_MS)
1158
+ * @returns true when the idle prompt was observed, false on timeout/abort
1159
+ */
1160
+ async waitForRuntimeInputReady(sessionName, runtimeType, abortSignal, timeoutMs = REGISTRATION_DELIVERY_CONSTANTS.RUNTIME_INPUT_READY_TIMEOUT_MS) {
1161
+ const runtimeService = this.createRuntimeService(runtimeType);
1162
+ // Mocked / non-TUI runtimes without the predicate: nothing to wait for.
1163
+ if (typeof runtimeService.isReadyForInput !== 'function') {
1164
+ return true;
1165
+ }
1166
+ const sessionHelper = await this.getSessionHelper();
1167
+ const pollMs = this.testAwareInterval(REGISTRATION_DELIVERY_CONSTANTS.RUNTIME_INPUT_READY_POLL_MS);
1168
+ const startedAt = Date.now();
1169
+ let polls = 0;
1170
+ while (!abortSignal?.aborted) {
1171
+ let screen = '';
1172
+ try {
1173
+ screen = sessionHelper.capturePane(sessionName);
1174
+ }
1175
+ catch (captureError) {
1176
+ this.logger.debug('Runtime input-ready capture failed (will retry)', {
1177
+ sessionName,
1178
+ error: captureError instanceof Error ? captureError.message : String(captureError),
1179
+ });
1180
+ }
1181
+ polls++;
1182
+ if (runtimeService.isReadyForInput(screen)) {
1183
+ this.logger.info('Runtime idle at input prompt — delivering registration instruction', {
1184
+ sessionName,
1185
+ runtimeType,
1186
+ waitedMs: Date.now() - startedAt,
1187
+ polls,
1188
+ });
1189
+ return true;
1190
+ }
1191
+ if (Date.now() - startedAt >= timeoutMs) {
1192
+ const lastLines = screen.split('\n').filter((l) => l.trim()).slice(-5);
1193
+ this.logger.warn('Timed out waiting for runtime input prompt — sending registration instruction anyway', {
1194
+ sessionName,
1195
+ runtimeType,
1196
+ timeoutMs,
1197
+ polls,
1198
+ lastTerminalLines: lastLines,
1199
+ });
1200
+ return false;
1201
+ }
1202
+ await delay(pollMs);
1203
+ }
1204
+ this.logger.info('Runtime input-ready wait aborted (runtime exited)', { sessionName });
1205
+ return false;
1206
+ }
1207
+ /**
1208
+ * Resolve how long an agent gets to register after its prompt is delivered.
1209
+ * Mirrors the timeout selection used when the session is created.
1210
+ *
1211
+ * @param role - Agent role
1212
+ * @param runtimeType - Agent runtime
1213
+ * @returns Registration timeout in milliseconds
1214
+ */
1215
+ resolveRegistrationTimeout(role, runtimeType) {
1216
+ if (role === ORCHESTRATOR_ROLE)
1217
+ return AGENT_TIMEOUTS.ORCHESTRATOR_INITIALIZATION;
1218
+ if (runtimeType === RUNTIME_TYPES.CLAUDE_CODE)
1219
+ return AGENT_TIMEOUTS.CLAUDE_CODE_INITIALIZATION;
1220
+ return AGENT_TIMEOUTS.REGULAR_AGENT_INITIALIZATION;
1221
+ }
1222
+ /**
1223
+ * After the registration instruction was delivered, wait the registration
1224
+ * timeout for the agent to flip to `active`. If it does not, log an error
1225
+ * (this used to be completely silent) and re-deliver the instruction once,
1226
+ * gated again on the runtime being idle at its prompt.
1227
+ *
1228
+ * @param sessionName - PTY session name
1229
+ * @param role - Agent role
1230
+ * @param prompt - The full registration prompt (re-written to the prompt file)
1231
+ * @param runtimeType - Agent runtime
1232
+ * @param abortSignal - Aborts when the runtime exits
1233
+ */
1234
+ async redeliverIfUnregistered(sessionName, role, prompt, runtimeType, abortSignal) {
1235
+ const timeout = this.resolveRegistrationTimeout(role, runtimeType);
1236
+ const checkInterval = this.testAwareInterval(REGISTRATION_DELIVERY_CONSTANTS.REGISTRATION_CHECK_INTERVAL_MS);
1237
+ for (let redelivery = 0; redelivery <= REGISTRATION_DELIVERY_CONSTANTS.MAX_REDELIVERIES; redelivery++) {
1238
+ const startedAt = Date.now();
1239
+ while (Date.now() - startedAt < timeout) {
1240
+ if (abortSignal.aborted)
1241
+ return;
1242
+ if (await this.checkAgentRegistration(sessionName, role)) {
1243
+ this.logger.info('Agent registration confirmed after prompt delivery', {
1244
+ sessionName, role, redeliveries: redelivery, waitedMs: Date.now() - startedAt,
1245
+ });
1246
+ return;
1247
+ }
1248
+ await delay(checkInterval);
1249
+ }
1250
+ if (abortSignal.aborted)
1251
+ return;
1252
+ if (redelivery >= REGISTRATION_DELIVERY_CONSTANTS.MAX_REDELIVERIES) {
1253
+ this.logger.error('Agent never registered after registration prompt delivery', {
1254
+ sessionName, role, runtimeType, timeoutMs: timeout, redeliveries: redelivery,
1255
+ hint: `POST /api/terminal/${sessionName}/deliver {force:true} with the prompt-file instruction`,
1256
+ });
1257
+ return;
1258
+ }
1259
+ const sessionHelper = await this.getSessionHelper();
1260
+ if (!sessionHelper.sessionExists(sessionName)) {
1261
+ this.logger.warn('Registration re-delivery skipped — session no longer exists', { sessionName, role });
1262
+ return;
1263
+ }
1264
+ this.logger.warn('No registration within timeout — re-delivering registration instruction', {
1265
+ sessionName, role, runtimeType, timeoutMs: timeout,
1266
+ });
1267
+ await this.waitForRuntimeInputReady(sessionName, runtimeType, abortSignal);
1268
+ if (abortSignal.aborted)
1269
+ return;
1270
+ const resent = await this.sendPromptRobustly(sessionName, prompt, runtimeType, abortSignal);
1271
+ this.logger.info('registration re-delivered', { sessionName, role, runtimeType, resent });
1272
+ }
1273
+ }
1080
1274
  /**
1081
1275
  * Step 3: Kill session and recreate completely
1082
1276
  * Most aggressive approach - completely recreates the session from scratch
@@ -1135,13 +1329,17 @@ export class AgentRegistrationService {
1135
1329
  }
1136
1330
  // Recreate session based on role
1137
1331
  if (role === ORCHESTRATOR_ROLE) {
1332
+ // Same deterministic cwd for the PTY and the runtime `cd` — this site
1333
+ // used to `cd` into process.cwd() (the package install dir under
1334
+ // systemd) while the PTY was created elsewhere.
1335
+ const orchestratorCwd = projectPath || (await this.resolveOrchestratorCwd());
1138
1336
  await this.createOrchestratorSession({
1139
1337
  sessionName,
1140
- projectPath: projectPath || process.cwd(),
1338
+ projectPath: orchestratorCwd,
1141
1339
  });
1142
1340
  // Initialize runtime for orchestrator using script (always fresh start)
1143
1341
  const runtimeService = this.createRuntimeService(runtimeType);
1144
- await runtimeService.executeRuntimeInitScript(sessionName, process.cwd(), effectiveFlags, promptFilePath, agentName);
1342
+ await runtimeService.executeRuntimeInitScript(sessionName, orchestratorCwd, effectiveFlags, promptFilePath, agentName);
1145
1343
  // Wait for runtime to be ready
1146
1344
  const checkInterval = this.getCheckInterval();
1147
1345
  // runtimeService3: Separate instance for orchestrator ready-state detection
@@ -1707,16 +1905,29 @@ export class AgentRegistrationService {
1707
1905
  teamNormsPath,
1708
1906
  };
1709
1907
  }
1908
+ // Prompt tiering: the orchestrator is re-registered on every
1909
+ // cold start and re-reads the whole system prompt at full price.
1910
+ // CREWLY_ORC_PROMPT_PROFILE=lite drops the planning/onboarding
1911
+ // modules; the default stays `full`. Both tiers are assembled
1912
+ // for the orchestrator so the operator can compare their size
1913
+ // in the log before flipping the env.
1914
+ const requestedProfile = role === ORCHESTRATOR_ROLE ? resolveOrcPromptProfile() : undefined;
1915
+ if (requestedProfile)
1916
+ moduleConfig.promptProfile = requestedProfile;
1710
1917
  const assembler = new PromptAssemblyService();
1711
1918
  const { prompt: modularPrompt, report } = await assembler.assemble(moduleConfig);
1712
1919
  this.logger.info('Modular prompt assembled for registration', {
1713
1920
  sessionName,
1714
1921
  role,
1922
+ profile: report.profile,
1715
1923
  totalTokens: report.totalTokens,
1716
1924
  moduleCount: report.moduleBreakdown.length,
1717
1925
  truncatedCount: report.truncated.length,
1718
1926
  modules: report.moduleBreakdown.map(m => m.name),
1719
1927
  });
1928
+ if (requestedProfile) {
1929
+ await this.logPromptProfileComparison(assembler, moduleConfig, report);
1930
+ }
1720
1931
  return modularPrompt;
1721
1932
  }
1722
1933
  return prompt;
@@ -2029,6 +2240,44 @@ Loop until done, blocked, or explicitly reassigned:
2029
2240
  this.logger.warn('Fast registration timeout', { sessionName, role, timeout });
2030
2241
  return false;
2031
2242
  }
2243
+ /**
2244
+ * Resolve the orchestrator's working directory deterministically:
2245
+ * `CREWLY_ORC_CWD` env → first stored project whose path exists → CREWLY_HOME.
2246
+ *
2247
+ * Never the package install dir or the server's `process.cwd()`: under
2248
+ * systemd that is `/usr/lib/node_modules/crewly`, and the orchestrator
2249
+ * would see a different filesystem depending on which code path started it.
2250
+ *
2251
+ * @returns Absolute directory to spawn the orchestrator PTY in
2252
+ */
2253
+ async resolveOrchestratorCwd() {
2254
+ const envCwd = process.env[ENV_CONSTANTS.CREWLY_ORC_CWD]?.trim();
2255
+ if (envCwd) {
2256
+ const resolved = path.resolve(envCwd);
2257
+ this.logger.info('Orchestrator cwd resolved from CREWLY_ORC_CWD', { cwd: resolved });
2258
+ return resolved;
2259
+ }
2260
+ try {
2261
+ const projects = await this.storageService.getProjects();
2262
+ const firstProject = projects.find((project) => project.path && existsSync(project.path));
2263
+ if (firstProject) {
2264
+ this.logger.info('Orchestrator cwd resolved from first assigned project', {
2265
+ cwd: firstProject.path,
2266
+ projectId: firstProject.id,
2267
+ projectName: firstProject.name,
2268
+ });
2269
+ return firstProject.path;
2270
+ }
2271
+ }
2272
+ catch (error) {
2273
+ this.logger.debug('Could not read projects for orchestrator cwd (falling back to CREWLY_HOME)', {
2274
+ error: error instanceof Error ? error.message : String(error),
2275
+ });
2276
+ }
2277
+ const home = getCrewlyHomePath();
2278
+ this.logger.info('Orchestrator cwd resolved to CREWLY_HOME (no env override, no project)', { cwd: home });
2279
+ return home;
2280
+ }
2032
2281
  /**
2033
2282
  * Create orchestrator session - extracted from the original tmux service
2034
2283
  */
@@ -2113,7 +2362,14 @@ Loop until done, blocked, or explicitly reassigned:
2113
2362
  * @returns Promise with success/error information
2114
2363
  */
2115
2364
  async _createAgentSessionImpl(config) {
2116
- const { sessionName, role, projectPath = process.cwd(), windowName, memberId } = config;
2365
+ const { sessionName, role, windowName, memberId } = config;
2366
+ // The orchestrator's cwd is resolved deterministically (env > first
2367
+ // project > CREWLY_HOME) regardless of which boot path called us — the
2368
+ // boot path, /orchestrator/setup and the restart service used to pass
2369
+ // three different directories (server-install finding 4).
2370
+ const projectPath = role === ORCHESTRATOR_ROLE
2371
+ ? await this.resolveOrchestratorCwd()
2372
+ : (config.projectPath ?? process.cwd());
2117
2373
  const forceRecreate = config.forceRecreate ?? false;
2118
2374
  // Get runtime type from config or default to claude-code
2119
2375
  let runtimeType = config.runtimeType || RUNTIME_TYPES.CLAUDE_CODE;
@@ -2480,7 +2736,11 @@ Loop until done, blocked, or explicitly reassigned:
2480
2736
  await sessionHelper.setEnvironmentVariable(sessionName, ENV_CONSTANTS.CREWLY_PROJECT_PATH, cwdToUse);
2481
2737
  // #222: Set install dir so agents can resolve skill paths regardless of CWD
2482
2738
  await sessionHelper.setEnvironmentVariable(sessionName, ENV_CONSTANTS.CREWLY_INSTALL_DIR, this.projectRoot);
2483
- // Inject API keys from settings (with override chain) for all runtimes
2739
+ // Inject API keys from settings (with override chain) for the PTY
2740
+ // runtimes (claude-code, gemini-cli, codex-cli). crewly-agent never
2741
+ // reaches this block — it returns from the in-process branch above —
2742
+ // and gets its keys via CrewlyAgentExternalRuntimeService.buildChildEnv
2743
+ // on the child's spawn environment instead.
2484
2744
  const settingsService = getSettingsService();
2485
2745
  const runtimeContext = { runtime: runtimeType };
2486
2746
  // Gemini key — needed by gemini-cli and crewly-agent
@@ -2512,11 +2772,7 @@ Loop until done, blocked, or explicitly reassigned:
2512
2772
  });
2513
2773
  // Use the existing unified registration system
2514
2774
  // #227: Claude Code gets extended timeout for PI protection evaluation
2515
- const timeout = role === ORCHESTRATOR_ROLE
2516
- ? AGENT_TIMEOUTS.ORCHESTRATOR_INITIALIZATION
2517
- : runtimeType === RUNTIME_TYPES.CLAUDE_CODE
2518
- ? AGENT_TIMEOUTS.CLAUDE_CODE_INITIALIZATION
2519
- : AGENT_TIMEOUTS.REGULAR_AGENT_INITIALIZATION;
2775
+ const timeout = this.resolveRegistrationTimeout(role, runtimeType);
2520
2776
  const initResult = await this.initializeAgentWithRegistration(sessionName, role, projectPath, timeout, memberId, runtimeType, runtimeFlags, config.additionalAllowlistPaths);
2521
2777
  if (!initResult.success) {
2522
2778
  return {
@@ -2718,9 +2974,23 @@ Loop until done, blocked, or explicitly reassigned:
2718
2974
  // Process message asynchronously — don't block the caller
2719
2975
  crewlyRuntime.handleMessage(message, slackMetadata)
2720
2976
  .then((result) => {
2977
+ // Usage goes in the main log, not only the per-session buffer: this
2978
+ // is the line an operator greps to see what a run cost (2026-09-18).
2979
+ // cachedInput is the cached portion of input, so the rate is cached / input.
2980
+ const cachedInput = result.usage?.cachedInput ?? 0;
2981
+ const promptTokens = Math.max(result.usage?.input ?? 0, cachedInput);
2721
2982
  this.logger.info('Crewly Agent finished processing message', {
2722
2983
  sessionName, messageLength: message.length,
2723
2984
  responseLength: result.text?.length ?? 0,
2985
+ steps: result.steps,
2986
+ toolCalls: result.toolCalls?.length ?? 0,
2987
+ finishReason: result.finishReason,
2988
+ usage: {
2989
+ input: result.usage?.input ?? 0,
2990
+ output: result.usage?.output ?? 0,
2991
+ cachedInput,
2992
+ cacheHitPercent: promptTokens > 0 ? Math.round((cachedInput / promptTokens) * 100) : 0,
2993
+ },
2724
2994
  });
2725
2995
  // Route response text back to the originating chat conversation.
2726
2996
  // Without this, crewly-agent responses are discarded — the agent