crewly 1.13.0 → 1.13.1

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 (597) hide show
  1. package/config/skills/_common/complete-body-shape.test.sh +113 -0
  2. package/config/skills/_common/no-dangling-symlinks.test.sh +63 -0
  3. package/config/skills/_common/task-pool-body-shape.test.sh +471 -0
  4. package/config/skills/agent/core/accept-task/execute.sh +30 -5
  5. package/config/skills/agent/core/block-task/execute.sh +59 -6
  6. package/config/skills/agent/core/complete-task/SKILL.md +37 -5
  7. package/config/skills/agent/core/complete-task/execute.sh +40 -9
  8. package/config/skills/agent/core/complete-task/execute.test.sh +213 -0
  9. package/config/skills/agent/core/create-task/SKILL.md +33 -0
  10. package/config/skills/agent/core/create-task/execute.sh +82 -23
  11. package/config/skills/agent/core/delegate-task/execute.sh +46 -0
  12. package/config/skills/agent/core/get-team-norms/SKILL.md +1 -1
  13. package/config/skills/agent/core/get-team-norms/execute.sh +73 -2
  14. package/config/skills/agent/core/handoff-task/execute.sh +8 -1
  15. package/config/skills/agent/core/report-status/SKILL.md +26 -0
  16. package/config/skills/agent/core/report-status/execute.sh +40 -5
  17. package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
  18. package/config/skills/orchestrator/delegate-task/execute.sh +45 -11
  19. package/config/skills/orchestrator/delegate-task/execute.test.sh +153 -1
  20. package/config/skills/team-leader/aggregate-results/SKILL.md +1 -1
  21. package/config/skills/team-leader/decompose-goal/execute.sh +11 -16
  22. package/config/skills/team-leader/delegate-task/SKILL.md +14 -1
  23. package/config/skills/team-leader/delegate-task/execute.sh +132 -43
  24. package/config/skills/team-leader/delegate-task/execute.test.sh +180 -27
  25. package/config/vitest-exclude.constants.ts +56 -0
  26. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +18 -3
  28. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/slack/slack.controller.js +18 -15
  31. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +6 -1
  33. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +19 -10
  35. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  36. package/dist/backend/backend/src/index.d.ts.map +1 -1
  37. package/dist/backend/backend/src/index.js +20 -0
  38. package/dist/backend/backend/src/index.js.map +1 -1
  39. package/dist/backend/backend/src/scripts/stamp-build.d.ts +25 -0
  40. package/dist/backend/backend/src/scripts/stamp-build.d.ts.map +1 -0
  41. package/dist/backend/backend/src/scripts/stamp-build.js +48 -0
  42. package/dist/backend/backend/src/scripts/stamp-build.js.map +1 -0
  43. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  44. package/dist/backend/backend/src/services/agent/agent-registration.service.js +25 -0
  45. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  46. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +9 -1
  48. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts +42 -3
  50. package/dist/backend/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/agent/crewly-agent/types.js +22 -1
  52. package/dist/backend/backend/src/services/agent/crewly-agent/types.js.map +1 -1
  53. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts +15 -0
  54. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +40 -0
  56. package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
  57. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts +28 -3
  58. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js +65 -8
  60. package/dist/backend/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +214 -4
  62. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +330 -48
  64. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  65. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +13 -1
  66. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +84 -5
  68. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  69. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +14 -0
  70. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +77 -3
  72. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  73. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
  74. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +268 -36
  76. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/v3/escalation-router.service.js +2 -2
  78. package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
  79. package/dist/backend/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -1
  80. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js +39 -2
  81. package/dist/backend/backend/src/services/v3/request-sla.subscriber.js.map +1 -1
  82. package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
  83. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  84. package/dist/backend/backend/src/types/v2/index.js +1 -1
  85. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  86. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +181 -1
  87. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  88. package/dist/backend/backend/src/types/v2/work-item.types.js +104 -17
  89. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  90. package/dist/backend/backend/src/utils/build-provenance.d.ts +150 -0
  91. package/dist/backend/backend/src/utils/build-provenance.d.ts.map +1 -0
  92. package/dist/backend/backend/src/utils/build-provenance.js +211 -0
  93. package/dist/backend/backend/src/utils/build-provenance.js.map +1 -0
  94. package/dist/backend/build-info.json +4 -0
  95. package/dist/backend/config/vitest-exclude.constants.d.ts +53 -0
  96. package/dist/backend/config/vitest-exclude.constants.d.ts.map +1 -0
  97. package/dist/backend/config/vitest-exclude.constants.js +55 -0
  98. package/dist/backend/config/vitest-exclude.constants.js.map +1 -0
  99. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts +538 -0
  100. package/dist/cli/backend/src/services/agent/active-work-briefing.service.d.ts.map +1 -0
  101. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js +802 -0
  102. package/dist/cli/backend/src/services/agent/active-work-briefing.service.js.map +1 -0
  103. package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts +240 -0
  104. package/dist/cli/backend/src/services/agent/agent-heartbeat.service.d.ts.map +1 -0
  105. package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js +524 -0
  106. package/dist/cli/backend/src/services/agent/agent-heartbeat.service.js.map +1 -0
  107. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +629 -0
  108. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -0
  109. package/dist/cli/backend/src/services/agent/agent-registration.service.js +4548 -0
  110. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -0
  111. package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts +118 -0
  112. package/dist/cli/backend/src/services/agent/agent-suspend.service.d.ts.map +1 -0
  113. package/dist/cli/backend/src/services/agent/agent-suspend.service.js +304 -0
  114. package/dist/cli/backend/src/services/agent/agent-suspend.service.js.map +1 -0
  115. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts +196 -0
  116. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.d.ts.map +1 -0
  117. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js +504 -0
  118. package/dist/cli/backend/src/services/agent/auditor-scheduler.service.js.map +1 -0
  119. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts +97 -0
  120. package/dist/cli/backend/src/services/agent/claude-runtime.service.d.ts.map +1 -0
  121. package/dist/cli/backend/src/services/agent/claude-runtime.service.js +334 -0
  122. package/dist/cli/backend/src/services/agent/claude-runtime.service.js.map +1 -0
  123. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts +47 -0
  124. package/dist/cli/backend/src/services/agent/codex-runtime.service.d.ts.map +1 -0
  125. package/dist/cli/backend/src/services/agent/codex-runtime.service.js +112 -0
  126. package/dist/cli/backend/src/services/agent/codex-runtime.service.js.map +1 -0
  127. package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts +323 -0
  128. package/dist/cli/backend/src/services/agent/context-window-monitor.service.d.ts.map +1 -0
  129. package/dist/cli/backend/src/services/agent/context-window-monitor.service.js +1056 -0
  130. package/dist/cli/backend/src/services/agent/context-window-monitor.service.js.map +1 -0
  131. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts +198 -0
  132. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -0
  133. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +816 -0
  134. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -0
  135. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts +155 -0
  136. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.d.ts.map +1 -0
  137. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js +272 -0
  138. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-log-buffer.js.map +1 -0
  139. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts +91 -0
  140. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.d.ts.map +1 -0
  141. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js +120 -0
  142. package/dist/cli/backend/src/services/agent/crewly-agent/in-process-runtime-registry.js.map +1 -0
  143. package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts +536 -0
  144. package/dist/cli/backend/src/services/agent/crewly-agent/types.d.ts.map +1 -0
  145. package/dist/cli/backend/src/services/agent/crewly-agent/types.js +282 -0
  146. package/dist/cli/backend/src/services/agent/crewly-agent/types.js.map +1 -0
  147. package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts +100 -0
  148. package/dist/cli/backend/src/services/agent/disk-cleanup.service.d.ts.map +1 -0
  149. package/dist/cli/backend/src/services/agent/disk-cleanup.service.js +149 -0
  150. package/dist/cli/backend/src/services/agent/disk-cleanup.service.js.map +1 -0
  151. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts +130 -0
  152. package/dist/cli/backend/src/services/agent/gemini-runtime.service.d.ts.map +1 -0
  153. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js +758 -0
  154. package/dist/cli/backend/src/services/agent/gemini-runtime.service.js.map +1 -0
  155. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +216 -0
  156. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -0
  157. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +508 -0
  158. package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -0
  159. package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts +113 -0
  160. package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.d.ts.map +1 -0
  161. package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js +161 -0
  162. package/dist/cli/backend/src/services/agent/pty-activity-tracker.service.js.map +1 -0
  163. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts +156 -0
  164. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -0
  165. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +641 -0
  166. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -0
  167. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +295 -0
  168. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -0
  169. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +1166 -0
  170. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -0
  171. package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts +71 -0
  172. package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -0
  173. package/dist/cli/backend/src/services/agent/runtime-service.factory.js +174 -0
  174. package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -0
  175. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +435 -0
  176. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -0
  177. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +1331 -0
  178. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -0
  179. package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts +33 -0
  180. package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.d.ts.map +1 -0
  181. package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js +70 -0
  182. package/dist/cli/backend/src/services/ai/prompt-modules/capability-overlay.module.js.map +1 -0
  183. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts +100 -0
  184. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.d.ts.map +1 -0
  185. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js +296 -0
  186. package/dist/cli/backend/src/services/ai/prompt-modules/communication.module.js.map +1 -0
  187. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts +59 -0
  188. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.d.ts.map +1 -0
  189. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js +87 -0
  190. package/dist/cli/backend/src/services/ai/prompt-modules/decision-rights.module.js.map +1 -0
  191. package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts +67 -0
  192. package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.d.ts.map +1 -0
  193. package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js +84 -0
  194. package/dist/cli/backend/src/services/ai/prompt-modules/default-execution-loop.module.js.map +1 -0
  195. package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts +35 -0
  196. package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.d.ts.map +1 -0
  197. package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js +50 -0
  198. package/dist/cli/backend/src/services/ai/prompt-modules/domain-sop.module.js.map +1 -0
  199. package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts +41 -0
  200. package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.d.ts.map +1 -0
  201. package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js +95 -0
  202. package/dist/cli/backend/src/services/ai/prompt-modules/expert-profile.module.js.map +1 -0
  203. package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts +28 -0
  204. package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.d.ts.map +1 -0
  205. package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js +47 -0
  206. package/dist/cli/backend/src/services/ai/prompt-modules/identity.module.js.map +1 -0
  207. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts +65 -0
  208. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.d.ts.map +1 -0
  209. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js +79 -0
  210. package/dist/cli/backend/src/services/ai/prompt-modules/lazy-anti-patterns.module.js.map +1 -0
  211. package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts +28 -0
  212. package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.d.ts.map +1 -0
  213. package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js +55 -0
  214. package/dist/cli/backend/src/services/ai/prompt-modules/learning-reference.module.js.map +1 -0
  215. package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts +44 -0
  216. package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.d.ts.map +1 -0
  217. package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js +120 -0
  218. package/dist/cli/backend/src/services/ai/prompt-modules/lifecycle.module.js.map +1 -0
  219. package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts +46 -0
  220. package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.d.ts.map +1 -0
  221. package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js +44 -0
  222. package/dist/cli/backend/src/services/ai/prompt-modules/markdown-file-module.js.map +1 -0
  223. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +28 -0
  224. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -0
  225. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +46 -0
  226. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -0
  227. package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts +60 -0
  228. package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.d.ts.map +1 -0
  229. package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js +104 -0
  230. package/dist/cli/backend/src/services/ai/prompt-modules/mission-context.module.js.map +1 -0
  231. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts +29 -0
  232. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.d.ts.map +1 -0
  233. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js +50 -0
  234. package/dist/cli/backend/src/services/ai/prompt-modules/project-reference.module.js.map +1 -0
  235. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts +103 -0
  236. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -0
  237. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +383 -0
  238. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -0
  239. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts +34 -0
  240. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.d.ts.map +1 -0
  241. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js +96 -0
  242. package/dist/cli/backend/src/services/ai/prompt-modules/recovery.module.js.map +1 -0
  243. package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts +106 -0
  244. package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.d.ts.map +1 -0
  245. package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js +167 -0
  246. package/dist/cli/backend/src/services/ai/prompt-modules/request-contract.module.js.map +1 -0
  247. package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts +35 -0
  248. package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.d.ts.map +1 -0
  249. package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js +50 -0
  250. package/dist/cli/backend/src/services/ai/prompt-modules/risk-policy.module.js.map +1 -0
  251. package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts +91 -0
  252. package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.d.ts.map +1 -0
  253. package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js +411 -0
  254. package/dist/cli/backend/src/services/ai/prompt-modules/role-boundary.module.js.map +1 -0
  255. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts +62 -0
  256. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -0
  257. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +199 -0
  258. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -0
  259. package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts +79 -0
  260. package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.d.ts.map +1 -0
  261. package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js +118 -0
  262. package/dist/cli/backend/src/services/ai/prompt-modules/sop-norm-distinction.module.js.map +1 -0
  263. package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts +102 -0
  264. package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.d.ts.map +1 -0
  265. package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js +229 -0
  266. package/dist/cli/backend/src/services/ai/prompt-modules/soul.module.js.map +1 -0
  267. package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts +61 -0
  268. package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.d.ts.map +1 -0
  269. package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js +197 -0
  270. package/dist/cli/backend/src/services/ai/prompt-modules/team-norms.module.js.map +1 -0
  271. package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts +54 -0
  272. package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.d.ts.map +1 -0
  273. package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js +149 -0
  274. package/dist/cli/backend/src/services/ai/prompt-modules/team-reference.module.js.map +1 -0
  275. package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts +32 -0
  276. package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.d.ts.map +1 -0
  277. package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js +69 -0
  278. package/dist/cli/backend/src/services/ai/prompt-modules/user-profile-reference.module.js.map +1 -0
  279. package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts +91 -0
  280. package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.d.ts.map +1 -0
  281. package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js +136 -0
  282. package/dist/cli/backend/src/services/ai/prompt-modules/working-memory.module.js.map +1 -0
  283. package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts +81 -0
  284. package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.d.ts.map +1 -0
  285. package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js +135 -0
  286. package/dist/cli/backend/src/services/ai/self-improvement/growth-areas.service.js.map +1 -0
  287. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +737 -0
  288. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -0
  289. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +1213 -0
  290. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -0
  291. package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts +27 -0
  292. package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.d.ts.map +1 -0
  293. package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js +57 -0
  294. package/dist/cli/backend/src/services/chat-v2/chat-v2.singleton.js.map +1 -0
  295. package/dist/cli/backend/src/services/chat-v2/config.d.ts +100 -0
  296. package/dist/cli/backend/src/services/chat-v2/config.d.ts.map +1 -0
  297. package/dist/cli/backend/src/services/chat-v2/config.js +174 -0
  298. package/dist/cli/backend/src/services/chat-v2/config.js.map +1 -0
  299. package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts +118 -0
  300. package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -0
  301. package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js +171 -0
  302. package/dist/cli/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -0
  303. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +188 -0
  304. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -0
  305. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +317 -0
  306. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -0
  307. package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts +119 -0
  308. package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.d.ts.map +1 -0
  309. package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js +551 -0
  310. package/dist/cli/backend/src/services/chat-v2/sqlite/chat-db.js.map +1 -0
  311. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +208 -0
  312. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -0
  313. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +405 -0
  314. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -0
  315. package/dist/cli/backend/src/services/chat-v2/types.d.ts +341 -0
  316. package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -0
  317. package/dist/cli/backend/src/services/chat-v2/types.js +61 -0
  318. package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -0
  319. package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts +37 -0
  320. package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.d.ts.map +1 -0
  321. package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js +63 -0
  322. package/dist/cli/backend/src/services/continuation/patterns/idle-patterns.js.map +1 -0
  323. package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts +335 -0
  324. package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.d.ts.map +1 -0
  325. package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js +421 -0
  326. package/dist/cli/backend/src/services/intent-task/intent-classifier.rules.js.map +1 -0
  327. package/dist/cli/backend/src/services/mcp-client.d.ts +233 -0
  328. package/dist/cli/backend/src/services/mcp-client.d.ts.map +1 -0
  329. package/dist/cli/backend/src/services/mcp-client.js +302 -0
  330. package/dist/cli/backend/src/services/mcp-client.js.map +1 -0
  331. package/dist/cli/backend/src/services/memory/mission-context.service.d.ts +168 -0
  332. package/dist/cli/backend/src/services/memory/mission-context.service.d.ts.map +1 -0
  333. package/dist/cli/backend/src/services/memory/mission-context.service.js +365 -0
  334. package/dist/cli/backend/src/services/memory/mission-context.service.js.map +1 -0
  335. package/dist/cli/backend/src/services/memory/session-memory.service.d.ts +197 -0
  336. package/dist/cli/backend/src/services/memory/session-memory.service.d.ts.map +1 -0
  337. package/dist/cli/backend/src/services/memory/session-memory.service.js +369 -0
  338. package/dist/cli/backend/src/services/memory/session-memory.service.js.map +1 -0
  339. package/dist/cli/backend/src/services/memory/user-profile.service.d.ts +77 -0
  340. package/dist/cli/backend/src/services/memory/user-profile.service.d.ts.map +1 -0
  341. package/dist/cli/backend/src/services/memory/user-profile.service.js +171 -0
  342. package/dist/cli/backend/src/services/memory/user-profile.service.js.map +1 -0
  343. package/dist/cli/backend/src/services/memory/working-memory.service.d.ts +232 -0
  344. package/dist/cli/backend/src/services/memory/working-memory.service.d.ts.map +1 -0
  345. package/dist/cli/backend/src/services/memory/working-memory.service.js +417 -0
  346. package/dist/cli/backend/src/services/memory/working-memory.service.js.map +1 -0
  347. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +84 -0
  348. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -0
  349. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +136 -0
  350. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -0
  351. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +358 -0
  352. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -0
  353. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +755 -0
  354. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -0
  355. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts +269 -0
  356. package/dist/cli/backend/src/services/monitoring/token-usage.service.d.ts.map +1 -0
  357. package/dist/cli/backend/src/services/monitoring/token-usage.service.js +391 -0
  358. package/dist/cli/backend/src/services/monitoring/token-usage.service.js.map +1 -0
  359. package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts +132 -0
  360. package/dist/cli/backend/src/services/observability/agent-behavior-log.service.d.ts.map +1 -0
  361. package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js +284 -0
  362. package/dist/cli/backend/src/services/observability/agent-behavior-log.service.js.map +1 -0
  363. package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts +70 -0
  364. package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.d.ts.map +1 -0
  365. package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js +121 -0
  366. package/dist/cli/backend/src/services/observability/agent-behavior-log.singleton.js.map +1 -0
  367. package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts +130 -0
  368. package/dist/cli/backend/src/services/observability/agent-behavior-log.types.d.ts.map +1 -0
  369. package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js +48 -0
  370. package/dist/cli/backend/src/services/observability/agent-behavior-log.types.js.map +1 -0
  371. package/dist/cli/backend/src/services/observability/observability-db.d.ts +84 -0
  372. package/dist/cli/backend/src/services/observability/observability-db.d.ts.map +1 -0
  373. package/dist/cli/backend/src/services/observability/observability-db.js +165 -0
  374. package/dist/cli/backend/src/services/observability/observability-db.js.map +1 -0
  375. package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts +124 -0
  376. package/dist/cli/backend/src/services/onboarding/content-approval.service.d.ts.map +1 -0
  377. package/dist/cli/backend/src/services/onboarding/content-approval.service.js +256 -0
  378. package/dist/cli/backend/src/services/onboarding/content-approval.service.js.map +1 -0
  379. package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts +80 -0
  380. package/dist/cli/backend/src/services/onboarding/content-approval.types.d.ts.map +1 -0
  381. package/dist/cli/backend/src/services/onboarding/content-approval.types.js +16 -0
  382. package/dist/cli/backend/src/services/onboarding/content-approval.types.js.map +1 -0
  383. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +142 -0
  384. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -0
  385. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +265 -0
  386. package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -0
  387. package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts +231 -0
  388. package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.d.ts.map +1 -0
  389. package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js +353 -0
  390. package/dist/cli/backend/src/services/orchestrator/improvement-marker.service.js.map +1 -0
  391. package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts +157 -0
  392. package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.d.ts.map +1 -0
  393. package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js +483 -0
  394. package/dist/cli/backend/src/services/orchestrator/improvement-startup.service.js.map +1 -0
  395. package/dist/cli/backend/src/services/orchestrator/index.d.ts +16 -0
  396. package/dist/cli/backend/src/services/orchestrator/index.d.ts.map +1 -0
  397. package/dist/cli/backend/src/services/orchestrator/index.js +16 -0
  398. package/dist/cli/backend/src/services/orchestrator/index.js.map +1 -0
  399. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts +117 -0
  400. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.d.ts.map +1 -0
  401. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js +300 -0
  402. package/dist/cli/backend/src/services/orchestrator/orchestrator-restart.service.js.map +1 -0
  403. package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts +114 -0
  404. package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.d.ts.map +1 -0
  405. package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js +195 -0
  406. package/dist/cli/backend/src/services/orchestrator/orchestrator-setup.service.js.map +1 -0
  407. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts +94 -0
  408. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.d.ts.map +1 -0
  409. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js +279 -0
  410. package/dist/cli/backend/src/services/orchestrator/orchestrator-status.service.js.map +1 -0
  411. package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts +192 -0
  412. package/dist/cli/backend/src/services/orchestrator/safe-restart.service.d.ts.map +1 -0
  413. package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js +395 -0
  414. package/dist/cli/backend/src/services/orchestrator/safe-restart.service.js.map +1 -0
  415. package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts +201 -0
  416. package/dist/cli/backend/src/services/orchestrator/self-improvement.service.d.ts.map +1 -0
  417. package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js +396 -0
  418. package/dist/cli/backend/src/services/orchestrator/self-improvement.service.js.map +1 -0
  419. package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts +17 -0
  420. package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.d.ts.map +1 -0
  421. package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js +30 -0
  422. package/dist/cli/backend/src/services/orchestrator/slack-bridge-lazy.js.map +1 -0
  423. package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts +249 -0
  424. package/dist/cli/backend/src/services/orchestrator/state-persistence.service.d.ts.map +1 -0
  425. package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js +569 -0
  426. package/dist/cli/backend/src/services/orchestrator/state-persistence.service.js.map +1 -0
  427. package/dist/cli/backend/src/services/session/index.d.ts +47 -0
  428. package/dist/cli/backend/src/services/session/index.d.ts.map +1 -0
  429. package/dist/cli/backend/src/services/session/index.js +50 -0
  430. package/dist/cli/backend/src/services/session/index.js.map +1 -0
  431. package/dist/cli/backend/src/services/session/log-rotation.service.d.ts +163 -0
  432. package/dist/cli/backend/src/services/session/log-rotation.service.d.ts.map +1 -0
  433. package/dist/cli/backend/src/services/session/log-rotation.service.js +362 -0
  434. package/dist/cli/backend/src/services/session/log-rotation.service.js.map +1 -0
  435. package/dist/cli/backend/src/services/session/pty/index.d.ts +11 -0
  436. package/dist/cli/backend/src/services/session/pty/index.d.ts.map +1 -0
  437. package/dist/cli/backend/src/services/session/pty/index.js +11 -0
  438. package/dist/cli/backend/src/services/session/pty/index.js.map +1 -0
  439. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts +445 -0
  440. package/dist/cli/backend/src/services/session/pty/pty-session-backend.d.ts.map +1 -0
  441. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js +804 -0
  442. package/dist/cli/backend/src/services/session/pty/pty-session-backend.js.map +1 -0
  443. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts +252 -0
  444. package/dist/cli/backend/src/services/session/pty/pty-session.d.ts.map +1 -0
  445. package/dist/cli/backend/src/services/session/pty/pty-session.js +611 -0
  446. package/dist/cli/backend/src/services/session/pty/pty-session.js.map +1 -0
  447. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts +275 -0
  448. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.d.ts.map +1 -0
  449. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js +403 -0
  450. package/dist/cli/backend/src/services/session/pty/pty-terminal-buffer.js.map +1 -0
  451. package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts +86 -0
  452. package/dist/cli/backend/src/services/session/runtime-pid-registry.service.d.ts.map +1 -0
  453. package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js +214 -0
  454. package/dist/cli/backend/src/services/session/runtime-pid-registry.service.js.map +1 -0
  455. package/dist/cli/backend/src/services/session/session-backend.factory.d.ts +127 -0
  456. package/dist/cli/backend/src/services/session/session-backend.factory.d.ts.map +1 -0
  457. package/dist/cli/backend/src/services/session/session-backend.factory.js +226 -0
  458. package/dist/cli/backend/src/services/session/session-backend.factory.js.map +1 -0
  459. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts +390 -0
  460. package/dist/cli/backend/src/services/session/session-backend.interface.d.ts.map +1 -0
  461. package/dist/cli/backend/src/services/session/session-backend.interface.js +19 -0
  462. package/dist/cli/backend/src/services/session/session-backend.interface.js.map +1 -0
  463. package/dist/cli/backend/src/services/session/session-command-helper.d.ts +350 -0
  464. package/dist/cli/backend/src/services/session/session-command-helper.d.ts.map +1 -0
  465. package/dist/cli/backend/src/services/session/session-command-helper.js +810 -0
  466. package/dist/cli/backend/src/services/session/session-command-helper.js.map +1 -0
  467. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts +307 -0
  468. package/dist/cli/backend/src/services/session/session-handoff.service.d.ts.map +1 -0
  469. package/dist/cli/backend/src/services/session/session-handoff.service.js +742 -0
  470. package/dist/cli/backend/src/services/session/session-handoff.service.js.map +1 -0
  471. package/dist/cli/backend/src/services/session/session-state-persistence.d.ts +231 -0
  472. package/dist/cli/backend/src/services/session/session-state-persistence.d.ts.map +1 -0
  473. package/dist/cli/backend/src/services/session/session-state-persistence.js +407 -0
  474. package/dist/cli/backend/src/services/session/session-state-persistence.js.map +1 -0
  475. package/dist/cli/backend/src/services/settings/role.service.d.ts +277 -0
  476. package/dist/cli/backend/src/services/settings/role.service.d.ts.map +1 -0
  477. package/dist/cli/backend/src/services/settings/role.service.js +728 -0
  478. package/dist/cli/backend/src/services/settings/role.service.js.map +1 -0
  479. package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts +152 -0
  480. package/dist/cli/backend/src/services/slack/cross-machine-message.service.d.ts.map +1 -0
  481. package/dist/cli/backend/src/services/slack/cross-machine-message.service.js +354 -0
  482. package/dist/cli/backend/src/services/slack/cross-machine-message.service.js.map +1 -0
  483. package/dist/cli/backend/src/services/slack/slack-image.service.d.ts +114 -0
  484. package/dist/cli/backend/src/services/slack/slack-image.service.d.ts.map +1 -0
  485. package/dist/cli/backend/src/services/slack/slack-image.service.js +331 -0
  486. package/dist/cli/backend/src/services/slack/slack-image.service.js.map +1 -0
  487. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +499 -0
  488. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -0
  489. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +1928 -0
  490. package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -0
  491. package/dist/cli/backend/src/services/slack/slack.service.d.ts +315 -0
  492. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -0
  493. package/dist/cli/backend/src/services/slack/slack.service.js +1094 -0
  494. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -0
  495. package/dist/cli/backend/src/services/sop/sop.service.d.ts +364 -0
  496. package/dist/cli/backend/src/services/sop/sop.service.d.ts.map +1 -0
  497. package/dist/cli/backend/src/services/sop/sop.service.js +734 -0
  498. package/dist/cli/backend/src/services/sop/sop.service.js.map +1 -0
  499. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +152 -7
  500. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  501. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +268 -36
  502. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  503. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts +178 -0
  504. package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -0
  505. package/dist/cli/backend/src/services/v3/escalation-router.service.js +692 -0
  506. package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -0
  507. package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts +200 -0
  508. package/dist/cli/backend/src/services/v3/kr-tracking.service.d.ts.map +1 -0
  509. package/dist/cli/backend/src/services/v3/kr-tracking.service.js +482 -0
  510. package/dist/cli/backend/src/services/v3/kr-tracking.service.js.map +1 -0
  511. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts +117 -0
  512. package/dist/cli/backend/src/services/v3/mission-executor.service.d.ts.map +1 -0
  513. package/dist/cli/backend/src/services/v3/mission-executor.service.js +321 -0
  514. package/dist/cli/backend/src/services/v3/mission-executor.service.js.map +1 -0
  515. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts +610 -0
  516. package/dist/cli/backend/src/services/v3/request-sla.subscriber.d.ts.map +1 -0
  517. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js +1529 -0
  518. package/dist/cli/backend/src/services/v3/request-sla.subscriber.js.map +1 -0
  519. package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts +78 -0
  520. package/dist/cli/backend/src/services/v3/request-tracker.service.d.ts.map +1 -0
  521. package/dist/cli/backend/src/services/v3/request-tracker.service.js +108 -0
  522. package/dist/cli/backend/src/services/v3/request-tracker.service.js.map +1 -0
  523. package/dist/cli/backend/src/services/v3/request.service.d.ts +295 -0
  524. package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -0
  525. package/dist/cli/backend/src/services/v3/request.service.js +534 -0
  526. package/dist/cli/backend/src/services/v3/request.service.js.map +1 -0
  527. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts +340 -0
  528. package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -0
  529. package/dist/cli/backend/src/services/v3/v3-data.service.js +1113 -0
  530. package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -0
  531. package/dist/cli/backend/src/types/cross-machine.types.d.ts +103 -0
  532. package/dist/cli/backend/src/types/cross-machine.types.d.ts.map +1 -0
  533. package/dist/cli/backend/src/types/cross-machine.types.js +47 -0
  534. package/dist/cli/backend/src/types/cross-machine.types.js.map +1 -0
  535. package/dist/cli/backend/src/types/intent-task.types.d.ts +402 -0
  536. package/dist/cli/backend/src/types/intent-task.types.d.ts.map +1 -0
  537. package/dist/cli/backend/src/types/intent-task.types.js +403 -0
  538. package/dist/cli/backend/src/types/intent-task.types.js.map +1 -0
  539. package/dist/cli/backend/src/types/orchestrator-state.types.d.ts +531 -0
  540. package/dist/cli/backend/src/types/orchestrator-state.types.d.ts.map +1 -0
  541. package/dist/cli/backend/src/types/orchestrator-state.types.js +110 -0
  542. package/dist/cli/backend/src/types/orchestrator-state.types.js.map +1 -0
  543. package/dist/cli/backend/src/types/v2/index.d.ts +30 -0
  544. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -0
  545. package/dist/cli/backend/src/types/v2/index.js +22 -0
  546. package/dist/cli/backend/src/types/v2/index.js.map +1 -0
  547. package/dist/cli/backend/src/types/v2/key-result.types.d.ts +279 -0
  548. package/dist/cli/backend/src/types/v2/key-result.types.d.ts.map +1 -0
  549. package/dist/cli/backend/src/types/v2/key-result.types.js +264 -0
  550. package/dist/cli/backend/src/types/v2/key-result.types.js.map +1 -0
  551. package/dist/cli/backend/src/types/v2/mission.types.d.ts +661 -0
  552. package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -0
  553. package/dist/cli/backend/src/types/v2/mission.types.js +713 -0
  554. package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -0
  555. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +204 -0
  556. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -0
  557. package/dist/cli/backend/src/types/v2/reconcile.types.js +121 -0
  558. package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -0
  559. package/dist/cli/backend/src/types/v2/request.types.d.ts +192 -0
  560. package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -0
  561. package/dist/cli/backend/src/types/v2/request.types.js +179 -0
  562. package/dist/cli/backend/src/types/v2/request.types.js.map +1 -0
  563. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +181 -1
  564. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  565. package/dist/cli/backend/src/types/v2/work-item.types.js +104 -17
  566. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  567. package/dist/cli/backend/src/types/v2/workspace.types.d.ts +157 -0
  568. package/dist/cli/backend/src/types/v2/workspace.types.d.ts.map +1 -0
  569. package/dist/cli/backend/src/types/v2/workspace.types.js +173 -0
  570. package/dist/cli/backend/src/types/v2/workspace.types.js.map +1 -0
  571. package/dist/cli/backend/src/utils/async.utils.d.ts +68 -0
  572. package/dist/cli/backend/src/utils/async.utils.d.ts.map +1 -0
  573. package/dist/cli/backend/src/utils/async.utils.js +80 -0
  574. package/dist/cli/backend/src/utils/async.utils.js.map +1 -0
  575. package/dist/cli/backend/src/utils/native-binding.utils.d.ts +128 -0
  576. package/dist/cli/backend/src/utils/native-binding.utils.d.ts.map +1 -0
  577. package/dist/cli/backend/src/utils/native-binding.utils.js +206 -0
  578. package/dist/cli/backend/src/utils/native-binding.utils.js.map +1 -0
  579. package/dist/cli/backend/src/websocket/chat.gateway.d.ts +142 -0
  580. package/dist/cli/backend/src/websocket/chat.gateway.d.ts.map +1 -0
  581. package/dist/cli/backend/src/websocket/chat.gateway.js +327 -0
  582. package/dist/cli/backend/src/websocket/chat.gateway.js.map +1 -0
  583. package/dist/cli/backend/src/websocket/terminal.gateway.d.ts +341 -0
  584. package/dist/cli/backend/src/websocket/terminal.gateway.d.ts.map +1 -0
  585. package/dist/cli/backend/src/websocket/terminal.gateway.js +933 -0
  586. package/dist/cli/backend/src/websocket/terminal.gateway.js.map +1 -0
  587. package/dist/cli/config/vitest-exclude.constants.d.ts +53 -0
  588. package/dist/cli/config/vitest-exclude.constants.d.ts.map +1 -0
  589. package/dist/cli/config/vitest-exclude.constants.js +55 -0
  590. package/dist/cli/config/vitest-exclude.constants.js.map +1 -0
  591. package/frontend/dist/assets/index-890d3f9d.js +4961 -0
  592. package/frontend/dist/index.html +1 -1
  593. package/package.json +2 -2
  594. package/packages/crewly-agent/src/runtime/agent-runner.service.test.ts +174 -30
  595. package/packages/crewly-agent/src/runtime/agent-runner.service.ts +121 -6
  596. package/packages/crewly-agent/src/runtime/types.ts +56 -5
  597. package/frontend/dist/assets/index-aa737fd3.js +0 -5254
