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,195 @@
1
+ /**
2
+ * The one line the harness posts to the owner when an agent finished
3
+ * owner-requested work and never reported it (crewly#1357).
4
+ *
5
+ * The owner thread is not a log: the line names the deliverable in plain
6
+ * words, in the owner's language, with no work item ids, links, file names,
7
+ * codecs, sizes or "Results:" dumps. On 2026-10-17 the fallback posted
8
+ * "Ella finished: <WorkItem titles> Results: <PR link, codec, file sizes>"
9
+ * into a video thread; the owner's reaction: 我还是收到agent发的这种message.
10
+ *
11
+ * Pure functions only.
12
+ *
13
+ * @module services/orc/owner-completion-report.text
14
+ */
15
+ import { OWNER_COMPLETION_REPORT_CONSTANTS as C } from '../../constants.js';
16
+ /** CJK ideographs, kana and hangul. */
17
+ const CJK_RE = /[぀-ヿ㐀-䶿一-鿿가-힯豈-﫿]/g;
18
+ /** Letters of any script (what the ratio is measured against). */
19
+ const LETTER_RE = /[\p{L}]/gu;
20
+ /** http(s) links, bare www. links and `<url|label>` Slack links. */
21
+ const URL_RE = /<?(?:https?:\/\/|www\.)[^\s<>|]+(?:\|[^>]*)?>?/gi;
22
+ /** UUIDs. */
23
+ const UUID_RE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;
24
+ /** Short ids: 8+ hex chars (work item prefixes, commit shas). */
25
+ const HEX_ID_RE = /\b(?=[0-9a-f]*\d)(?=[0-9a-f]*[a-f])[0-9a-f]{8,}\b/gi;
26
+ /** Ticket ids (`CREW-305`, `TKT-12`, `#1357`). */
27
+ const TICKET_RE = /\b[A-Z][A-Z0-9]{1,9}-\d{1,6}\b|(?<![\w&])#\d{2,7}\b/g;
28
+ /** Paths: anything with a slash and no spaces that looks like a file / dir, plus `~/…` and `./…`. */
29
+ const PATH_RE = /(?:~|\.{1,2})?\/[\w.@~-]+(?:\/[\w.@~-]+)+\/?|\b[\w.-]+\/[\w./-]*\.[a-z0-9]{1,6}\b/gi;
30
+ /** Bare file names with a known extension (`clip.mp4`, `notes.md`). */
31
+ const FILE_RE = /\b[\w-]+\.(?:mp4|mov|webm|mkv|gif|png|jpe?g|svg|pdf|md|txt|csv|json|ya?ml|html?|tsx?|jsx?|sh|zip|docx?|xlsx?|pptx?)\b/gi;
32
+ /** Parentheses (ASCII and full-width) with their content. */
33
+ const PARENS_RE = /\(([^()]*)\)|(([^()]*))/g;
34
+ /** Backtick code spans. */
35
+ const CODE_RE = /`[^`]*`/g;
36
+ /** Status markers such as `[DONE]`. */
37
+ const MARKER_RE = /\[[A-Z_ ]{2,20}\]/g;
38
+ /** Where the first clause ends. */
39
+ const CLAUSE_END_RE = /(?:\.\s|。|;|;|\s[—–-]\s|\n|:\s|:)/;
40
+ /** Leftover punctuation at the ends. */
41
+ const EDGE_PUNCT_RE = /^[\s,.;:!?、,。;:—–\-"'“”‘’(())]+|[\s,.;:!?、,。;:—–\-"'“”‘’(())]+$/g;
42
+ /** Trailing words a stripped sentence may leave dangling. */
43
+ const DANGLING_RE = /\s+(?:in|at|to|for|of|on|from|with|under|into|via|as|by|and|or|的|在|到|于)$/i;
44
+ /**
45
+ * Which language the owner writes in, from a sample of their text: Chinese
46
+ * when at least {@link OWNER_COMPLETION_REPORT_CONSTANTS.OWNER_LANGUAGE_CJK_MIN_RATIO}
47
+ * of its letters are CJK, else English. An empty sample is English.
48
+ *
49
+ * @param sample - The owner's own words (one or several messages)
50
+ * @returns `zh` or `en`
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * detectOwnerLanguage('什么是投资'); // 'zh'
55
+ * detectOwnerLanguage('Record a short demo'); // 'en'
56
+ * ```
57
+ */
58
+ export function detectOwnerLanguage(sample) {
59
+ const text = Array.isArray(sample) ? sample.join('\n') : String(sample ?? '');
60
+ const letters = text.match(LETTER_RE)?.length ?? 0;
61
+ if (!letters)
62
+ return 'en';
63
+ const cjk = text.match(CJK_RE)?.length ?? 0;
64
+ return cjk / letters >= C.OWNER_LANGUAGE_CJK_MIN_RATIO ? 'zh' : 'en';
65
+ }
66
+ /**
67
+ * The deliverable a work item title or summary names, in plain words: its
68
+ * first clause with links, ids, paths, file names, code spans, markers and
69
+ * parentheses holding digits removed.
70
+ *
71
+ * @param text - Title or summary
72
+ * @returns The plain phrase (possibly empty), at most {@link OWNER_COMPLETION_REPORT_CONSTANTS.DELIVERABLE_MAX_CHARS} characters
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * plainDeliverable('Screen recording of the tutorial page (1080p, 42 MB) — https://x.test/a.mp4');
77
+ * // 'Screen recording of the tutorial page'
78
+ * ```
79
+ */
80
+ export function plainDeliverable(text) {
81
+ let t = String(text ?? '').replace(/\s+/g, ' ').trim();
82
+ t = t.replace(MARKER_RE, ' ').replace(CODE_RE, ' ').replace(URL_RE, ' ');
83
+ // An aside that held a number or something internal (a file, an id) is an
84
+ // aside the owner does not need; one that only held words stays.
85
+ t = t.replace(PARENS_RE, (whole, ascii, wide) => {
86
+ const inner = (ascii ?? wide ?? '').trim();
87
+ const cleaned = stripInternal(inner).trim();
88
+ return /\d/.test(inner) || !cleaned || cleaned !== inner ? ' ' : whole;
89
+ });
90
+ const clause = t.split(CLAUSE_END_RE)[0] ?? '';
91
+ t = stripInternal(clause)
92
+ .replace(/\s+/g, ' ')
93
+ .replace(EDGE_PUNCT_RE, '')
94
+ .trim();
95
+ // Stripping can leave "Fix for and" behind: drop dangling connectives until none is left.
96
+ for (let prev = ''; prev !== t;) {
97
+ prev = t;
98
+ t = t.replace(DANGLING_RE, '').replace(EDGE_PUNCT_RE, '').trim();
99
+ }
100
+ if (t.length > C.DELIVERABLE_MAX_CHARS)
101
+ t = `${t.slice(0, C.DELIVERABLE_MAX_CHARS - 1).trimEnd()}…`;
102
+ return t;
103
+ }
104
+ /**
105
+ * Remove what is internal to the harness from a phrase: ids, paths, file
106
+ * names, ticket ids and short hex ids.
107
+ *
108
+ * @param text - Phrase
109
+ * @returns The phrase without them (spacing not yet normalised)
110
+ */
111
+ function stripInternal(text) {
112
+ return text.replace(UUID_RE, ' ').replace(PATH_RE, ' ').replace(FILE_RE, ' ').replace(TICKET_RE, ' ').replace(HEX_ID_RE, ' ');
113
+ }
114
+ /**
115
+ * The deliverables of a chain, de-duplicated, at most
116
+ * {@link OWNER_COMPLETION_REPORT_CONSTANTS.MAX_TITLES}.
117
+ *
118
+ * @param texts - Titles / summaries of the finished work, in order
119
+ * @returns Plain phrases (possibly empty)
120
+ */
121
+ export function plainDeliverables(texts) {
122
+ const out = [];
123
+ for (const text of texts) {
124
+ const phrase = plainDeliverable(text);
125
+ if (phrase && !out.some((p) => p.toLowerCase() === phrase.toLowerCase()))
126
+ out.push(phrase);
127
+ if (out.length >= C.MAX_TITLES)
128
+ break;
129
+ }
130
+ return out;
131
+ }
132
+ /**
133
+ * Join phrases the way the language does ("a, b and c" / "a、b和c").
134
+ *
135
+ * @param phrases - Plain phrases
136
+ * @param language - Owner language
137
+ * @returns One list phrase
138
+ */
139
+ export function joinDeliverables(phrases, language) {
140
+ if (phrases.length === 0)
141
+ return '';
142
+ if (phrases.length === 1)
143
+ return phrases[0];
144
+ const head = phrases.slice(0, -1);
145
+ const last = phrases[phrases.length - 1];
146
+ return language === 'zh' ? `${head.join('、')}和${last}` : `${head.join(', ')} and ${last}`;
147
+ }
148
+ /**
149
+ * The one sentence posted for the agent, plus the short "sent by Crewly"
150
+ * marker, in the owner's language.
151
+ *
152
+ * @param input - Agent name, deliverables, language
153
+ * @returns Two lines: the sentence and the marker
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * fallbackLine({ agentName: 'Ella', deliverables: ['排期里 5 张卡的文案', '教程页的录屏'], language: 'zh' });
158
+ * // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏,细节稍后补在这里。\n— 由 Crewly 代发'
159
+ * ```
160
+ */
161
+ export function fallbackLine(input) {
162
+ const what = joinDeliverables(plainDeliverables(input.deliverables), input.language);
163
+ if (input.language === 'zh') {
164
+ const sentence = what ? `${input.agentName} 做完了${what},细节稍后补在这里。` : `${input.agentName} 把你要的事做完了,细节稍后补在这里。`;
165
+ return `${sentence}\n— 由 Crewly 代发`;
166
+ }
167
+ const sentence = what ? `${input.agentName} finished ${what}; the details will follow here.` : `${input.agentName} finished what you asked for; the details will follow here.`;
168
+ return `${sentence}\n— sent by Crewly`;
169
+ }
170
+ /**
171
+ * The line the harness posts in the team channel, as the team lead, when the
172
+ * lead never reported team work the orchestrator delegated for the owner
173
+ * (crewly#1371): who finished what the owner approved, and where the owner
174
+ * approved it; plus the short "sent by Crewly" marker.
175
+ *
176
+ * @param input - Worker name, deliverables, language, approval link
177
+ * @returns The lines
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * leadFallbackLine({ workerName: 'Dana', deliverables: ['两个账号的教程文案'], language: 'zh', approvalLink: 'https://slack.com/archives/D1/p1' });
182
+ * // 'Dana 做完了你批准的两个账号的教程文案。\n批准的对话:https://slack.com/archives/D1/p1\n— 由 Crewly 代发'
183
+ * ```
184
+ */
185
+ export function leadFallbackLine(input) {
186
+ const what = joinDeliverables(plainDeliverables(input.deliverables), input.language);
187
+ const link = input.approvalLink?.trim();
188
+ if (input.language === 'zh') {
189
+ const sentence = what ? `${input.workerName} 做完了你批准的${what}。` : `${input.workerName} 把你批准的事做完了。`;
190
+ return [sentence, ...(link ? [`批准的对话:${link}`] : []), '— 由 Crewly 代发'].join('\n');
191
+ }
192
+ const sentence = what ? `${input.workerName} finished ${what}, which you approved.` : `${input.workerName} finished what you approved.`;
193
+ return [sentence, ...(link ? [`Where you approved it: ${link}`] : []), '— sent by Crewly'].join('\n');
194
+ }
195
+ //# sourceMappingURL=owner-completion-report.text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-completion-report.text.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/owner-completion-report.text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Team work the orchestrator delegated on the owner's behalf is reported to
3
+ * the owner by the team's lead, in the team's Slack channel, as the lead
4
+ * (crewly#1371).
5
+ *
6
+ * Incident 2026-10-17: the orc opened one DM thread with four items across
7
+ * two teams; the owner replied 「按建议」. Marketing re-worded a tutorial and
8
+ * the orc posted "[Orc] 第 2 条已上线 …" in that DM thread, under an
9
+ * unrelated email draft. The owner could not tell who did the work or why
10
+ * the orc was telling him. Owner decision: 「团队做完的事由负责人汇报」.
11
+ *
12
+ * A work item the orchestrator delegates with an owner origin (`delegate-task
13
+ * --thread/--conversation`) to a member of a team that has a Slack channel is
14
+ * stamped with a {@link LeadReport} (`metadata.leadReport`): who reports it
15
+ * (the team lead; the worker when the team has no lead) and where (the team
16
+ * channel). Verify items and re-delegations of that work carry the same
17
+ * stamp. Everything downstream reads the stamp:
18
+ *
19
+ * | Where | What changes |
20
+ * |---|---|
21
+ * | owner completion report | the chain is the lead's: nudge the lead, fallback posts in the team channel as the lead |
22
+ * | orc `[EVENT:task:verified]` / `[DONE]` | informational, "no owner post needed — <lead> reports it in #<channel>" |
23
+ * | OrcDeliveryEnforcer | no `[DELIVER_REQUIRED]` for it |
24
+ * | `reply --work-item` | a new top-level post in the team channel |
25
+ *
26
+ * Work that was never delegated to a team (the orc's own work, a member of
27
+ * no team, a team with no Slack channel) is not stamped and keeps the
28
+ * existing behaviour. Pure functions only.
29
+ *
30
+ * @module services/orc/team-lead-report
31
+ */
32
+ import type { Team, TeamMember } from '../../types/index.js';
33
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
34
+ import { type LeadReport, type WorkItemOrigin } from './work-item-destination.js';
35
+ export { isLeadReport, leadReportOf, type LeadReport } from './work-item-destination.js';
36
+ /** An owner origin. */
37
+ type OwnerOrigin = Extract<WorkItemOrigin, {
38
+ kind: 'owner';
39
+ }>;
40
+ /**
41
+ * The team's lead by the lead rule (no "first member" fallback): among
42
+ * several, the one the hierarchy marks as top.
43
+ *
44
+ * @param team - Team
45
+ * @returns The lead, or null when the team has none
46
+ */
47
+ export declare function leadOfTeam(team: Team): TeamMember | null;
48
+ /** Inputs of {@link planTeamLeadReport}. */
49
+ export interface PlanTeamLeadReportInput {
50
+ /** The item being created, its origin already stamped */
51
+ workItem: WorkItem;
52
+ /** The agent creating (delegating) it */
53
+ creator?: string;
54
+ /** Every team */
55
+ teams: readonly Team[];
56
+ /** Orchestrator check */
57
+ isOrchestrator: (name: string) => boolean;
58
+ /** A team's Slack channel, or null when it has none */
59
+ channelOf: (teamId: string) => {
60
+ slackChannelId: string;
61
+ channelName: string;
62
+ } | null;
63
+ /** Pool items (for a re-delegation of work already stamped) */
64
+ items?: readonly WorkItem[];
65
+ }
66
+ /**
67
+ * Whether two owner origins name the same place.
68
+ *
69
+ * @param a - Owner origin
70
+ * @param b - Owner origin
71
+ * @returns True for the same Slack thread / DM, or the same chat conversation thread
72
+ */
73
+ export declare function sameOwnerPlace(a: OwnerOrigin, b: OwnerOrigin): boolean;
74
+ /**
75
+ * Who reports a new work item to the owner, and where — or null when it is
76
+ * not team work the orchestrator delegated on the owner's behalf.
77
+ *
78
+ * - the orchestrator delegated it with an owner origin to a member of a team
79
+ * that has a Slack channel → that team's lead (the worker when the team has
80
+ * no lead), in that channel;
81
+ * - a member re-delegates work it holds that is already stamped, for the same
82
+ * owner place → the same lead and channel, with the new worker;
83
+ * - anything else → null (existing behaviour).
84
+ *
85
+ * @param input - New item, creator, teams, channels
86
+ * @returns The stamp, or null
87
+ */
88
+ export declare function planTeamLeadReport(input: PlanTeamLeadReportInput): LeadReport | null;
89
+ /**
90
+ * A link to the owner's thread the approval came from.
91
+ *
92
+ * @param origin - Owner origin
93
+ * @returns Slack link, or null when the origin is not a Slack thread
94
+ */
95
+ export declare function approvalLink(origin: WorkItemOrigin | null | undefined): string | null;
96
+ /**
97
+ * The reporter's display name.
98
+ *
99
+ * @param report - Stamp
100
+ * @returns Name (session when unknown)
101
+ */
102
+ export declare function leadNameOf(report: LeadReport): string;
103
+ /**
104
+ * The line the orchestrator's notice about this work carries: it is
105
+ * informational, the lead reports it.
106
+ *
107
+ * @param report - Stamp
108
+ * @returns English harness text
109
+ */
110
+ export declare function orchestratorNote(report: LeadReport): string;
111
+ /**
112
+ * The note a delegated member gets for stamped work: the lead tells the
113
+ * owner, in the team channel; the member reports its result as usual.
114
+ *
115
+ * @param wi - The stored work item
116
+ * @param report - Its stamp
117
+ * @returns English harness text
118
+ */
119
+ export declare function memberLeadReportNote(wi: Pick<WorkItem, 'id' | 'target'>, report: LeadReport): string;
120
+ //# sourceMappingURL=team-lead-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-lead-report.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAkC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAElH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEzF,uBAAuB;AACvB,KAAK,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAY9D;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU,GAAG,IAAI,CAIxD;AAED,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,yDAAyD;IACzD,QAAQ,EAAE,QAAQ,CAAC;IACnB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB;IACjB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,yBAAyB;IACzB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,uDAAuD;IACvD,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtF,+DAA+D;IAC/D,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO,CAItE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,UAAU,GAAG,IAAI,CAmCpF;AA6BD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGrF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAWpG"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Team work the orchestrator delegated on the owner's behalf is reported to
3
+ * the owner by the team's lead, in the team's Slack channel, as the lead
4
+ * (crewly#1371).
5
+ *
6
+ * Incident 2026-10-17: the orc opened one DM thread with four items across
7
+ * two teams; the owner replied 「按建议」. Marketing re-worded a tutorial and
8
+ * the orc posted "[Orc] 第 2 条已上线 …" in that DM thread, under an
9
+ * unrelated email draft. The owner could not tell who did the work or why
10
+ * the orc was telling him. Owner decision: 「团队做完的事由负责人汇报」.
11
+ *
12
+ * A work item the orchestrator delegates with an owner origin (`delegate-task
13
+ * --thread/--conversation`) to a member of a team that has a Slack channel is
14
+ * stamped with a {@link LeadReport} (`metadata.leadReport`): who reports it
15
+ * (the team lead; the worker when the team has no lead) and where (the team
16
+ * channel). Verify items and re-delegations of that work carry the same
17
+ * stamp. Everything downstream reads the stamp:
18
+ *
19
+ * | Where | What changes |
20
+ * |---|---|
21
+ * | owner completion report | the chain is the lead's: nudge the lead, fallback posts in the team channel as the lead |
22
+ * | orc `[EVENT:task:verified]` / `[DONE]` | informational, "no owner post needed — <lead> reports it in #<channel>" |
23
+ * | OrcDeliveryEnforcer | no `[DELIVER_REQUIRED]` for it |
24
+ * | `reply --work-item` | a new top-level post in the team channel |
25
+ *
26
+ * Work that was never delegated to a team (the orc's own work, a member of
27
+ * no team, a team with no Slack channel) is not stamped and keeps the
28
+ * existing behaviour. Pure functions only.
29
+ *
30
+ * @module services/orc/team-lead-report
31
+ */
32
+ import { getTeamLeads } from '../../utils/team.utils.js';
33
+ import { slackArchiveLink } from '../decisions/ticket-thread-store.js';
34
+ import { leadReportOf, originOfWorkItem } from './work-item-destination.js';
35
+ export { isLeadReport, leadReportOf } from './work-item-destination.js';
36
+ /**
37
+ * Session of a team member (permanent agent id first, like the pool).
38
+ *
39
+ * @param m - Member
40
+ * @returns Session name
41
+ */
42
+ function sessionOf(m) {
43
+ return m?.agentId || m?.sessionName || undefined;
44
+ }
45
+ /**
46
+ * The team's lead by the lead rule (no "first member" fallback): among
47
+ * several, the one the hierarchy marks as top.
48
+ *
49
+ * @param team - Team
50
+ * @returns The lead, or null when the team has none
51
+ */
52
+ export function leadOfTeam(team) {
53
+ const leads = getTeamLeads(team);
54
+ if (leads.length === 0)
55
+ return null;
56
+ return leads.find((m) => m.hierarchyLevel === 1 && m.canDelegate === true) ?? leads[0];
57
+ }
58
+ /**
59
+ * Whether two owner origins name the same place.
60
+ *
61
+ * @param a - Owner origin
62
+ * @param b - Owner origin
63
+ * @returns True for the same Slack thread / DM, or the same chat conversation thread
64
+ */
65
+ export function sameOwnerPlace(a, b) {
66
+ if (a.slackChannelId && b.slackChannelId)
67
+ return a.slackChannelId === b.slackChannelId && (a.threadTs ?? '') === (b.threadTs ?? '');
68
+ if (a.conversationId && b.conversationId)
69
+ return a.conversationId === b.conversationId && (a.chatThreadId ?? '') === (b.chatThreadId ?? '');
70
+ return false;
71
+ }
72
+ /**
73
+ * Who reports a new work item to the owner, and where — or null when it is
74
+ * not team work the orchestrator delegated on the owner's behalf.
75
+ *
76
+ * - the orchestrator delegated it with an owner origin to a member of a team
77
+ * that has a Slack channel → that team's lead (the worker when the team has
78
+ * no lead), in that channel;
79
+ * - a member re-delegates work it holds that is already stamped, for the same
80
+ * owner place → the same lead and channel, with the new worker;
81
+ * - anything else → null (existing behaviour).
82
+ *
83
+ * @param input - New item, creator, teams, channels
84
+ * @returns The stamp, or null
85
+ */
86
+ export function planTeamLeadReport(input) {
87
+ const { workItem, creator, teams, isOrchestrator } = input;
88
+ const origin = originOfWorkItem(workItem);
89
+ const worker = workItem.target;
90
+ if (origin?.kind !== 'owner' || !worker || !creator || isOrchestrator(worker))
91
+ return null;
92
+ if (!isOrchestrator(creator)) {
93
+ // A re-delegation of stamped work (the lead hands it to a member).
94
+ for (const held of input.items ?? []) {
95
+ if (held.target !== creator)
96
+ continue;
97
+ const stamp = leadReportOf(held);
98
+ const heldOrigin = originOfWorkItem(held);
99
+ if (!stamp || heldOrigin?.kind !== 'owner' || !sameOwnerPlace(heldOrigin, origin))
100
+ continue;
101
+ const member = findMember(teams, worker);
102
+ return { ...stamp, worker, ...(member?.name ? { workerName: member.name } : {}) };
103
+ }
104
+ return null;
105
+ }
106
+ const found = findMemberAndTeam(teams, worker);
107
+ if (!found)
108
+ return null;
109
+ const channel = input.channelOf(found.team.id);
110
+ if (!channel)
111
+ return null;
112
+ const lead = leadOfTeam(found.team);
113
+ const leadSession = sessionOf(lead) ?? worker;
114
+ return {
115
+ lead: leadSession,
116
+ ...(lead?.name ? { leadName: lead.name } : leadSession === worker && found.member.name ? { leadName: found.member.name } : {}),
117
+ worker,
118
+ ...(found.member.name ? { workerName: found.member.name } : {}),
119
+ teamId: found.team.id,
120
+ teamName: found.team.name,
121
+ slackChannelId: channel.slackChannelId,
122
+ channelName: channel.channelName.replace(/^#/, ''),
123
+ };
124
+ }
125
+ /**
126
+ * The (non-archived) team a session is a member of, with the member.
127
+ *
128
+ * @param teams - Every team
129
+ * @param session - Agent session
130
+ * @returns Team + member, or null
131
+ */
132
+ function findMemberAndTeam(teams, session) {
133
+ for (const team of teams) {
134
+ if (team.archived)
135
+ continue;
136
+ const member = (team.members ?? []).find((m) => sessionOf(m) === session || m.sessionName === session);
137
+ if (member)
138
+ return { team, member };
139
+ }
140
+ return null;
141
+ }
142
+ /**
143
+ * The member a session is, in any team.
144
+ *
145
+ * @param teams - Every team
146
+ * @param session - Agent session
147
+ * @returns Member, or null
148
+ */
149
+ function findMember(teams, session) {
150
+ return findMemberAndTeam(teams, session)?.member ?? null;
151
+ }
152
+ /**
153
+ * A link to the owner's thread the approval came from.
154
+ *
155
+ * @param origin - Owner origin
156
+ * @returns Slack link, or null when the origin is not a Slack thread
157
+ */
158
+ export function approvalLink(origin) {
159
+ if (origin?.kind !== 'owner' || !origin.slackChannelId || !origin.threadTs)
160
+ return null;
161
+ return slackArchiveLink(origin.slackChannelId, origin.threadTs);
162
+ }
163
+ /**
164
+ * The reporter's display name.
165
+ *
166
+ * @param report - Stamp
167
+ * @returns Name (session when unknown)
168
+ */
169
+ export function leadNameOf(report) {
170
+ return report.leadName ?? report.lead;
171
+ }
172
+ /**
173
+ * The line the orchestrator's notice about this work carries: it is
174
+ * informational, the lead reports it.
175
+ *
176
+ * @param report - Stamp
177
+ * @returns English harness text
178
+ */
179
+ export function orchestratorNote(report) {
180
+ return `No owner post needed — ${leadNameOf(report)} reports it in #${report.channelName}; do not post it in your thread with the owner.`;
181
+ }
182
+ /**
183
+ * The note a delegated member gets for stamped work: the lead tells the
184
+ * owner, in the team channel; the member reports its result as usual.
185
+ *
186
+ * @param wi - The stored work item
187
+ * @param report - Its stamp
188
+ * @returns English harness text
189
+ */
190
+ export function memberLeadReportNote(wi, report) {
191
+ if (wi.target === report.lead) {
192
+ return (`The owner approved this in the orchestrator's thread. When it is finished you report it to the owner yourself, in #${report.channelName}: ` +
193
+ `reply --work-item ${wi.id} "<one or two plain lines>". The orchestrator does not relay it.`);
194
+ }
195
+ return (`The owner approved this in the orchestrator's thread. When it is finished, ${leadNameOf(report)} reports it to the owner in #${report.channelName}; ` +
196
+ `do not post it to the owner yourself. Report your result as usual (report-status).`);
197
+ }
198
+ //# sourceMappingURL=team-lead-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-lead-report.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Wiring for {@link planTeamLeadReport} (crewly#1371): the real teams, team
3
+ * channels and pool. The planning stays in `team-lead-report.ts`.
4
+ *
5
+ * @module services/orc/team-lead-report.wiring
6
+ */
7
+ import type { Team } from '../../types/index.js';
8
+ import type { WorkItem } from '../../types/v2/work-item.types.js';
9
+ import { type LeadReport } from './team-lead-report.js';
10
+ /** Collaborators of {@link resolveLeadReport}. */
11
+ export interface LeadReportSources {
12
+ /** The team → Slack channel mappings, or null when Slack team channels are not set up */
13
+ channels(): Promise<Array<{
14
+ teamId: string;
15
+ slackChannelId: string;
16
+ slackChannelName: string;
17
+ }> | null>;
18
+ /** Every team */
19
+ teams(): Promise<Team[]>;
20
+ }
21
+ /**
22
+ * The real sources (lazy imports keep this module light).
23
+ *
24
+ * @returns Sources
25
+ */
26
+ export declare function defaultLeadReportSources(): LeadReportSources;
27
+ /**
28
+ * Who reports a new work item to the owner, and where: the stamp to put on
29
+ * it (see {@link planTeamLeadReport}). Never throws.
30
+ *
31
+ * @param input - The item (origin already stamped), its creator, the pool
32
+ * @param sources - Teams and channels (default: the real ones)
33
+ * @returns The stamp, or null
34
+ */
35
+ export declare function resolveLeadReport(input: {
36
+ workItem: WorkItem;
37
+ creator?: string;
38
+ items: readonly WorkItem[];
39
+ }, sources?: LeadReportSources): Promise<LeadReport | null>;
40
+ /**
41
+ * The lead report of the work an agent status report is about (the item it
42
+ * names, else the sender's current or just-finished item). Never throws.
43
+ *
44
+ * @param input - Sender and the work item the report named
45
+ * @param poolItems - Pool items (default: the task pool)
46
+ * @param now - Clock (epoch ms)
47
+ * @returns The stamp, or null
48
+ */
49
+ export declare function leadReportForStatus(input: {
50
+ sender: string;
51
+ workItemId?: string;
52
+ }, poolItems?: () => Promise<WorkItem[]>, now?: number): Promise<LeadReport | null>;
53
+ //# sourceMappingURL=team-lead-report.wiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-lead-report.wiring.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/team-lead-report.wiring.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAoC,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE1F,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,yFAAyF;IACzF,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IACxG,iBAAiB;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAY5D;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,EAC3E,OAAO,GAAE,iBAA8C,GACtD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAsB5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC9C,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,EACrC,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5B"}