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
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Agent Turn State
3
+ *
4
+ * Whether an agent is mid-turn according to its runtime, not according to
5
+ * its screen. Long tool calls, a model writing a long tool input and
6
+ * background subagents are all silent on the PTY. Reading silence as "idle"
7
+ * let a restart kill Eve mid-work (2026-10-02, TKT-194). See
8
+ * specs/2026-10-02-restart-busy-and-resume.md.
9
+ *
10
+ * Sources:
11
+ * - Claude Code hooks (POST /api/agent-hooks): SessionStart, UserPromptSubmit,
12
+ * PreToolUse, PostToolUse, SubagentStart, SubagentStop, Stop. Only
13
+ * identifiers are kept (event names, tool-use ids, subagent ids), never
14
+ * payload content.
15
+ * - The Claude Code transcript (see claude-transcript-turn.ts).
16
+ *
17
+ * How they combine:
18
+ * - The hooks lead. A transcript turn end (end_turn, interrupt, API or
19
+ * usage-limit error) newer than the last hook event ends a hook `turn`:
20
+ * Esc and API errors fire no Stop hook.
21
+ * - `Stop` clears open tool calls and holds the turn's subagents. Held
22
+ * subagents count as `background` only while the transcript (Claude Code's
23
+ * own pending-background count) agrees; a transcript turn end with nothing
24
+ * pending drops them.
25
+ * - A transcript-only `background` (no hook saw a subagent) is reported as
26
+ * `idle`: on its own it never blocks the drain or settling.
27
+ * - A transcript `turn` newer than the last hook event (a lost hook) is a turn.
28
+ *
29
+ * Verdicts:
30
+ * - `turn`: a turn is in progress;
31
+ * - `background`: the turn ended, but a subagent is still running and will
32
+ * start a new turn when it finishes;
33
+ * - `idle`: the runtime said the turn ended and nothing is pending;
34
+ * - `unknown`: no trustworthy signal; callers fall back to the screen.
35
+ *
36
+ * @module services/monitoring/agent-turn-state
37
+ */
38
+ import { TURN_STATE_CONSTANTS } from '../../constants.js';
39
+ import { claudeTranscriptTurnState } from './claude-transcript-turn.js';
40
+ /** Hook events this service reads. */
41
+ const TURN_EVENTS = new Set(['SessionStart', 'UserPromptSubmit', 'PreToolUse', 'PostToolUse', 'SubagentStart', 'SubagentStop', 'Stop']);
42
+ /** SessionStart sources that mean a new runtime process. */
43
+ const RUNTIME_START_SOURCES = new Set(['startup', 'resume']);
44
+ /** Prefix of synthetic ids for subagents that reported none. */
45
+ const ANON = '\u0000anon-';
46
+ const UNKNOWN = { state: 'unknown', longRunning: false, since: null, source: 'none' };
47
+ /**
48
+ * Oldest value, or null.
49
+ *
50
+ * @param values - Timestamps
51
+ * @returns Smallest, or null when empty
52
+ */
53
+ function oldest(values) {
54
+ let min = null;
55
+ for (const v of values)
56
+ if (min === null || v < min)
57
+ min = v;
58
+ return min;
59
+ }
60
+ /**
61
+ * Process-wide runtime turn state. Singleton; in memory only (a backend
62
+ * restart kills the agents too, so nothing needs to survive one).
63
+ */
64
+ export class AgentTurnStateService {
65
+ static instance = null;
66
+ records = new Map();
67
+ transcriptLocator = null;
68
+ /** Located transcript per session, re-resolved after LOCATOR_CACHE_MS */
69
+ located = new Map();
70
+ /**
71
+ * @returns The singleton
72
+ */
73
+ static getInstance() {
74
+ if (!AgentTurnStateService.instance)
75
+ AgentTurnStateService.instance = new AgentTurnStateService();
76
+ return AgentTurnStateService.instance;
77
+ }
78
+ /** Reset the singleton (tests only). */
79
+ static resetInstance() {
80
+ AgentTurnStateService.instance = null;
81
+ }
82
+ /**
83
+ * Install the transcript locator.
84
+ *
85
+ * @param locator - Locator, or null to disable the transcript
86
+ */
87
+ setTranscriptLocator(locator) {
88
+ this.transcriptLocator = locator;
89
+ this.located.clear();
90
+ }
91
+ /**
92
+ * A runtime process was (re)started for the session: forget its old turn
93
+ * state, and ignore transcript background launches from before now.
94
+ *
95
+ * @param sessionName - Session
96
+ * @param now - Start time
97
+ */
98
+ noteRuntimeStart(sessionName, now = Date.now()) {
99
+ this.records.delete(sessionName);
100
+ this.located.delete(sessionName);
101
+ const r = this.recordFor(sessionName, now);
102
+ r.runtimeStartedAt = now;
103
+ }
104
+ /**
105
+ * Record a Claude Code hook event.
106
+ *
107
+ * @param sessionName - Reporting session
108
+ * @param event - Hook event name (validated by the caller)
109
+ * @param ids - Tool-use / subagent ids and SessionStart source, already validated
110
+ * @param now - Clock
111
+ * @returns True when the event changed the turn state model
112
+ */
113
+ recordHook(sessionName, event, ids = {}, now = Date.now()) {
114
+ if (!TURN_EVENTS.has(event))
115
+ return false;
116
+ if (event === 'SessionStart') {
117
+ if (ids.source && RUNTIME_START_SOURCES.has(ids.source)) {
118
+ this.noteRuntimeStart(sessionName, now);
119
+ }
120
+ else {
121
+ // /clear or compaction: same process, maybe another transcript file.
122
+ this.located.delete(sessionName);
123
+ }
124
+ return true;
125
+ }
126
+ const r = this.recordFor(sessionName, now);
127
+ r.lastEventAt = now;
128
+ const markActive = () => {
129
+ if (!r.active) {
130
+ r.active = true;
131
+ r.activeSince = now;
132
+ }
133
+ };
134
+ const max = TURN_STATE_CONSTANTS.MAX_OPEN_PER_SESSION;
135
+ switch (event) {
136
+ case 'UserPromptSubmit':
137
+ markActive();
138
+ break;
139
+ case 'PreToolUse':
140
+ markActive();
141
+ if (ids.toolUseId && r.openTools.size < max)
142
+ r.openTools.set(ids.toolUseId, now);
143
+ break;
144
+ case 'PostToolUse':
145
+ markActive();
146
+ if (ids.toolUseId)
147
+ r.openTools.delete(ids.toolUseId);
148
+ break;
149
+ case 'SubagentStart':
150
+ if (r.subagents.size < max)
151
+ r.subagents.set(ids.agentId ?? `${ANON}${r.anonSeq++}`, now);
152
+ break;
153
+ case 'SubagentStop': {
154
+ const removeFrom = (m) => {
155
+ if (ids.agentId && m.delete(ids.agentId))
156
+ return true;
157
+ if (!ids.agentId) {
158
+ const anon = [...m.keys()].find((k) => k.startsWith(ANON)) ?? m.keys().next().value;
159
+ if (anon !== undefined)
160
+ return m.delete(anon);
161
+ }
162
+ return false;
163
+ };
164
+ if (!removeFrom(r.subagents))
165
+ removeFrom(r.heldSubagents);
166
+ // The parent is notified and resumes: its turn is active again
167
+ // until the next Stop (2026-10-02, Eve's 04:41:11 turn).
168
+ markActive();
169
+ break;
170
+ }
171
+ case 'Stop':
172
+ this.endTurn(r, now);
173
+ break;
174
+ }
175
+ return true;
176
+ }
177
+ /**
178
+ * Forget a session (its runtime exited).
179
+ *
180
+ * @param sessionName - Session
181
+ */
182
+ forget(sessionName) {
183
+ this.records.delete(sessionName);
184
+ this.located.delete(sessionName);
185
+ }
186
+ /**
187
+ * Sessions that reported a hook event (still remembered).
188
+ *
189
+ * @returns Session names
190
+ */
191
+ knownSessions() {
192
+ return [...this.records.keys()];
193
+ }
194
+ /**
195
+ * Epoch ms of the session's last hook event, or null when it never sent one.
196
+ *
197
+ * @param sessionName - Session
198
+ * @returns Time or null
199
+ */
200
+ lastHookEventAt(sessionName) {
201
+ const r = this.records.get(sessionName);
202
+ return r && r.lastEventAt > 0 ? r.lastEventAt : null;
203
+ }
204
+ /**
205
+ * What the hooks alone say (held subagents count as background here).
206
+ *
207
+ * @param sessionName - Session
208
+ * @param now - Clock
209
+ * @returns Verdict (`unknown` without hooks or after a long silence)
210
+ */
211
+ hookVerdict(sessionName, now = Date.now()) {
212
+ const r = this.records.get(sessionName);
213
+ if (!r || r.lastEventAt === 0)
214
+ return UNKNOWN;
215
+ this.expire(r, now);
216
+ const subs = r.subagents.size + r.heldSubagents.size;
217
+ if (r.active) {
218
+ const open = r.openTools.size > 0 || subs > 0;
219
+ if (open || now - r.lastEventAt <= TURN_STATE_CONSTANTS.HOOK_SILENCE_MS) {
220
+ return { state: 'turn', longRunning: open, since: r.activeSince, source: 'hooks' };
221
+ }
222
+ // A lost Stop must not pin the agent as busy forever.
223
+ return UNKNOWN;
224
+ }
225
+ if (subs > 0) {
226
+ return { state: 'background', longRunning: true, since: oldest([...r.subagents.values(), ...r.heldSubagents.values()]), source: 'hooks' };
227
+ }
228
+ return { state: 'idle', longRunning: false, since: null, source: 'hooks' };
229
+ }
230
+ /**
231
+ * Combined verdict (see the module doc for the rules).
232
+ *
233
+ * @param sessionName - Session
234
+ * @param now - Clock
235
+ * @returns Verdict
236
+ *
237
+ * @example
238
+ * ```typescript
239
+ * const v = AgentTurnStateService.getInstance().getVerdict('eve-1');
240
+ * if (v.state === 'turn' || v.state === 'background') // do not call it idle
241
+ * ```
242
+ */
243
+ getVerdict(sessionName, now = Date.now()) {
244
+ const r = this.records.get(sessionName);
245
+ const t = this.readTranscript(sessionName, now, r?.runtimeStartedAt ?? undefined);
246
+ const transcriptTurn = t !== null && t.verdict === 'turn' && now - t.mtimeMs <= TURN_STATE_CONSTANTS.TRANSCRIPT_FRESH_MS;
247
+ const asTranscriptTurn = () => ({
248
+ state: 'turn',
249
+ longRunning: false,
250
+ since: t && Number.isFinite(t.lastEntryAt) ? t.lastEntryAt : null,
251
+ source: 'transcript',
252
+ });
253
+ if (!r || r.lastEventAt === 0) {
254
+ if (transcriptTurn)
255
+ return asTranscriptTurn();
256
+ // A transcript-only "background" never blocks on its own.
257
+ if (t && (t.verdict === 'idle' || t.verdict === 'background'))
258
+ return { state: 'idle', longRunning: false, since: null, source: 'transcript' };
259
+ return UNKNOWN;
260
+ }
261
+ // Esc, API errors and usage limits end the turn with no Stop hook: a
262
+ // transcript turn end newer than the last hook event ends it here too.
263
+ if (r.active && t && Number.isFinite(t.turnEndedAt) && t.turnEndedAt > r.lastEventAt) {
264
+ this.endTurn(r, t.turnEndedAt);
265
+ }
266
+ const hooks = this.hookVerdict(sessionName, now);
267
+ if (hooks.state === 'turn')
268
+ return hooks;
269
+ if (hooks.state === 'background') {
270
+ // Held subagents need Claude Code's own word that they still run.
271
+ // (A transcript still mid-flush — its last entry the turn's tool
272
+ // result — agrees too when it lists the launch as pending.)
273
+ const agrees = t !== null && t.pendingBackground > 0 && (t.verdict === 'background' || transcriptTurn);
274
+ const liveSince = oldest(r.subagents.values());
275
+ if (r.subagents.size > 0 || agrees) {
276
+ return { ...hooks, ...(agrees ? {} : { since: liveSince }) };
277
+ }
278
+ if (t !== null && t.verdict === 'idle' && r.stoppedAt !== null && Number.isFinite(t.turnEndedAt) && t.turnEndedAt >= r.stoppedAt - TURN_STATE_CONSTANTS.TRANSCRIPT_LAG_MS) {
279
+ r.heldSubagents.clear(); // the transcript says nothing is pending: they were stale
280
+ }
281
+ if (!t)
282
+ r.heldSubagents.clear(); // no second opinion: Stop clears them
283
+ return { state: 'idle', longRunning: false, since: null, source: 'hooks' };
284
+ }
285
+ // A turn the hooks missed (a failed POST) but the transcript shows.
286
+ if (transcriptTurn && t && t.lastEntryAt > r.lastEventAt)
287
+ return asTranscriptTurn();
288
+ return hooks;
289
+ }
290
+ /**
291
+ * Whether the agent still has background work after its turn ended: the
292
+ * work it is answering for is not finished yet.
293
+ *
294
+ * @param sessionName - Session
295
+ * @param now - Clock
296
+ * @returns True for a `background` verdict
297
+ */
298
+ hasBackgroundWork(sessionName, now = Date.now()) {
299
+ return this.getVerdict(sessionName, now).state === 'background';
300
+ }
301
+ /**
302
+ * End a record's turn: open tools are cleared, the turn's subagents are held.
303
+ *
304
+ * @param r - Record
305
+ * @param at - When the turn ended
306
+ */
307
+ endTurn(r, at) {
308
+ r.active = false;
309
+ r.stoppedAt = at;
310
+ r.openTools.clear();
311
+ for (const [id, startedAt] of r.subagents)
312
+ r.heldSubagents.set(id, startedAt);
313
+ r.subagents.clear();
314
+ }
315
+ /**
316
+ * Drop open tool calls and subagents older than OPEN_WORK_MAX_MS.
317
+ *
318
+ * @param r - Record
319
+ * @param now - Clock
320
+ */
321
+ expire(r, now) {
322
+ const maxAge = TURN_STATE_CONSTANTS.OPEN_WORK_MAX_MS;
323
+ for (const m of [r.openTools, r.subagents, r.heldSubagents]) {
324
+ for (const [id, at] of m)
325
+ if (now - at > maxAge)
326
+ m.delete(id);
327
+ }
328
+ }
329
+ /**
330
+ * Read the session's transcript, if a locator finds one.
331
+ *
332
+ * @param sessionName - Session
333
+ * @param now - Clock
334
+ * @param launchedAfter - Runtime start (older launches ignored)
335
+ * @returns The transcript state, or null
336
+ */
337
+ readTranscript(sessionName, now, launchedAfter) {
338
+ if (!this.transcriptLocator)
339
+ return null;
340
+ const cached = this.located.get(sessionName);
341
+ let file;
342
+ if (cached && now - cached.at < TURN_STATE_CONSTANTS.LOCATOR_CACHE_MS) {
343
+ file = cached.file;
344
+ }
345
+ else {
346
+ try {
347
+ file = this.transcriptLocator(sessionName);
348
+ }
349
+ catch {
350
+ file = null;
351
+ }
352
+ if (this.located.size >= TURN_STATE_CONSTANTS.MAX_TRACKED_SESSIONS)
353
+ this.located.clear();
354
+ this.located.set(sessionName, { file, at: now });
355
+ }
356
+ if (!file)
357
+ return null;
358
+ return claudeTranscriptTurnState(file, launchedAfter !== undefined ? { launchedAfter } : {});
359
+ }
360
+ /**
361
+ * Get or create a session's record (bounded).
362
+ *
363
+ * @param sessionName - Session
364
+ * @param now - Clock
365
+ * @returns The record
366
+ */
367
+ recordFor(sessionName, now) {
368
+ let r = this.records.get(sessionName);
369
+ if (r)
370
+ return r;
371
+ if (this.records.size >= TURN_STATE_CONSTANTS.MAX_TRACKED_SESSIONS) {
372
+ const first = this.records.keys().next().value;
373
+ if (first !== undefined)
374
+ this.records.delete(first);
375
+ }
376
+ r = {
377
+ active: false,
378
+ activeSince: now,
379
+ lastEventAt: 0,
380
+ stoppedAt: null,
381
+ runtimeStartedAt: null,
382
+ openTools: new Map(),
383
+ subagents: new Map(),
384
+ heldSubagents: new Map(),
385
+ anonSeq: 0,
386
+ };
387
+ this.records.set(sessionName, r);
388
+ return r;
389
+ }
390
+ }
391
+ //# sourceMappingURL=agent-turn-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn-state.js","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/agent-turn-state.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,7 @@
39
39
  *