@@ -7,7 +7,7 @@
7
7
  <meta name="color-scheme" content="dark" />
8
8
  <!-- Nunito font is self-hosted via @fontsource/nunito (imported in main.tsx) -->
9
9
  <title>Crewly AI Studio</title>
10
- <script type="module" crossorigin src="/assets/index-aa737fd3.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-890d3f9d.js"></script>
11
11
  <link rel="stylesheet" href="/assets/index-8205ea5e.css">
12
12
  </head>
13
13
  <body class="bg-background-dark font-display text-text-primary-dark">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crewly",
3
- "version": "1.13.0",
3
+ "version": "1.13.1",
4
4
  "type": "module",
5
5
  "description": "Multi-agent orchestration platform for AI coding teams — coordinates Claude Code, Gemini CLI, and Codex agents with a real-time web dashboard",
6
6
  "workspaces": [
@@ -35,7 +35,7 @@
35
35
  "scripts": {
36
36
  "build": "npm run build:backend && npm run build:frontend && npm run build:cli",
37
37
  "build:server": "npm run build:backend && npm run build:cli",
38
- "build:backend": "tsc -p backend/tsconfig.json",
38
+ "build:backend": "tsc -p backend/tsconfig.json && node dist/backend/backend/src/scripts/stamp-build.js",
39
39
  "build:frontend": "cd frontend && npm run build",
40
40
  "build:cli": "tsc -p cli/tsconfig.json",
41
41
  "dev": "concurrently \"npm run dev:backend\" \"npm run dev:frontend\"",
@@ -93,7 +93,7 @@ describe('AgentRunnerService', () => {
93
93
 
94
94
  expect(result.text).toBe('Hello from agent');
95
95
  expect(result.steps).toBe(1);
96
- expect(result.usage).toEqual({ input: 100, output: 50 });
96
+ expect(result.usage).toEqual({ input: 100, output: 50, cachedInput: 0 });
97
97
  expect(result.toolCalls).toEqual([]);
98
98
  expect(result.finishReason).toBe('stop');
99
99
  });
@@ -194,7 +194,7 @@ describe('AgentRunnerService', () => {
194
194
 
195
195
  const result = await runner.run('Test');
196
196
 
197
- expect(result.usage).toEqual({ input: 0, output: 0 });
197
+ expect(result.usage).toEqual({ input: 0, output: 0, cachedInput: 0 });
198
198
  });
199
199
 
200
200
  it('should throw if not initialized', async () => {
@@ -614,18 +614,24 @@ describe('AgentRunnerService', () => {
614
614
  });
615
615
 
616
616
  describe('getContextBudget', () => {
617
- it('should return normal level with zero usage', () => {
617
+ it('should return normal level before any request has been billed', () => {
618
618
  const budget = runner.getContextBudget();
619
619
 
620
- expect(budget.totalTokensUsed).toBe(0);
621
- expect(budget.usagePercent).toBe(0);
620
+ expect(budget.lifetimeTokensUsed).toBe(0);
621
+ // No provider measurement yet, so occupancy is estimated from the system
622
+ // prompt — small but non-zero, and it must not read as an empty context.
623
+ expect(budget.contextTokensUsed).toBeGreaterThan(0);
624
+ expect(budget.usagePercent).toBeLessThan(0.01);
622
625
  expect(budget.level).toBe('normal');
623
626
  expect(budget.messageCount).toBe(0);
624
627
  expect(budget.compactionPending).toBe(false);
625
628
  expect(budget.contextWindowSize).toBeGreaterThan(0);
626
629
  });
627
630
 
628
- it('should track cumulative token usage', async () => {
631
+ it('separates context occupancy from lifetime spend', async () => {
632
+ // The two must diverge: history is re-sent every turn, so lifetime spend
633
+ // accumulates while occupancy only reflects the latest prompt. Conflating
634
+ // them drove `usagePercent` past 100% within a few turns.
629
635
  await runner.initialize();
630
636
  mockGenerateText.mockResolvedValueOnce({
631
637
  text: 'Response',
@@ -635,9 +641,41 @@ describe('AgentRunnerService', () => {
635
641
  });
636
642
  await runner.run('Hello');
637
643
 
644
+ expect(runner.getContextBudget().lifetimeTokensUsed).toBe(700);
645
+ expect(runner.getContextBudget().contextTokensUsed).toBe(700);
646
+
647
+ mockGenerateText.mockResolvedValueOnce({
648
+ text: 'Response 2',
649
+ steps: [],
650
+ usage: { inputTokens: 800, outputTokens: 100 },
651
+ finishReason: 'stop',
652
+ });
653
+ await runner.run('Hello again');
654
+
638
655
  const budget = runner.getContextBudget();
639
- expect(budget.totalTokensUsed).toBe(700);
640
- expect(budget.messageCount).toBe(2); // user + assistant
656
+ expect(budget.lifetimeTokensUsed).toBe(1600); // 700 + 900, still climbing
657
+ expect(budget.contextTokensUsed).toBe(900); // just the latest prompt
658
+ expect(budget.messageCount).toBe(4);
659
+ });
660
+
661
+ it('counts cache hits as occupying the window even though they bill cheaper', async () => {
662
+ // Cached tokens are served at a discount but are still part of the
663
+ // prompt. Dropping them would make a well-cached session look almost
664
+ // empty and defeat compaction entirely.
665
+ await runner.initialize();
666
+ mockGenerateText.mockResolvedValueOnce({
667
+ text: 'Response',
668
+ steps: [],
669
+ usage: { inputTokens: 300, outputTokens: 100, cachedInputTokens: 20_000 },
670
+ finishReason: 'stop',
671
+ });
672
+ await runner.run('Hello');
673
+
674
+ const budget = runner.getContextBudget();
675
+ expect(budget.contextTokensUsed).toBe(20_400);
676
+ // Billing is unaffected — lifetime counts only what the provider charged
677
+ // as fresh input plus output.
678
+ expect(budget.lifetimeTokensUsed).toBe(400);
641
679
  });
642
680
 
643
681
  it('should return warning level when approaching threshold', async () => {
@@ -657,11 +695,13 @@ describe('AgentRunnerService', () => {
657
695
  }
658
696
 
659
697
  const budget = runner.getContextBudget();
660
- // 10 * 9000 = 90,000 tokens. Context window = 200,000 (anthropic claude-sonnet-4-20250514)
661
- // 90000/200000 = 0.45, threshold = 0.8, warning at 0.68
662
- // Actually need more tokens. Let me check: the model is claude-sonnet-4-20250514 = 200,000
663
- // So we'd need 136,000+ for warning (0.68 * 200000)
664
- expect(budget.totalTokensUsed).toBe(90000);
698
+ // 10 turns × 9,000 billed = 90,000 lifetime tokens, but each individual
699
+ // prompt was only 9,000 — well under the 200,000 window. The budget must
700
+ // read the second number: measuring lifetime spend against the window is
701
+ // what pinned long sessions at 'critical' forever.
702
+ expect(budget.lifetimeTokensUsed).toBe(90000);
703
+ expect(budget.contextTokensUsed).toBe(9000);
704
+ expect(budget.level).toBe('normal');
665
705
  });
666
706
 
667
707
  it('should return critical level when at or above compaction threshold', async () => {
@@ -689,6 +729,43 @@ describe('AgentRunnerService', () => {
689
729
  expect(budget.summary).toContain('CRITICAL');
690
730
  });
691
731
 
732
+ // Regression: a long session used to settle into a state where EVERY
733
+ // message ran a compaction before its own request, doubling the model calls
734
+ // for the rest of the session and never recovering — compaction shrank the
735
+ // history but nothing reset the counter it was judged against. Reproduced
736
+ // at an orchestrator's real scale: a ~20k-token prompt on DeepSeek's 64k
737
+ // window crossed the 0.8 threshold by the third message.
738
+ it('does not fall into a permanent compact-before-every-message loop', async () => {
739
+ const config = {
740
+ ...baseConfig,
741
+ model: { provider: 'deepseek' as const, modelId: 'deepseek-chat', temperature: 0.3, maxTokens: 8192 },
742
+ maxHistoryMessages: 100,
743
+ };
744
+ const r = new AgentRunnerService(config, mockModelManager, mockApiClient);
745
+ r._generateTextFn = mockGenerateText;
746
+ await r.initialize();
747
+
748
+ mockGenerateText.mockResolvedValue({
749
+ text: 'ok',
750
+ steps: [],
751
+ usage: { inputTokens: 20_000, outputTokens: 300 },
752
+ finishReason: 'stop',
753
+ });
754
+
755
+ const TURNS = 12;
756
+ for (let i = 0; i < TURNS; i++) {
757
+ await r.run(`message ${i}`);
758
+ }
759
+
760
+ // One call per turn. A compaction would add a summarization call on top,
761
+ // so a count above TURNS means the loop is back.
762
+ expect(mockGenerateText).toHaveBeenCalledTimes(TURNS);
763
+ const budget = r.getContextBudget();
764
+ expect(budget.level).toBe('normal');
765
+ // The old formula reported ~380% here.
766
+ expect(budget.usagePercent).toBeLessThan(1);
767
+ });
768
+
692
769
  it('should set compactionPending when message count exceeds max', async () => {
693
770
  const config = {
694
771
  ...baseConfig,
@@ -824,22 +901,15 @@ describe('AgentRunnerService', () => {
824
901
  // Each run uses 150 tokens. After 6 runs: 900 tokens.
825
902
  // Context window for claude-sonnet-4-20250514 = 200,000
826
903
  // Set threshold to 0.004 (0.4%) = 800 tokens
827
- // Runs 0-3 won't trigger (0,150,300,450 < 800). Run 4+ will trigger.
828
- // But compaction needs >= 10 messages, so runs 4-5 trigger budget-critical
829
- // but compactHistory returns early (8 and 10 messages respectively).
830
- // Actually run 5 has 10 messages so compaction runs.
831
- // Let's use threshold 0.005 = 1000 tokens, so 6 runs of 150 = 900 < 1000.
832
- // Then the 7th run triggers at 900 + check >= 1000? No, budget is checked
833
- // before the run with existing tokens. After 6 runs = 900 tokens < 1000 = normal.
834
- // After 7th run = 900 + 150 = 1050. But check is before run with 900 tokens.
835
- // We need threshold to trigger BEFORE a run. So set threshold = 0.004 = 800.
836
- // After 5 runs = 750 < 800 (normal). After 6th run's execution → 900.
837
- // 7th run check: 900/200000 = 0.0045 >= 0.004 → critical → compaction triggers.
838
- // At that point we have 12 messages (6 runs × 2), >= 10, so compaction runs.
904
+ // Compaction must stay reachable on token pressure alone, with a message
905
+ // count nowhere near `maxHistoryMessages`. Pressure now comes from one
906
+ // large prompt rather than from many small ones adding up: occupancy is
907
+ // measured per request, so a long-but-light session no longer reads as
908
+ // full. Threshold 0.004 of a 200,000 window = 800 tokens.
839
909
  const config = {
840
910
  ...baseConfig,
841
911
  maxHistoryMessages: 1000, // high message limit, won't trigger by count
842
- compactionThreshold: 0.004, // triggers after ~6 runs of 150 tokens each
912
+ compactionThreshold: 0.004,
843
913
  };
844
914
  const r = new AgentRunnerService(config, mockModelManager, mockApiClient);
845
915
  r._generateTextFn = mockGenerateText;
@@ -857,11 +927,22 @@ describe('AgentRunnerService', () => {
857
927
  }
858
928
 
859
929
  expect(r.getHistoryLength()).toBe(12);
860
- // 900 / 200000 = 0.0045 >= 0.004 → critical
930
+ expect(r.getContextBudget().level).toBe('normal');
931
+
932
+ // A turn that actually fills the context — 950 tokens against an 800
933
+ // token threshold.
934
+ mockGenerateText.mockResolvedValueOnce({
935
+ text: 'Big context turn',
936
+ steps: [],
937
+ usage: { inputTokens: 900, outputTokens: 50 },
938
+ finishReason: 'stop',
939
+ });
940
+ await r.run('Message with a large prompt');
941
+
861
942
  expect(r.getContextBudget().level).toBe('critical');
862
943
 
863
- // Next run should trigger compaction due to token budget being critical
864
- // AI summary call + actual run
944
+ // The next run sees a critical budget and compacts first:
945
+ // one summarization call, then the run itself.
865
946
  mockGenerateText.mockResolvedValueOnce({
866
947
  text: 'Compaction summary of state',
867
948
  steps: [],
@@ -878,12 +959,75 @@ describe('AgentRunnerService', () => {
878
959
  await r.run('Trigger compaction by budget');
879
960
 
880
961
  // Should have compacted: 1 summary + 10 recent + 1 user + 1 assistant
881
- expect(r.getHistoryLength()).toBeLessThan(14);
962
+ expect(r.getHistoryLength()).toBeLessThan(16);
882
963
  const state = r.getState();
883
964
  expect(String(state.messages[0].content)).toContain('Compacted State');
884
965
  });
885
966
  });
886
967
 
968
+ // Prompt caching — the fixed prefix (system prompt + tool schemas) is
969
+ // byte-stable for the life of a session and was billed at full rate on every
970
+ // turn because no provider options were ever sent.
971
+ describe('prompt caching', () => {
972
+ const lastCallArgs = () =>
973
+ mockGenerateText.mock.calls[mockGenerateText.mock.calls.length - 1][0];
974
+
975
+ it('asks Anthropic to cache the request prefix', async () => {
976
+ await runner.initialize();
977
+ mockGenerateText.mockResolvedValueOnce({
978
+ text: 'ok', steps: [], usage: { inputTokens: 10, outputTokens: 5 }, finishReason: 'stop',
979
+ });
980
+ await runner.run('Hello');
981
+
982
+ expect(lastCallArgs().providerOptions).toEqual({
983
+ anthropic: { cacheControl: { type: 'ephemeral' } },
984
+ });
985
+ });
986
+
987
+ it('sends no provider options for a non-Anthropic model', async () => {
988
+ // DeepSeek caches server-side with no opt-in and the others have no
989
+ // equivalent knob; an Anthropic-namespaced option there is just noise.
990
+ const config = {
991
+ ...baseConfig,
992
+ model: { provider: 'deepseek' as const, modelId: 'deepseek-chat', temperature: 0.3, maxTokens: 8192 },
993
+ };
994
+ const r = new AgentRunnerService(config, mockModelManager, mockApiClient);
995
+ r._generateTextFn = mockGenerateText;
996
+ await r.initialize();
997
+ mockGenerateText.mockResolvedValueOnce({
998
+ text: 'ok', steps: [], usage: { inputTokens: 10, outputTokens: 5 }, finishReason: 'stop',
999
+ });
1000
+ await r.run('Hello');
1001
+
1002
+ expect(lastCallArgs().providerOptions).toBeUndefined();
1003
+ });
1004
+
1005
+ it('reports cache hits on the run result so the hit rate is observable', async () => {
1006
+ await runner.initialize();
1007
+ mockGenerateText.mockResolvedValueOnce({
1008
+ text: 'ok',
1009
+ steps: [],
1010
+ usage: { inputTokens: 400, outputTokens: 60, cachedInputTokens: 18_000 },
1011
+ finishReason: 'stop',
1012
+ });
1013
+
1014
+ const result = await runner.run('Hello');
1015
+
1016
+ expect(result.usage).toEqual({ input: 400, output: 60, cachedInput: 18_000 });
1017
+ });
1018
+
1019
+ it('reports zero cache hits when the provider omits the field', async () => {
1020
+ await runner.initialize();
1021
+ mockGenerateText.mockResolvedValueOnce({
1022
+ text: 'ok', steps: [], usage: { inputTokens: 400, outputTokens: 60 }, finishReason: 'stop',
1023
+ });
1024
+
1025
+ const result = await runner.run('Hello');
1026
+
1027
+ expect(result.usage.cachedInput).toBe(0);
1028
+ });
1029
+ });
1030
+
887
1031
  describe('audit trail', () => {
888
1032
  it('should return empty audit log initially', () => {
889
1033
  const log = runner.getAuditLog();
@@ -306,6 +306,7 @@ export class AgentRunnerService {
306
306
  messages: [],
307
307
  systemPrompt: this.effectiveSystemPrompt,
308
308
  totalTokens: { input: 0, output: 0 },
309
+ lastContextTokens: 0,
309
310
  createdAt: new Date(),
310
311
  lastActivityAt: new Date(),
311
312
  };
@@ -699,11 +700,19 @@ export class AgentRunnerService {
699
700
  * @returns ContextBudgetStatus with usage stats and level
700
701
  */
701
702
  getContextBudget(): ContextBudgetStatus {
702
- const totalTokensUsed = this.state.totalTokens.input + this.state.totalTokens.output;
703
+ const lifetimeTokensUsed = this.state.totalTokens.input + this.state.totalTokens.output;
704
+ // Occupancy, NOT lifetime spend. The prompt is re-sent in full on every
705
+ // request, so the lifetime sum counts the same history once per turn and
706
+ // sails past the window within a handful of messages — which used to pin
707
+ // `level` at 'critical' forever and run a compaction before every single
708
+ // message, doubling the model calls for the rest of the session.
709
+ const contextTokensUsed = this.state.lastContextTokens > 0
710
+ ? this.state.lastContextTokens
711
+ : this.estimateContextTokens();
703
712
  const contextWindowSize = MODEL_CONTEXT_WINDOWS[this.config.model.modelId]
704
713
  ?? MODEL_CONTEXT_WINDOWS.default;
705
714
  const usagePercent = contextWindowSize > 0
706
- ? totalTokensUsed / contextWindowSize
715
+ ? contextTokensUsed / contextWindowSize
707
716
  : 0;
708
717
 
709
718
  const threshold = this.config.compactionThreshold;
@@ -719,7 +728,7 @@ export class AgentRunnerService {
719
728
  || usagePercent >= threshold;
720
729
 
721
730
  const pct = (usagePercent * 100).toFixed(1);
722
- let summary = `${pct}% of context budget used (${totalTokensUsed.toLocaleString()}/${contextWindowSize.toLocaleString()} tokens, ${this.state.messages.length} messages)`;
731
+ let summary = `${pct}% of context budget used (${contextTokensUsed.toLocaleString()}/${contextWindowSize.toLocaleString()} tokens, ${this.state.messages.length} messages, ${lifetimeTokensUsed.toLocaleString()} billed this session)`;
723
732
  if (level === 'critical') {
724
733
  summary += ' — CRITICAL: compaction recommended immediately';
725
734
  } else if (level === 'warning') {
@@ -727,7 +736,8 @@ export class AgentRunnerService {
727
736
  }
728
737
 
729
738
  return {
730
- totalTokensUsed,
739
+ contextTokensUsed,
740
+ lifetimeTokensUsed,
731
741
  contextWindowSize,
732
742
  usagePercent,
733
743
  level,
@@ -737,6 +747,91 @@ export class AgentRunnerService {
737
747
  };
738
748
  }
739
749
 
750
+ /**
751
+ * Provider-specific request options.
752
+ *
753
+ * Turns on Anthropic prompt caching. Every request re-sends the same
754
+ * prefix — the system prompt (tens of KB for an orchestrator) followed by
755
+ * the tool schemas — and that prefix is byte-stable for the life of the
756
+ * session, which is exactly the shape caching is for. Without this the
757
+ * whole prefix is billed at full rate on every single turn.
758
+ *
759
+ * The top-level `cacheControl` places the breakpoint at the last cacheable
760
+ * block, so tools + system + settled history are covered by one marker and
761
+ * only the newest turn is uncached.
762
+ *
763
+ * Anthropic-only by design: DeepSeek caches server-side with no opt-in, and
764
+ * the other providers ignore an option namespaced to a provider that is not
765
+ * theirs — but sending it only where it means something keeps the request
766
+ * honest.
767
+ *
768
+ * @returns Provider options for the current model, or undefined when the
769
+ * provider needs none
770
+ */
771
+ private buildProviderOptions(): Record<string, Record<string, unknown>> | undefined {
772
+ if (this.config.model.provider !== 'anthropic') return undefined;
773
+ return { anthropic: { cacheControl: { type: 'ephemeral' } } };
774
+ }
775
+
776
+ /**
777
+ * Record how full the context is after a completed request.
778
+ *
779
+ * The prompt the provider just billed IS the context size — `input` covers
780
+ * the system prompt, the tool schemas and the retained history, and
781
+ * `cachedInput` covers the part of that same prompt served from cache
782
+ * (billed cheaper, but still occupying the window, so it must be added
783
+ * back). The reply is included because the next request carries it forward.
784
+ *
785
+ * Assigns rather than accumulates: this is a snapshot of the current turn,
786
+ * and compaction shrinks it back down on the next measurement.
787
+ *
788
+ * @param usage - Token counts reported by the provider for the request
789
+ */
790
+ private recordContextOccupancy(
791
+ usage: { input: number; output: number; cachedInput: number },
792
+ ): void {
793
+ this.state.lastContextTokens = usage.input + usage.cachedInput + usage.output;
794
+ }
795
+
796
+ /**
797
+ * Estimate context occupancy from the text we are about to send.
798
+ *
799
+ * Only used before the first response of a conversation, when no provider
800
+ * measurement exists yet. A rough number is fine there — one turn later it
801
+ * is replaced by the provider's own count — but it must not be wildly low,
802
+ * because a 40KB system prompt already fills a meaningful slice of a small
803
+ * window before any history exists.
804
+ *
805
+ * CJK and Latin text are counted separately: a single chars-per-token ratio
806
+ * misjudges a Chinese prompt by more than 2x in whichever direction it is
807
+ * tuned for. Tool schemas are not included — they are unavailable here and
808
+ * the estimate is superseded immediately.
809
+ *
810
+ * @returns Estimated tokens currently occupying the context window
811
+ */
812
+ private estimateContextTokens(): number {
813
+ let text = this.state.systemPrompt ?? '';
814
+ for (const m of this.state.messages) {
815
+ text += typeof m.content === 'string' ? m.content : JSON.stringify(m.content);
816
+ }
817
+ let cjk = 0;
818
+ for (const ch of text) {
819
+ const code = ch.codePointAt(0) ?? 0;
820
+ // CJK ideographs, kana, Hangul, and full-width forms.
821
+ if ((code >= 0x3040 && code <= 0x9fff)
822
+ || (code >= 0xac00 && code <= 0xd7af)
823
+ || (code >= 0xf900 && code <= 0xfaff)
824
+ || (code >= 0xff00 && code <= 0xffef)) {
825
+ cjk++;
826
+ }
827
+ }
828
+ const latin = [...text].length - cjk;
829
+ return Math.ceil(
830
+ latin / CREWLY_AGENT_DEFAULTS.CHARS_PER_TOKEN_LATIN
831
+ + cjk / CREWLY_AGENT_DEFAULTS.CHARS_PER_TOKEN_CJK,
832
+ );
833
+ }
834
+
740
835
  /**
741
836
  * Process queued messages serially.
742
837
  */
@@ -1049,6 +1144,7 @@ export class AgentRunnerService {
1049
1144
  model: this.model!,
1050
1145
  system: this.state.systemPrompt,
1051
1146
  messages: this.state.messages,
1147
+ providerOptions: this.buildProviderOptions(),
1052
1148
  tools: tools as any,
1053
1149
  stopWhen: stepCountIs(this.config.maxSteps),
1054
1150
  temperature: this.config.model.temperature,
@@ -1161,9 +1257,11 @@ export class AgentRunnerService {
1161
1257
  const usage = {
1162
1258
  input: resultUsage?.inputTokens ?? 0,
1163
1259
  output: resultUsage?.outputTokens ?? 0,
1260
+ cachedInput: resultUsage?.cachedInputTokens ?? 0,
1164
1261
  };
1165
1262
  this.state.totalTokens.input += usage.input;
1166
1263
  this.state.totalTokens.output += usage.output;
1264
+ this.recordContextOccupancy(usage);
1167
1265
 
1168
1266
  // Check budget after token update
1169
1267
  const postBudget = this.getContextBudget();
@@ -1277,6 +1375,7 @@ export class AgentRunnerService {
1277
1375
  model: this.model,
1278
1376
  system: this.state.systemPrompt,
1279
1377
  messages: this.state.messages,
1378
+ providerOptions: this.buildProviderOptions(),
1280
1379
  tools,
1281
1380
  stopWhen: stepCountIs(this.config.maxSteps),
1282
1381
  temperature: this.config.model.temperature,
@@ -1345,9 +1444,11 @@ export class AgentRunnerService {
1345
1444
  const usage = {
1346
1445
  input: result.usage?.inputTokens ?? 0,
1347
1446
  output: result.usage?.outputTokens ?? 0,
1447
+ cachedInput: result.usage?.cachedInputTokens ?? 0,
1348
1448
  };
1349
1449
  this.state.totalTokens.input += usage.input;
1350
1450
  this.state.totalTokens.output += usage.output;
1451
+ this.recordContextOccupancy(usage);
1351
1452
 
1352
1453
  // Check budget after token update and attach warning if approaching limits
1353
1454
  const postBudget = this.getContextBudget();
@@ -1492,6 +1593,7 @@ export class AgentRunnerService {
1492
1593
  model: this.model,
1493
1594
  system: this.state.systemPrompt,
1494
1595
  messages: this.state.messages,
1596
+ providerOptions: this.buildProviderOptions(),
1495
1597
  tools: tools as any,
1496
1598
  stopWhen: stepCountIs(20), // Limited steps for follow-up
1497
1599
  temperature: this.config.model.temperature,
@@ -1503,7 +1605,7 @@ export class AgentRunnerService {
1503
1605
  const followUpResult = followUp as unknown as Record<string, unknown>;
1504
1606
  const steps = (followUpResult.steps as Array<Record<string, unknown>>) ?? [];
1505
1607
  const text = (followUpResult.text as string) ?? '';
1506
- const followUpUsage = followUpResult.usage as { inputTokens?: number; outputTokens?: number } | undefined;
1608
+ const followUpUsage = followUpResult.usage as { inputTokens?: number; outputTokens?: number; cachedInputTokens?: number } | undefined;
1507
1609
  const finishReason = (followUpResult.finishReason as string) ?? 'stop';
1508
1610
 
1509
1611
  const followUpToolCalls: ToolCallRecord[] = [];
@@ -1520,10 +1622,16 @@ export class AgentRunnerService {
1520
1622
  this.state.messages.push({ role: 'assistant', content: text });
1521
1623
  }
1522
1624
 
1523
- // Track follow-up token usage
1625
+ // Track follow-up token usage. This is a later request in the same run,
1626
+ // so its prompt is the most current picture of how full the context is.
1524
1627
  if (followUpUsage) {
1525
1628
  this.state.totalTokens.input += followUpUsage.inputTokens ?? 0;
1526
1629
  this.state.totalTokens.output += followUpUsage.outputTokens ?? 0;
1630
+ this.recordContextOccupancy({
1631
+ input: followUpUsage.inputTokens ?? 0,
1632
+ output: followUpUsage.outputTokens ?? 0,
1633
+ cachedInput: followUpUsage.cachedInputTokens ?? 0,
1634
+ });
1527
1635
  }
1528
1636
 
1529
1637
  return {
@@ -1532,6 +1640,7 @@ export class AgentRunnerService {
1532
1640
  usage: {
1533
1641
  input: followUpUsage?.inputTokens ?? 0,
1534
1642
  output: followUpUsage?.outputTokens ?? 0,
1643
+ cachedInput: followUpUsage?.cachedInputTokens ?? 0,
1535
1644
  },
1536
1645
  toolCalls: followUpToolCalls,
1537
1646
  finishReason,
@@ -1564,6 +1673,7 @@ export class AgentRunnerService {
1564
1673
  model: this.model,
1565
1674
  system: this.state.systemPrompt,
1566
1675
  messages: this.state.messages,
1676
+ providerOptions: this.buildProviderOptions(),
1567
1677
  maxOutputTokens: resolveMaxOutputTokens(this.config.model),
1568
1678
  temperature: this.config.model.temperature,
1569
1679
  });
@@ -1578,6 +1688,11 @@ export class AgentRunnerService {
1578
1688
  if (fallbackUsage) {
1579
1689
  this.state.totalTokens.input += fallbackUsage.inputTokens ?? 0;
1580
1690
  this.state.totalTokens.output += fallbackUsage.outputTokens ?? 0;
1691
+ this.recordContextOccupancy({
1692
+ input: fallbackUsage.inputTokens ?? 0,
1693
+ output: fallbackUsage.outputTokens ?? 0,
1694
+ cachedInput: fallbackUsage.cachedInputTokens ?? 0,
1695
+ });
1581
1696
  }
1582
1697
  }
1583
1698
 
@@ -105,6 +105,20 @@ export interface ConversationState {
105
105
  systemPrompt: string;
106
106
  /** Cumulative token usage across all generateText calls */
107
107
  totalTokens: { input: number; output: number };
108
+ /**
109
+ * Tokens occupying the model's context as of the most recent request:
110
+ * the prompt that was actually sent (system + tools + retained history,
111
+ * cache hits included) plus the reply it produced, which the next request
112
+ * carries forward.
113
+ *
114
+ * This is a MEASUREMENT, not a running total — it is assigned, never
115
+ * accumulated. `totalTokens` answers "what has this session cost?";
116
+ * this answers "how full is the context?". Using the former for the
117
+ * latter conflates lifetime spend with occupancy and climbs past 100%
118
+ * of the window after a few turns, pinning the runner in permanent
119
+ * compaction. 0 until the first response lands.
120
+ */
121
+ lastContextTokens: number;
108
122
  /** Conversation creation time */
109
123
  createdAt: Date;
110
124
  /** Last activity timestamp */
@@ -156,8 +170,13 @@ export interface AgentRunResult {
156
170
  text: string;
157
171
  /** Number of steps taken in this run */
158
172
  steps: number;
159
- /** Token usage for this run */
160
- usage: { input: number; output: number };
173
+ /**
174
+ * Token usage for this run. `cachedInput` is the portion of `input` the
175
+ * provider served from its prompt cache — the number to watch when
176
+ * verifying caching actually engaged. It is 0 on providers that do not
177
+ * report cache hits.
178
+ */
179
+ usage: { input: number; output: number; cachedInput: number };
161
180
  /** Tool calls made during this run */
162
181
  toolCalls: ToolCallRecord[];
163
182
  /** Reason the generation finished */
@@ -322,8 +341,19 @@ export const WRITE_TOOLS: readonly string[] = [
322
341
  * Tracks token usage against the model's context window limit.
323
342
  */
324
343
  export interface ContextBudgetStatus {
325
- /** Total tokens used so far (input + output) */
326
- totalTokensUsed: number;
344
+ /**
345
+ * Tokens occupying the context window right now — measured from the last
346
+ * request, or estimated from the system prompt + history before the first
347
+ * one. This is the numerator of `usagePercent`.
348
+ */
349
+ contextTokensUsed: number;
350
+ /**
351
+ * Lifetime tokens billed for this session (input + output across every
352
+ * request). Reported for cost visibility only — it must never be compared
353
+ * against the context window, since re-sent history is counted once per
354
+ * request and the sum exceeds the window long before the context is full.
355
+ */
356
+ lifetimeTokensUsed: number;
327
357
  /** Estimated context window size for the current model */
328
358
  contextWindowSize: number;
329
359
  /** Usage as a fraction (0.0 - 1.0) */
@@ -343,7 +373,20 @@ export interface ContextBudgetStatus {
343
373
  * Used for budget tracking when the model doesn't report its own limit.
344
374
  */
345
375
  export const MODEL_CONTEXT_WINDOWS: Record<string, number> = {
346
- // Anthropic
376
+ // Anthropic — current generation. These were missing, so every model the
377
+ // fleet actually runs fell through to `default: 128_000` while its real
378
+ // window is 1M. An 8x under-estimate makes `compactionThreshold` fire
379
+ // roughly 8x too early, which is expensive: each premature compaction is a
380
+ // whole extra model call.
381
+ 'claude-fable-5': 1_000_000,
382
+ 'claude-opus-5': 1_000_000,
383
+ 'claude-opus-4-8': 1_000_000,
384
+ 'claude-opus-4-7': 1_000_000,
385
+ 'claude-opus-4-6': 1_000_000,
386
+ 'claude-sonnet-5': 1_000_000,
387
+ 'claude-sonnet-4-6': 1_000_000,
388
+ 'claude-haiku-4-5': 200_000,
389
+ // Anthropic — older dated snapshots, kept so pinned configs still resolve.
347
390
  'claude-opus-4-20250514': 200_000,
348
391
  'claude-sonnet-4-20250514': 200_000,
349
392
  'claude-haiku-4-20250506': 200_000,
@@ -493,6 +536,14 @@ export const CREWLY_AGENT_DEFAULTS = {
493
536
  MAX_HISTORY_MESSAGES: 100,
494
537
  /** Default compaction threshold (80% of context window) */
495
538
  COMPACTION_THRESHOLD: 0.8,
539
+ /**
540
+ * Characters per token, used ONLY to size the context before the first
541
+ * response gives us a real measurement. Latin text runs about 4 chars per
542
+ * token; CJK about 1.5, so the two are counted separately — a single ratio
543
+ * would misjudge a Chinese system prompt by more than 2x.
544
+ */
545
+ CHARS_PER_TOKEN_LATIN: 4,
546
+ CHARS_PER_TOKEN_CJK: 1.5,
496
547
  /** Default model configuration */
497
548
  DEFAULT_MODEL: {
498
549
  provider: 'google' as ModelProvider,