crewly 1.20.362 → 1.20.364

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 (320) hide show
  1. package/config/hooks/destructive-git-guard/guard.mjs +96 -0
  2. package/config/roles/orchestrator/prompt.md +3 -3
  3. package/config/roles/team-leader/prompt.md +2 -0
  4. package/config/skills/agent/core/ask-owner/SKILL.md +31 -0
  5. package/config/skills/agent/core/ask-owner/execute.sh +14 -3
  6. package/config/skills/agent/core/ask-owner/execute.test.sh +8 -0
  7. package/config/skills/agent/core/gmail-read/SKILL.md +8 -0
  8. package/config/skills/agent/core/gmail-send/SKILL.md +10 -3
  9. package/config/skills/agent/core/gmail-send/execute.sh +2 -1
  10. package/config/skills/agent/core/gmail-watch-thread/SKILL.md +69 -0
  11. package/config/skills/agent/core/gmail-watch-thread/execute.sh +51 -0
  12. package/config/skills/agent/core/project-tickets/SKILL.md +12 -0
  13. package/config/skills/agent/core/project-tickets/execute.sh +13 -3
  14. package/config/skills/agent/core/project-tickets/execute.test.sh +4 -0
  15. package/config/skills/agent/core/watch-for-event/SKILL.md +22 -0
  16. package/config/skills/orchestrator/delegate-task/SKILL.md +14 -0
  17. package/config/skills/orchestrator/delegate-task/execute.sh +19 -2
  18. package/config/skills/orchestrator/delegate-task/execute.test.sh +30 -0
  19. package/config/skills/orchestrator/harness-login/SKILL.md +1 -1
  20. package/config/skills/team-leader/delegate-task/execute.sh +6 -0
  21. package/dist/backend/backend/src/constants.d.ts +74 -2
  22. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  23. package/dist/backend/backend/src/constants.js +75 -3
  24. package/dist/backend/backend/src/constants.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  26. package/dist/backend/backend/src/controllers/chat/chat.controller.js +14 -1
  27. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  28. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +44 -0
  29. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
  30. package/dist/backend/backend/src/controllers/google/google.controller.js +121 -3
  31. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
  32. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
  33. package/dist/backend/backend/src/controllers/google/google.routes.js +5 -1
  34. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -1
  35. package/dist/backend/backend/src/controllers/harness/owner-login.controller.d.ts +1 -1
  36. package/dist/backend/backend/src/controllers/harness/owner-login.controller.js +1 -1
  37. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts +1 -1
  38. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js +2 -1
  40. package/dist/backend/backend/src/controllers/project-tickets/project-tickets.controller.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  42. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +7 -0
  43. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  44. package/dist/backend/backend/src/index.d.ts.map +1 -1
  45. package/dist/backend/backend/src/index.js +61 -0
  46. package/dist/backend/backend/src/index.js.map +1 -1
  47. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
  49. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  50. package/dist/backend/backend/src/services/decisions/decision-card.d.ts +46 -13
  51. package/dist/backend/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/decisions/decision-card.js +100 -50
  53. package/dist/backend/backend/src/services/decisions/decision-card.js.map +1 -1
  54. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts +23 -1
  55. package/dist/backend/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/decisions/decision-contract.js +76 -4
  57. package/dist/backend/backend/src/services/decisions/decision-contract.js.map +1 -1
  58. package/dist/backend/backend/src/services/decisions/decision-wording.d.ts +167 -0
  59. package/dist/backend/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
  60. package/dist/backend/backend/src/services/decisions/decision-wording.js +406 -0
  61. package/dist/backend/backend/src/services/decisions/decision-wording.js.map +1 -0
  62. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +30 -1
  63. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/decisions/decision.service.js +44 -8
  65. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  66. package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/decisions/decision.wiring.js +17 -0
  68. package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
  69. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  70. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +6 -1
  71. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  72. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts +142 -0
  73. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js +304 -0
  75. package/dist/backend/backend/src/services/google/gmail-reply-watch.service.js.map +1 -0
  76. package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts +130 -0
  77. package/dist/backend/backend/src/services/google/gmail-send-approval.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/google/gmail-send-approval.service.js +216 -0
  79. package/dist/backend/backend/src/services/google/gmail-send-approval.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts +28 -13
  81. package/dist/backend/backend/src/services/google/gmail-send-gate.d.ts.map +1 -1
  82. package/dist/backend/backend/src/services/google/gmail-send-gate.js +82 -29
  83. package/dist/backend/backend/src/services/google/gmail-send-gate.js.map +1 -1
  84. package/dist/backend/backend/src/services/google/gmail.service.d.ts +90 -0
  85. package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -1
  86. package/dist/backend/backend/src/services/google/gmail.service.js +122 -0
  87. package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -1
  88. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts +24 -14
  89. package/dist/backend/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
  90. package/dist/backend/backend/src/services/harness/claude-accounts.js +35 -21
  91. package/dist/backend/backend/src/services/harness/claude-accounts.js.map +1 -1
  92. package/dist/backend/backend/src/services/harness/claude-native-login.d.ts +106 -0
  93. package/dist/backend/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/harness/claude-native-login.js +174 -0
  95. package/dist/backend/backend/src/services/harness/claude-native-login.js.map +1 -0
  96. package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
  97. package/dist/backend/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/harness/claude-token-migration.service.js +283 -0
  99. package/dist/backend/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
  100. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
  101. package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  102. package/dist/backend/backend/src/services/harness/harness-credentials.store.js +96 -39
  103. package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  104. package/dist/backend/backend/src/services/harness/harness-registry.js +1 -1
  105. package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -1
  106. package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
  107. package/dist/backend/backend/src/services/harness/harness-relogin.service.js +2 -2
  108. package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -1
  109. package/dist/backend/backend/src/services/harness/harness.service.js +10 -1
  110. package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -1
  111. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +24 -21
  112. package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  113. package/dist/backend/backend/src/services/harness/login-broker.service.js +50 -64
  114. package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -1
  115. package/dist/backend/backend/src/services/harness/login-rules.d.ts +17 -11
  116. package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/harness/login-rules.js +22 -25
  118. package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -1
  119. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
  120. package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/open-items/open-item-extractor.js +70 -0
  122. package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  123. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +25 -0
  124. package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  125. package/dist/backend/backend/src/services/open-items/open-items.service.js +65 -5
  126. package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
  127. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
  128. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +5 -2
  129. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
  130. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +50 -2
  131. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
  132. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +103 -11
  133. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
  134. package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +27 -0
  135. package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
  136. package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +25 -0
  137. package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
  138. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
  139. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +4 -2
  140. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
  141. package/dist/backend/backend/src/services/orc/team-lead-report.d.ts +120 -0
  142. package/dist/backend/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
  143. package/dist/backend/backend/src/services/orc/team-lead-report.js +198 -0
  144. package/dist/backend/backend/src/services/orc/team-lead-report.js.map +1 -0
  145. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
  146. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
  147. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js +85 -0
  148. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
  149. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
  150. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  151. package/dist/backend/backend/src/services/orc/work-item-destination.js +38 -1
  152. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  153. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
  154. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  155. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js +30 -6
  156. package/dist/backend/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  157. package/dist/backend/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
  158. package/dist/backend/backend/src/services/project-tickets/ticket-file.js +6 -1
  159. package/dist/backend/backend/src/services/project-tickets/ticket-file.js.map +1 -1
  160. package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts +64 -0
  161. package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.d.ts.map +1 -0
  162. package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js +93 -0
  163. package/dist/backend/backend/src/services/project-tickets/ticket-hold-registry.js.map +1 -0
  164. package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
  165. package/dist/backend/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
  166. package/dist/backend/backend/src/services/project-tickets/ticket-hold.js +301 -0
  167. package/dist/backend/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
  168. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +33 -3
  169. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  170. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +50 -4
  171. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  172. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +8 -1
  173. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  174. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +26 -0
  175. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  176. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +6 -1
  177. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  178. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +3 -2
  179. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  180. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.d.ts.map +1 -1
  181. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js +4 -1
  182. package/dist/backend/backend/src/services/runtime-fallback/runtime-fallback.wiring.js.map +1 -1
  183. package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts +34 -0
  184. package/dist/backend/backend/src/services/stall/stall-watcher.service.d.ts.map +1 -1
  185. package/dist/backend/backend/src/services/stall/stall-watcher.service.js +70 -2
  186. package/dist/backend/backend/src/services/stall/stall-watcher.service.js.map +1 -1
  187. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
  188. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  189. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +72 -1
  190. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  191. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts +3 -0
  192. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.d.ts.map +1 -1
  193. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js +5 -2
  194. package/dist/backend/backend/src/services/worktree/worktree-janitor.service.js.map +1 -1
  195. package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts +7 -2
  196. package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.d.ts.map +1 -1
  197. package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js +11 -2
  198. package/dist/backend/backend/src/services/worktree/worktree-unmerged-notice.js.map +1 -1
  199. package/dist/backend/backend/src/types/decision.types.d.ts +53 -1
  200. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  201. package/dist/backend/backend/src/types/event-bus.types.d.ts +10 -2
  202. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  203. package/dist/backend/backend/src/types/event-bus.types.js +8 -0
  204. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  205. package/dist/backend/backend/src/types/project-ticket.types.d.ts +7 -0
  206. package/dist/backend/backend/src/types/project-ticket.types.d.ts.map +1 -1
  207. package/dist/backend/backend/src/types/project-ticket.types.js +1 -0
  208. package/dist/backend/backend/src/types/project-ticket.types.js.map +1 -1
  209. package/dist/backend/backend/src/types/v2/open-item.types.d.ts +8 -1
  210. package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  211. package/dist/backend/build-info.json +2 -2
  212. package/dist/cli/backend/src/constants.d.ts +74 -2
  213. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  214. package/dist/cli/backend/src/constants.js +75 -3
  215. package/dist/cli/backend/src/constants.js.map +1 -1
  216. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  217. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +2 -1
  218. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  219. package/dist/cli/backend/src/services/decisions/decision-card.d.ts +46 -13
  220. package/dist/cli/backend/src/services/decisions/decision-card.d.ts.map +1 -1
  221. package/dist/cli/backend/src/services/decisions/decision-card.js +100 -50
  222. package/dist/cli/backend/src/services/decisions/decision-card.js.map +1 -1
  223. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts +23 -1
  224. package/dist/cli/backend/src/services/decisions/decision-contract.d.ts.map +1 -1
  225. package/dist/cli/backend/src/services/decisions/decision-contract.js +76 -4
  226. package/dist/cli/backend/src/services/decisions/decision-contract.js.map +1 -1
  227. package/dist/cli/backend/src/services/decisions/decision-wording.d.ts +167 -0
  228. package/dist/cli/backend/src/services/decisions/decision-wording.d.ts.map +1 -0
  229. package/dist/cli/backend/src/services/decisions/decision-wording.js +406 -0
  230. package/dist/cli/backend/src/services/decisions/decision-wording.js.map +1 -0
  231. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +30 -1
  232. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  233. package/dist/cli/backend/src/services/decisions/decision.service.js +44 -8
  234. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  235. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  236. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +6 -1
  237. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  238. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts +24 -14
  239. package/dist/cli/backend/src/services/harness/claude-accounts.d.ts.map +1 -1
  240. package/dist/cli/backend/src/services/harness/claude-accounts.js +35 -21
  241. package/dist/cli/backend/src/services/harness/claude-accounts.js.map +1 -1
  242. package/dist/cli/backend/src/services/harness/claude-native-login.d.ts +106 -0
  243. package/dist/cli/backend/src/services/harness/claude-native-login.d.ts.map +1 -0
  244. package/dist/cli/backend/src/services/harness/claude-native-login.js +174 -0
  245. package/dist/cli/backend/src/services/harness/claude-native-login.js.map +1 -0
  246. package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts +158 -0
  247. package/dist/cli/backend/src/services/harness/claude-token-migration.service.d.ts.map +1 -0
  248. package/dist/cli/backend/src/services/harness/claude-token-migration.service.js +283 -0
  249. package/dist/cli/backend/src/services/harness/claude-token-migration.service.js.map +1 -0
  250. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +44 -24
  251. package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -1
  252. package/dist/cli/backend/src/services/harness/harness-credentials.store.js +96 -39
  253. package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -1
  254. package/dist/cli/backend/src/services/harness/harness-registry.js +1 -1
  255. package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -1
  256. package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +2 -2
  257. package/dist/cli/backend/src/services/harness/harness-relogin.service.js +2 -2
  258. package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -1
  259. package/dist/cli/backend/src/services/harness/harness.service.js +10 -1
  260. package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -1
  261. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +24 -21
  262. package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -1
  263. package/dist/cli/backend/src/services/harness/login-broker.service.js +50 -64
  264. package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -1
  265. package/dist/cli/backend/src/services/harness/login-rules.d.ts +17 -11
  266. package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -1
  267. package/dist/cli/backend/src/services/harness/login-rules.js +22 -25
  268. package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -1
  269. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +36 -0
  270. package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -1
  271. package/dist/cli/backend/src/services/open-items/open-item-extractor.js +70 -0
  272. package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -1
  273. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts +25 -0
  274. package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
  275. package/dist/cli/backend/src/services/open-items/open-items.service.js +65 -5
  276. package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
  277. package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +113 -0
  278. package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -0
  279. package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +195 -0
  280. package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -0
  281. package/dist/cli/backend/src/services/orc/team-lead-report.d.ts +120 -0
  282. package/dist/cli/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
  283. package/dist/cli/backend/src/services/orc/team-lead-report.js +198 -0
  284. package/dist/cli/backend/src/services/orc/team-lead-report.js.map +1 -0
  285. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
  286. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
  287. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js +85 -0
  288. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
  289. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
  290. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  291. package/dist/cli/backend/src/services/orc/work-item-destination.js +38 -1
  292. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
  293. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts +5 -0
  294. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.d.ts.map +1 -1
  295. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js +30 -6
  296. package/dist/cli/backend/src/services/project-tickets/project-ticket.service.js.map +1 -1
  297. package/dist/cli/backend/src/services/project-tickets/ticket-file.d.ts.map +1 -1
  298. package/dist/cli/backend/src/services/project-tickets/ticket-file.js +6 -1
  299. package/dist/cli/backend/src/services/project-tickets/ticket-file.js.map +1 -1
  300. package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts +176 -0
  301. package/dist/cli/backend/src/services/project-tickets/ticket-hold.d.ts.map +1 -0
  302. package/dist/cli/backend/src/services/project-tickets/ticket-hold.js +301 -0
  303. package/dist/cli/backend/src/services/project-tickets/ticket-hold.js.map +1 -0
  304. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
  305. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  306. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +72 -1
  307. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  308. package/dist/cli/backend/src/types/decision.types.d.ts +53 -1
  309. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  310. package/dist/cli/backend/src/types/event-bus.types.d.ts +10 -2
  311. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  312. package/dist/cli/backend/src/types/event-bus.types.js +8 -0
  313. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  314. package/dist/cli/backend/src/types/project-ticket.types.d.ts +7 -0
  315. package/dist/cli/backend/src/types/project-ticket.types.d.ts.map +1 -1
  316. package/dist/cli/backend/src/types/project-ticket.types.js +1 -0
  317. package/dist/cli/backend/src/types/project-ticket.types.js.map +1 -1
  318. package/dist/cli/backend/src/types/v2/open-item.types.d.ts +8 -1
  319. package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -1
  320. package/package.json +1 -1
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Claude Code's own login state: is a config dir (or the default login)
3
+ * signed in through Claude Code itself?
4
+ *
5
+ * Crewly does not collect, store or intermediate Claude.ai credentials
6
+ * (Anthropic's Claude Code legal page). Claude Code keeps its own login in
7
+ * `<config dir>/.credentials.json` or, on macOS, in the keychain, so a file
8
+ * check alone is wrong on a Mac: the default login of a Mac has no
9
+ * `.credentials.json` at all. Two questions are therefore asked of the CLI
10
+ * itself, always with Crewly's own env (no `CLAUDE_CODE_OAUTH_TOKEN`, no API
11
+ * key) so a token can never make a login look native:
12
+ *
13
+ * - {@link readClaudeAuthStatus}: `claude auth status --json`, the CLI's own
14
+ * record (`loggedIn`). Cheap, no network turn, but it keeps saying
15
+ * `loggedIn: true` for an expired login. Feeds the sync "signed in" flag.
16
+ * - {@link probeClaudeNativeLogin}: one tiny real turn. This is the
17
+ * verification the token migration waits for before it deletes anything.
18
+ *
19
+ * Neither prints or reads a credential: only the exit code and the output
20
+ * of the CLI are looked at.
21
+ *
22
+ * @module services/harness/claude-native-login
23
+ */
24
+ import type { LoginState, RunCommand } from './harness.types.js';
25
+ /** Injectable dependencies. */
26
+ export interface ClaudeNativeLoginDeps {
27
+ run?: RunCommand;
28
+ /** Base env (default process.env) */
29
+ env?: NodeJS.ProcessEnv;
30
+ homeDir?: string;
31
+ /** PATH lookup of the `claude` binary */
32
+ resolveCommand?: (command: string) => string | null;
33
+ /** Scratch directory the probe turn runs in */
34
+ scratchDir?: string;
35
+ timeoutMs?: number;
36
+ now?: () => number;
37
+ }
38
+ /**
39
+ * Env to ask Claude Code about its OWN login: the caller's env without any
40
+ * token or key, pointed at a config dir (or the default login's).
41
+ *
42
+ * @param baseEnv - Starting env
43
+ * @param configDir - A named account's config dir; null = the default login
44
+ * @returns Env for the child process
45
+ */
46
+ export declare function nativeLoginEnv(baseEnv: NodeJS.ProcessEnv, configDir: string | null): NodeJS.ProcessEnv;
47
+ /**
48
+ * Ask the CLI whether it is signed in (`claude auth status --json`).
49
+ *
50
+ * @param configDir - A named account's config dir; null = the default login
51
+ * @param deps - Dependencies
52
+ * @returns `loggedIn` as the CLI reports it, or null when it could not be asked
53
+ */
54
+ export declare function readClaudeAuthStatus(configDir: string | null, deps?: ClaudeNativeLoginDeps): Promise<boolean | null>;
55
+ /**
56
+ * Refresh the cached `claude auth status` answer of accounts.
57
+ *
58
+ * @param accounts - Account configs: `account` is the name (null = default login), `configDir` its dir (null = default)
59
+ * @param deps - Dependencies
60
+ * @param maxAgeMs - Skip an account answered this recently
61
+ * @returns Resolves when every account was asked (an unanswered one keeps its old answer)
62
+ */
63
+ export declare function refreshClaudeNativeLogins(accounts: ReadonlyArray<{
64
+ account: string | null;
65
+ configDir: string | null;
66
+ }>, deps?: ClaudeNativeLoginDeps, maxAgeMs?: number): Promise<void>;
67
+ /**
68
+ * The last `claude auth status` answer for an account.
69
+ *
70
+ * @param account - Account name; null = the default login
71
+ * @returns True/false, or undefined when never asked
72
+ */
73
+ export declare function cachedClaudeNativeLogin(account: string | null): boolean | undefined;
74
+ /**
75
+ * Set the cached answer (after a verified login or sign-out).
76
+ *
77
+ * @param account - Account name; null = the default login
78
+ * @param loggedIn - New answer
79
+ * @param now - Clock
80
+ */
81
+ export declare function setCachedClaudeNativeLogin(account: string | null, loggedIn: boolean, now?: number): void;
82
+ /** Forget every cached answer (tests). */
83
+ export declare function resetClaudeNativeLoginCache(): void;
84
+ /**
85
+ * Classify the output of a probe turn.
86
+ *
87
+ * @param result - Exit code and output
88
+ * @returns `logged_out` on a login-expiry message; `logged_in` when the turn
89
+ * worked or the account answered with a usage limit (a limit proves the
90
+ * login works); else `unknown`
91
+ */
92
+ export declare function classifyNativeProbe(result: {
93
+ code: number | null;
94
+ stdout: string;
95
+ stderr: string;
96
+ }): LoginState;
97
+ /**
98
+ * Verify a login with one real Claude turn on Claude Code's own login, with
99
+ * no token or key in the env.
100
+ *
101
+ * @param configDir - A named account's config dir; null = the default login
102
+ * @param deps - Dependencies
103
+ * @returns `logged_in`, `logged_out` or `unknown`; never rejects
104
+ */
105
+ export declare function probeClaudeNativeLogin(configDir: string | null, deps?: ClaudeNativeLoginDeps): Promise<LoginState>;
106
+ //# sourceMappingURL=claude-native-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-login.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-native-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGjE,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IACrC,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,qCAAqC;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAWD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU,CAOtG;AAeD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAa9H;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,CAC9C,QAAQ,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EAC7E,IAAI,GAAE,qBAA0B,EAChC,QAAQ,SAAS,GACf,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,CAEnF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAE,MAAmB,GAAG,IAAI,CAEpH;AAED,0CAA0C;AAC1C,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAO/G;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,UAAU,CAAC,CAW5H"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Claude Code's own login state: is a config dir (or the default login)
3
+ * signed in through Claude Code itself?
4
+ *
5
+ * Crewly does not collect, store or intermediate Claude.ai credentials
6
+ * (Anthropic's Claude Code legal page). Claude Code keeps its own login in
7
+ * `<config dir>/.credentials.json` or, on macOS, in the keychain, so a file
8
+ * check alone is wrong on a Mac: the default login of a Mac has no
9
+ * `.credentials.json` at all. Two questions are therefore asked of the CLI
10
+ * itself, always with Crewly's own env (no `CLAUDE_CODE_OAUTH_TOKEN`, no API
11
+ * key) so a token can never make a login look native:
12
+ *
13
+ * - {@link readClaudeAuthStatus}: `claude auth status --json`, the CLI's own
14
+ * record (`loggedIn`). Cheap, no network turn, but it keeps saying
15
+ * `loggedIn: true` for an expired login. Feeds the sync "signed in" flag.
16
+ * - {@link probeClaudeNativeLogin}: one tiny real turn. This is the
17
+ * verification the token migration waits for before it deletes anything.
18
+ *
19
+ * Neither prints or reads a credential: only the exit code and the output
20
+ * of the CLI are looked at.
21
+ *
22
+ * @module services/harness/claude-native-login
23
+ */
24
+ import * as fs from 'fs';
25
+ import * as os from 'os';
26
+ import * as path from 'path';
27
+ import { HARNESS_CONSTANTS, RUNTIME_TYPES } from '../../constants.js';
28
+ import { detectUsageLimit, isExhaustingKind } from '../runtime-fallback/usage-limit-rules.js';
29
+ import { buildHarnessPath, resolveExecutable, runCommand } from './harness-exec.utils.js';
30
+ import { detectLoginExpiry } from './login-expiry-rules.js';
31
+ /** Env that would nest the run in a Claude session or leak Crewly's API token. */
32
+ const NESTED_ENV = ['CREWLY_API_TOKEN', 'CLAUDECODE', 'CLAUDE_CODE_ENTRYPOINT', 'CLAUDE_CODE_SSE_PORT'];
33
+ /** Cache key of the default login. */
34
+ const DEFAULT_KEY = '';
35
+ /** Last `claude auth status` answer per account (`''` = the default login). */
36
+ const statusCache = new Map();
37
+ /**
38
+ * Env to ask Claude Code about its OWN login: the caller's env without any
39
+ * token or key, pointed at a config dir (or the default login's).
40
+ *
41
+ * @param baseEnv - Starting env
42
+ * @param configDir - A named account's config dir; null = the default login
43
+ * @returns Env for the child process
44
+ */
45
+ export function nativeLoginEnv(baseEnv, configDir) {
46
+ const env = { ...baseEnv };
47
+ delete env[HARNESS_CONSTANTS.CLAUDE.OAUTH_TOKEN_ENV];
48
+ delete env[HARNESS_CONSTANTS.CLAUDE.API_KEY_ENV];
49
+ for (const name of NESTED_ENV)
50
+ delete env[name];
51
+ if (configDir)
52
+ env[HARNESS_CONSTANTS.CLAUDE.CONFIG_DIR_ENV] = configDir;
53
+ return env;
54
+ }
55
+ /**
56
+ * Resolve the claude binary and base env once per call.
57
+ *
58
+ * @param deps - Dependencies
59
+ * @returns Binary path (or null), base env and the runner
60
+ */
61
+ function setup(deps) {
62
+ const env = deps.env ?? process.env;
63
+ const homeDir = deps.homeDir ?? os.homedir();
64
+ const resolve = deps.resolveCommand ?? ((command) => resolveExecutable(command, buildHarnessPath(env.PATH, homeDir)));
65
+ return { binary: resolve('claude'), env, run: deps.run ?? runCommand, timeoutMs: deps.timeoutMs ?? HARNESS_CONSTANTS.RELOGIN.PROBE_TIMEOUT_MS };
66
+ }
67
+ /**
68
+ * Ask the CLI whether it is signed in (`claude auth status --json`).
69
+ *
70
+ * @param configDir - A named account's config dir; null = the default login
71
+ * @param deps - Dependencies
72
+ * @returns `loggedIn` as the CLI reports it, or null when it could not be asked
73
+ */
74
+ export async function readClaudeAuthStatus(configDir, deps = {}) {
75
+ try {
76
+ const { binary, env, run, timeoutMs } = setup(deps);
77
+ if (!binary)
78
+ return null;
79
+ const result = await run(binary, ['auth', 'status', '--json'], { env: nativeLoginEnv(env, configDir), timeoutMs });
80
+ const parsed = JSON.parse(result.stdout);
81
+ if (parsed !== null && typeof parsed === 'object' && typeof parsed.loggedIn === 'boolean') {
82
+ return parsed.loggedIn;
83
+ }
84
+ return null;
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ /**
91
+ * Refresh the cached `claude auth status` answer of accounts.
92
+ *
93
+ * @param accounts - Account configs: `account` is the name (null = default login), `configDir` its dir (null = default)
94
+ * @param deps - Dependencies
95
+ * @param maxAgeMs - Skip an account answered this recently
96
+ * @returns Resolves when every account was asked (an unanswered one keeps its old answer)
97
+ */
98
+ export async function refreshClaudeNativeLogins(accounts, deps = {}, maxAgeMs = 60_000) {
99
+ const now = (deps.now ?? Date.now)();
100
+ for (const { account, configDir } of accounts) {
101
+ const key = account ?? DEFAULT_KEY;
102
+ const known = statusCache.get(key);
103
+ if (known && now - known.at < maxAgeMs)
104
+ continue;
105
+ const loggedIn = await readClaudeAuthStatus(configDir, deps);
106
+ if (loggedIn !== null)
107
+ statusCache.set(key, { loggedIn, at: now });
108
+ }
109
+ }
110
+ /**
111
+ * The last `claude auth status` answer for an account.
112
+ *
113
+ * @param account - Account name; null = the default login
114
+ * @returns True/false, or undefined when never asked
115
+ */
116
+ export function cachedClaudeNativeLogin(account) {
117
+ return statusCache.get(account ?? DEFAULT_KEY)?.loggedIn;
118
+ }
119
+ /**
120
+ * Set the cached answer (after a verified login or sign-out).
121
+ *
122
+ * @param account - Account name; null = the default login
123
+ * @param loggedIn - New answer
124
+ * @param now - Clock
125
+ */
126
+ export function setCachedClaudeNativeLogin(account, loggedIn, now = Date.now()) {
127
+ statusCache.set(account ?? DEFAULT_KEY, { loggedIn, at: now });
128
+ }
129
+ /** Forget every cached answer (tests). */
130
+ export function resetClaudeNativeLoginCache() {
131
+ statusCache.clear();
132
+ }
133
+ /**
134
+ * Classify the output of a probe turn.
135
+ *
136
+ * @param result - Exit code and output
137
+ * @returns `logged_out` on a login-expiry message; `logged_in` when the turn
138
+ * worked or the account answered with a usage limit (a limit proves the
139
+ * login works); else `unknown`
140
+ */
141
+ export function classifyNativeProbe(result) {
142
+ const output = `${result.stdout}\n${result.stderr}`;
143
+ if (detectLoginExpiry(output, HARNESS_CONSTANTS.IDS.CLAUDE_CODE))
144
+ return 'logged_out';
145
+ const limit = detectUsageLimit(output, RUNTIME_TYPES.CLAUDE_CODE);
146
+ if (limit && isExhaustingKind(limit.kind))
147
+ return 'logged_in';
148
+ if (result.code === 0)
149
+ return 'logged_in';
150
+ return 'unknown';
151
+ }
152
+ /**
153
+ * Verify a login with one real Claude turn on Claude Code's own login, with
154
+ * no token or key in the env.
155
+ *
156
+ * @param configDir - A named account's config dir; null = the default login
157
+ * @param deps - Dependencies
158
+ * @returns `logged_in`, `logged_out` or `unknown`; never rejects
159
+ */
160
+ export async function probeClaudeNativeLogin(configDir, deps = {}) {
161
+ try {
162
+ const { binary, env, run, timeoutMs } = setup(deps);
163
+ if (!binary)
164
+ return 'unknown';
165
+ const scratch = deps.scratchDir ?? path.join(os.tmpdir(), 'crewly-native-login-probe');
166
+ fs.mkdirSync(scratch, { recursive: true });
167
+ const result = await run(binary, HARNESS_CONSTANTS.CLAUDE.PROBE_ARGS, { env: nativeLoginEnv(env, configDir), timeoutMs, cwd: scratch });
168
+ return classifyNativeProbe(result);
169
+ }
170
+ catch {
171
+ return 'unknown';
172
+ }
173
+ }
174
+ //# sourceMappingURL=claude-native-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-native-login.js","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-native-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Claude token migration — retire the Claude sign-in tokens older Crewly
3
+ * versions saved, without locking anyone out.
4
+ *
5
+ * Anthropic's Claude Code legal page: developers may not collect, store or
6
+ * intermediate Claude.ai credentials or session tokens; sign-in must finish
7
+ * through Anthropic's own flow. Older Crewly ran `claude setup-token`, read
8
+ * the token off the screen and saved it in `harness-credentials.json`
9
+ * (`claude.oauthToken` for the default login, `claudeAccounts.<name>.oauthToken`
10
+ * for named accounts). Crewly now signs in with Claude Code's own
11
+ * `claude auth login` and stores nothing (login-broker.service.ts).
12
+ *
13
+ * Rules of the transition:
14
+ *
15
+ * - A saved token keeps being handed to its account's Claude Code processes
16
+ * until that account is signed in natively (store.legacyClaudeTokenEnv).
17
+ * Nothing stops working on upgrade.
18
+ * - A token is deleted only after the account's native login is verified by
19
+ * a real Claude turn run WITHOUT any token or key in the env
20
+ * (claude-native-login.ts). A login that only looks signed in is not enough.
21
+ * - A named account's own config dir can only have been signed in by Crewly's
22
+ * flow or by the owner, so a verified native login there retires its token
23
+ * at once (the periodic run notices a login done by hand too). The default
24
+ * login is different: the machine's own Claude login may be another
25
+ * account than the one the saved token belongs to, so its token is retired
26
+ * only by a sign-in done through Crewly (`login claude`), never guessed.
27
+ * - The owner is told once per machine which accounts need one re-sign-in
28
+ * (state file `claude-token-migration.json`, no secrets in it).
29
+ * - When no saved token remains, the leftover Claude keys are removed from
30
+ * `harness-credentials.json`; other keys are untouched, the file is
31
+ * rewritten atomically with mode 0600, and no backup is kept.
32
+ *
33
+ * @module services/harness/claude-token-migration.service
34
+ */
35
+ import { type HarnessCredentialsStore } from './harness-credentials.store.js';
36
+ import { type HarnessLogger, type LoginState } from './harness.types.js';
37
+ /** A login that still depends on a token an older Crewly saved. */
38
+ export interface LegacyTokenEntry {
39
+ /** Named account; null = the default login */
40
+ account: string | null;
41
+ }
42
+ /** What one run did. */
43
+ export interface MigrationResult {
44
+ /** Logins whose token was deleted this run */
45
+ retired: Array<string | null>;
46
+ /** Logins that still run on a saved token (need a native sign-in) */
47
+ pending: Array<string | null>;
48
+ /** The owner notice was sent this run */
49
+ notified: boolean;
50
+ }
51
+ /** Owner DM sender. */
52
+ export interface MigrationNotifier {
53
+ sendToOwner(text: string): Promise<unknown>;
54
+ }
55
+ /** Injectable dependencies. */
56
+ export interface ClaudeTokenMigrationDeps {
57
+ credentials?: Pick<HarnessCredentialsStore, 'getLegacyClaudeOauthToken' | 'listClaudeAccountsWithToken' | 'clearLegacyClaudeOauthToken' | 'clearClaudeAccount' | 'pruneLegacyClaudeKeys'>;
58
+ /** Real Claude turn on Claude Code's own login, no token in the env */
59
+ probe?: (configDir: string | null) => Promise<LoginState>;
60
+ /** `claude auth status` on Claude Code's own login */
61
+ readStatus?: (configDir: string | null) => Promise<boolean | null>;
62
+ /** Config dir of a named account */
63
+ accountConfigDir?: (account: string) => string;
64
+ notifier?: () => MigrationNotifier | null;
65
+ /** Directory of the state file (default CREWLY_HOME) */
66
+ crewlyHome?: string;
67
+ logger?: HarnessLogger;
68
+ now?: () => number;
69
+ }
70
+ /** Retires saved Claude tokens once the account is signed in natively. */
71
+ export declare class ClaudeTokenMigrationService {
72
+ private readonly credentials;
73
+ private readonly probe;
74
+ private readonly readStatus;
75
+ private readonly accountConfigDir;
76
+ private notifier;
77
+ private readonly crewlyHome;
78
+ private readonly logger;
79
+ private readonly now;
80
+ private running;
81
+ private timer;
82
+ /**
83
+ * @param deps - Injectable dependencies (all optional)
84
+ */
85
+ constructor(deps?: ClaudeTokenMigrationDeps);
86
+ /**
87
+ * Where the owner notice is sent.
88
+ *
89
+ * @param notifier - Lazy owner DM sender
90
+ */
91
+ setNotifier(notifier: () => MigrationNotifier | null): void;
92
+ /**
93
+ * Logins that still depend on a saved token.
94
+ *
95
+ * @returns Entries (default login first)
96
+ */
97
+ listLegacy(): LegacyTokenEntry[];
98
+ /**
99
+ * Check every login that still has a saved token; retire what can be
100
+ * retired and tell the owner about the rest, once. Safe to call at any
101
+ * time and as often as you like (idempotent); concurrent calls share one run.
102
+ *
103
+ * @returns What happened; never rejects
104
+ */
105
+ run(): Promise<MigrationResult>;
106
+ /**
107
+ * A sign-in done through Crewly just completed and was verified: retire
108
+ * the saved token of that login (default or named).
109
+ *
110
+ * @param account - Named account; null = the default login
111
+ * @returns Resolves when done; never rejects
112
+ */
113
+ afterLogin(account: string | null): Promise<void>;
114
+ /**
115
+ * Run now (after a short delay) and then on an interval.
116
+ *
117
+ * @param startDelayMs - Delay before the first run
118
+ */
119
+ start(startDelayMs?: number): void;
120
+ /** Stop the timers. */
121
+ stop(): void;
122
+ private hasLegacy;
123
+ private configDirOf;
124
+ /**
125
+ * Delete the saved token of a login when its native login passes a real
126
+ * Claude turn with no token in the env.
127
+ *
128
+ * @param account - Named account; null = the default login
129
+ * @returns True when the token was deleted
130
+ */
131
+ private retireIfVerified;
132
+ /** Remove leftover Claude keys once no saved token remains. */
133
+ private finishCleanup;
134
+ private runOnce;
135
+ private statePath;
136
+ private readState;
137
+ private writeState;
138
+ /**
139
+ * Tell the owner, once per machine, which logins need one re-sign-in.
140
+ *
141
+ * @param pending - Logins that still run on a saved token
142
+ * @returns True when the notice was delivered now
143
+ */
144
+ private notifyOnce;
145
+ }
146
+ /**
147
+ * The backend's token migration, bound to the stored credentials.
148
+ *
149
+ * @returns The singleton
150
+ */
151
+ export declare function getClaudeTokenMigrationService(): ClaudeTokenMigrationService;
152
+ /**
153
+ * Replace or clear the singleton (tests).
154
+ *
155
+ * @param service - Service, or null
156
+ */
157
+ export declare function setClaudeTokenMigrationServiceForTesting(service: ClaudeTokenMigrationService | null): void;
158
+ //# sourceMappingURL=claude-token-migration.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-token-migration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/harness/claude-token-migration.service.ts"],"names":[],"mappings":"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"}