crewly 1.20.195 → 1.20.197

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 (595) 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.controller.d.ts.map +1 -1
  47. package/dist/backend/backend/src/controllers/browser/browser.controller.js +54 -8
  48. package/dist/backend/backend/src/controllers/browser/browser.controller.js.map +1 -1
  49. package/dist/backend/backend/src/controllers/browser/browser.routes.d.ts.map +1 -1
  50. package/dist/backend/backend/src/controllers/browser/browser.routes.js +18 -5
  51. package/dist/backend/backend/src/controllers/browser/browser.routes.js.map +1 -1
  52. package/dist/backend/backend/src/controllers/canva/canva.routes.d.ts.map +1 -1
  53. package/dist/backend/backend/src/controllers/canva/canva.routes.js +8 -1
  54. package/dist/backend/backend/src/controllers/canva/canva.routes.js.map +1 -1
  55. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  56. package/dist/backend/backend/src/controllers/chat/chat.controller.js +10 -1
  57. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  58. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.d.ts.map +1 -1
  59. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js +3 -5
  60. package/dist/backend/backend/src/controllers/cloud/cloud-device-pairing.controller.js.map +1 -1
  61. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts +4 -2
  62. package/dist/backend/backend/src/controllers/connector/connector.controller.d.ts.map +1 -1
  63. package/dist/backend/backend/src/controllers/connector/connector.controller.js +17 -2
  64. package/dist/backend/backend/src/controllers/connector/connector.controller.js.map +1 -1
  65. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.d.ts.map +1 -1
  66. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js +2 -3
  67. package/dist/backend/backend/src/controllers/connector/grant-sharing.handler.js.map +1 -1
  68. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts +4 -2
  69. package/dist/backend/backend/src/controllers/decisions/decisions.controller.d.ts.map +1 -1
  70. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js +31 -20
  71. package/dist/backend/backend/src/controllers/decisions/decisions.controller.js.map +1 -1
  72. package/dist/backend/backend/src/controllers/desktop/desktop.controller.d.ts.map +1 -1
  73. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js +16 -0
  74. package/dist/backend/backend/src/controllers/desktop/desktop.controller.js.map +1 -1
  75. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  76. package/dist/backend/backend/src/controllers/google/google.controller.js +9 -5
  77. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  78. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  79. package/dist/backend/backend/src/controllers/google/google.routes.js +16 -3
  80. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  81. package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -1
  82. package/dist/backend/backend/src/controllers/harness/harness.controller.js +3 -5
  83. package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -1
  84. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.d.ts.map +1 -1
  85. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js +8 -1
  86. package/dist/backend/backend/src/controllers/microsoft/microsoft-todo.routes.js.map +1 -1
  87. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +1 -1
  88. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
  89. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.d.ts.map +1 -1
  90. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js +3 -5
  91. package/dist/backend/backend/src/controllers/owner-receipt/owner-receipt.controller.js.map +1 -1
  92. package/dist/backend/backend/src/controllers/people/people.routes.d.ts.map +1 -1
  93. package/dist/backend/backend/src/controllers/people/people.routes.js +3 -5
  94. package/dist/backend/backend/src/controllers/people/people.routes.js.map +1 -1
  95. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +35 -2
  96. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  97. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +138 -4
  98. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  99. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts +2 -0
  100. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.d.ts.map +1 -1
  101. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js +7 -1
  102. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.routes.js.map +1 -1
  103. package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -1
  104. package/dist/backend/backend/src/controllers/request/open-items.controller.js +2 -4
  105. package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -1
  106. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js +1 -1
  107. package/dist/backend/backend/src/controllers/signal-digest/signal-digest.controller.js.map +1 -1
  108. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  109. package/dist/backend/backend/src/controllers/slack/slack.controller.js +9 -0
  110. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  111. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.d.ts.map +1 -1
  112. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js +11 -0
  113. package/dist/backend/backend/src/controllers/system/runtime-fallback.controller.js.map +1 -1
  114. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts +6 -4
  115. package/dist/backend/backend/src/controllers/system/system-control.controller.d.ts.map +1 -1
  116. package/dist/backend/backend/src/controllers/system/system-control.controller.js +20 -13
  117. package/dist/backend/backend/src/controllers/system/system-control.controller.js.map +1 -1
  118. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  119. package/dist/backend/backend/src/controllers/team/team.controller.js +14 -7
  120. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  121. package/dist/backend/backend/src/controllers/tickets/tickets.controller.d.ts.map +1 -1
  122. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js +5 -7
  123. package/dist/backend/backend/src/controllers/tickets/tickets.controller.js.map +1 -1
  124. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts +30 -4
  125. package/dist/backend/backend/src/controllers/trace/trace.controller.d.ts.map +1 -1
  126. package/dist/backend/backend/src/controllers/trace/trace.controller.js +278 -10
  127. package/dist/backend/backend/src/controllers/trace/trace.controller.js.map +1 -1
  128. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts +3 -3
  129. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.d.ts.map +1 -1
  130. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js +4 -2
  131. package/dist/backend/backend/src/controllers/whatsapp/whatsapp-inbox.controller.js.map +1 -1
  132. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.d.ts.map +1 -1
  133. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js +10 -2
  134. package/dist/backend/backend/src/controllers/whatsapp/whatsapp.controller.js.map +1 -1
  135. package/dist/backend/backend/src/index.d.ts +34 -0
  136. package/dist/backend/backend/src/index.d.ts.map +1 -1
  137. package/dist/backend/backend/src/index.js +313 -42
  138. package/dist/backend/backend/src/index.js.map +1 -1
  139. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts +31 -0
  140. package/dist/backend/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
  141. package/dist/backend/backend/src/middleware/agent-origin-correction.js +31 -0
  142. package/dist/backend/backend/src/middleware/agent-origin-correction.js.map +1 -0
  143. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts +6 -0
  144. package/dist/backend/backend/src/middleware/agent-origin.middleware.d.ts.map +1 -1
  145. package/dist/backend/backend/src/middleware/agent-origin.middleware.js +4 -1
  146. package/dist/backend/backend/src/middleware/agent-origin.middleware.js.map +1 -1
  147. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts +20 -17
  148. package/dist/backend/backend/src/middleware/api-token.middleware.d.ts.map +1 -1
  149. package/dist/backend/backend/src/middleware/api-token.middleware.js +27 -37
  150. package/dist/backend/backend/src/middleware/api-token.middleware.js.map +1 -1
  151. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts +213 -0
  152. package/dist/backend/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
  153. package/dist/backend/backend/src/middleware/caller-identity.middleware.js +481 -0
  154. package/dist/backend/backend/src/middleware/caller-identity.middleware.js.map +1 -0
  155. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts +67 -0
  156. package/dist/backend/backend/src/middleware/caller-identity.testing.d.ts.map +1 -0
  157. package/dist/backend/backend/src/middleware/caller-identity.testing.js +108 -0
  158. package/dist/backend/backend/src/middleware/caller-identity.testing.js.map +1 -0
  159. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  160. package/dist/backend/backend/src/services/agent/agent-registration.service.js +12 -2
  161. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  162. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  163. package/dist/backend/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  164. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js +19 -10
  165. package/dist/backend/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  166. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  167. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  168. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  169. package/dist/backend/backend/src/services/agent/restore-filter.d.ts +5 -2
  170. package/dist/backend/backend/src/services/agent/restore-filter.d.ts.map +1 -1
  171. package/dist/backend/backend/src/services/agent/restore-filter.js +5 -2
  172. package/dist/backend/backend/src/services/agent/restore-filter.js.map +1 -1
  173. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  175. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  176. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  177. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  178. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  179. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  180. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  182. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  183. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts +34 -1
  184. package/dist/backend/backend/src/services/browser/browser-session.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/browser/browser-session.service.js +38 -1
  186. package/dist/backend/backend/src/services/browser/browser-session.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts +98 -10
  188. package/dist/backend/backend/src/services/browser/owner-browser-input.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/browser/owner-browser-input.js +126 -11
  190. package/dist/backend/backend/src/services/browser/owner-browser-input.js.map +1 -1
  191. package/dist/backend/backend/src/services/chat/chat.service.d.ts +99 -2
  192. package/dist/backend/backend/src/services/chat/chat.service.d.ts.map +1 -1
  193. package/dist/backend/backend/src/services/chat/chat.service.js +265 -40
  194. package/dist/backend/backend/src/services/chat/chat.service.js.map +1 -1
  195. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  196. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  197. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  198. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  199. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  200. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  201. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  202. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  203. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  204. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  205. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  206. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  207. package/dist/backend/backend/src/services/chat-v2/types.d.ts +0 -1
  208. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
  209. package/dist/backend/backend/src/services/chat-v2/types.js +0 -1
  210. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
  211. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  212. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
  213. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  214. package/dist/backend/backend/src/services/core/api-token.service.d.ts +28 -0
  215. package/dist/backend/backend/src/services/core/api-token.service.d.ts.map +1 -1
  216. package/dist/backend/backend/src/services/core/api-token.service.js +46 -0
  217. package/dist/backend/backend/src/services/core/api-token.service.js.map +1 -1
  218. package/dist/backend/backend/src/services/core/dashboard-build.d.ts +49 -0
  219. package/dist/backend/backend/src/services/core/dashboard-build.d.ts.map +1 -0
  220. package/dist/backend/backend/src/services/core/dashboard-build.js +68 -0
  221. package/dist/backend/backend/src/services/core/dashboard-build.js.map +1 -0
  222. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts +127 -0
  223. package/dist/backend/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  224. package/dist/backend/backend/src/services/core/owner-auth.service.js +205 -0
  225. package/dist/backend/backend/src/services/core/owner-auth.service.js.map +1 -0
  226. package/dist/backend/backend/src/services/core/peer-process.service.d.ts +168 -0
  227. package/dist/backend/backend/src/services/core/peer-process.service.d.ts.map +1 -0
  228. package/dist/backend/backend/src/services/core/peer-process.service.js +352 -0
  229. package/dist/backend/backend/src/services/core/peer-process.service.js.map +1 -0
  230. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts +97 -1
  231. package/dist/backend/backend/src/services/experiments/experiment.service.d.ts.map +1 -1
  232. package/dist/backend/backend/src/services/experiments/experiment.service.js +372 -1
  233. package/dist/backend/backend/src/services/experiments/experiment.service.js.map +1 -1
  234. package/dist/backend/backend/src/services/experiments/experiment.wiring.d.ts.map +1 -1
  235. package/dist/backend/backend/src/services/experiments/experiment.wiring.js +19 -2
  236. package/dist/backend/backend/src/services/experiments/experiment.wiring.js.map +1 -1
  237. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.d.ts.map +1 -1
  238. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js +2 -1
  239. package/dist/backend/backend/src/services/messaging/owner-message-watchdog.wiring.js.map +1 -1
  240. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  241. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  242. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  243. package/dist/backend/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  244. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  245. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  246. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  247. package/dist/backend/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  248. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  249. package/dist/backend/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  250. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js +391 -0
  251. package/dist/backend/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  252. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts +35 -1
  253. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.d.ts.map +1 -1
  254. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js +138 -2
  255. package/dist/backend/backend/src/services/monitoring/claude-transcript-sync.service.js.map +1 -1
  256. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  257. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  258. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  259. package/dist/backend/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  260. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts +82 -0
  261. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.d.ts.map +1 -0
  262. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js +141 -0
  263. package/dist/backend/backend/src/services/monitoring/deferred-idle-settle.js.map +1 -0
  264. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts +51 -1
  265. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.d.ts.map +1 -1
  266. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js +118 -2
  267. package/dist/backend/backend/src/services/monitoring/system-resource-alert.service.js.map +1 -1
  268. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts +103 -0
  269. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.d.ts.map +1 -0
  270. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js +86 -0
  271. package/dist/backend/backend/src/services/monitoring/transcript-cost-repair.js.map +1 -0
  272. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +57 -0
  273. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  274. package/dist/backend/backend/src/services/open-items/open-items.service.js +100 -4
  275. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  276. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
  277. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js +13 -0
  278. package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.js.map +1 -1
  279. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  280. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  281. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +42 -3
  282. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  283. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.d.ts.map +1 -1
  284. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js +2 -1
  285. package/dist/backend/backend/src/services/project-tickets/ticket-assignee-waker.js.map +1 -1
  286. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  287. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +3 -0
  288. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  289. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts +156 -0
  290. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.d.ts.map +1 -0
  291. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js +308 -0
  292. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-retro.js.map +1 -0
  293. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts +212 -0
  294. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -0
  295. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +515 -0
  296. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -0
  297. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts +186 -0
  298. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.d.ts.map +1 -0
  299. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js +341 -0
  300. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-trace.js.map +1 -0
  301. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts +309 -0
  302. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  303. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +726 -1
  304. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  305. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  306. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  307. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  308. package/dist/backend/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  309. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts +61 -3
  310. package/dist/backend/backend/src/services/restart/interrupted-turns.d.ts.map +1 -1
  311. package/dist/backend/backend/src/services/restart/interrupted-turns.js +106 -9
  312. package/dist/backend/backend/src/services/restart/interrupted-turns.js.map +1 -1
  313. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  314. package/dist/backend/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  315. package/dist/backend/backend/src/services/restart/restart-drain.service.js +37 -5
  316. package/dist/backend/backend/src/services/restart/restart-drain.service.js.map +1 -1
  317. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts +62 -0
  318. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.d.ts.map +1 -0
  319. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js +126 -0
  320. package/dist/backend/backend/src/services/restart/supervisor-stop-budget.js.map +1 -0
  321. package/dist/backend/backend/src/services/restart/turn-probe.d.ts +17 -2
  322. package/dist/backend/backend/src/services/restart/turn-probe.d.ts.map +1 -1
  323. package/dist/backend/backend/src/services/restart/turn-probe.js +29 -4
  324. package/dist/backend/backend/src/services/restart/turn-probe.js.map +1 -1
  325. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.d.ts.map +1 -1
  326. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js +4 -0
  327. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.service.js.map +1 -1
  328. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  329. package/dist/backend/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  330. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js +66 -3
  331. package/dist/backend/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  332. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  333. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  334. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +200 -41
  335. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  336. package/dist/backend/backend/src/services/slack/slack.service.d.ts +18 -0
  337. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  338. package/dist/backend/backend/src/services/slack/slack.service.js +32 -0
  339. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  340. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts +99 -0
  341. package/dist/backend/backend/src/services/trace/trace-analysis.service.d.ts.map +1 -0
  342. package/dist/backend/backend/src/services/trace/trace-analysis.service.js +148 -0
  343. package/dist/backend/backend/src/services/trace/trace-analysis.service.js.map +1 -0
  344. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts +17 -0
  345. package/dist/backend/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  346. package/dist/backend/backend/src/services/trace/trace-context.service.js +58 -1
  347. package/dist/backend/backend/src/services/trace/trace-context.service.js.map +1 -1
  348. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts +4 -0
  349. package/dist/backend/backend/src/services/trace/trace-http.middleware.d.ts.map +1 -1
  350. package/dist/backend/backend/src/services/trace/trace-http.middleware.js +32 -2
  351. package/dist/backend/backend/src/services/trace/trace-http.middleware.js.map +1 -1
  352. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts +262 -0
  353. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -0
  354. package/dist/backend/backend/src/services/trace/trace-metrics.js +810 -0
  355. package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -0
  356. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts +48 -0
  357. package/dist/backend/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  358. package/dist/backend/backend/src/services/trace/trace-recorder.js +121 -1
  359. package/dist/backend/backend/src/services/trace/trace-recorder.js.map +1 -1
  360. package/dist/backend/backend/src/services/trace/trace-store.d.ts +40 -1
  361. package/dist/backend/backend/src/services/trace/trace-store.d.ts.map +1 -1
  362. package/dist/backend/backend/src/services/trace/trace-store.js +126 -14
  363. package/dist/backend/backend/src/services/trace/trace-store.js.map +1 -1
  364. package/dist/backend/backend/src/services/trace/trace-summary.d.ts +77 -0
  365. package/dist/backend/backend/src/services/trace/trace-summary.d.ts.map +1 -0
  366. package/dist/backend/backend/src/services/trace/trace-summary.js +239 -0
  367. package/dist/backend/backend/src/services/trace/trace-summary.js.map +1 -0
  368. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts +74 -0
  369. package/dist/backend/backend/src/services/trace/trace-timeline.d.ts.map +1 -0
  370. package/dist/backend/backend/src/services/trace/trace-timeline.js +162 -0
  371. package/dist/backend/backend/src/services/trace/trace-timeline.js.map +1 -0
  372. package/dist/backend/backend/src/services/trace/trace.types.d.ts +22 -3
  373. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
  374. package/dist/backend/backend/src/services/trace/trace.types.js +20 -1
  375. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
  376. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts +80 -0
  377. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.d.ts.map +1 -0
  378. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js +184 -0
  379. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt-format-ask.js.map +1 -0
  380. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts +7 -0
  381. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.d.ts.map +1 -1
  382. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js +16 -0
  383. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.service.js.map +1 -1
  384. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts +16 -0
  385. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.d.ts.map +1 -1
  386. package/dist/backend/backend/src/services/v3/owner-receipt/owner-receipt.types.js.map +1 -1
  387. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.d.ts.map +1 -1
  388. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js +2 -1
  389. package/dist/backend/backend/src/services/v3/tl-auto-verify.service.js.map +1 -1
  390. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +8 -0
  391. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  392. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +24 -2
  393. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  394. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts +4 -3
  395. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.d.ts.map +1 -1
  396. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js +3 -2
  397. package/dist/backend/backend/src/services/whatsapp/whatsapp-draft-gate.js.map +1 -1
  398. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  399. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  400. package/dist/backend/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  401. package/dist/backend/backend/src/services/workflow/message-scheduler.service.d.ts.map +1 -1
  402. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js +3 -0
  403. package/dist/backend/backend/src/services/workflow/message-scheduler.service.js.map +1 -1
  404. package/dist/backend/backend/src/services/workflow/scheduler.service.d.ts.map +1 -1
  405. package/dist/backend/backend/src/services/workflow/scheduler.service.js +3 -0
  406. package/dist/backend/backend/src/services/workflow/scheduler.service.js.map +1 -1
  407. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.d.ts.map +1 -1
  408. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js +2 -1
  409. package/dist/backend/backend/src/services/worktree/workitem-worktree.subscriber.js.map +1 -1
  410. package/dist/backend/backend/src/types/decision.types.d.ts +3 -1
  411. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  412. package/dist/backend/backend/src/types/experiment.types.d.ts +57 -0
  413. package/dist/backend/backend/src/types/experiment.types.d.ts.map +1 -1
  414. package/dist/backend/backend/src/types/experiment.types.js.map +1 -1
  415. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  416. package/dist/backend/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  417. package/dist/backend/backend/src/types/ticket-autopilot.types.js +14 -0
  418. package/dist/backend/backend/src/types/ticket-autopilot.types.js.map +1 -1
  419. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +4 -0
  420. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  421. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +1 -1
  422. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  423. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -0
  424. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  425. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts +44 -37
  426. package/dist/backend/backend/src/utils/agent-caller.utils.d.ts.map +1 -1
  427. package/dist/backend/backend/src/utils/agent-caller.utils.js +48 -42
  428. package/dist/backend/backend/src/utils/agent-caller.utils.js.map +1 -1
  429. package/dist/backend/backend/src/utils/secret-env.d.ts.map +1 -1
  430. package/dist/backend/backend/src/utils/secret-env.js +8 -1
  431. package/dist/backend/backend/src/utils/secret-env.js.map +1 -1
  432. package/dist/backend/build-info.json +2 -2
  433. package/dist/backend/config/constants.d.ts +67 -0
  434. package/dist/backend/config/constants.d.ts.map +1 -1
  435. package/dist/backend/config/constants.js +67 -0
  436. package/dist/backend/config/constants.js.map +1 -1
  437. package/dist/cli/backend/src/constants.d.ts +223 -5
  438. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  439. package/dist/cli/backend/src/constants.js +206 -6
  440. package/dist/cli/backend/src/constants.js.map +1 -1
  441. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  442. package/dist/cli/backend/src/services/agent/agent-registration.service.js +12 -2
  443. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  444. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts +7 -5
  445. package/dist/cli/backend/src/services/agent/control-plane-guard.service.d.ts.map +1 -1
  446. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js +19 -10
  447. package/dist/cli/backend/src/services/agent/control-plane-guard.service.js.map +1 -1
  448. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.d.ts.map +1 -1
  449. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js +10 -1
  450. package/dist/cli/backend/src/services/agent/crewly-agent/crewly-agent-external-runtime.service.js.map +1 -1
  451. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  452. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +4 -0
  453. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  454. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +29 -0
  455. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  456. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +77 -1
  457. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  458. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  459. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -0
  460. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  461. package/dist/cli/backend/src/services/chat/chat.service.d.ts +99 -2
  462. package/dist/cli/backend/src/services/chat/chat.service.d.ts.map +1 -1
  463. package/dist/cli/backend/src/services/chat/chat.service.js +265 -40
  464. package/dist/cli/backend/src/services/chat/chat.service.js.map +1 -1
  465. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +30 -5
  466. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  467. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +34 -4
  468. package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  469. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts +18 -11
  470. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  471. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js +19 -25
  472. package/dist/cli/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  473. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +7 -4
  474. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  475. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +8 -4
  476. package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  477. package/dist/cli/backend/src/services/chat-v2/types.d.ts +0 -1
  478. package/dist/cli/backend/src/services/chat-v2/types.d.ts.map +1 -1
  479. package/dist/cli/backend/src/services/chat-v2/types.js +0 -1
  480. package/dist/cli/backend/src/services/chat-v2/types.js.map +1 -1
  481. package/dist/cli/backend/src/services/core/api-token.service.d.ts +28 -0
  482. package/dist/cli/backend/src/services/core/api-token.service.d.ts.map +1 -1
  483. package/dist/cli/backend/src/services/core/api-token.service.js +46 -0
  484. package/dist/cli/backend/src/services/core/api-token.service.js.map +1 -1
  485. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts +127 -0
  486. package/dist/cli/backend/src/services/core/owner-auth.service.d.ts.map +1 -0
  487. package/dist/cli/backend/src/services/core/owner-auth.service.js +205 -0
  488. package/dist/cli/backend/src/services/core/owner-auth.service.js.map +1 -0
  489. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts +0 -8
  490. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.d.ts.map +1 -1
  491. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js +0 -18
  492. package/dist/cli/backend/src/services/messaging/thread-status-queue.service.js.map +1 -1
  493. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts +19 -0
  494. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.d.ts.map +1 -1
  495. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js +41 -5
  496. package/dist/cli/backend/src/services/monitoring/activity-monitor.service.js.map +1 -1
  497. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts +184 -0
  498. package/dist/cli/backend/src/services/monitoring/agent-turn-state.d.ts.map +1 -0
  499. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js +391 -0
  500. package/dist/cli/backend/src/services/monitoring/agent-turn-state.js.map +1 -0
  501. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts +73 -0
  502. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.d.ts.map +1 -0
  503. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js +258 -0
  504. package/dist/cli/backend/src/services/monitoring/claude-transcript-turn.js.map +1 -0
  505. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +57 -0
  506. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  507. package/dist/cli/backend/src/services/open-items/open-items.service.js +100 -4
  508. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  509. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +36 -0
  510. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  511. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +42 -3
  512. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  513. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts +34 -3
  514. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.d.ts.map +1 -1
  515. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js +57 -2
  516. package/dist/cli/backend/src/services/restart/in-flight-turn-tracker.service.js.map +1 -1
  517. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts +22 -0
  518. package/dist/cli/backend/src/services/restart/restart-drain.service.d.ts.map +1 -1
  519. package/dist/cli/backend/src/services/restart/restart-drain.service.js +37 -5
  520. package/dist/cli/backend/src/services/restart/restart-drain.service.js.map +1 -1
  521. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts +29 -0
  522. package/dist/cli/backend/src/services/slack/slack-auto-working.service.d.ts.map +1 -1
  523. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js +66 -3
  524. package/dist/cli/backend/src/services/slack/slack-auto-working.service.js.map +1 -1
  525. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +79 -15
  526. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  527. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +200 -41
  528. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  529. package/dist/cli/backend/src/services/slack/slack.service.d.ts +18 -0
  530. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  531. package/dist/cli/backend/src/services/slack/slack.service.js +32 -0
  532. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  533. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts +17 -0
  534. package/dist/cli/backend/src/services/trace/trace-context.service.d.ts.map +1 -1
  535. package/dist/cli/backend/src/services/trace/trace-context.service.js +58 -1
  536. package/dist/cli/backend/src/services/trace/trace-context.service.js.map +1 -1
  537. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts +48 -0
  538. package/dist/cli/backend/src/services/trace/trace-recorder.d.ts.map +1 -1
  539. package/dist/cli/backend/src/services/trace/trace-recorder.js +121 -1
  540. package/dist/cli/backend/src/services/trace/trace-recorder.js.map +1 -1
  541. package/dist/cli/backend/src/services/trace/trace-store.d.ts +40 -1
  542. package/dist/cli/backend/src/services/trace/trace-store.d.ts.map +1 -1
  543. package/dist/cli/backend/src/services/trace/trace-store.js +126 -14
  544. package/dist/cli/backend/src/services/trace/trace-store.js.map +1 -1
  545. package/dist/cli/backend/src/services/trace/trace.types.d.ts +22 -3
  546. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
  547. package/dist/cli/backend/src/services/trace/trace.types.js +20 -1
  548. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
  549. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts +3 -1
  550. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.d.ts.map +1 -1
  551. package/dist/cli/backend/src/services/wiki/wiki-ingest.service.js.map +1 -1
  552. package/dist/cli/backend/src/types/decision.types.d.ts +3 -1
  553. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  554. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts +9 -0
  555. package/dist/cli/backend/src/types/ticket-autopilot.types.d.ts.map +1 -1
  556. package/dist/cli/backend/src/types/ticket-autopilot.types.js +14 -0
  557. package/dist/cli/backend/src/types/ticket-autopilot.types.js.map +1 -1
  558. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +4 -0
  559. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  560. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +1 -1
  561. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  562. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -0
  563. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  564. package/dist/cli/backend/src/utils/secret-env.d.ts.map +1 -1
  565. package/dist/cli/backend/src/utils/secret-env.js +8 -1
  566. package/dist/cli/backend/src/utils/secret-env.js.map +1 -1
  567. package/dist/cli/cli/src/commands/service.d.ts +12 -0
  568. package/dist/cli/cli/src/commands/service.d.ts.map +1 -1
  569. package/dist/cli/cli/src/commands/service.js +36 -2
  570. package/dist/cli/cli/src/commands/service.js.map +1 -1
  571. package/dist/cli/cli/src/index.js +4 -0
  572. package/dist/cli/cli/src/index.js.map +1 -1
  573. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts +41 -0
  574. package/dist/cli/cli/src/utils/owner-token-fetch.d.ts.map +1 -0
  575. package/dist/cli/cli/src/utils/owner-token-fetch.js +83 -0
  576. package/dist/cli/cli/src/utils/owner-token-fetch.js.map +1 -0
  577. package/dist/cli/cli/src/utils/safe-shutdown.d.ts +13 -3
  578. package/dist/cli/cli/src/utils/safe-shutdown.d.ts.map +1 -1
  579. package/dist/cli/cli/src/utils/safe-shutdown.js +26 -4
  580. package/dist/cli/cli/src/utils/safe-shutdown.js.map +1 -1
  581. package/dist/cli/config/constants.d.ts +67 -0
  582. package/dist/cli/config/constants.d.ts.map +1 -1
  583. package/dist/cli/config/constants.js +67 -0
  584. package/dist/cli/config/constants.js.map +1 -1
  585. package/frontend/dist/assets/index-5cbcf45b.css +42 -0
  586. package/frontend/dist/assets/{index-800118ca.js → index-63a33dbf.js} +291 -291
  587. package/frontend/dist/index.html +2 -2
  588. package/package.json +1 -1
  589. package/packages/crewly-agent/src/runtime/api-client.test.ts +42 -0
  590. package/packages/crewly-agent/src/runtime/api-client.ts +6 -0
  591. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts +0 -52
  592. package/dist/backend/backend/src/services/v3/request-notification.service.d.ts.map +0 -1
  593. package/dist/backend/backend/src/services/v3/request-notification.service.js +0 -161
  594. package/dist/backend/backend/src/services/v3/request-notification.service.js.map +0 -1
  595. package/frontend/dist/assets/index-5e967795.css +0 -42
