crewly 1.20.195 → 1.20.196

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 (584) hide show
  1. package/config/constants.ts +68 -0
  2. package/config/hooks/agent-status/report.sh +31 -12
  3. package/config/hooks/subagent-guard/subagent.sh +25 -1
  4. package/config/roles/orchestrator/fragments/lifecycle.md +1 -1
  5. package/config/roles/orchestrator/prompt.md +3 -3
  6. package/config/skills/_common/lib.sh +28 -5
  7. package/config/skills/_common/lib.test.sh +32 -1
  8. package/config/skills/agent/core/create-intent-tasks/execute.sh +2 -0
  9. package/config/skills/agent/core/decompose-intent/execute.sh +2 -0
  10. package/config/skills/agent/core/experiment-card/SKILL.md +29 -1
  11. package/config/skills/agent/core/experiment-card/execute.sh +35 -1
  12. package/config/skills/agent/core/experiment-card/execute.test.sh +11 -0
  13. package/config/skills/agent/core/project-tickets/SKILL.md +35 -2
  14. package/config/skills/agent/core/project-tickets/execute.sh +59 -6
  15. package/config/skills/agent/core/project-tickets/execute.test.sh +24 -0
  16. package/config/skills/agent/core/send-message/execute.sh +16 -0
  17. package/config/skills/agent/core/send-message/execute.test.sh +10 -0
  18. package/config/skills/agent/core/trace-read/SKILL.md +117 -0
  19. package/config/skills/agent/core/trace-read/execute.sh +116 -0
  20. package/config/skills/agent/core/update-intent-task/execute.sh +2 -0
  21. package/config/skills/agent/marketing/submit-for-approval/execute.sh +3 -2
  22. package/config/skills/orchestrator/decompose-mission/execute.sh +2 -0
  23. package/config/skills/orchestrator/decompose-okr/execute.sh +1 -0
  24. package/config/skills/orchestrator/design-team/execute.sh +2 -0
  25. package/config/skills/orchestrator/measure-kr/execute.sh +2 -0
  26. package/config/skills/orchestrator/review-mission/execute.sh +2 -0
  27. package/config/skills/orchestrator/send-message/execute.sh +10 -2
  28. package/config/skills/orchestrator/send-message/execute.test.sh +9 -0
  29. package/config/skills/team-leader/design-checklist/execute.sh +2 -0
  30. package/dist/backend/backend/src/constants.d.ts +223 -5
  31. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  32. package/dist/backend/backend/src/constants.js +206 -6
  33. package/dist/backend/backend/src/constants.js.map +1 -1
  34. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts +9 -3
  35. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +38 -5
  37. package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts +4 -9
  39. package/dist/backend/backend/src/controllers/approvals/approvals.controller.d.ts.map +1 -1
  40. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js +6 -14
  41. package/dist/backend/backend/src/controllers/approvals/approvals.controller.js.map +1 -1
  42. package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts +64 -0
  43. package/dist/backend/backend/src/controllers/auth/owner-session.controller.d.ts.map +1 -0
  44. package/dist/backend/backend/src/controllers/auth/owner-session.controller.js +164 -0
  45. package/dist/backend/backend/src/controllers/auth/owner-session.controller.js.map +1 -0
  46. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  47. package/dist/backend/backend/src/controllers/browser/browser.routes.js +18 -5
  48. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  49. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  50. package/dist/backend/backend/src/controllers/canva/canva.routes.js +8 -1
  51. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  52. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  53. package/dist/backend/backend/src/controllers/chat/chat.controller.js +10 -1
  54. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  55. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -1
  56. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +3 -5
  57. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -1
  58. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -2
  59. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  60. package/dist/backend/backend/src/controllers/connector/connector.controller.js +17 -2
  61. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  62. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -1
  63. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +2 -3
  64. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -1
  65. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +4 -2
  66. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
  67. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +31 -20
  68. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
  69. package/dist/backend/backend/src/controllers/desktop/desktop.controller.d.ts.map +1 -1
  70. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js +16 -0
  71. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js.map +1 -1
  72. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  73. package/dist/backend/backend/src/controllers/google/google.controller.js +9 -5
  74. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  75. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  76. package/dist/backend/backend/src/controllers/google/google.routes.js +16 -3
  77. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  78. package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -1
  79. package/dist/backend/backend/src/controllers/harness/harness.controller.js +3 -5
  80. package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -1
  81. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  82. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +8 -1
  83. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  84. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +1 -1
  85. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
  86. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
  87. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +3 -5
  88. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
  89. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -1
  90. package/dist/backend/backend/src/controllers/people/people.routes.js +3 -5
  91. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -1
  92. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +35 -2
  93. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  94. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +138 -4
  95. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  96. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -0
  97. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
  98. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +7 -1
  99. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
  100. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -1
  101. package/dist/backend/backend/src/controllers/request/open-items.controller.js +2 -4
  102. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  103. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +1 -1
  104. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -1
  105. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  106. package/dist/backend/backend/src/controllers/slack/slack.controller.js +9 -0
  107. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  108. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  109. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +11 -0
  110. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  111. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +6 -4
  112. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
  113. package/dist/backend/backend/src/controllers/system/system-control.controller.js +20 -13
  114. package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
  115. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  116. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -7
  117. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  118. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
  119. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +5 -7
  120. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
  121. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +30 -4
  122. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -1
  123. package/dist/backend/backend/src/controllers/trace/trace.controller.js +278 -10
  124. package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -1
  125. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +3 -3
  126. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -1
  127. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +4 -2
  128. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -1
  129. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
  130. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +10 -2
  131. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
  132. package/dist/backend/backend/src/index.d.ts +34 -0
  133. package/dist/backend/backend/src/index.d.ts.map +1 -1
  134. package/dist/backend/backend/src/index.js +313 -42
  135. package/dist/backend/backend/src/index.js.map +1 -1
  136. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts +31 -0
  137. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
  138. package/dist/backend/backend/src/middleware/agent-origin-correction.js +31 -0
  139. package/dist/backend/backend/src/middleware/agent-origin-correction.js.map +1 -0
  140. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +6 -0
  141. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
  142. package/dist/backend/backend/src/middleware/agent-origin.middleware.js +4 -1
  143. package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
  144. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +20 -17
  145. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
  146. package/dist/backend/backend/src/middleware/api-token.middleware.js +27 -37
  147. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
  148. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +213 -0
  149. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
  150. package/dist/backend/backend/src/middleware/caller-identity.middleware.js +481 -0
  151. package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -0
  152. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts +67 -0
  153. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts.map +1 -0
  154. package/dist/backend/backend/src/middleware/caller-identity.testing.js +108 -0
  155. package/dist/backend/backend/src/middleware/caller-identity.testing.js.map +1 -0
  156. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  157. package/dist/backend/backend/src/services/agent/agent-registration.service.js +12 -2
  158. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  159. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  160. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  161. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +19 -10
  162. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  163. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  164. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  165. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  166. package/dist/backend/backend/src/services/agent/restore-filter.d.ts +5 -2
  167. package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
  168. package/dist/backend/backend/src/services/agent/restore-filter.js +5 -2
  169. package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
  170. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  171. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  172. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  173. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  174. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  175. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  176. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  177. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  178. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  179. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  180. package/dist/backend/backend/src/services/chat/chat.service.d.ts +99 -2
  181. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  182. package/dist/backend/backend/src/services/chat/chat.service.js +265 -40
  183. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  184. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  185. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  186. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  187. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  188. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  189. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  190. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  191. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  192. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  193. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  194. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  195. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  196. package/dist/backend/backend/src/services/chat-v2/types.d.ts +0 -1
  197. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
  198. package/dist/backend/backend/src/services/chat-v2/types.js +0 -1
  199. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
  200. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  201. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  202. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  203. package/dist/backend/backend/src/services/core/api-token.service.d.ts +28 -0
  204. package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
  205. package/dist/backend/backend/src/services/core/api-token.service.js +46 -0
  206. package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
  207. package/dist/backend/backend/src/services/core/dashboard-build.d.ts +49 -0
  208. package/dist/backend/backend/src/services/core/dashboard-build.d.ts.map +1 -0
  209. package/dist/backend/backend/src/services/core/dashboard-build.js +68 -0
  210. package/dist/backend/backend/src/services/core/dashboard-build.js.map +1 -0
  211. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts +127 -0
  212. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  213. package/dist/backend/backend/src/services/core/owner-auth.service.js +205 -0
  214. package/dist/backend/backend/src/services/core/owner-auth.service.js.map +1 -0
  215. package/dist/backend/backend/src/services/core/peer-process.service.d.ts +168 -0
  216. package/dist/backend/backend/src/services/core/peer-process.service.d.ts.map +1 -0
  217. package/dist/backend/backend/src/services/core/peer-process.service.js +352 -0
  218. package/dist/backend/backend/src/services/core/peer-process.service.js.map +1 -0
  219. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +97 -1
  220. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
  221. package/dist/backend/backend/src/services/experiments/experiment.service.js +372 -1
  222. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
  223. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -1
  224. package/dist/backend/backend/src/services/experiments/experiment.wiring.js +19 -2
  225. package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -1
  226. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  227. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -1
  228. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  229. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  230. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  231. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  232. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  233. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  234. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  235. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  236. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  237. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  238. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  239. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +391 -0
  240. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  241. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +35 -1
  242. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  243. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +138 -2
  244. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  245. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  246. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  247. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  248. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  249. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts +82 -0
  250. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts.map +1 -0
  251. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js +141 -0
  252. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js.map +1 -0
  253. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +51 -1
  254. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
  255. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +118 -2
  256. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
  257. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts +103 -0
  258. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts.map +1 -0
  259. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js +86 -0
  260. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js.map +1 -0
  261. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +57 -0
  262. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  263. package/dist/backend/backend/src/services/open-items/open-items.service.js +100 -4
  264. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  265. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  266. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +13 -0
  267. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  268. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  269. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  270. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +42 -3
  271. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  272. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -1
  273. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +2 -1
  274. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -1
  275. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  276. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +3 -0
  277. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  278. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts +156 -0
  279. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts.map +1 -0
  280. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +308 -0
  281. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -0
  282. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +212 -0
  283. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -0
  284. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +515 -0
  285. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -0
  286. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +186 -0
  287. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -0
  288. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +341 -0
  289. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -0
  290. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +309 -0
  291. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  292. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +726 -1
  293. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  294. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  295. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  296. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  297. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  298. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +61 -3
  299. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -1
  300. package/dist/backend/backend/src/services/restart/interrupted-turns.js +106 -9
  301. package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -1
  302. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  303. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  304. package/dist/backend/backend/src/services/restart/restart-drain.service.js +37 -5
  305. package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -1
  306. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts +62 -0
  307. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts.map +1 -0
  308. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js +126 -0
  309. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js.map +1 -0
  310. package/dist/backend/backend/src/services/restart/turn-probe.d.ts +17 -2
  311. package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -1
  312. package/dist/backend/backend/src/services/restart/turn-probe.js +29 -4
  313. package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -1
  314. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  315. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
  316. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  317. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  318. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  319. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +66 -3
  320. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  321. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  322. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  323. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +200 -41
  324. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  325. package/dist/backend/backend/src/services/slack/slack.service.d.ts +18 -0
  326. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  327. package/dist/backend/backend/src/services/slack/slack.service.js +32 -0
  328. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  329. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts +99 -0
  330. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts.map +1 -0
  331. package/dist/backend/backend/src/services/trace/trace-analysis.service.js +148 -0
  332. package/dist/backend/backend/src/services/trace/trace-analysis.service.js.map +1 -0
  333. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +17 -0
  334. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  335. package/dist/backend/backend/src/services/trace/trace-context.service.js +58 -1
  336. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
  337. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +4 -0
  338. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -1
  339. package/dist/backend/backend/src/services/trace/trace-http.middleware.js +32 -2
  340. package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -1
  341. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts +262 -0
  342. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -0
  343. package/dist/backend/backend/src/services/trace/trace-metrics.js +810 -0
  344. package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -0
  345. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +48 -0
  346. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  347. package/dist/backend/backend/src/services/trace/trace-recorder.js +121 -1
  348. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
  349. package/dist/backend/backend/src/services/trace/trace-store.d.ts +40 -1
  350. package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -1
  351. package/dist/backend/backend/src/services/trace/trace-store.js +126 -14
  352. package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -1
  353. package/dist/backend/backend/src/services/trace/trace-summary.d.ts +77 -0
  354. package/dist/backend/backend/src/services/trace/trace-summary.d.ts.map +1 -0
  355. package/dist/backend/backend/src/services/trace/trace-summary.js +239 -0
  356. package/dist/backend/backend/src/services/trace/trace-summary.js.map +1 -0
  357. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts +74 -0
  358. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts.map +1 -0
  359. package/dist/backend/backend/src/services/trace/trace-timeline.js +162 -0
  360. package/dist/backend/backend/src/services/trace/trace-timeline.js.map +1 -0
  361. package/dist/backend/backend/src/services/trace/trace.types.d.ts +22 -3
  362. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
  363. package/dist/backend/backend/src/services/trace/trace.types.js +20 -1
  364. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
  365. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts +80 -0
  366. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts.map +1 -0
  367. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js +184 -0
  368. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js.map +1 -0
  369. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +7 -0
  370. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
  371. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +16 -0
  372. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
  373. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +16 -0
  374. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
  375. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
  376. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
  377. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +2 -1
  378. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
  379. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +8 -0
  380. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  381. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +24 -2
  382. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  383. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +4 -3
  384. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -1
  385. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +3 -2
  386. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -1
  387. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  388. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  389. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  390. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  391. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
  392. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  393. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  394. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
  395. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  396. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -1
  397. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +2 -1
  398. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -1
  399. package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
  400. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  401. package/dist/backend/backend/src/types/experiment.types.d.ts +57 -0
  402. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
  403. package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
  404. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  405. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  406. package/dist/backend/backend/src/types/ticket-autopilot.types.js +14 -0
  407. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  408. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +4 -0
  409. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  410. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +1 -1
  411. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  412. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -0
  413. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  414. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +44 -37
  415. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  416. package/dist/backend/backend/src/utils/agent-caller.utils.js +48 -42
  417. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  418. package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -1
  419. package/dist/backend/backend/src/utils/secret-env.js +8 -1
  420. package/dist/backend/backend/src/utils/secret-env.js.map +1 -1
  421. package/dist/backend/build-info.json +2 -2
  422. package/dist/backend/config/constants.d.ts +67 -0
  423. package/dist/backend/config/constants.d.ts.map +1 -1
  424. package/dist/backend/config/constants.js +67 -0
  425. package/dist/backend/config/constants.js.map +1 -1
  426. package/dist/cli/backend/src/constants.d.ts +223 -5
  427. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  428. package/dist/cli/backend/src/constants.js +206 -6
  429. package/dist/cli/backend/src/constants.js.map +1 -1
  430. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  431. package/dist/cli/backend/src/services/agent/agent-registration.service.js +12 -2
  432. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  433. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  434. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  435. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +19 -10
  436. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  437. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  438. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  439. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  440. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  441. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  442. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  443. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  444. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  445. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  446. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  447. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  448. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  449. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  450. package/dist/cli/backend/src/services/chat/chat.service.d.ts +99 -2
  451. package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -1
  452. package/dist/cli/backend/src/services/chat/chat.service.js +265 -40
  453. package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -1
  454. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  455. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  456. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  457. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  458. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  459. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  460. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  461. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  462. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  463. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  464. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  465. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  466. package/dist/cli/backend/src/services/chat-v2/types.d.ts +0 -1
  467. package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -1
  468. package/dist/cli/backend/src/services/chat-v2/types.js +0 -1
  469. package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -1
  470. package/dist/cli/backend/src/services/core/api-token.service.d.ts +28 -0
  471. package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
  472. package/dist/cli/backend/src/services/core/api-token.service.js +46 -0
  473. package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
  474. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts +127 -0
  475. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  476. package/dist/cli/backend/src/services/core/owner-auth.service.js +205 -0
  477. package/dist/cli/backend/src/services/core/owner-auth.service.js.map +1 -0
  478. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  479. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  480. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  481. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  482. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  483. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  484. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  485. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  486. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  487. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  488. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +391 -0
  489. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  490. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  491. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  492. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  493. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  494. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +57 -0
  495. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  496. package/dist/cli/backend/src/services/open-items/open-items.service.js +100 -4
  497. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  498. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  499. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  500. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +42 -3
  501. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  502. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  503. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  504. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  505. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  506. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  507. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  508. package/dist/cli/backend/src/services/restart/restart-drain.service.js +37 -5
  509. package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -1
  510. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  511. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  512. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +66 -3
  513. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  514. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  515. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  516. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +200 -41
  517. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  518. package/dist/cli/backend/src/services/slack/slack.service.d.ts +18 -0
  519. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  520. package/dist/cli/backend/src/services/slack/slack.service.js +32 -0
  521. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  522. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +17 -0
  523. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  524. package/dist/cli/backend/src/services/trace/trace-context.service.js +58 -1
  525. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
  526. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +48 -0
  527. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  528. package/dist/cli/backend/src/services/trace/trace-recorder.js +121 -1
  529. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
  530. package/dist/cli/backend/src/services/trace/trace-store.d.ts +40 -1
  531. package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -1
  532. package/dist/cli/backend/src/services/trace/trace-store.js +126 -14
  533. package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -1
  534. package/dist/cli/backend/src/services/trace/trace.types.d.ts +22 -3
  535. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
  536. package/dist/cli/backend/src/services/trace/trace.types.js +20 -1
  537. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
  538. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  539. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  540. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  541. package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
  542. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  543. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  544. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  545. package/dist/cli/backend/src/types/ticket-autopilot.types.js +14 -0
  546. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  547. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +4 -0
  548. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  549. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +1 -1
  550. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  551. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -0
  552. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  553. package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -1
  554. package/dist/cli/backend/src/utils/secret-env.js +8 -1
  555. package/dist/cli/backend/src/utils/secret-env.js.map +1 -1
  556. package/dist/cli/cli/src/commands/service.d.ts +12 -0
  557. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  558. package/dist/cli/cli/src/commands/service.js +36 -2
  559. package/dist/cli/cli/src/commands/service.js.map +1 -1
  560. package/dist/cli/cli/src/index.js +4 -0
  561. package/dist/cli/cli/src/index.js.map +1 -1
  562. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts +41 -0
  563. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts.map +1 -0
  564. package/dist/cli/cli/src/utils/owner-token-fetch.js +83 -0
  565. package/dist/cli/cli/src/utils/owner-token-fetch.js.map +1 -0
  566. package/dist/cli/cli/src/utils/safe-shutdown.d.ts +13 -3
  567. package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -1
  568. package/dist/cli/cli/src/utils/safe-shutdown.js +26 -4
  569. package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -1
  570. package/dist/cli/config/constants.d.ts +67 -0
  571. package/dist/cli/config/constants.d.ts.map +1 -1
  572. package/dist/cli/config/constants.js +67 -0
  573. package/dist/cli/config/constants.js.map +1 -1
  574. package/frontend/dist/assets/index-bfa0e2e8.css +42 -0
  575. package/frontend/dist/assets/{index-800118ca.js → index-edfa8e04.js} +285 -285
  576. package/frontend/dist/index.html +2 -2
  577. package/package.json +1 -1
  578. package/packages/crewly-agent/src/runtime/api-client.test.ts +42 -0
  579. package/packages/crewly-agent/src/runtime/api-client.ts +6 -0
  580. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts +0 -52
  581. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts.map +0 -1
  582. package/dist/backend/backend/src/services/v3/request-notification.service.js +0 -161
  583. package/dist/backend/backend/src/services/v3/request-notification.service.js.map +0 -1
  584. package/frontend/dist/assets/index-5e967795.css +0 -42
