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
@@ -0,0 +1,755 @@
1
+ /**
2
+ * Thread Status Queue Service
3
+ *
4
+ * Tracks the lifecycle of every inbound message thread across platforms
5
+ * (Slack, GChat, Telegram, etc.). On orchestrator restart, non-terminal
6
+ * threads are recovered and re-enqueued so no user messages are silently dropped.
7
+ *
8
+ * Persistence is debounced and written to ~/.crewly/thread-status-queue.json
9
+ * using atomic file I/O to prevent corruption.
10
+ *
11
+ * @module services/messaging/thread-status-queue
12
+ */
13
+ import { randomUUID } from 'crypto';
14
+ import path from 'path';
15
+ import { THREAD_STATUS_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
16
+ import { LoggerService } from '../core/logger.service.js';
17
+ import { atomicWriteFile, safeReadJson } from '../../utils/file-io.utils.js';
18
+ import { PERSISTED_THREAD_STATUS_VERSION, isPersistedThreadStatusState, isTerminalStatus, isReplyStatus, } from '../../types/thread-status.types.js';
19
+ /** Default follow-up check delay in minutes */
20
+ const FOLLOW_UP_CHECK_DELAY_MINUTES = 5;
21
+ /**
22
+ * Service that maintains a persistent queue of thread statuses.
23
+ * Constructed with a crewly home directory path for disk persistence.
24
+ *
25
+ * Lifecycle: enqueued → delivered → replied_* (terminal or waiting_actions)
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const svc = new ThreadStatusQueueService('/home/user/.crewly');
30
+ * await svc.loadPersistedState();
31
+ *
32
+ * const entry = svc.trackInbound({
33
+ * source: 'slack',
34
+ * threadKey: 'C123:170743.001',
35
+ * conversationId: 'conv-1',
36
+ * messagePreview: 'Deploy the new feature',
37
+ * });
38
+ *
39
+ * svc.markDelivered('C123:170743.001');
40
+ * svc.markReplied('C123:170743.001', 'replied_completed');
41
+ * ```
42
+ */
43
+ export class ThreadStatusQueueService {
44
+ /** Singleton instance */
45
+ static instance;
46
+ /** Logger for this service */
47
+ logger = LoggerService.getInstance().createComponentLogger('ThreadStatusQueueService');
48
+ /** All tracked thread entries, keyed by threadKey for O(1) lookup */
49
+ entries = new Map();
50
+ /** Path to the persistence file, or null if init() has not been called */
51
+ persistPath = null;
52
+ /** Debounce timer for batching persistence writes */
53
+ persistTimer = null;
54
+ /** ISO timestamp of last cleanup run */
55
+ lastCleanupAt = new Date().toISOString();
56
+ /** Scheduler service for creating follow-up checks */
57
+ schedulerService = null;
58
+ /** Event bus for subscribing to message:received events */
59
+ eventBusService = null;
60
+ /** Tracks active follow-up subscriptions keyed by threadKey */
61
+ followUpTracking = new Map();
62
+ /**
63
+ * Creates a new ThreadStatusQueueService.
64
+ * Use getInstance() for singleton access, or construct directly for testing.
65
+ *
66
+ * @param crewlyHome - Optional crewly home directory path for immediate initialization
67
+ */
68
+ constructor(crewlyHome) {
69
+ if (crewlyHome) {
70
+ this.persistPath = path.join(crewlyHome, THREAD_STATUS_CONSTANTS.STORAGE_FILE);
71
+ this.logger.info('Initialized', { persistPath: this.persistPath });
72
+ }
73
+ // Register as singleton so getInstance() returns the fully-initialized instance
74
+ ThreadStatusQueueService.instance = this;
75
+ }
76
+ /**
77
+ * Returns the singleton instance of ThreadStatusQueueService.
78
+ * Call init() after this to set the persistence path.
79
+ *
80
+ * @returns The singleton instance
81
+ */
82
+ static getInstance() {
83
+ if (!ThreadStatusQueueService.instance) {
84
+ ThreadStatusQueueService.instance = new ThreadStatusQueueService();
85
+ }
86
+ return ThreadStatusQueueService.instance;
87
+ }
88
+ /**
89
+ * Resets the singleton instance. For testing only.
90
+ */
91
+ static resetInstance() {
92
+ if (ThreadStatusQueueService.instance) {
93
+ ThreadStatusQueueService.instance.destroy();
94
+ }
95
+ ThreadStatusQueueService.instance = undefined;
96
+ }
97
+ /**
98
+ * Loads persisted state from disk.
99
+ * If the file doesn't exist or is corrupted, starts with an empty queue.
100
+ */
101
+ async loadPersistedState() {
102
+ if (!this.persistPath) {
103
+ this.logger.warn('loadPersistedState called before init — skipping');
104
+ return;
105
+ }
106
+ const defaultState = {
107
+ version: PERSISTED_THREAD_STATUS_VERSION,
108
+ entries: [],
109
+ lastCleanupAt: new Date().toISOString(),
110
+ };
111
+ const state = await safeReadJson(this.persistPath, defaultState, this.logger);
112
+ if (!isPersistedThreadStatusState(state)) {
113
+ this.logger.warn('Invalid persisted state, starting fresh');
114
+ return;
115
+ }
116
+ this.entries.clear();
117
+ for (const entry of state.entries) {
118
+ this.entries.set(entry.threadKey, entry);
119
+ }
120
+ this.lastCleanupAt = state.lastCleanupAt;
121
+ this.logger.info('Loaded persisted state', {
122
+ entryCount: this.entries.size,
123
+ lastCleanupAt: this.lastCleanupAt,
124
+ });
125
+ }
126
+ /**
127
+ * Records a new inbound thread message with status `enqueued`.
128
+ * If a thread with the same threadKey already exists, the existing entry is returned.
129
+ *
130
+ * @param input - Inbound message details
131
+ * @returns The created (or existing) ThreadStatusEntry
132
+ */
133
+ trackInbound(input) {
134
+ const existing = this.entries.get(input.threadKey);
135
+ if (existing) {
136
+ this.logger.debug('Thread already tracked, returning existing', { threadKey: input.threadKey });
137
+ return existing;
138
+ }
139
+ const now = new Date().toISOString();
140
+ const entry = {
141
+ id: randomUUID(),
142
+ source: input.source,
143
+ threadKey: input.threadKey,
144
+ conversationId: input.conversationId,
145
+ status: 'enqueued',
146
+ receivedAt: now,
147
+ updatedAt: now,
148
+ messagePreview: input.messagePreview.slice(0, THREAD_STATUS_CONSTANTS.MAX_PREVIEW_LENGTH),
149
+ retryCount: 0,
150
+ queueMessageId: input.queueMessageId,
151
+ sourceMetadata: input.sourceMetadata,
152
+ };
153
+ this.entries.set(input.threadKey, entry);
154
+ this.schedulePersist();
155
+ this.logger.info('Tracked inbound thread', {
156
+ threadKey: input.threadKey,
157
+ source: input.source,
158
+ conversationId: input.conversationId,
159
+ });
160
+ return entry;
161
+ }
162
+ /**
163
+ * Transitions a thread from `enqueued` (or `error`) to `delivered`.
164
+ * No-op if thread is already in a terminal or later status.
165
+ *
166
+ * @param threadKey - Platform-specific thread identifier
167
+ * @throws Error if threadKey is not found
168
+ */
169
+ markDelivered(threadKey) {
170
+ const entry = this.getOrThrow(threadKey, 'markDelivered');
171
+ if (isTerminalStatus(entry.status) || entry.status === 'delivered') {
172
+ return;
173
+ }
174
+ const now = new Date().toISOString();
175
+ entry.status = 'delivered';
176
+ entry.deliveredAt = now;
177
+ entry.updatedAt = now;
178
+ this.schedulePersist();
179
+ this.logger.info('Marked delivered', { threadKey });
180
+ }
181
+ /**
182
+ * Set the SchedulerService instance for creating follow-up checks.
183
+ * Called during server initialization.
184
+ *
185
+ * @param service - The SchedulerService instance (or compatible interface)
186
+ */
187
+ setSchedulerService(service) {
188
+ this.schedulerService = service;
189
+ }
190
+ /**
191
+ * Set the EventBusService instance for subscribing to message events.
192
+ * Called during server initialization.
193
+ *
194
+ * @param service - The EventBusService instance (or compatible interface)
195
+ */
196
+ setEventBusService(service) {
197
+ this.eventBusService = service;
198
+ }
199
+ /**
200
+ * Transitions a thread to one of the replied_* statuses.
201
+ * Sets the repliedAt timestamp.
202
+ *
203
+ * When status is `replied_to_follow_up`, automatically:
204
+ * 1. Creates a scheduled check (default 5 min) to verify user replied
205
+ * 2. Subscribes to message:received events for this thread's conversation
206
+ * 3. On user reply: cancels the scheduled check and transitions to replied_completed
207
+ *
208
+ * @param threadKey - Platform-specific thread identifier
209
+ * @param status - One of: replied_completed, replied_waiting_actions, replied_to_follow_up
210
+ * @throws Error if threadKey is not found or status is not a valid reply status
211
+ */
212
+ markReplied(threadKey, status) {
213
+ if (!isReplyStatus(status)) {
214
+ throw new Error(`Invalid reply status: ${status}`);
215
+ }
216
+ const entry = this.getOrThrow(threadKey, 'markReplied');
217
+ if (isTerminalStatus(entry.status)) {
218
+ return;
219
+ }
220
+ const now = new Date().toISOString();
221
+ entry.status = status;
222
+ entry.repliedAt = now;
223
+ entry.updatedAt = now;
224
+ this.schedulePersist();
225
+ this.logger.info('Marked replied', { threadKey, status });
226
+ // Sub-task A: Auto-schedule follow-up check and event subscription
227
+ if (status === 'replied_to_follow_up') {
228
+ this.setupFollowUpTracking(threadKey, entry);
229
+ }
230
+ }
231
+ /**
232
+ * Handles a user reply to a follow-up thread.
233
+ * Cancels the scheduled check, removes the event subscription,
234
+ * and transitions the thread to replied_completed (or re-enqueues).
235
+ *
236
+ * @param threadKey - Platform-specific thread identifier
237
+ */
238
+ handleFollowUpReply(threadKey) {
239
+ const tracking = this.followUpTracking.get(threadKey);
240
+ if (!tracking) {
241
+ this.logger.debug('No follow-up tracking found for thread', { threadKey });
242
+ return;
243
+ }
244
+ // Cancel the scheduled check
245
+ if (this.schedulerService) {
246
+ this.schedulerService.cancelCheck(tracking.scheduledCheckId);
247
+ }
248
+ // Remove the event subscription
249
+ if (this.eventBusService) {
250
+ this.eventBusService.unsubscribe(tracking.eventSubscriptionId);
251
+ }
252
+ this.followUpTracking.delete(threadKey);
253
+ // Transition thread to replied_completed
254
+ const entry = this.entries.get(threadKey);
255
+ if (entry && entry.status === 'replied_to_follow_up') {
256
+ entry.status = 'replied_completed';
257
+ entry.updatedAt = new Date().toISOString();
258
+ this.schedulePersist();
259
+ this.logger.info('Follow-up reply received, thread completed', { threadKey });
260
+ }
261
+ }
262
+ /**
263
+ * Returns the active follow-up tracking for a thread, if any.
264
+ * Useful for testing and debugging.
265
+ *
266
+ * @param threadKey - Platform-specific thread identifier
267
+ * @returns The follow-up tracking info, or null
268
+ */
269
+ getFollowUpTracking(threadKey) {
270
+ return this.followUpTracking.get(threadKey) ?? null;
271
+ }
272
+ /**
273
+ * Records that an agent was delegated work from this thread.
274
+ *
275
+ * @param threadKey - Platform-specific thread identifier
276
+ * @param agentSession - Session name of the delegated agent
277
+ * @throws Error if threadKey is not found
278
+ */
279
+ addDelegatedAgent(threadKey, agentSession) {
280
+ const entry = this.getOrThrow(threadKey, 'addDelegatedAgent');
281
+ if (!entry.delegatedAgents) {
282
+ entry.delegatedAgents = [];
283
+ }
284
+ if (!entry.delegatedAgents.includes(agentSession)) {
285
+ entry.delegatedAgents.push(agentSession);
286
+ entry.updatedAt = new Date().toISOString();
287
+ this.schedulePersist();
288
+ this.logger.info('Added delegated agent', { threadKey, agentSession });
289
+ }
290
+ }
291
+ /**
292
+ * Transitions a `replied_waiting_actions` thread to `replied_completed`
293
+ * when all delegated agents have finished their work.
294
+ *
295
+ * @param threadKey - Platform-specific thread identifier
296
+ * @throws Error if threadKey is not found
297
+ */
298
+ markDelegationsComplete(threadKey) {
299
+ const entry = this.getOrThrow(threadKey, 'markDelegationsComplete');
300
+ if (entry.status !== 'replied_waiting_actions') {
301
+ return;
302
+ }
303
+ entry.status = 'replied_completed';
304
+ entry.updatedAt = new Date().toISOString();
305
+ this.schedulePersist();
306
+ this.logger.info('Marked delegations complete', { threadKey });
307
+ }
308
+ /**
309
+ * Returns all entries not in a terminal status. Used for restart recovery.
310
+ *
311
+ * @returns Array of non-terminal ThreadStatusEntry objects
312
+ */
313
+ getPendingThreads() {
314
+ const pending = [];
315
+ for (const entry of this.entries.values()) {
316
+ if (!isTerminalStatus(entry.status)) {
317
+ pending.push(entry);
318
+ }
319
+ }
320
+ return pending;
321
+ }
322
+ /**
323
+ * Returns all entries matching the given status.
324
+ *
325
+ * @param status - The ThreadStatus to filter by
326
+ * @returns Array of matching ThreadStatusEntry objects
327
+ */
328
+ getByStatus(status) {
329
+ const results = [];
330
+ for (const entry of this.entries.values()) {
331
+ if (entry.status === status) {
332
+ results.push(entry);
333
+ }
334
+ }
335
+ return results;
336
+ }
337
+ /**
338
+ * Retrieves a specific entry by threadKey.
339
+ *
340
+ * @param threadKey - Platform-specific thread identifier
341
+ * @returns The entry, or null if not found
342
+ */
343
+ get(threadKey) {
344
+ return this.entries.get(threadKey) ?? null;
345
+ }
346
+ /**
347
+ * Find a thread entry by its conversationId.
348
+ *
349
+ * Useful when the caller has a conversationId (e.g. from chat history)
350
+ * but not the threadKey. Scans all entries — O(n) but the set is small.
351
+ *
352
+ * @param conversationId - The conversation ID to search for
353
+ * @returns The most recently updated matching entry, or null
354
+ */
355
+ getByConversationId(conversationId) {
356
+ let best = null;
357
+ for (const entry of this.entries.values()) {
358
+ if (entry.conversationId === conversationId) {
359
+ if (!best || entry.updatedAt > best.updatedAt) {
360
+ best = entry;
361
+ }
362
+ }
363
+ }
364
+ return best;
365
+ }
366
+ /**
367
+ * Finds a thread status entry by its queueMessageId.
368
+ * Returns the most recently updated entry if multiple match.
369
+ *
370
+ * @param queueMessageId - The queue message ID to search for
371
+ * @returns The most recently updated matching entry, or null
372
+ */
373
+ getByQueueMessageId(queueMessageId) {
374
+ let best = null;
375
+ for (const entry of this.entries.values()) {
376
+ if (entry.queueMessageId === queueMessageId) {
377
+ if (!best || entry.updatedAt > best.updatedAt) {
378
+ best = entry;
379
+ }
380
+ }
381
+ }
382
+ return best;
383
+ }
384
+ /**
385
+ * Expires entries that have been in a non-terminal status longer than maxAgeMinutes.
386
+ * Transitions them to `expired`.
387
+ *
388
+ * @param maxAgeMinutes - Maximum age in minutes (defaults to STALE_TIMEOUT_MINUTES)
389
+ * @returns Number of entries expired
390
+ */
391
+ expireStale(maxAgeMinutes = THREAD_STATUS_CONSTANTS.STALE_TIMEOUT_MINUTES) {
392
+ const cutoff = Date.now() - maxAgeMinutes * 60 * 1000;
393
+ let count = 0;
394
+ for (const entry of this.entries.values()) {
395
+ if (isTerminalStatus(entry.status))
396
+ continue;
397
+ const updatedTime = new Date(entry.updatedAt).getTime();
398
+ if (updatedTime < cutoff) {
399
+ entry.status = 'expired';
400
+ entry.updatedAt = new Date().toISOString();
401
+ count++;
402
+ }
403
+ }
404
+ if (count > 0) {
405
+ this.schedulePersist();
406
+ this.logger.info('Expired stale threads', { count, maxAgeMinutes });
407
+ }
408
+ return count;
409
+ }
410
+ /**
411
+ * Removes terminal entries older than retentionHours.
412
+ * Also enforces MAX_ENTRIES by pruning oldest terminal entries first.
413
+ *
414
+ * @param retentionHours - Hours to retain terminal entries (defaults to CLEANUP_RETENTION_HOURS)
415
+ * @returns Number of entries removed
416
+ */
417
+ cleanup(retentionHours = THREAD_STATUS_CONSTANTS.CLEANUP_RETENTION_HOURS) {
418
+ const cutoff = Date.now() - retentionHours * 60 * 60 * 1000;
419
+ let count = 0;
420
+ // Remove terminal entries older than retention period
421
+ for (const [key, entry] of this.entries) {
422
+ if (isTerminalStatus(entry.status)) {
423
+ const updatedTime = new Date(entry.updatedAt).getTime();
424
+ if (updatedTime < cutoff) {
425
+ this.entries.delete(key);
426
+ count++;
427
+ }
428
+ }
429
+ }
430
+ // Enforce MAX_ENTRIES: prune oldest terminal entries first
431
+ if (this.entries.size > THREAD_STATUS_CONSTANTS.MAX_ENTRIES) {
432
+ const terminalEntries = Array.from(this.entries.entries())
433
+ .filter(([, e]) => isTerminalStatus(e.status))
434
+ .sort(([, a], [, b]) => new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime());
435
+ for (const [key] of terminalEntries) {
436
+ if (this.entries.size <= THREAD_STATUS_CONSTANTS.MAX_ENTRIES)
437
+ break;
438
+ this.entries.delete(key);
439
+ count++;
440
+ }
441
+ }
442
+ if (count > 0) {
443
+ this.lastCleanupAt = new Date().toISOString();
444
+ this.schedulePersist();
445
+ this.logger.info('Cleaned up entries', { removed: count, remaining: this.entries.size });
446
+ }
447
+ return count;
448
+ }
449
+ /**
450
+ * Returns statistics for monitoring the thread status queue.
451
+ *
452
+ * @returns Stats snapshot including total, per-status counts, and oldest pending timestamp
453
+ */
454
+ getStats() {
455
+ const byStatus = {
456
+ enqueued: 0,
457
+ delivered: 0,
458
+ replied_completed: 0,
459
+ replied_waiting_actions: 0,
460
+ replied_to_follow_up: 0,
461
+ expired: 0,
462
+ error: 0,
463
+ };
464
+ let oldestPending = null;
465
+ for (const entry of this.entries.values()) {
466
+ byStatus[entry.status]++;
467
+ if (!isTerminalStatus(entry.status)) {
468
+ if (oldestPending === null || entry.receivedAt < oldestPending) {
469
+ oldestPending = entry.receivedAt;
470
+ }
471
+ }
472
+ }
473
+ return {
474
+ total: this.entries.size,
475
+ byStatus,
476
+ oldestPending,
477
+ };
478
+ }
479
+ /**
480
+ * Initializes the service with a crewly home directory for persistence.
481
+ * Must be called before loadPersistedState() when using getInstance().
482
+ *
483
+ * @param crewlyHome - Absolute path to the crewly home directory (e.g. ~/.crewly)
484
+ */
485
+ init(crewlyHome) {
486
+ this.persistPath = path.join(crewlyHome, THREAD_STATUS_CONSTANTS.STORAGE_FILE);
487
+ this.logger.info('Initialized', { persistPath: this.persistPath });
488
+ }
489
+ /**
490
+ * Public convenience method: optionally re-inits the persist path,
491
+ * then loads persisted state from disk.
492
+ *
493
+ * @param crewlyHome - Optional crewly home directory to re-initialize with
494
+ */
495
+ async load(crewlyHome) {
496
+ if (crewlyHome) {
497
+ this.init(crewlyHome);
498
+ }
499
+ await this.loadPersistedState();
500
+ }
501
+ /**
502
+ * Immediately flushes the current state to disk. Call during graceful shutdown
503
+ * to ensure no in-memory mutations are lost.
504
+ */
505
+ async persist() {
506
+ // Cancel any debounced write — we flush synchronously
507
+ if (this.persistTimer) {
508
+ clearTimeout(this.persistTimer);
509
+ this.persistTimer = null;
510
+ }
511
+ await this.persistToDisk();
512
+ }
513
+ /**
514
+ * Returns all entries in the queue. Used for the thread-status API.
515
+ *
516
+ * @returns Array of all ThreadStatusEntry objects
517
+ */
518
+ getAllEntries() {
519
+ return Array.from(this.entries.values());
520
+ }
521
+ /**
522
+ * Recovers pending threads after an orchestrator restart.
523
+ * Loads persisted state and handles each thread based on its status:
524
+ *
525
+ * 1. **enqueued/delivered/error** — Send a "I'm back online" confirmation
526
+ * via the platform, then re-enqueue for orchestrator processing.
527
+ * 2. **replied_to_follow_up** — Re-setup follow-up tracking (scheduled
528
+ * check + event subscription) to continue waiting for user reply.
529
+ * 3. **replied_waiting_actions** — Check delegated agent statuses. If all
530
+ * agents are done, transition to replied_completed. Otherwise keep waiting.
531
+ * 4. **replied_completed/expired** — Already terminal, skip.
532
+ *
533
+ * @param messageQueueService - The message queue service for re-enqueuing
534
+ * @param options - Optional callbacks for agent status checking and platform confirmations
535
+ * @returns Summary of recovery actions taken
536
+ */
537
+ async recoverPendingThreads(messageQueueService, options) {
538
+ await this.loadPersistedState();
539
+ const pending = this.getPendingThreads();
540
+ let reEnqueued = 0;
541
+ let followUpRestored = 0;
542
+ let waitingActionsChecked = 0;
543
+ let delegationsCompleted = 0;
544
+ for (const entry of pending) {
545
+ // Branch 1: enqueued / delivered / error — confirm + re-enqueue
546
+ if (entry.status === 'enqueued' || entry.status === 'delivered' || entry.status === 'error') {
547
+ // Send platform confirmation if callback provided
548
+ if (options?.confirmCallback) {
549
+ try {
550
+ await options.confirmCallback(entry);
551
+ }
552
+ catch (err) {
553
+ this.logger.warn('Recovery confirm callback failed', {
554
+ threadKey: entry.threadKey,
555
+ error: err instanceof Error ? err.message : String(err),
556
+ });
557
+ }
558
+ }
559
+ // Re-enqueue for orchestrator processing
560
+ messageQueueService.enqueue({
561
+ content: `[RECOVERY] Unreplied thread from ${entry.receivedAt}: ${entry.messagePreview}`,
562
+ conversationId: entry.conversationId,
563
+ source: entry.source,
564
+ sourceMetadata: entry.sourceMetadata,
565
+ });
566
+ reEnqueued++;
567
+ }
568
+ // Branch 2: replied_to_follow_up — re-setup follow-up tracking
569
+ else if (entry.status === 'replied_to_follow_up') {
570
+ this.setupFollowUpTracking(entry.threadKey, entry);
571
+ followUpRestored++;
572
+ }
573
+ // Branch 3: replied_waiting_actions — check delegated agents
574
+ else if (entry.status === 'replied_waiting_actions') {
575
+ waitingActionsChecked++;
576
+ if (options?.agentStatusChecker && entry.delegatedAgents && entry.delegatedAgents.length > 0) {
577
+ const statuses = await Promise.all(entry.delegatedAgents.map((agent) => options.agentStatusChecker.getAgentWorkingStatus(agent)));
578
+ const allDone = statuses.every((status) => status === 'idle' || status === 'unknown');
579
+ if (allDone) {
580
+ entry.status = 'replied_completed';
581
+ entry.updatedAt = new Date().toISOString();
582
+ delegationsCompleted++;
583
+ this.logger.info('All delegated agents done on recovery, completing thread', {
584
+ threadKey: entry.threadKey,
585
+ agents: entry.delegatedAgents,
586
+ });
587
+ }
588
+ else {
589
+ // Agents still working — notify orchestrator to keep watching
590
+ messageQueueService.enqueue({
591
+ content: `[RECOVERY] Thread ${entry.threadKey} is waiting for agents: ${entry.delegatedAgents.join(', ')}. Some are still working.`,
592
+ conversationId: 'system',
593
+ source: 'system_event',
594
+ targetSession: ORCHESTRATOR_SESSION_NAME,
595
+ });
596
+ }
597
+ }
598
+ else {
599
+ // No agent status checker or no delegated agents — notify orchestrator
600
+ messageQueueService.enqueue({
601
+ content: `[RECOVERY] Thread ${entry.threadKey} is waiting for agents: ${entry.delegatedAgents?.join(', ') || 'unknown'}. Check their status.`,
602
+ conversationId: 'system',
603
+ source: 'system_event',
604
+ targetSession: ORCHESTRATOR_SESSION_NAME,
605
+ });
606
+ }
607
+ }
608
+ // Branch 4: replied_completed / expired — skip (already terminal)
609
+ // These are filtered out by getPendingThreads(), but defensive check
610
+ }
611
+ if (reEnqueued > 0 || followUpRestored > 0 || delegationsCompleted > 0) {
612
+ this.schedulePersist();
613
+ }
614
+ const expired = this.expireStale();
615
+ const cleaned = this.cleanup();
616
+ this.logger.info('Pending thread recovery complete', {
617
+ loaded: this.entries.size,
618
+ reEnqueued,
619
+ followUpRestored,
620
+ waitingActionsChecked,
621
+ delegationsCompleted,
622
+ expired,
623
+ cleaned,
624
+ });
625
+ return {
626
+ loaded: this.entries.size,
627
+ reEnqueued,
628
+ followUpRestored,
629
+ waitingActionsChecked,
630
+ delegationsCompleted,
631
+ expired,
632
+ cleaned,
633
+ };
634
+ }
635
+ /**
636
+ * Cleans up timers and follow-up tracking. Call on shutdown.
637
+ */
638
+ destroy() {
639
+ if (this.persistTimer) {
640
+ clearTimeout(this.persistTimer);
641
+ this.persistTimer = null;
642
+ }
643
+ // Cancel all active follow-up tracking
644
+ for (const [threadKey, tracking] of this.followUpTracking) {
645
+ if (this.schedulerService) {
646
+ this.schedulerService.cancelCheck(tracking.scheduledCheckId);
647
+ }
648
+ if (this.eventBusService) {
649
+ this.eventBusService.unsubscribe(tracking.eventSubscriptionId);
650
+ }
651
+ }
652
+ this.followUpTracking.clear();
653
+ }
654
+ // ===========================================================================
655
+ // Private Helpers
656
+ // ===========================================================================
657
+ /**
658
+ * Retrieves an entry by threadKey or throws an error with a descriptive message.
659
+ *
660
+ * @param threadKey - Platform-specific thread identifier
661
+ * @param caller - Name of the calling method (for error messages)
662
+ * @returns The found entry
663
+ * @throws Error if entry is not found
664
+ */
665
+ getOrThrow(threadKey, caller) {
666
+ const entry = this.entries.get(threadKey);
667
+ if (!entry) {
668
+ throw new Error(`${caller}: thread not found — threadKey=${threadKey}`);
669
+ }
670
+ return entry;
671
+ }
672
+ /**
673
+ * Sets up follow-up tracking for a replied_to_follow_up thread.
674
+ * Creates a scheduled check and an event subscription so that if
675
+ * the user replies, the check is cancelled and the thread is completed.
676
+ *
677
+ * @param threadKey - Platform-specific thread identifier
678
+ * @param entry - The thread status entry
679
+ */
680
+ setupFollowUpTracking(threadKey, entry) {
681
+ // Schedule a check to verify user replied
682
+ let scheduledCheckId = '';
683
+ if (this.schedulerService) {
684
+ scheduledCheckId = this.schedulerService.scheduleCheck(ORCHESTRATOR_SESSION_NAME, FOLLOW_UP_CHECK_DELAY_MINUTES, `[FOLLOW-UP CHECK] Thread ${threadKey} (conv: ${entry.conversationId}) asked user for clarification ${FOLLOW_UP_CHECK_DELAY_MINUTES}m ago. Preview: "${entry.messagePreview}". Check if user has replied.`, 'check-in', { label: `follow-up:${threadKey}` });
685
+ this.logger.info('Scheduled follow-up check', {
686
+ threadKey,
687
+ scheduledCheckId,
688
+ delayMinutes: FOLLOW_UP_CHECK_DELAY_MINUTES,
689
+ });
690
+ }
691
+ else {
692
+ this.logger.warn('SchedulerService not set, skipping follow-up check scheduling', { threadKey });
693
+ }
694
+ // Subscribe to message events for this thread's conversation
695
+ let eventSubscriptionId = '';
696
+ if (this.eventBusService) {
697
+ const sub = this.eventBusService.subscribe({
698
+ eventType: ['message:received', 'agent:idle'],
699
+ filter: { conversationId: entry.conversationId },
700
+ subscriberSession: ORCHESTRATOR_SESSION_NAME,
701
+ oneShot: true,
702
+ ttlMinutes: FOLLOW_UP_CHECK_DELAY_MINUTES + 5,
703
+ messageTemplate: `[FOLLOW-UP REPLY] User replied to thread ${threadKey}. Original: "${entry.messagePreview}"`,
704
+ });
705
+ eventSubscriptionId = sub.id;
706
+ this.logger.info('Subscribed to follow-up reply events', {
707
+ threadKey,
708
+ subscriptionId: eventSubscriptionId,
709
+ });
710
+ }
711
+ else {
712
+ this.logger.warn('EventBusService not set, skipping follow-up event subscription', { threadKey });
713
+ }
714
+ if (scheduledCheckId || eventSubscriptionId) {
715
+ this.followUpTracking.set(threadKey, {
716
+ scheduledCheckId,
717
+ eventSubscriptionId,
718
+ });
719
+ }
720
+ }
721
+ /**
722
+ * Schedules a debounced persistence write to disk.
723
+ * Multiple mutations within PERSIST_DEBOUNCE_MS are batched into a single write.
724
+ */
725
+ schedulePersist() {
726
+ if (!this.persistPath)
727
+ return;
728
+ if (this.persistTimer) {
729
+ clearTimeout(this.persistTimer);
730
+ }
731
+ this.persistTimer = setTimeout(() => {
732
+ this.persistTimer = null;
733
+ this.persistToDisk().catch((err) => {
734
+ this.logger.warn('Failed to persist thread status queue', { error: String(err) });
735
+ });
736
+ }, THREAD_STATUS_CONSTANTS.PERSIST_DEBOUNCE_MS);
737
+ }
738
+ /**
739
+ * Writes the current queue state to disk atomically.
740
+ */
741
+ async persistToDisk() {
742
+ if (!this.persistPath) {
743
+ this.logger.warn('persistToDisk called before init — skipping');
744
+ return;
745
+ }
746
+ const state = {
747
+ version: PERSISTED_THREAD_STATUS_VERSION,
748
+ entries: Array.from(this.entries.values()),
749
+ lastCleanupAt: this.lastCleanupAt,
750
+ };
751
+ await atomicWriteFile(this.persistPath, JSON.stringify(state, null, 2));
752
+ this.logger.debug('Persisted to disk', { entryCount: state.entries.length });
753
+ }
754
+ }
755
+ //# sourceMappingURL=thread-status-queue.service.js.map