@@ -0,0 +1,810 @@
1
+ /**
2
+ * Autonomy metrics of one run trace, computed from its events only: where the
3
+ * time went (agents working, waiting on the owner, waiting on an agent, idle),
4
+ * owner touches, rework, stalls with a cause, harness interventions, tokens
5
+ * and cost, and the outcome.
6
+ *
7
+ * Pure: no I/O, no clock unless none is given. The definitions are in
8
+ * specs/2026-10-03-autonomy-metrics.md; keep the two in step.
9
+ *
10
+ * @module services/trace/trace-metrics
11
+ */
12
+ import { TRACE_CONSTANTS } from '../../constants.js';
13
+ import { eventCostUsd, eventTokens } from '../monitoring/token-usage.service.js';
14
+ /** Every stall cause, in the order they are checked. */
15
+ export const STALL_CAUSES = ['runtime_quota', 'delivery_failure', 'waiting_on_owner', 'waiting_on_agent', 'nobody_pushing'];
16
+ // ---------------------------------------------------------------------------
17
+ // Settings
18
+ // ---------------------------------------------------------------------------
19
+ /**
20
+ * Stall threshold: `CREWLY_TRACE_STALL_MINUTES`, else
21
+ * {@link TRACE_CONSTANTS.STALL_MINUTES}.
22
+ *
23
+ * @returns Minutes
24
+ */
25
+ export function defaultStallMinutes() {
26
+ const env = Number(process.env.CREWLY_TRACE_STALL_MINUTES);
27
+ return Number.isFinite(env) && env > 0 ? clampStallMinutes(env) : TRACE_CONSTANTS.STALL_MINUTES;
28
+ }
29
+ /**
30
+ * A caller's stall threshold within bounds.
31
+ *
32
+ * @param minutes - Requested minutes
33
+ * @returns Minutes within STALL_MINUTES_MIN..STALL_MINUTES_MAX
34
+ */
35
+ export function clampStallMinutes(minutes) {
36
+ return Math.min(TRACE_CONSTANTS.STALL_MINUTES_MAX, Math.max(TRACE_CONSTANTS.STALL_MINUTES_MIN, minutes));
37
+ }
38
+ /**
39
+ * Sort and merge overlapping intervals; empty ones are dropped.
40
+ *
41
+ * @param list - Intervals
42
+ * @returns Disjoint, sorted intervals
43
+ */
44
+ export function mergeIntervals(list) {
45
+ const sorted = list.filter(([a, b]) => b > a).sort((x, y) => x[0] - y[0]);
46
+ const out = [];
47
+ for (const [a, b] of sorted) {
48
+ const last = out[out.length - 1];
49
+ if (last && a <= last[1])
50
+ last[1] = Math.max(last[1], b);
51
+ else
52
+ out.push([a, b]);
53
+ }
54
+ return out;
55
+ }
56
+ /**
57
+ * Clip intervals to a window.
58
+ *
59
+ * @param list - Intervals
60
+ * @param lo - Window start
61
+ * @param hi - Window end
62
+ * @returns Clipped intervals (merged)
63
+ */
64
+ function clip(list, lo, hi) {
65
+ return mergeIntervals(list.map(([a, b]) => [Math.max(a, lo), Math.min(b, hi)]));
66
+ }
67
+ /**
68
+ * `a` minus `b`; both merged.
69
+ *
70
+ * @param a - Intervals
71
+ * @param b - Intervals to remove
72
+ * @returns What is in `a` and not in `b`
73
+ */
74
+ export function subtractIntervals(a, b) {
75
+ const out = [];
76
+ for (const [start, end] of a) {
77
+ let cursor = start;
78
+ for (const [bs, be] of b) {
79
+ if (be <= cursor || bs >= end)
80
+ continue;
81
+ if (bs > cursor)
82
+ out.push([cursor, bs]);
83
+ cursor = Math.max(cursor, be);
84
+ if (cursor >= end)
85
+ break;
86
+ }
87
+ if (cursor < end)
88
+ out.push([cursor, end]);
89
+ }
90
+ return out;
91
+ }
92
+ /**
93
+ * Total length.
94
+ *
95
+ * @param list - Disjoint intervals
96
+ * @returns ms
97
+ */
98
+ function lengthOf(list) {
99
+ return list.reduce((sum, [a, b]) => sum + (b - a), 0);
100
+ }
101
+ /** Work item statuses after which nobody works on it. */
102
+ const WORK_ITEM_CLOSED = new Set(['done', 'done_by_worker', 'verified', 'failed', 'rejected', 'cancelled']);
103
+ /** Work item statuses that hold nobody (waiting for a time). */
104
+ const WORK_ITEM_WAITING_ON_TIME = new Set(['scheduled']);
105
+ /** Statuses a work item is re-queued from (a retry). */
106
+ const RETRY_FROM = new Set(['running', 'blocked', 'failed', 'rejected', 'done_by_worker', 'escalated', 'cancelled', 'verified', 'done']);
107
+ /** Work item types that are a verification. */
108
+ const VERIFY_TYPES = new Set(['check', 'review']);
109
+ /** Decision statuses that close it (`parked` still waits on the owner). */
110
+ const DECISION_CLOSED = new Set(['resolved', 'defaulted', 'cancelled', 'expired', 'skipped']);
111
+ /** Decision kinds that are approvals. */
112
+ const APPROVAL_DECISION_KINDS = new Set(['spend_cap', 'runtime_terms', 'browser_action']);
113
+ /** Request statuses an agent holds. */
114
+ const REQUEST_AGENT_HOLD = new Set(['open', 'ready', 'running', 'awaiting_followup', 'blocked']);
115
+ /** Request statuses work goes back to on a send-back. */
116
+ const REQUEST_BACK_TO_WORK = new Set(['open', 'ready', 'running', 'blocked']);
117
+ /** Events that are not progress (pushing, refusals, failures). */
118
+ const NOT_PROGRESS = new Set(['harness.nudge', 'harness.redelivery', 'harness.wake', 'harness.correction', 'harness.subagent_sendback', 'guard.block', 'error', 'runtime.blocked', 'trace.truncated', 'trace.root']);
119
+ /** turn.error text that means the runtime is out of usage or signed out. */
120
+ const QUOTA_TEXT = /usage limit|rate limit|quota|credit|billing|sign.?in|log.?in|logged out|unauthori[sz]ed|\b401\b/i;
121
+ /**
122
+ * A string field of `data`.
123
+ *
124
+ * @param e - Event
125
+ * @param key - Field
126
+ * @returns The value, or undefined
127
+ */
128
+ function dataStr(e, key) {
129
+ const v = e.data?.[key];
130
+ return typeof v === 'string' ? v : typeof v === 'number' || typeof v === 'boolean' ? String(v) : undefined;
131
+ }
132
+ /**
133
+ * A number field of `data`.
134
+ *
135
+ * @param e - Event
136
+ * @param key - Field
137
+ * @returns The value (0 when absent)
138
+ */
139
+ function dataNum(e, key) {
140
+ const v = Number(e.data?.[key]);
141
+ return Number.isFinite(v) ? v : 0;
142
+ }
143
+ /**
144
+ * The agent session an event is about: its agent actor, else `refs.session`.
145
+ *
146
+ * @param e - Event
147
+ * @returns Session, or undefined
148
+ */
149
+ export function sessionOfEvent(e) {
150
+ if (e.actor.kind === 'agent' && e.actor.session)
151
+ return e.actor.session;
152
+ return e.refs.session || undefined;
153
+ }
154
+ /**
155
+ * Whether an event moved the run forward (see the spec's Stalls section).
156
+ *
157
+ * @param e - Event
158
+ * @returns True for progress
159
+ */
160
+ export function isProgressEvent(e) {
161
+ if (NOT_PROGRESS.has(e.type))
162
+ return false;
163
+ if (e.type === 'message.outbound' && e.outcome === 'failed')
164
+ return false;
165
+ if (e.type === 'turn.delivered' && (dataStr(e, 'kind') === 'redelivery' || e.outcome === 'failed'))
166
+ return false;
167
+ return true;
168
+ }
169
+ /**
170
+ * The text of an owner message delivery without its "delivered to X" prefix
171
+ * (one message delivered to two agents is one touch).
172
+ *
173
+ * @param e - turn.delivered event
174
+ * @returns Message text
175
+ */
176
+ function ownerMessageText(e) {
177
+ return e.summary.replace(/^Owner message delivered to \S+: /, '');
178
+ }
179
+ /**
180
+ * Tokens and cost of a `usage` event (the Usage page's unit and prices).
181
+ *
182
+ * @param e - Event
183
+ * @returns Tokens (input incl. cached + output) and USD, or null for other events
184
+ */
185
+ export function usageOfEvent(e) {
186
+ if (e.type !== 'usage')
187
+ return null;
188
+ const runtime = dataStr(e, 'runtime');
189
+ const usage = {
190
+ model: dataStr(e, 'model') ?? 'unknown',
191
+ input: dataNum(e, 'input'),
192
+ output: dataNum(e, 'output'),
193
+ cachedInput: dataNum(e, 'cachedInput'),
194
+ cacheWrite: dataNum(e, 'cacheWrite'),
195
+ ...(runtime ? { runtime } : {}),
196
+ };
197
+ const tokens = eventTokens(usage);
198
+ return { ...tokens, costUsd: eventCostUsd(usage) };
199
+ }
200
+ /**
201
+ * Sorted events with a valid time (the root excluded).
202
+ *
203
+ * @param events - Raw events
204
+ * @returns Events with times, in time order (file order breaks ties)
205
+ */
206
+ export function sortTraceEvents(events) {
207
+ return events
208
+ .map((e, i) => ({ e, t: Date.parse(e.ts), i }))
209
+ .filter((x) => x.e.type !== 'trace.root' && Number.isFinite(x.t))
210
+ .sort((a, b) => a.t - b.t || a.i - b.i)
211
+ .map(({ e, t }) => ({ e, t }));
212
+ }
213
+ // ---------------------------------------------------------------------------
214
+ // Busy periods
215
+ // ---------------------------------------------------------------------------
216
+ /**
217
+ * Busy periods per session: from `turn.ended` events when the session has
218
+ * any, else inferred from its deliveries and own activity.
219
+ *
220
+ * @param timed - Sorted events
221
+ * @returns Intervals and how they were found
222
+ */
223
+ function busyPeriods(timed) {
224
+ const explicit = new Map();
225
+ const points = new Map();
226
+ const add = (map, s, t) => {
227
+ const list = map.get(s) ?? [];
228
+ list.push(t);
229
+ map.set(s, list);
230
+ };
231
+ for (const { e, t } of timed) {
232
+ if (e.type === 'turn.ended' && e.actor.session) {
233
+ const busyMs = Math.max(0, dataNum(e, 'busyMs'));
234
+ const list = explicit.get(e.actor.session) ?? [];
235
+ list.push([t - busyMs, t]);
236
+ explicit.set(e.actor.session, list);
237
+ continue;
238
+ }
239
+ if (e.type === 'turn.delivered' && e.refs.session && isProgressEvent(e))
240
+ add(points, e.refs.session, t);
241
+ else if (e.actor.kind === 'agent' && e.actor.session)
242
+ add(points, e.actor.session, t);
243
+ }
244
+ const intervals = [];
245
+ let inferred = 0;
246
+ for (const list of explicit.values())
247
+ intervals.push(...list);
248
+ for (const [session, pts] of points) {
249
+ if (explicit.has(session))
250
+ continue;
251
+ inferred += 1;
252
+ let cur = null;
253
+ for (const p of pts) {
254
+ if (cur && p - cur[1] <= TRACE_CONSTANTS.INFERRED_TURN_GAP_MS)
255
+ cur[1] = p;
256
+ else {
257
+ if (cur)
258
+ intervals.push(cur);
259
+ cur = [p, p];
260
+ }
261
+ }
262
+ if (cur)
263
+ intervals.push(cur);
264
+ }
265
+ return { intervals, explicit: explicit.size, inferred };
266
+ }
267
+ /**
268
+ * Owner and agent holds from decisions, Requests, work items and agent →
269
+ * agent messages.
270
+ *
271
+ * @param timed - Sorted events
272
+ * @param end - Window end (open holds end here)
273
+ * @returns Holds and last statuses
274
+ */
275
+ function collectHolds(timed, end) {
276
+ const owner = [];
277
+ const agent = [];
278
+ const openDecisions = new Map();
279
+ const requestState = new Map();
280
+ const workItems = new Map();
281
+ const pendingMessages = [];
282
+ const closeRequest = (id, t, stillOpen = false) => {
283
+ const st = requestState.get(id);
284
+ if (!st)
285
+ return;
286
+ const flag = stillOpen ? { stillOpen } : {};
287
+ if (st.status === 'waiting_confirmation')
288
+ owner.push({ start: st.since, end: t, label: `Ticket ${id} waits for the owner's review`, ...flag });
289
+ else if (REQUEST_AGENT_HOLD.has(st.status))
290
+ agent.push({ start: st.since, end: t, label: `Ticket ${id} is ${st.status.replace(/_/g, ' ')}`, ...flag });
291
+ };
292
+ const closeWorkItem = (id, t, stillOpen = false) => {
293
+ const wi = workItems.get(id);
294
+ if (!wi || !wi.open)
295
+ return;
296
+ agent.push({
297
+ start: wi.since,
298
+ end: t,
299
+ label: `Work item${wi.target ? ` for ${wi.target}` : ''} is ${wi.status}`,
300
+ ...(wi.target ? { session: wi.target } : {}),
301
+ ...(stillOpen ? { stillOpen } : {}),
302
+ });
303
+ wi.open = false;
304
+ };
305
+ for (const { e, t } of timed) {
306
+ // Any activity of an agent answers messages sent to it.
307
+ const actorSession = e.actor.kind === 'agent' ? e.actor.session : undefined;
308
+ if (actorSession) {
309
+ for (let i = pendingMessages.length - 1; i >= 0; i--) {
310
+ const m = pendingMessages[i];
311
+ if (m.target === actorSession && t >= m.since) {
312
+ agent.push({ start: m.since, end: t, label: `Message to ${m.target}${m.from ? ` from ${m.from}` : ''} not picked up`, session: m.target });
313
+ pendingMessages.splice(i, 1);
314
+ }
315
+ }
316
+ }
317
+ switch (e.type) {
318
+ case 'decision.created': {
319
+ const id = e.refs.decisionId ?? `decision@${t}`;
320
+ if (!openDecisions.has(id))
321
+ openDecisions.set(id, t);
322
+ break;
323
+ }
324
+ case 'decision.status': {
325
+ const id = e.refs.decisionId ?? '';
326
+ const to = dataStr(e, 'to') ?? '';
327
+ const since = openDecisions.get(id);
328
+ if (since !== undefined && DECISION_CLOSED.has(to)) {
329
+ owner.push({ start: since, end: t, label: `Decision ${id} open` });
330
+ openDecisions.delete(id);
331
+ }
332
+ else if (since === undefined && !DECISION_CLOSED.has(to) && id) {
333
+ openDecisions.set(id, t);
334
+ }
335
+ break;
336
+ }
337
+ case 'request.created':
338
+ case 'request.status': {
339
+ const id = e.refs.requestId ?? 'request';
340
+ const status = e.type === 'request.created' ? (dataStr(e, 'status') ?? 'open') : (dataStr(e, 'to') ?? '');
341
+ if (!status)
342
+ break;
343
+ closeRequest(id, t);
344
+ requestState.set(id, { status, since: t });
345
+ break;
346
+ }
347
+ case 'workitem.created': {
348
+ const id = e.refs.workItemId;
349
+ if (!id)
350
+ break;
351
+ const status = dataStr(e, 'status') ?? 'queued';
352
+ const open = !WORK_ITEM_CLOSED.has(status) && !WORK_ITEM_WAITING_ON_TIME.has(status);
353
+ workItems.set(id, { status, since: t, open, ...(e.refs.session ? { target: e.refs.session } : {}) });
354
+ break;
355
+ }
356
+ case 'workitem.status': {
357
+ const id = e.refs.workItemId;
358
+ if (!id)
359
+ break;
360
+ const to = dataStr(e, 'to') ?? '';
361
+ const wi = workItems.get(id) ?? { status: dataStr(e, 'from') ?? 'queued', since: t, open: false, ...(e.refs.session ? { target: e.refs.session } : {}) };
362
+ if (!workItems.has(id))
363
+ workItems.set(id, wi);
364
+ closeWorkItem(id, t);
365
+ wi.status = to;
366
+ wi.since = t;
367
+ if (e.refs.session)
368
+ wi.target = e.refs.session;
369
+ wi.open = !WORK_ITEM_CLOSED.has(to) && !WORK_ITEM_WAITING_ON_TIME.has(to);
370
+ break;
371
+ }
372
+ case 'message.agent': {
373
+ if (e.refs.session && e.refs.session !== actorSession)
374
+ pendingMessages.push({ target: e.refs.session, ...(actorSession ? { from: actorSession } : {}), since: t });
375
+ break;
376
+ }
377
+ default:
378
+ break;
379
+ }
380
+ }
381
+ // Still open at the end of the window.
382
+ for (const [id, since] of openDecisions)
383
+ owner.push({ start: since, end, label: `Decision ${id} open`, stillOpen: true });
384
+ for (const id of requestState.keys())
385
+ closeRequest(id, end, true);
386
+ for (const id of workItems.keys())
387
+ closeWorkItem(id, end, true);
388
+ for (const m of pendingMessages) {
389
+ agent.push({ start: m.since, end, label: `Message to ${m.target}${m.from ? ` from ${m.from}` : ''} not picked up`, session: m.target, stillOpen: true });
390
+ }
391
+ const workItemStatus = new Map();
392
+ for (const [id, wi] of workItems)
393
+ workItemStatus.set(id, wi.status);
394
+ const requestStatus = new Map();
395
+ for (const [id, st] of requestState)
396
+ requestStatus.set(id, st.status);
397
+ return { owner, agent, workItemStatus, requestStatus };
398
+ }
399
+ /**
400
+ * Holds covering a moment.
401
+ *
402
+ * @param holds - Holds
403
+ * @param at - Time (ms)
404
+ * @returns Holds open at `at` (a hold still open at the window's end covers every later moment)
405
+ */
406
+ function holdsAt(holds, at) {
407
+ return holds.filter((h) => h.start <= at && (h.end > at || h.stillOpen === true));
408
+ }
409
+ // ---------------------------------------------------------------------------
410
+ // Main
411
+ // ---------------------------------------------------------------------------
412
+ /**
413
+ * Compute the autonomy metrics of a trace.
414
+ *
415
+ * @param root - The trace root
416
+ * @param events - Its events, in any order (the root event is ignored)
417
+ * @param options - Stall threshold, clock
418
+ * @returns The metrics
419
+ *
420
+ * @example
421
+ * ```typescript
422
+ * const page = await store.read(id, 0, TRACE_CONSTANTS.MAX_PAGE_SIZE);
423
+ * const m = computeTraceMetrics(page.root, page.events, { stallMinutes: 30 });
424
+ * m.time.waitingOwnerMs; // time the run sat on the owner
425
+ * ```
426
+ */
427
+ export function computeTraceMetrics(root, events, options = {}) {
428
+ const stallMinutes = clampStallMinutes(options.stallMinutes ?? defaultStallMinutes());
429
+ const thresholdMs = stallMinutes * 60_000;
430
+ const now = (options.now ?? new Date()).getTime();
431
+ const timed = sortTraceEvents(events);
432
+ const rootAt = Date.parse(root.createdAt);
433
+ const firstAt = timed.length > 0 ? timed[0].t : Number.NaN;
434
+ const start = Number.isFinite(rootAt) ? (Number.isFinite(firstAt) ? Math.min(rootAt, firstAt) : rootAt) : Number.isFinite(firstAt) ? firstAt : now;
435
+ const end = Math.max(start, timed.length > 0 ? timed[timed.length - 1].t : start);
436
+ // --- Time ---------------------------------------------------------------
437
+ const busy = busyPeriods(timed);
438
+ const active = clip(busy.intervals, start, end);
439
+ const holds = collectHolds(timed, end);
440
+ const ownerHeld = clip(holds.owner.map((h) => [h.start, h.end]), start, end);
441
+ const agentHeld = clip(holds.agent.map((h) => [h.start, h.end]), start, end);
442
+ const activeMs = lengthOf(active);
443
+ const ownerOnly = subtractIntervals(ownerHeld, active);
444
+ const waitingOwnerMs = lengthOf(ownerOnly);
445
+ const waitingAgentMs = lengthOf(subtractIntervals(subtractIntervals(agentHeld, active), ownerHeld));
446
+ const wallMs = end - start;
447
+ const idleMs = Math.max(0, wallMs - activeMs - waitingOwnerMs - waitingAgentMs);
448
+ const activeSource = busy.explicit === 0 && busy.inferred === 0 ? 'none' : busy.explicit === 0 ? 'inferred' : busy.inferred === 0 ? 'turn_events' : 'mixed';
449
+ // --- Owner touches, rework, interventions, usage --------------------------
450
+ const touches = { answered: 0, approved: 0, sentBack: 0, corrected: 0, manual: 0 };
451
+ const rework = { sendBacks: 0, retries: 0, failedVerifications: 0, subagentSendBacks: 0 };
452
+ const interventions = { nudges: 0, redeliveries: 0, wakes: 0, corrections: 0, guardBlocks: 0, misroutes: 0 };
453
+ const touchTimes = [];
454
+ const touchEvents = [];
455
+ const ownerActions = [];
456
+ const approvalDecisions = new Set();
457
+ const rejectCounts = new Map();
458
+ const workItemType = new Map();
459
+ const retryCounts = new Map();
460
+ const recentOwnerMessages = [];
461
+ let agentSpoke = false;
462
+ const byAgent = new Map();
463
+ const byModel = new Map();
464
+ const agents = new Set();
465
+ let experiment;
466
+ const touch = (kind, t) => {
467
+ touches[kind] += 1;
468
+ touchTimes.push(t);
469
+ if (options.detail)
470
+ touchEvents.push({ kind, at: new Date(t).toISOString() });
471
+ agentSpoke = false;
472
+ };
473
+ const addUsage = (map, key, tokens, cost) => {
474
+ const row = map.get(key) ?? { key, inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0, costUsd: 0 };
475
+ row.inputTokens += tokens.input;
476
+ row.cachedInputTokens += tokens.cachedInput;
477
+ row.outputTokens += tokens.output;
478
+ row.totalTokens += tokens.total;
479
+ row.costUsd += cost;
480
+ map.set(key, row);
481
+ };
482
+ for (const { e, t } of timed) {
483
+ if (e.actor.kind === 'agent' && e.actor.session)
484
+ agents.add(e.actor.session);
485
+ switch (e.type) {
486
+ case 'message.outbound':
487
+ if (e.outcome === 'failed')
488
+ interventions.misroutes += 1;
489
+ else if (e.actor.kind === 'agent')
490
+ agentSpoke = true;
491
+ break;
492
+ case 'turn.delivered': {
493
+ if (e.refs.session && e.actor.kind !== 'owner')
494
+ agents.add(e.refs.session);
495
+ if (dataStr(e, 'kind') !== 'owner_message' || e.actor.kind !== 'owner')
496
+ break;
497
+ if (e.refs.session)
498
+ agents.add(e.refs.session);
499
+ const text = ownerMessageText(e);
500
+ const dup = recentOwnerMessages.some((m) => m.text === text && t - m.t <= TRACE_CONSTANTS.OWNER_MESSAGE_DEDUPE_MS);
501
+ recentOwnerMessages.push({ text, t });
502
+ if (dup || t - start <= TRACE_CONSTANTS.ROOT_GRACE_MS)
503
+ break;
504
+ touch(agentSpoke ? 'answered' : 'corrected', t);
505
+ break;
506
+ }
507
+ case 'decision.created': {
508
+ const kind = dataStr(e, 'kind');
509
+ if (e.refs.decisionId && (dataStr(e, 'sensitive') || (kind && APPROVAL_DECISION_KINDS.has(kind))))
510
+ approvalDecisions.add(e.refs.decisionId);
511
+ if (e.actor.kind === 'agent')
512
+ agentSpoke = true;
513
+ break;
514
+ }
515
+ case 'decision.status': {
516
+ const to = dataStr(e, 'to');
517
+ if (e.actor.kind === 'owner' && (to === 'resolved' || to === 'skipped')) {
518
+ touch(e.refs.decisionId && approvalDecisions.has(e.refs.decisionId) ? 'approved' : 'answered', t);
519
+ }
520
+ break;
521
+ }
522
+ case 'request.created': {
523
+ if (e.refs.requestId)
524
+ rejectCounts.set(e.refs.requestId, 0);
525
+ break;
526
+ }
527
+ case 'request.status': {
528
+ const id = e.refs.requestId ?? 'request';
529
+ const from = dataStr(e, 'from');
530
+ const to = dataStr(e, 'to');
531
+ const accepted = dataStr(e, 'acceptedBy');
532
+ const prevRc = rejectCounts.get(id) ?? 0;
533
+ const rc = e.data && 'rejectCount' in e.data ? dataNum(e, 'rejectCount') : prevRc;
534
+ rejectCounts.set(id, Math.max(prevRc, rc));
535
+ if (to === 'done' && (accepted === 'owner' || (from === 'waiting_confirmation' && !accepted)))
536
+ touch('approved', t);
537
+ else if (rc > prevRc || (from === 'waiting_confirmation' && to && REQUEST_BACK_TO_WORK.has(to))) {
538
+ touch('sentBack', t);
539
+ rework.sendBacks += 1;
540
+ }
541
+ break;
542
+ }
543
+ case 'workitem.created': {
544
+ if (e.refs.workItemId) {
545
+ workItemType.set(e.refs.workItemId, dataStr(e, 'type') ?? '');
546
+ retryCounts.set(e.refs.workItemId, 0);
547
+ }
548
+ break;
549
+ }
550
+ case 'workitem.status': {
551
+ const id = e.refs.workItemId ?? '';
552
+ const from = dataStr(e, 'from') ?? '';
553
+ const to = dataStr(e, 'to') ?? '';
554
+ const prevRetry = retryCounts.get(id) ?? 0;
555
+ const retry = e.data && 'retryCount' in e.data ? dataNum(e, 'retryCount') : prevRetry;
556
+ retryCounts.set(id, Math.max(prevRetry, retry));
557
+ if ((to === 'queued' && RETRY_FROM.has(from)) || retry > prevRetry)
558
+ rework.retries += 1;
559
+ if ((from === 'done_by_worker' && to === 'rejected') || (VERIFY_TYPES.has(workItemType.get(id) ?? '') && (to === 'failed' || to === 'rejected'))) {
560
+ rework.failedVerifications += 1;
561
+ }
562
+ break;
563
+ }
564
+ case 'harness.subagent_sendback':
565
+ rework.subagentSendBacks += 1;
566
+ break;
567
+ case 'harness.nudge':
568
+ interventions.nudges += 1;
569
+ break;
570
+ case 'harness.redelivery':
571
+ interventions.redeliveries += 1;
572
+ break;
573
+ case 'harness.wake':
574
+ interventions.wakes += 1;
575
+ break;
576
+ case 'harness.correction':
577
+ interventions.corrections += 1;
578
+ break;
579
+ case 'guard.block':
580
+ interventions.guardBlocks += 1;
581
+ break;
582
+ case 'owner.action':
583
+ ownerActions.push(t);
584
+ break;
585
+ case 'usage': {
586
+ const u = usageOfEvent(e);
587
+ if (!u)
588
+ break;
589
+ addUsage(byAgent, sessionOfEvent(e) ?? 'unknown', u, u.costUsd);
590
+ addUsage(byModel, dataStr(e, 'model') ?? 'unknown', u, u.costUsd);
591
+ break;
592
+ }
593
+ case 'experiment.event': {
594
+ const id = e.refs.experimentId ?? experiment?.id ?? '';
595
+ const ev = dataStr(e, 'event') ?? '';
596
+ experiment = { ...(experiment ?? {}), id };
597
+ if (ev === 'created' && !experiment.status)
598
+ experiment.status = 'planned';
599
+ if (ev === 'shipped' || ev === 'baseline_captured')
600
+ experiment.status = 'running';
601
+ if (ev === 'cancelled')
602
+ experiment.status = 'cancelled';
603
+ if (ev === 'measured') {
604
+ experiment.status = 'done';
605
+ const m = /measured: (worked|didnt|inconclusive)/.exec(e.summary);
606
+ if (m)
607
+ experiment.verdict = m[1];
608
+ }
609
+ break;
610
+ }
611
+ default:
612
+ break;
613
+ }
614
+ }
615
+ // A dashboard write next to an owner touch is that touch.
616
+ touches.manual = ownerActions.filter((t) => !touchTimes.some((x) => Math.abs(x - t) <= TRACE_CONSTANTS.OWNER_ACTION_DEDUPE_MS)).length;
617
+ // --- Stalls --------------------------------------------------------------
618
+ const progress = timed.filter(({ e }) => isProgressEvent(e));
619
+ // Busy periods and progress instants, in order (overlaps are fine: the cursor only moves forward).
620
+ const covered = [...active, ...progress.map(({ t }) => [t, t])].sort((x, y) => x[0] - y[0]);
621
+ const gaps = [];
622
+ let cursor = start;
623
+ for (const [a, b] of covered) {
624
+ if (a - cursor > thresholdMs)
625
+ gaps.push([cursor, a]);
626
+ cursor = Math.max(cursor, b);
627
+ }
628
+ // A gap that runs to the window's end (no progress after it) can still be going on.
629
+ const trailing = end - cursor > thresholdMs;
630
+ if (trailing)
631
+ gaps.push([cursor, end]);
632
+ const openAtEnd = holdsAt(holds.owner, end).length > 0 || holdsAt(holds.agent, end).length > 0;
633
+ const stalls = gaps.map(([a, b]) => classifyStall(a, b, timed, progress, holds));
634
+ if (openAtEnd && now - end > 0) {
635
+ const last = stalls[stalls.length - 1];
636
+ if (trailing && last) {
637
+ last.end = new Date(now).toISOString();
638
+ last.ms = now - Date.parse(last.start);
639
+ last.ongoing = true;
640
+ }
641
+ else if (now - Math.max(cursor, end) > thresholdMs) {
642
+ const s = classifyStall(Math.max(cursor, end), now, timed, progress, holds);
643
+ s.ongoing = true;
644
+ stalls.push(s);
645
+ }
646
+ }
647
+ const byCause = Object.fromEntries(STALL_CAUSES.map((c) => [c, 0]));
648
+ for (const s of stalls)
649
+ byCause[s.cause] += 1;
650
+ const kept = !options.detail && stalls.length > TRACE_CONSTANTS.METRICS_MAX_STALL_ITEMS
651
+ ? [...stalls].sort((x, y) => y.ms - x.ms).slice(0, TRACE_CONSTANTS.METRICS_MAX_STALL_ITEMS).sort((x, y) => x.start.localeCompare(y.start))
652
+ : stalls;
653
+ // --- Outcome -------------------------------------------------------------
654
+ const wiStatuses = [...holds.workItemStatus.values()];
655
+ const workItems = {
656
+ total: wiStatuses.length,
657
+ done: wiStatuses.filter((s) => s === 'done' || s === 'verified' || s === 'done_by_worker').length,
658
+ failed: wiStatuses.filter((s) => s === 'failed' || s === 'rejected').length,
659
+ open: wiStatuses.filter((s) => !WORK_ITEM_CLOSED.has(s)).length,
660
+ };
661
+ const primaryRequest = root.refs.requestId && holds.requestStatus.has(root.refs.requestId) ? root.refs.requestId : [...holds.requestStatus.keys()][0];
662
+ const requestStatus = primaryRequest ? holds.requestStatus.get(primaryRequest) : undefined;
663
+ const state = outcomeState({ requestStatus, experiment, workItems, ownerOpen: holdsAt(holds.owner, end).length > 0, agentOpen: holdsAt(holds.agent, end).length > 0 });
664
+ const sortUsage = (map) => [...map.values()].map((r) => ({ ...r, costUsd: roundUsd(r.costUsd) })).sort((a, b) => b.costUsd - a.costUsd || b.totalTokens - a.totalTokens);
665
+ const agentRows = sortUsage(byAgent);
666
+ const sum = (k) => agentRows.reduce((s, r) => s + r[k], 0);
667
+ const total = (o) => Object.values(o).reduce((s, n) => s + n, 0);
668
+ return {
669
+ traceId: root.traceId,
670
+ window: { start: new Date(start).toISOString(), end: new Date(end).toISOString() },
671
+ eventCount: timed.length,
672
+ agents: [...agents].sort(),
673
+ time: { wallMs, activeMs, waitingOwnerMs, waitingAgentMs, idleMs, activeSource },
674
+ // `manual` is not collected yet (see TraceMetrics.ownerTouches): not in the total.
675
+ ownerTouches: { ...touches, total: touches.answered + touches.approved + touches.sentBack + touches.corrected },
676
+ rework: { ...rework, total: total(rework) },
677
+ stalls: { thresholdMinutes: stallMinutes, count: stalls.length, totalMs: stalls.reduce((s, x) => s + x.ms, 0), byCause, items: kept },
678
+ interventions: { ...interventions, total: total(interventions) },
679
+ usage: {
680
+ inputTokens: sum('inputTokens'),
681
+ cachedInputTokens: sum('cachedInputTokens'),
682
+ outputTokens: sum('outputTokens'),
683
+ totalTokens: sum('totalTokens'),
684
+ costUsd: roundUsd([...byAgent.values()].reduce((s, r) => s + r.costUsd, 0)),
685
+ byAgent: agentRows,
686
+ byModel: sortUsage(byModel),
687
+ },
688
+ outcome: {
689
+ state,
690
+ ...(requestStatus ? { requestStatus } : {}),
691
+ workItems,
692
+ ...(experiment ? { experiment } : {}),
693
+ },
694
+ ...(options.detail ? { ownerTouchEvents: touchEvents } : {}),
695
+ };
696
+ }
697
+ /**
698
+ * Round a dollar amount to 1/10 000 (sums of tiny per-turn costs).
699
+ *
700
+ * @param usd - Amount
701
+ * @returns Rounded amount
702
+ */
703
+ function roundUsd(usd) {
704
+ return Math.round(usd * 10_000) / 10_000;
705
+ }
706
+ /**
707
+ * The run's overall state.
708
+ *
709
+ * @param input - Request status, experiment, work items, open holds at the end
710
+ * @returns State
711
+ */
712
+ function outcomeState(input) {
713
+ const { requestStatus, experiment, workItems } = input;
714
+ if (requestStatus === 'done')
715
+ return 'done';
716
+ if (requestStatus === 'cancelled')
717
+ return 'cancelled';
718
+ if (input.ownerOpen || requestStatus === 'waiting_confirmation')
719
+ return 'waiting_on_owner';
720
+ if (experiment?.status === 'done')
721
+ return 'done';
722
+ if (experiment?.status === 'cancelled')
723
+ return 'cancelled';
724
+ if (input.agentOpen || workItems.open > 0 || experiment?.status === 'running' || experiment?.status === 'planned')
725
+ return 'in_progress';
726
+ if (workItems.total > 0 && workItems.done > 0)
727
+ return 'done';
728
+ if (workItems.total > 0 && workItems.failed > 0)
729
+ return 'failed';
730
+ if (workItems.total > 0)
731
+ return 'cancelled';
732
+ return 'no_open_work';
733
+ }
734
+ /**
735
+ * Give a stall its cause (the spec's table; first match wins).
736
+ *
737
+ * @param a - Stall start (ms)
738
+ * @param b - Stall end (ms)
739
+ * @param timed - All events, sorted
740
+ * @param progress - Progress events, sorted
741
+ * @param holds - Owner / agent holds
742
+ * @returns The stall
743
+ */
744
+ function classifyStall(a, b, timed, progress, holds) {
745
+ const base = { start: new Date(a).toISOString(), end: new Date(b).toISOString(), ms: b - a };
746
+ const around = timed.filter(({ t }) => t >= a - TRACE_CONSTANTS.STALL_CAUSE_LOOKBACK_MS && t <= b).map(({ e }) => e);
747
+ const quota = around.find((e) => e.type === 'runtime.blocked' ||
748
+ (e.type === 'harness.nudge' && ['login', 'spend_cap'].includes(dataStr(e, 'reason') ?? '')) ||
749
+ (e.type === 'turn.error' && QUOTA_TEXT.test(e.summary)));
750
+ if (quota) {
751
+ const session = sessionOfEvent(quota);
752
+ return { ...base, cause: 'runtime_quota', detail: quota.summary, ...(session ? { sessions: [session] } : {}) };
753
+ }
754
+ const failed = around.find((e) => (e.type === 'message.outbound' || e.type === 'turn.delivered') && e.outcome === 'failed');
755
+ if (failed) {
756
+ const session = sessionOfEvent(failed);
757
+ return { ...base, cause: 'delivery_failure', detail: failed.summary, ...(session ? { sessions: [session] } : {}) };
758
+ }
759
+ const ownerHolds = holdsAt(holds.owner, a);
760
+ if (ownerHolds.length > 0)
761
+ return { ...base, cause: 'waiting_on_owner', detail: holdDetail(ownerHolds) };
762
+ const before = [...progress].reverse().find(({ t }) => t <= a);
763
+ const after = progress.find(({ t }) => t >= b);
764
+ if (before?.e.type === 'message.outbound' && before.e.actor.kind === 'agent' && after?.e.actor.kind === 'owner') {
765
+ return { ...base, cause: 'waiting_on_owner', detail: `${before.e.actor.session ?? 'An agent'} spoke to the owner; the owner answered after the gap` };
766
+ }
767
+ const agentHolds = holdsAt(holds.agent, a);
768
+ if (agentHolds.length > 0) {
769
+ const sessions = [...new Set(agentHolds.map((h) => h.session).filter((s) => !!s))];
770
+ return { ...base, cause: 'waiting_on_agent', detail: holdDetail(agentHolds), ...(sessions.length > 0 ? { sessions } : {}) };
771
+ }
772
+ return { ...base, cause: 'nobody_pushing', detail: 'Nothing was open and nobody was working' };
773
+ }
774
+ /**
775
+ * What held a stall, each distinct reason once ("×3" when repeated).
776
+ *
777
+ * @param holds - Holds open at the stall's start
778
+ * @returns One line
779
+ */
780
+ function holdDetail(holds) {
781
+ const counts = new Map();
782
+ for (const h of holds)
783
+ counts.set(h.label, (counts.get(h.label) ?? 0) + 1);
784
+ return [...counts].map(([label, n]) => (n > 1 ? `${label} (×${n})` : label)).join('; ');
785
+ }
786
+ /**
787
+ * The numbers embedded in list rows.
788
+ *
789
+ * @param m - Full metrics
790
+ * @returns Summary
791
+ */
792
+ export function summarizeTraceMetrics(m) {
793
+ return {
794
+ wallMs: m.time.wallMs,
795
+ activeMs: m.time.activeMs,
796
+ waitingOwnerMs: m.time.waitingOwnerMs,
797
+ waitingAgentMs: m.time.waitingAgentMs,
798
+ idleMs: m.time.idleMs,
799
+ ownerTouches: m.ownerTouches.total,
800
+ rework: m.rework.total,
801
+ stalls: m.stalls.count,
802
+ stallMs: m.stalls.totalMs,
803
+ ongoingStall: m.stalls.items.some((s) => s.ongoing === true),
804
+ interventions: m.interventions.total,
805
+ totalTokens: m.usage.totalTokens,
806
+ costUsd: m.usage.costUsd,
807
+ state: m.outcome.state,
808
+ };
809
+ }
810
+ //# sourceMappingURL=trace-metrics.js.map