40
40
  * @module services/monitoring/claude-transcript-sync
41
41
  */
42
+ import { type CostRepairPlan } from './transcript-cost-repair.js';
42
43
  /**
43
44
  * How far a single session's transcript has been consumed.
44
45
  *
@@ -87,8 +88,12 @@ export interface TranscriptCursor {
87
88
  * pointed at one foreign transcript and each accumulated its whole cost —
88
89
  * Atlas and Max each showed ~$300. Cursors without this mark are recounted
89
90
  * once on load.
91
+ *
92
+ * `3` once `cost` has been checked against the token ledger and, if it was
93
+ * double-counted by the recount bug (#972, v1.20.89–v1.20.192), lowered to
94
+ * the ledger cost (#990). New cursors start at `3`.
90
95
  */
91
- costBasis?: 2;
96
+ costBasis?: 2 | 3;
92
97
  }
93
98
  /** One agent's context size, as measured from its latest transcript turn. */
94
99
  export interface ContextReading {
@@ -263,6 +268,35 @@ export declare class ClaudeTranscriptSyncService {
263
268
  private emitContext;
264
269
  /** Reads persisted cursors; a missing or corrupt file starts fresh. */
265
270
  private loadCursors;
271
+ /**
272
+ * #990: one-time repair of cursors whose `cost` was double-counted by the
273
+ * recount bug (#972). Each cursor not yet at `costBasis: 3` is checked
274
+ * against its session's token-ledger cost: one clearly above the ledger is
275
+ * lowered to it, one that is not is left alone. Either way it is marked
276
+ * `costBasis: 3` so it is never checked again. A cursor whose ledger cannot
277
+ * be trusted yet (no events, or the newest transcript turn is missing from
278
+ * the ledger) is left unmarked and checked again on the next start.
279
+ *
280
+ * Every change is logged with the before and after figures. With `dryRun`
281
+ * nothing is changed or marked; the plan is only logged and returned.
282
+ *
283
+ * Expects the token ledger to be loaded already (the server loads it before
284
+ * starting this service).
285
+ *
286
+ * @param options.dryRun - Log what would change, change nothing
287
+ * @returns The plan that was applied (or would be, in a dry run)
288
+ */
289
+ repairDoubleCountedCosts(options?: {
290
+ dryRun?: boolean;
291
+ }): Promise<CostRepairPlan>;
292
+ /**
293
+ * The newest assistant turn this cursor has counted in its current
294
+ * transcript, as a ledger match key.
295
+ *
296
+ * @param cursor - The cursor
297
+ * @returns The key; null when nothing has been counted there yet; undefined when the transcript cannot be read
298
+ */
299
+ private newestCountedTurn;
266
300
  /**
267
301
  * Recount, once, the cost of every cursor written before the shared-cwd
268
302
  * guard, from its own transcript alone.
@@ -1 +1 @@
1
- {"version":3,"file":"claude-transcript-sync.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/claude-transcript-sync.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-transcript-sync.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/monitoring/claude-transcript-sync.service.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,7 @@ import { CLAUDE_TRANSCRIPT_SYNC_CONSTANTS } from '../../constants.js';
50
50
  import { findLatestSessionFile, findSessionJsonlPath } from './claude-session-tokens.service.js';
51
51
  import { effectiveClaudeAccount } from '../runtime-fallback/effective-runtime.js';
52
52
  import { claudeAccountConfigDir } from '../harness/claude-accounts.js';
53
+ import { planCostRepair, ledgerEventCost } from './transcript-cost-repair.js';
53
54
  /**
54
55
  * Reads Claude Code transcripts on an interval and records exact token usage.
55
56
  *
@@ -315,7 +316,7 @@ export class ClaudeTranscriptSyncService {
315
316
  async syncOne(sessionName, filePath, ownedByOther = () => false) {
316
317
  let cursor = this.cursors.get(sessionName);
317
318
  if (!cursor) {
318
- cursor = { filePath, offset: 0, seenMessageIds: [], cost: 0, costBasis: 2 };
319
+ cursor = { filePath, offset: 0, seenMessageIds: [], cost: 0, costBasis: 3 };
319
320
  this.cursors.set(sessionName, cursor);
320
321
  }
321
322
  let turns = 0;
@@ -521,7 +522,131 @@ export class ClaudeTranscriptSyncService {
521
522
  }
522
523
  catch {
523
524
  this.cursors = new Map();
525
+ return;
526
+ }
527
+ try {
528
+ await this.repairDoubleCountedCosts({
529
+ dryRun: process.env[CLAUDE_TRANSCRIPT_SYNC_CONSTANTS.COST_REPAIR_DRY_RUN_ENV] === '1',
530
+ });
531
+ }
532
+ catch (err) {
533
+ this.logger.warn('Transcript cost repair failed; cursors left as they were', {
534
+ error: err instanceof Error ? err.message : String(err),
535
+ });
536
+ }
537
+ }
538
+ /**
539
+ * #990: one-time repair of cursors whose `cost` was double-counted by the
540
+ * recount bug (#972). Each cursor not yet at `costBasis: 3` is checked
541
+ * against its session's token-ledger cost: one clearly above the ledger is
542
+ * lowered to it, one that is not is left alone. Either way it is marked
543
+ * `costBasis: 3` so it is never checked again. A cursor whose ledger cannot
544
+ * be trusted yet (no events, or the newest transcript turn is missing from
545
+ * the ledger) is left unmarked and checked again on the next start.
546
+ *
547
+ * Every change is logged with the before and after figures. With `dryRun`
548
+ * nothing is changed or marked; the plan is only logged and returned.
549
+ *
550
+ * Expects the token ledger to be loaded already (the server loads it before
551
+ * starting this service).
552
+ *
553
+ * @param options.dryRun - Log what would change, change nothing
554
+ * @returns The plan that was applied (or would be, in a dry run)
555
+ */
556
+ async repairDoubleCountedCosts(options = {}) {
557
+ const pending = [...this.cursors].filter(([, cursor]) => cursor.costBasis !== 3);
558
+ if (pending.length === 0)
559
+ return { changes: [], verified: [], skipped: [] };
560
+ const pendingNames = new Set(pending.map(([name]) => name));
561
+ const ledgerCost = new Map();
562
+ const ledgerTurns = new Map();
563
+ TokenUsageService.getInstance().forEachEvent((sessionName, event) => {
564
+ if (!pendingNames.has(sessionName))
565
+ return;
566
+ ledgerCost.set(sessionName, (ledgerCost.get(sessionName) ?? 0) + ledgerEventCost(event));
567
+ const turns = ledgerTurns.get(sessionName) ?? new Set();
568
+ turns.add(turnKey(event.timestamp, event.input, event.output));
569
+ ledgerTurns.set(sessionName, turns);
570
+ });
571
+ // Is the ledger current for a session? Its newest counted transcript turn must be in it.
572
+ const current = new Map();
573
+ for (const [sessionName, cursor] of pending) {
574
+ if (!ledgerCost.has(sessionName))
575
+ continue;
576
+ const newest = await this.newestCountedTurn(cursor);
577
+ current.set(sessionName, newest === undefined ? undefined : newest === null ? true : ledgerTurns.get(sessionName)?.has(newest) === true);
578
+ }
579
+ const plan = planCostRepair(Object.fromEntries(pending), (sessionName) => {
580
+ const cost = ledgerCost.get(sessionName);
581
+ return cost === undefined ? undefined : { cost, current: current.get(sessionName) };
582
+ });
583
+ const round = (usd) => Math.round(usd * 100) / 100;
584
+ for (const change of plan.changes) {
585
+ this.logger.info(options.dryRun
586
+ ? 'Cost repair (dry run): would lower a double-counted session cost to its ledger cost'
587
+ : 'Cost repair: lowered a double-counted session cost to its ledger cost', {
588
+ sessionName: change.sessionName,
589
+ was: round(change.was),
590
+ now: round(change.now),
591
+ removed: round(change.excess),
592
+ });
593
+ }
594
+ this.logger.info(options.dryRun ? 'Cost repair dry run finished; nothing changed' : 'Cost repair finished', {
595
+ lowered: plan.changes.length,
596
+ removedUsd: round(plan.changes.reduce((n, c) => n + c.excess, 0)),
597
+ alreadyCorrect: plan.verified.length,
598
+ skipped: plan.skipped,
599
+ });
600
+ if (options.dryRun)
601
+ return plan;
602
+ for (const change of plan.changes) {
603
+ const cursor = this.cursors.get(change.sessionName);
604
+ if (!cursor)
605
+ continue;
606
+ cursor.cost = change.now;
607
+ cursor.costBasis = 3;
608
+ TokenUsageService.getInstance().overrideSessionCost(change.sessionName, cursor.cost);
609
+ }
610
+ for (const sessionName of plan.verified) {
611
+ const cursor = this.cursors.get(sessionName);
612
+ if (cursor)
613
+ cursor.costBasis = 3;
524
614
  }
615
+ if (plan.changes.length > 0 || plan.verified.length > 0)
616
+ await this.saveCursors();
617
+ return plan;
618
+ }
619
+ /**
620
+ * The newest assistant turn this cursor has counted in its current
621
+ * transcript, as a ledger match key.
622
+ *
623
+ * @param cursor - The cursor
624
+ * @returns The key; null when nothing has been counted there yet; undefined when the transcript cannot be read
625
+ */
626
+ async newestCountedTurn(cursor) {
627
+ let text;
628
+ try {
629
+ const handle = await fs.open(cursor.filePath, 'r');
630
+ try {
631
+ const size = (await handle.stat()).size;
632
+ const length = Math.min(cursor.offset, size);
633
+ const buf = Buffer.alloc(length);
634
+ await handle.read(buf, 0, length, 0);
635
+ text = buf.toString('utf-8');
636
+ }
637
+ finally {
638
+ await handle.close();
639
+ }
640
+ }
641
+ catch {
642
+ return undefined;
643
+ }
644
+ const lastNewline = text.lastIndexOf('\n');
645
+ if (lastNewline < 0)
646
+ return null;
647
+ const turns = this.parseTurns(text.slice(0, lastNewline), new Set());
648
+ const newest = turns[turns.length - 1];
649
+ return newest ? turnKey(newest.timestamp, newest.input, newest.output) : null;
525
650
  }
526
651
  /**
527
652
  * Recount, once, the cost of every cursor written before the shared-cwd
@@ -535,7 +660,7 @@ export class ClaudeTranscriptSyncService {
535
660
  async recountLegacyCosts() {
536
661
  let changed = false;
537
662
  for (const [sessionName, cursor] of this.cursors) {
538
- if (cursor.costBasis === 2)
663
+ if (cursor.costBasis === 2 || cursor.costBasis === 3)
539
664
  continue;
540
665
  let text;
541
666
  try {
@@ -600,6 +725,17 @@ export class ClaudeTranscriptSyncService {
600
725
  return this.cursors.get(sessionName);
601
726
  }
602
727
  }
728
+ /**
729
+ * Key that matches a transcript turn to its token-ledger event.
730
+ *
731
+ * @param timestamp - Turn timestamp (the ledger keeps the turn's own)
732
+ * @param input - Fresh input tokens
733
+ * @param output - Output tokens
734
+ * @returns Match key
735
+ */
736
+ function turnKey(timestamp, input, output) {
737
+ return `${timestamp}|${input}|${output}`;
738
+ }
603
739
  /**
604
740
  * Convenience accessor for the shared sync service.
605
741
  *