@@ -23,7 +23,7 @@ import { TerminalGateway, setTerminalGateway } from './websocket/terminal.gatewa
23
23
  import { initializeChatGateway } from './websocket/chat.gateway.js';
24
24
  import { LoggerService } from './services/core/logger.service.js';
25
25
  import { retryWithBackoff } from './services/core/retry.util.js';
26
- import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, OWNER_MESSAGE_WATCHDOG_CONSTANTS, CLOUD_DISCONNECT_NOTICE_CONSTANTS, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, API_SECURITY_CONSTANTS, } from './constants.js';
26
+ import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, OWNER_MESSAGE_WATCHDOG_CONSTANTS, TURN_STATE_CONSTANTS, CLOUD_DISCONNECT_NOTICE_CONSTANTS, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, API_SECURITY_CONSTANTS, } from './constants.js';
27
27
  import { getSettingsService } from './services/settings/index.js';
28
28
  import { MemoryService } from './services/memory/memory.service.js';
29
29
  import { getImprovementStartupService } from './services/orchestrator/improvement-startup.service.js';
@@ -68,7 +68,7 @@ import { getSlackAutoWorkingService } from './services/slack/slack-auto-working.
68
68
  import { getSlackAgentDmService } from './services/slack/slack-agent-dm.service.js';
69
69
  import { sendBootAnnouncement, isFirstBoot, markBooted } from './services/boot/boot-announce.service.js';
70
70
  import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-queue.service.js';
71
- import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, EXPERIMENT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS, CODEX_USAGE_SYNC_CONSTANTS, ANTIGRAVITY_USAGE_SYNC_CONSTANTS } from './constants.js';
71
+ import { SUB_AGENT_QUEUE_CONSTANTS, CHAT_CONTEXT_CONSTANTS, SAFE_RESTART, AUTO_UPDATE_CONSTANTS, PROCESS_EXIT_CODES, CLAUDE_STARTUP_CONSTANTS, WEB_CONSTANTS, TICKET_CONSTANTS, UNASSIGNED_ROUTE_CONSTANTS, CLOUD_TALK_CONSTANTS, STANDING_ANSWERS_CONSTANTS, TICKET_AUTOPILOT_CONSTANTS, EXPERIMENT_CONSTANTS, WORK_ITEM_DESTINATION_CONSTANTS, CODEX_USAGE_SYNC_CONSTANTS, ANTIGRAVITY_USAGE_SYNC_CONSTANTS, OWNER_AUTH_CONSTANTS } from './constants.js';
72
72
  import { PtyActivityTrackerService } from './services/agent/pty-activity-tracker.service.js';
73
73
  import { InFlightTurnTracker } from './services/restart/in-flight-turn-tracker.service.js';
74
74
  import { TicketIntakeService, setTicketIntakeService, resolveTicketIdForSession, } from './services/v3/ticket-intake.service.js';
@@ -79,8 +79,12 @@ import { activeAcceptance, formatTicketMarker, formatTicketNumber } from './type
79
79
  import { createWorkItem, TERMINAL_WORK_ITEM_STATUSES } from './types/v2/work-item.types.js';
80
80
  import { runPoolArchiveMigration } from './services/task-pool/pool-archive-migration.js';
81
81
  import { createPtyTurnProbe } from './services/restart/turn-probe.js';
82
- import { RestartDrainService, resolveRestartDrainMs } from './services/restart/restart-drain.service.js';
83
- import { interruptedTurnsPath, loadInterruptedTurns, saveInterruptedTurns, writeInterruptedTurns, resumeInterruptedTurns, } from './services/restart/interrupted-turns.js';
82
+ import { RestartDrainService, resolveRestartDrainMs, resolveBackgroundDrainMs, } from './services/restart/restart-drain.service.js';
83
+ import { interruptedTurnsPath, loadInterruptedTurns, saveInterruptedTurns, writeInterruptedTurns, resumeInterruptedTurns, planCommitmentNotes, } from './services/restart/interrupted-turns.js';
84
+ import { AgentTurnStateService } from './services/monitoring/agent-turn-state.js';
85
+ import { DeferredIdleSettle } from './services/monitoring/deferred-idle-settle.js';
86
+ import { resolveSupervisorStopBudgetMs, capDrainToSupervisor } from './services/restart/supervisor-stop-budget.js';
87
+ import { findClaudeTranscript, defaultClaudeHome } from './services/agent/runtime-session-recovery.js';
84
88
  import { DeviceIdentityService } from './services/cloud/device-identity.service.js';
85
89
  import { CloudSyncService } from './services/cloud/cloud-sync.service.js';
86
90
  import { SlackThreadStoreService, setSlackThreadStore, getSlackThreadStore } from './services/slack/slack-thread-store.service.js';
@@ -95,9 +99,13 @@ import { setMessageQueueService as setMessagingControllerQueueService } from './
95
99
  import { SystemResourceAlertService } from './services/monitoring/system-resource-alert.service.js';
96
100
  import { TokenUsageService } from './services/monitoring/token-usage.service.js';
97
101
  import { agentHeartbeatMiddleware } from './middleware/agent-heartbeat.middleware.js';
98
- import { agentOriginMiddleware } from './middleware/agent-origin.middleware.js';
102
+ import { agentOriginMiddleware, liveSessionPids } from './middleware/agent-origin.middleware.js';
103
+ import { createCallerIdentityMiddleware } from './middleware/caller-identity.middleware.js';
104
+ import { PeerProcessService } from './services/core/peer-process.service.js';
105
+ import { createOwnerSessionPageMiddleware, createOwnerSessionRouter } from './controllers/auth/owner-session.controller.js';
106
+ import { dashboardBuildHeader, dashboardBuildMessage, loadDashboardEntry } from './services/core/dashboard-build.js';
99
107
  import { apiTokenMiddleware, healthGateMiddleware, socketIoAllowRequest, installWebSocketGate, } from './middleware/api-token.middleware.js';
100
- import { resolveApiToken } from './services/core/api-token.service.js';
108
+ import { getApiTokenFilePath, mirrorEnvTokenToFile, resolveApiToken } from './services/core/api-token.service.js';
101
109
  import { isHeadlessEnvironment, describeNetworkExposure } from './utils/network-exposure.utils.js';
102
110
  import { RedisCacheService } from './services/cache/redis-cache.service.js';
103
111
  import { OrchestratorRestartService } from './services/orchestrator/orchestrator-restart.service.js';
@@ -152,6 +160,7 @@ import { sessionsToRestore } from './services/agent/restore-filter.js';
152
160
  import { ProjectMemoryService } from './services/memory/project-memory.service.js';
153
161
  import { TaskHistorySubscriber } from './services/memory/task-history.subscriber.js';
154
162
  import { TeamHealthWatchdogService, LiveTeamHealthDataProvider, loadTeamHealthConfig, setTeamHealthWatchdogSingleton, getTeamHealthWatchdogSingleton, } from './services/team-health/index.js';
163
+ import { traceTurnActivity } from './services/trace/trace-recorder.js';
155
164
  // ESM __dirname equivalent using import.meta.url
156
165
  const __filename = fileURLToPath(import.meta.url);
157
166
  const __dirname = path.dirname(__filename);
@@ -214,10 +223,33 @@ function cloudHealthBlock() {
214
223
  return { status: 'unknown' };
215
224
  }
216
225
  }
226
+ /**
227
+ * Send an alert to the owner as a Slack notification. Shared by the disk
228
+ * janitor's low-disk notice, critical system alerts (#991) and repeated
229
+ * runtime startup exits (#989), so they all reach an away owner the same way.
230
+ *
231
+ * @param notice - Title, message and whether it is urgent
232
+ * @returns True when it was sent, false when Slack is not connected
233
+ */
234
+ async function slackOwnerAlertNotifier(notice) {
235
+ const slack = getSlackService();
236
+ if (!slack.isConnected())
237
+ return false;
238
+ await slack.sendNotification({
239
+ type: 'alert',
240
+ title: notice.title,
241
+ message: notice.message,
242
+ urgency: notice.urgent ? 'critical' : 'normal',
243
+ timestamp: new Date().toISOString(),
244
+ });
245
+ return true;
246
+ }
217
247
  export class CrewlyServer {
218
248
  app;
219
249
  httpServer;
220
250
  io;
251
+ /** Entry script of the dashboard build this backend serves (null: none built) */
252
+ dashboardEntry = null;
221
253
  config;
222
254
  logger = LoggerService.getInstance().createComponentLogger('CrewlyServer');
223
255
  /** Offline-replay summary from this boot, surfaced in the boot announcement. */
@@ -271,6 +303,21 @@ export class CrewlyServer {
271
303
  lastShutdownSignalAt = 0;
272
304
  /** Interrupted turns loaded at boot, resumed once their agents are back */
273
305
  interruptedTurnsAtBoot = [];
306
+ /** Supervisor's SIGTERM→SIGKILL budget (systemd TimeoutStopUSec), read at boot; null = none / unknown */
307
+ supervisorStopBudgetMs = null;
308
+ /**
309
+ * End-of-turn settling skipped while an agent still had background work,
310
+ * re-checked until that work is gone (specs/2026-10-02-restart-busy-and-resume.md).
311
+ */
312
+ deferredIdleSettle = new DeferredIdleSettle({
313
+ hasBackgroundWork: (sessionName) => AgentTurnStateService.getInstance().hasBackgroundWork(sessionName),
314
+ isMidTurn: (sessionName) => AgentTurnStateService.getInstance().getVerdict(sessionName).state === 'turn',
315
+ settle: (sessionName) => this.settleAfterTurn(sessionName),
316
+ intervalMs: TURN_STATE_CONSTANTS.SETTLE_RECHECK_MS,
317
+ maxWaitMs: TURN_STATE_CONSTANTS.OPEN_WORK_MAX_MS,
318
+ });
319
+ /** Owner promises past due and never nudged at boot; their agents are restored and reminded once */
320
+ openCommitmentsAtBoot = [];
274
321
  healthMonitoringInterval = null;
275
322
  constructor(config) {
276
323
  // Resolve ~ to actual home directory
@@ -535,7 +582,30 @@ export class CrewlyServer {
535
582
  readIntakeLog: () => intakeOutcomeLog.read(),
536
583
  });
537
584
  setOwnerReceiptService(receipt);
538
- startOwnerReceiptSchedule(receipt);
585
+ // #856 follow-up: while the receipt is off, show the owner one real
586
+ // sample on a decision card and let him choose (never turned on for him).
587
+ void (async () => {
588
+ const [{ OwnerReceiptFormatAsk }, { DecisionService }] = await Promise.all([
589
+ import('./services/v3/owner-receipt/owner-receipt-format-ask.js'),
590
+ import('./services/decisions/decision.service.js'),
591
+ ]);
592
+ const formatAsk = new OwnerReceiptFormatAsk({
593
+ receipt,
594
+ decisions: () => DecisionService.getInstance(),
595
+ logger: LoggerService.getInstance().createComponentLogger('OwnerReceiptFormat'),
596
+ });
597
+ DecisionService.registerKindHandler('owner_receipt_format', formatAsk);
598
+ startOwnerReceiptSchedule({
599
+ tick: async () => {
600
+ const sent = await receipt.tick();
601
+ await formatAsk.tick();
602
+ return sent;
603
+ },
604
+ });
605
+ })().catch((err) => {
606
+ this.logger.warn('Owner receipt format ask not wired; the receipt runs without it', { error: err instanceof Error ? err.message : String(err) });
607
+ startOwnerReceiptSchedule(receipt);
608
+ });
539
609
  }
540
610
  TaskPoolService.getInstance().setTicketResolver((sessionName) => resolveTicketIdForSession(InFlightTurnTracker.getInstance(), sessionName));
541
611
  // Phase 2: answered → 待验收 → 验过了 / 打回 / silence accepts.
@@ -1224,27 +1294,23 @@ export class CrewlyServer {
1224
1294
  // restart. The owner asked a second question while the agent
1225
1295
  // was mid-answer and never got a reply; the message was still
1226
1296
  // in the queue an hour later (2026-09-21, Ella).
1227
- setImmediate(() => void this.flushQueuedAgentMessages(event.sessionName));
1228
- // The turn ended: a "working on it" it never answered means it chose
1229
- // not to reply (an "ok", "好"). Take it down rather than leave a
1230
- // "still working — the reply will follow" that never follows.
1231
- void getSlackTypingPlaceholderService()
1232
- ?.settleTurnWithoutReply(event.sessionName)
1233
- .catch(() => undefined);
1234
- // Same rule for the DM threads it was owed an answer in: one it
1235
- // chose not to answer must not pull a later unattributed answer
1236
- // back into it (2026-09-28).
1237
- void getSlackAgentDmService()
1238
- ?.settleOpenThreads(event.sessionName)
1239
- .catch(() => undefined);
1240
- // Ticket loop Phase 2: an agent that finished its turn has answered
1241
- // the tickets it replied in — submit them (待验收 or done).
1242
- void getTicketReviewService()
1243
- ?.onAgentIdle(event.sessionName)
1244
- .catch(() => undefined);
1297
+ //
1298
+ // An agent whose turn ended with a subagent or background task
1299
+ // still running is not done: the turn that delivers comes when
1300
+ // that work finishes. Leave its placeholders and tickets alone
1301
+ // (2026-10-02, Eve: "the data inventory is still running").
1302
+ // A re-check settles later, once the background work is gone.
1303
+ // An idle while the runtime still reports a turn (a silent
1304
+ // screen, a forced reset) is not a turn end at all: settle
1305
+ // nothing and flush nothing into the live turn; the turn's own
1306
+ // end publishes agent:idle again (PR #1013 review).
1307
+ const idleOutcome = this.deferredIdleSettle.onIdle(event.sessionName);
1308
+ if (idleOutcome !== 'turn') {
1309
+ setImmediate(() => void this.flushQueuedAgentMessages(event.sessionName));
1310
+ }
1245
1311
  // V3: Auto-close open Requests when the orchestrator goes idle
1246
1312
  // Handles direct responses (no WorkItem delegation)
1247
- if (event.sessionName === ORCHESTRATOR_SESSION_NAME) {
1313
+ if (event.sessionName === ORCHESTRATOR_SESSION_NAME && idleOutcome !== 'turn') {
1248
1314
  setImmediate(() => this.autoCloseOpenRequests());
1249
1315
  }
1250
1316
  }
@@ -1493,12 +1559,24 @@ export class CrewlyServer {
1493
1559
  // and the SPA shell are outside `/api` and stay open; `/health` has its
1494
1560
  // own gate below (#825).
1495
1561
  this.app.use('/api', apiTokenMiddleware);
1562
+ // Which dashboard build is served: a still-open tab running an older
1563
+ // bundle can tell it should reload (#1010 review).
1564
+ this.dashboardEntry = this.config.headless ? null : loadDashboardEntry(path.join(findPackageRoot(__dirname), 'frontend/dist/index.html'));
1565
+ this.app.use('/api', dashboardBuildHeader(this.dashboardEntry));
1496
1566
  // A skill's X-Agent-Session is checked against the agent PTY its process
1497
1567
  // really runs under (X-Agent-Pid) and corrected when it names another
1498
1568
  // agent — before the heartbeat and every controller read it.
1499
1569
  this.app.use('/api', agentOriginMiddleware);
1570
+ // Who is calling, from credentials (#999, specs/2026-10-03-owner-auth.md):
1571
+ // agent badge, owner session (+ CSRF), owner API token (checked against
1572
+ // the process tree when it comes from this machine), relay credential.
1573
+ // A request with none of these is anonymous — never the owner.
1574
+ const peerProcesses = new PeerProcessService({ listSessionPids: liveSessionPids });
1575
+ this.app.use('/api', createCallerIdentityMiddleware(peerProcesses));
1500
1576
  // Agent heartbeat middleware - any API call with X-Agent-Session header updates heartbeat
1501
1577
  this.app.use('/api', agentHeartbeatMiddleware);
1578
+ // The dashboard's owner session + CSRF token (GET /api/auth/session).
1579
+ this.app.use('/api', createOwnerSessionRouter(peerProcesses));
1502
1580
  // API routes
1503
1581
  this.app.use('/api', createApiRoutes(this.apiController));
1504
1582
  // Health check (enhanced with mode and agent info).
@@ -1609,6 +1687,8 @@ export class CrewlyServer {
1609
1687
  // and in compiled/npm-installed mode (dist/backend/backend/src/)
1610
1688
  const projectRoot = findPackageRoot(__dirname);
1611
1689
  const frontendPath = path.join(projectRoot, 'frontend/dist');
1690
+ // A page load from the owner's browser gets the owner session cookie (#999).
1691
+ this.app.use(createOwnerSessionPageMiddleware(peerProcesses));
1612
1692
  this.app.use(express.static(frontendPath));
1613
1693
  // Serve frontend for all other routes (SPA)
1614
1694
  // Skip /api/ and /health paths so addon-registered API routes are reachable
@@ -1649,6 +1729,9 @@ export class CrewlyServer {
1649
1729
  configureWebSocket() {
1650
1730
  this.io.on('connection', (socket) => {
1651
1731
  this.logger.info('Client connected', { socketId: socket.id });
1732
+ // Tell the tab which dashboard build is served now (#1010 review).
1733
+ if (this.dashboardEntry)
1734
+ socket.emit(OWNER_AUTH_CONSTANTS.BUILD_EVENT, dashboardBuildMessage(this.dashboardEntry));
1652
1735
  socket.on('disconnect', () => {
1653
1736
  this.logger.info('Client disconnected', { socketId: socket.id });
1654
1737
  });
@@ -1797,6 +1880,11 @@ export class CrewlyServer {
1797
1880
  }
1798
1881
  // Start activity monitoring
1799
1882
  this.logger.info('Starting activity monitoring...');
1883
+ // Turn busy periods for the autonomy metrics (#984): one `turn.ended`
1884
+ // trace event per PTY turn, from the undelayed status listener.
1885
+ this.activityMonitorService.onWorkingStatusChange((session, status) => {
1886
+ traceTurnActivity(session, status === 'in_progress', 'pty');
1887
+ });
1800
1888
  this.activityMonitorService.startPolling();
1801
1889
  // Start idle detection for agent suspension
1802
1890
  this.logger.info('Starting idle detection service...');
@@ -2034,6 +2122,8 @@ export class CrewlyServer {
2034
2122
  const runtimeExitMonitor = RuntimeExitMonitorService.getInstance();
2035
2123
  runtimeExitMonitor.setAgentRegistrationService(this.apiController.agentRegistrationService);
2036
2124
  runtimeExitMonitor.setEventBusService(this.eventBusService);
2125
+ // #989: a runtime that keeps dying at start is told to the owner once.
2126
+ runtimeExitMonitor.setOwnerNotifier(slackOwnerAlertNotifier);
2037
2127
  }
2038
2128
  catch (error) {
2039
2129
  this.logger.warn('Failed to wire RuntimeExitMonitorService dependencies (non-critical)', {
@@ -3035,6 +3125,16 @@ export class CrewlyServer {
3035
3125
  else {
3036
3126
  this.logger.info('Ticket autopilot off (CREWLY_TICKET_AUTOPILOT=0)');
3037
3127
  }
3128
+ // The one owner card per retro that approves its harness-gap tickets
3129
+ // (specs/2026-10-03-autopilot-experiments.md §4). Registered even with
3130
+ // the autopilot switched off, so a card answered later still lands.
3131
+ {
3132
+ const { DecisionService: RetroDecisions } = await import('./services/decisions/decision.service.js');
3133
+ const { ticketAutopilot } = await import('./controllers/project-tickets/project-tickets.controller.js');
3134
+ RetroDecisions.registerKindHandler(TICKET_AUTOPILOT_CONSTANTS.RETRO_DECISION_KIND, {
3135
+ onSettled: (d) => ticketAutopilot().onRetroDecision(d),
3136
+ });
3137
+ }
3038
3138
  // Experiment cards (specs/experiment-cards.md, issue #986): measure each
3039
3139
  // shipped experiment at the end of its window, label it, log it to the
3040
3140
  // wiki and tell the owner. Kill switch: CREWLY_EXPERIMENTS=0.
@@ -3139,7 +3239,10 @@ export class CrewlyServer {
3139
3239
  // Start NOTIFY reconciliation service (retries failed Slack deliveries)
3140
3240
  this.notifyReconciliationService = new NotifyReconciliationService();
3141
3241
  this.notifyReconciliationService.start();
3142
- // Start system resource alert monitoring (proactive disk/memory/CPU alerts)
3242
+ // Start system resource alert monitoring (proactive disk/memory/CPU alerts).
3243
+ // Critical disk/memory alerts and auto-stopped agents also reach the
3244
+ // owner over Slack (#991), through the same path as the low-disk notice.
3245
+ this.systemResourceAlertService.setOwnerNotifier(slackOwnerAlertNotifier);
3143
3246
  this.systemResourceAlertService.startMonitoring();
3144
3247
  // Fire-and-forget background version check (populates cache for /health)
3145
3248
  VersionCheckService.getInstance().checkForUpdate().catch(() => {
@@ -3374,19 +3477,7 @@ export class CrewlyServer {
3374
3477
  // the usual Slack owner-notification path. Kill switch:
3375
3478
  // CREWLY_WORKTREE_JANITOR=0.
3376
3479
  try {
3377
- WorktreeJanitorService.getInstance().setLowDiskNotifier(async ({ title, message, urgent }) => {
3378
- const slack = getSlackService();
3379
- if (!slack.isConnected())
3380
- return false;
3381
- await slack.sendNotification({
3382
- type: 'alert',
3383
- title,
3384
- message,
3385
- urgency: urgent ? 'critical' : 'normal',
3386
- timestamp: new Date().toISOString(),
3387
- });
3388
- return true;
3389
- });
3480
+ WorktreeJanitorService.getInstance().setLowDiskNotifier(slackOwnerAlertNotifier);
3390
3481
  if (WorktreeJanitorService.getInstance().start()) {
3391
3482
  this.logger.info('WorktreeJanitorService scheduled');
3392
3483
  }
@@ -3850,11 +3941,17 @@ export class CrewlyServer {
3850
3941
  const allItems = await TaskPoolService.getInstance().getAllItems();
3851
3942
  // Work in hand only: active statuses, touched recently (see restore-filter),
3852
3943
  // plus agents whose turn the last restart cut off.
3944
+ const owed = await this.loadOwedWorkAtBoot();
3853
3945
  targets = sessionsToRestore(allItems, [
3854
3946
  ...this.interruptedTurnsAtBoot.map((t) => t.sessionName),
3855
3947
  // Agents with messages still waiting for them (restored from
3856
3948
  // disk by the queue) — someone is owed an answer.
3857
3949
  ...SubAgentMessageQueue.getInstance().sessionsWithPending(),
3950
+ // Agents whose owner promise is past due and was never
3951
+ // nudged: idle or not, they come back to be reminded once
3952
+ // (2026-10-02, Eve). Not-yet-due and already-nudged
3953
+ // promises are left to the open-items sweep.
3954
+ ...owed.map((c) => c.sessionName),
3858
3955
  ]);
3859
3956
  }
3860
3957
  catch (poolErr) {
@@ -4020,6 +4117,14 @@ export class CrewlyServer {
4020
4117
  */
4021
4118
  logNetworkExposure() {
4022
4119
  try {
4120
+ // A token pinned in the service environment is mirrored to the token
4121
+ // file, so the CLI on this machine can present it (#1010 review).
4122
+ const mirrored = mirrorEnvTokenToFile();
4123
+ if (mirrored === 'written' || mirrored === 'updated' || mirrored === 'failed') {
4124
+ this.logger[mirrored === 'failed' ? 'warn' : 'info'](`API token from ${API_SECURITY_CONSTANTS.ENV.API_TOKEN}: token file ${mirrored}`, {
4125
+ file: getApiTokenFilePath(),
4126
+ });
4127
+ }
4023
4128
  const token = resolveApiToken();
4024
4129
  const summary = describeNetworkExposure({
4025
4130
  bindHost: this.config.bindHost,
@@ -4209,6 +4314,32 @@ export class CrewlyServer {
4209
4314
  }
4210
4315
  this.logger.info(`Received ${signal} while shutdown is already past the drain; continuing`);
4211
4316
  }
4317
+ /**
4318
+ * End-of-turn settling: take down "working on it" placeholders the agent
4319
+ * never answered, settle its open DM threads, and submit the tickets it
4320
+ * replied in. Never throws.
4321
+ *
4322
+ * @param sessionName - Agent whose turn ended
4323
+ */
4324
+ settleAfterTurn(sessionName) {
4325
+ // The turn ended: a "working on it" it never answered means it chose
4326
+ // not to reply (an "ok", "好"). Take it down rather than leave a
4327
+ // "still working — the reply will follow" that never follows.
4328
+ void getSlackTypingPlaceholderService()
4329
+ ?.settleTurnWithoutReply(sessionName)
4330
+ .catch(() => undefined);
4331
+ // Same rule for the DM threads it was owed an answer in: one it
4332
+ // chose not to answer must not pull a later unattributed answer
4333
+ // back into it (2026-09-28).
4334
+ void getSlackAgentDmService()
4335
+ ?.settleOpenThreads(sessionName)
4336
+ .catch(() => undefined);
4337
+ // Ticket loop Phase 2: an agent that finished its turn has answered
4338
+ // the tickets it replied in — submit them (待验收 or done).
4339
+ void getTicketReviewService()
4340
+ ?.onAgentIdle(sessionName)
4341
+ .catch(() => undefined);
4342
+ }
4212
4343
  /**
4213
4344
  * Wire the safe-restart pieces: the turn probe, idle-event re-probing,
4214
4345
  * readiness queue counting, and the graceful-shutdown hook used by
@@ -4217,11 +4348,68 @@ export class CrewlyServer {
4217
4348
  wireSafeRestart() {
4218
4349
  const tracker = InFlightTurnTracker.getInstance();
4219
4350
  const activity = PtyActivityTrackerService.getInstance();
4351
+ const turnState = AgentTurnStateService.getInstance();
4352
+ const persistence = getSessionStatePersistence();
4353
+ const metaOf = (sessionName) => {
4354
+ try {
4355
+ return persistence.getSessionMetadata(sessionName);
4356
+ }
4357
+ catch {
4358
+ return undefined;
4359
+ }
4360
+ };
4361
+ // The runtime's own turn state (specs/2026-10-02-restart-busy-and-resume.md):
4362
+ // Claude Code transcripts as the fallback behind its hooks.
4363
+ turnState.setTranscriptLocator((sessionName) => {
4364
+ const meta = metaOf(sessionName);
4365
+ if (!meta || meta.runtimeType !== RUNTIME_TYPES.CLAUDE_CODE || !meta.claudeSessionId || !meta.cwd)
4366
+ return null;
4367
+ const homes = [meta.env?.CLAUDE_CONFIG_DIR, defaultClaudeHome()].filter((h) => typeof h === 'string' && h.length > 0);
4368
+ return findClaudeTranscript({ sessionId: meta.claudeSessionId, cwd: meta.cwd, claudeHomes: homes });
4369
+ });
4220
4370
  tracker.setProbe(createPtyTurnProbe({
4221
4371
  getBackend: () => getSessionBackendSync(),
4222
4372
  getIdleTimeMs: (sessionName) => (activity.hasActivity(sessionName) ? activity.getIdleTimeMs(sessionName) : null),
4373
+ getRuntimeVerdict: (sessionName) => turnState.getVerdict(sessionName),
4374
+ getLastHookEventAt: (sessionName) => turnState.lastHookEventAt(sessionName),
4375
+ getRuntimeType: (sessionName) => metaOf(sessionName)?.runtimeType ?? null,
4223
4376
  }));
4377
+ // Turns no delivery started (a background subagent finishing) and
4378
+ // background work after a turn count as mid-turn too (2026-10-02, Eve).
4379
+ tracker.setRuntimeBusySource((now) => {
4380
+ const backend = getSessionBackendSync();
4381
+ const out = [];
4382
+ for (const sessionName of turnState.knownSessions()) {
4383
+ if (!backend?.sessionExists(sessionName))
4384
+ continue;
4385
+ // An exited runtime is not working, whatever its last hook said.
4386
+ if (backend.isChildProcessAlive?.(sessionName) === false) {
4387
+ turnState.forget(sessionName);
4388
+ continue;
4389
+ }
4390
+ const v = turnState.getVerdict(sessionName, now);
4391
+ if (v.state === 'turn' || v.state === 'background')
4392
+ out.push({ sessionName, since: v.since, longRunning: v.longRunning });
4393
+ }
4394
+ return out;
4395
+ });
4224
4396
  tracker.attachEventSource(this.eventBusService);
4397
+ // Under systemd, TimeoutStopSec decides when we are SIGKILLed: the drain
4398
+ // must end before it, or the interrupted turns are never saved.
4399
+ this.supervisorStopBudgetMs = resolveSupervisorStopBudgetMs();
4400
+ if (this.supervisorStopBudgetMs !== null) {
4401
+ const wanted = resolveBackgroundDrainMs(process.env);
4402
+ const capped = capDrainToSupervisor(wanted, this.supervisorStopBudgetMs, SAFE_RESTART.SHUTDOWN_MARGIN_MS);
4403
+ const log = capped < wanted ? this.logger.warn.bind(this.logger) : this.logger.info.bind(this.logger);
4404
+ log('Restart drain capped by the systemd stop timeout', {
4405
+ timeoutStopMs: this.supervisorStopBudgetMs,
4406
+ drainCapMs: capped,
4407
+ wantedMs: wanted,
4408
+ ...(capped < wanted ? { fix: 'run "crewly service upgrade" (or "crewly service install --force") to regenerate the unit' } : {}),
4409
+ });
4410
+ }
4411
+ // A silent screen is not idle while the runtime reports a turn.
4412
+ this.activityMonitorService.setRuntimeTurnCheck((sessionName) => turnState.getVerdict(sessionName).state === 'turn');
4225
4413
  const drain = RestartDrainService.getInstance();
4226
4414
  drain.setQueueCounter(() => this.messageQueueService.pendingCount + SubAgentMessageQueue.getInstance().getTotalQueued());
4227
4415
  drain.setShutdownHandler((request) => this.shutdown({ reason: request.reason, exitCode: request.exitCode }));
@@ -4556,6 +4744,85 @@ export class CrewlyServer {
4556
4744
  });
4557
4745
  }
4558
4746
  }
4747
+ /**
4748
+ * Owner promises and owed answers left by the previous run. Their agents
4749
+ * are restored on boot even when idle (specs/2026-10-02-restart-busy-and-resume.md).
4750
+ * Never throws.
4751
+ *
4752
+ * @returns Open commitments and the agents owing an answer
4753
+ */
4754
+ async loadOwedWorkAtBoot() {
4755
+ let commitments = [];
4756
+ try {
4757
+ const { owedCommitments } = await import('./services/open-items/open-items.service.js');
4758
+ commitments = owedCommitments(await RequestService.getInstance().listAll(), new Date());
4759
+ }
4760
+ catch (error) {
4761
+ this.logger.warn('Could not read open owner promises at boot (non-fatal)', {
4762
+ error: error instanceof Error ? error.message : String(error),
4763
+ });
4764
+ }
4765
+ this.openCommitmentsAtBoot = commitments;
4766
+ if (commitments.length > 0) {
4767
+ this.logger.info('Owner promises past due and never nudged; their agents will be restored and reminded once', {
4768
+ commitments: commitments.map((c) => ({ session: c.sessionName, ticket: c.ticket, due: c.due })),
4769
+ });
4770
+ }
4771
+ return commitments;
4772
+ }
4773
+ /**
4774
+ * Remind restored agents of the owner promises they still owe, once each,
4775
+ * skipping agents that already get an interrupted-turn note.
4776
+ *
4777
+ * @param interrupted - The interrupted entries being resumed
4778
+ */
4779
+ async remindOpenCommitmentsAfterBoot(interrupted) {
4780
+ const commitments = this.openCommitmentsAtBoot;
4781
+ this.openCommitmentsAtBoot = [];
4782
+ if (commitments.length === 0)
4783
+ return;
4784
+ const registration = this.apiController.agentRegistrationService;
4785
+ const isRunning = (name) => Boolean(getSessionBackendSync()?.sessionExists(name)) || Boolean(registration.getInProcessRuntime(name));
4786
+ // One reminder per promise, ever: recorded (as the nudge) before it is
4787
+ // sent, so neither the next boot nor the sweep sends another.
4788
+ const { markRestartReminded, OpenItemsService } = await import('./services/open-items/open-items.service.js');
4789
+ // Through the service's queue when it runs: the sweep may be nudging the same promise.
4790
+ const openItems = OpenItemsService.getInstance();
4791
+ const markReminded = (requestId, itemId) => openItems ? openItems.markRestartReminded(requestId, itemId) : markRestartReminded(RequestService.getInstance(), requestId, itemId);
4792
+ const covered = new Set(interrupted.map((e) => e.sessionName));
4793
+ const marked = [];
4794
+ for (const c of commitments) {
4795
+ if (covered.has(c.sessionName) || !isRunning(c.sessionName))
4796
+ continue;
4797
+ try {
4798
+ if (await markReminded(c.requestId, c.itemId))
4799
+ marked.push(c);
4800
+ }
4801
+ catch (error) {
4802
+ this.logger.warn('Could not record a restart reminder; not sending it', {
4803
+ sessionName: c.sessionName,
4804
+ error: error instanceof Error ? error.message : String(error),
4805
+ });
4806
+ }
4807
+ }
4808
+ const notes = planCommitmentNotes(marked, interrupted, isRunning);
4809
+ for (const note of notes) {
4810
+ try {
4811
+ const result = await registration.sendMessageToAgent(note.sessionName, note.text);
4812
+ this.logger.info('Reminded a restored agent of the owner promise it still owes', {
4813
+ sessionName: note.sessionName,
4814
+ delivered: result.success,
4815
+ queuedUntilRegistered: result.queued === true,
4816
+ });
4817
+ }
4818
+ catch (error) {
4819
+ this.logger.warn('Could not remind a restored agent of its owner promise', {
4820
+ sessionName: note.sessionName,
4821
+ error: error instanceof Error ? error.message : String(error),
4822
+ });
4823
+ }
4824
+ }
4825
+ }
4559
4826
  /**
4560
4827
  * Re-deliver the turns the previous shutdown cut off, then clear the file.
4561
4828
  * The file is rewritten after each entry so a restart during this pass
@@ -4563,6 +4830,7 @@ export class CrewlyServer {
4563
4830
  */
4564
4831
  async resumeInterruptedTurnsAfterBoot() {
4565
4832
  const entries = this.interruptedTurnsAtBoot;
4833
+ await this.remindOpenCommitmentsAfterBoot(entries);
4566
4834
  if (entries.length === 0)
4567
4835
  return;
4568
4836
  this.interruptedTurnsAtBoot = [];
@@ -4617,8 +4885,11 @@ export class CrewlyServer {
4617
4885
  try {
4618
4886
  const drain = RestartDrainService.getInstance();
4619
4887
  drain.pauseDelivery(reason);
4620
- const timeoutMs = drainEnabled ? resolveRestartDrainMs(process.env) : 0;
4621
- const result = await drain.drain({ timeoutMs });
4888
+ const budget = this.supervisorStopBudgetMs;
4889
+ const margin = SAFE_RESTART.SHUTDOWN_MARGIN_MS;
4890
+ const timeoutMs = drainEnabled ? capDrainToSupervisor(resolveRestartDrainMs(process.env), budget, margin) : 0;
4891
+ const backgroundTimeoutMs = drainEnabled ? capDrainToSupervisor(resolveBackgroundDrainMs(process.env), budget, margin) : 0;
4892
+ const result = await drain.drain({ timeoutMs, backgroundTimeoutMs });
4622
4893
  if (result.remaining.length > 0) {
4623
4894
  const saved = saveInterruptedTurns(interruptedTurnsPath(this.config.crewlyHome), result.remaining, `${reason}: ${result.outcome}`);
4624
4895
  this.logger.warn('Persisted interrupted agent turns for resume after restart', {