crewly 1.20.363 → 1.20.365

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 (158) hide show
  1. package/config/roles/orchestrator/prompt.md +3 -3
  2. package/config/roles/team-leader/prompt.md +4 -0
  3. package/config/skills/agent/core/reply/SKILL.md +10 -2
  4. package/config/skills/agent/core/reply-channel/SKILL.md +10 -0
  5. package/config/skills/agent/core/send-message/SKILL.md +14 -0
  6. package/config/skills/orchestrator/delegate-task/SKILL.md +14 -0
  7. package/config/skills/orchestrator/delegate-task/execute.sh +19 -2
  8. package/config/skills/orchestrator/delegate-task/execute.test.sh +30 -0
  9. package/config/skills/team-leader/delegate-task/execute.sh +6 -0
  10. package/dist/backend/backend/src/constants.d.ts +11 -0
  11. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  12. package/dist/backend/backend/src/constants.js +11 -0
  13. package/dist/backend/backend/src/constants.js.map +1 -1
  14. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
  15. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +2 -0
  16. package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
  17. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  18. package/dist/backend/backend/src/controllers/chat/chat.controller.js +14 -1
  19. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  20. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +59 -0
  22. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  23. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +40 -1
  25. package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
  26. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +7 -0
  28. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  29. package/dist/backend/backend/src/index.d.ts.map +1 -1
  30. package/dist/backend/backend/src/index.js +9 -0
  31. package/dist/backend/backend/src/index.js.map +1 -1
  32. package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/event-bus/event-bus.service.js +5 -1
  34. package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  35. package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts +98 -0
  36. package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
  37. package/dist/backend/backend/src/services/messaging/agent-message-envelope.js +115 -0
  38. package/dist/backend/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
  39. package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts +7 -0
  40. package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
  41. package/dist/backend/backend/src/services/messaging/owner-hook-message.js +36 -1
  42. package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
  43. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
  44. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  45. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
  46. package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  47. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts +66 -0
  48. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts.map +1 -0
  49. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js +78 -0
  50. package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js.map +1 -0
  51. package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/orc/orc-status-router.service.js +5 -2
  53. package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
  54. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +84 -5
  55. package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +168 -19
  57. package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +42 -2
  59. package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +45 -5
  61. package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
  62. package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts +16 -1
  63. package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js +19 -3
  65. package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js.map +1 -1
  66. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +33 -4
  67. package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +97 -12
  69. package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
  70. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +6 -0
  71. package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +42 -1
  73. package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
  74. package/dist/backend/backend/src/services/orc/team-lead-report.d.ts +120 -0
  75. package/dist/backend/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
  76. package/dist/backend/backend/src/services/orc/team-lead-report.js +198 -0
  77. package/dist/backend/backend/src/services/orc/team-lead-report.js.map +1 -0
  78. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
  79. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
  80. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js +85 -0
  81. package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
  82. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
  83. package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  84. package/dist/backend/backend/src/services/orc/work-item-destination.js +38 -1
  85. package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
  86. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +6 -0
  87. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
  88. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +8 -0
  89. package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
  90. package/dist/backend/backend/src/services/slack/room-responder.d.ts +7 -3
  91. package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/slack/room-responder.js +26 -20
  93. package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -1
  94. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
  95. package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +35 -1
  97. package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  98. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
  99. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  100. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +72 -1
  101. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  102. package/dist/backend/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
  103. package/dist/backend/backend/src/services/trace/turn-trigger.js +6 -1
  104. package/dist/backend/backend/src/services/trace/turn-trigger.js.map +1 -1
  105. package/dist/backend/backend/src/types/event-bus.types.d.ts +6 -0
  106. package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
  107. package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
  108. package/dist/backend/build-info.json +2 -2
  109. package/dist/cli/backend/src/constants.d.ts +11 -0
  110. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  111. package/dist/cli/backend/src/constants.js +11 -0
  112. package/dist/cli/backend/src/constants.js.map +1 -1
  113. package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
  114. package/dist/cli/backend/src/services/event-bus/event-bus.service.js +5 -1
  115. package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
  116. package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts +98 -0
  117. package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
  118. package/dist/cli/backend/src/services/messaging/agent-message-envelope.js +115 -0
  119. package/dist/cli/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
  120. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
  121. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
  122. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
  123. package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
  124. package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +42 -2
  125. package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
  126. package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +45 -5
  127. package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
  128. package/dist/cli/backend/src/services/orc/team-lead-report.d.ts +120 -0
  129. package/dist/cli/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
  130. package/dist/cli/backend/src/services/orc/team-lead-report.js +198 -0
  131. package/dist/cli/backend/src/services/orc/team-lead-report.js.map +1 -0
  132. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
  133. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
  134. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js +85 -0
  135. package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
  136. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
  137. package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
  138. package/dist/cli/backend/src/services/orc/work-item-destination.js +38 -1
  139. package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
  140. package/dist/cli/backend/src/services/slack/room-responder.d.ts +7 -3
  141. package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -1
  142. package/dist/cli/backend/src/services/slack/room-responder.js +26 -20
  143. package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -1
  144. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
  145. package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
  146. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +35 -1
  147. package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
  148. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
  149. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  150. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +72 -1
  151. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  152. package/dist/cli/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
  153. package/dist/cli/backend/src/services/trace/turn-trigger.js +6 -1
  154. package/dist/cli/backend/src/services/trace/turn-trigger.js.map +1 -1
  155. package/dist/cli/backend/src/types/event-bus.types.d.ts +6 -0
  156. package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
  157. package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
  158. package/package.json +1 -1
@@ -52,6 +52,17 @@ export declare function plainDeliverable(text: string | undefined | null): strin
52
52
  * @returns Plain phrases (possibly empty)
53
53
  */
54
54
  export declare function plainDeliverables(texts: readonly (string | undefined | null)[]): string[];
55
+ /**
56
+ * The deliverables of a chain written in the owner's language, plain-worded.
57
+ * A phrase in another language is left out: a Chinese line never embeds an
58
+ * English WorkItem title ("Atlas 做完了Website-plan PDF built and posted in
59
+ * Steve thread", crewly#1376), and the line then names no deliverable.
60
+ *
61
+ * @param texts - Titles / summaries of the finished work, in order
62
+ * @param language - The owner's language
63
+ * @returns Plain phrases in that language (possibly none)
64
+ */
65
+ export declare function plainDeliverablesIn(texts: readonly (string | undefined | null)[], language: OwnerLanguage): string[];
55
66
  /**
56
67
  * Join phrases the way the language does ("a, b and c" / "a、b和c").
57
68
  *
@@ -71,7 +82,9 @@ export interface FallbackLineInput {
71
82
  }
72
83
  /**
73
84
  * The one sentence posted for the agent, plus the short "sent by Crewly"
74
- * marker, in the owner's language.
85
+ * marker, in the owner's language. It names only deliverables written in
86
+ * that language and promises nothing: "details later" was a promise nobody
87
+ * owned (crewly#1376).
75
88
  *
76
89
  * @param input - Agent name, deliverables, language
77
90
  * @returns Two lines: the sentence and the marker
@@ -79,8 +92,35 @@ export interface FallbackLineInput {
79
92
  * @example
80
93
  * ```typescript
81
94
  * fallbackLine({ agentName: 'Ella', deliverables: ['排期里 5 张卡的文案', '教程页的录屏'], language: 'zh' });
82
- * // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏,细节稍后补在这里。\n— 由 Crewly 代发'
95
+ * // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏。\n— 由 Crewly 代发'
83
96
  * ```
84
97
  */
85
98
  export declare function fallbackLine(input: FallbackLineInput): string;
99
+ /** Inputs of {@link leadFallbackLine}. */
100
+ export interface LeadFallbackLineInput {
101
+ /** Who did the work (display name) */
102
+ workerName: string;
103
+ /** Titles / summaries of the finished work */
104
+ deliverables: readonly (string | undefined | null)[];
105
+ /** The owner's language */
106
+ language: OwnerLanguage;
107
+ /** Link to the thread the owner approved it in, when it is a Slack thread */
108
+ approvalLink?: string | null;
109
+ }
110
+ /**
111
+ * The line the harness posts in the team channel, as the team lead, when the
112
+ * lead never reported team work the orchestrator delegated for the owner
113
+ * (crewly#1371): who finished what the owner approved, and where the owner
114
+ * approved it; plus the short "sent by Crewly" marker.
115
+ *
116
+ * @param input - Worker name, deliverables, language, approval link
117
+ * @returns The lines
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * leadFallbackLine({ workerName: 'Dana', deliverables: ['两个账号的教程文案'], language: 'zh', approvalLink: 'https://slack.com/archives/D1/p1' });
122
+ * // 'Dana 做完了你批准的两个账号的教程文案。\n批准的对话:https://slack.com/archives/D1/p1\n— 由 Crewly 代发'
123
+ * ```
124
+ */
125
+ export declare function leadFallbackLine(input: LeadFallbackLineInput): string;
86
126
  //# sourceMappingURL=owner-completion-report.text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"owner-completion-report.text.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/owner-completion-report.text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AA+BxC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAMxG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAsBxE;AAaD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAQzF;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAM5F;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IACrD,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAQ7D"}
1
+ {"version":3,"file":"owner-completion-report.text.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/owner-completion-report.text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AA+BxC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,CAMxG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAsBxE;AAaD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAQzF;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,EAAE,CAEpH;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAM5F;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IACrD,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAQ7D;AAED,0CAA0C;AAC1C,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IACrD,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,CAAC;IACxB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CASrE"}
@@ -129,6 +129,19 @@ export function plainDeliverables(texts) {
129
129
  }
130
130
  return out;
131
131
  }
132
+ /**
133
+ * The deliverables of a chain written in the owner's language, plain-worded.
134
+ * A phrase in another language is left out: a Chinese line never embeds an
135
+ * English WorkItem title ("Atlas 做完了Website-plan PDF built and posted in
136
+ * Steve thread", crewly#1376), and the line then names no deliverable.
137
+ *
138
+ * @param texts - Titles / summaries of the finished work, in order
139
+ * @param language - The owner's language
140
+ * @returns Plain phrases in that language (possibly none)
141
+ */
142
+ export function plainDeliverablesIn(texts, language) {
143
+ return plainDeliverables(texts).filter((phrase) => detectOwnerLanguage(phrase) === language);
144
+ }
132
145
  /**
133
146
  * Join phrases the way the language does ("a, b and c" / "a、b和c").
134
147
  *
@@ -147,7 +160,9 @@ export function joinDeliverables(phrases, language) {
147
160
  }
148
161
  /**
149
162
  * The one sentence posted for the agent, plus the short "sent by Crewly"
150
- * marker, in the owner's language.
163
+ * marker, in the owner's language. It names only deliverables written in
164
+ * that language and promises nothing: "details later" was a promise nobody
165
+ * owned (crewly#1376).
151
166
  *
152
167
  * @param input - Agent name, deliverables, language
153
168
  * @returns Two lines: the sentence and the marker
@@ -155,16 +170,41 @@ export function joinDeliverables(phrases, language) {
155
170
  * @example
156
171
  * ```typescript
157
172
  * fallbackLine({ agentName: 'Ella', deliverables: ['排期里 5 张卡的文案', '教程页的录屏'], language: 'zh' });
158
- * // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏,细节稍后补在这里。\n— 由 Crewly 代发'
173
+ * // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏。\n— 由 Crewly 代发'
159
174
  * ```
160
175
  */
161
176
  export function fallbackLine(input) {
162
- const what = joinDeliverables(plainDeliverables(input.deliverables), input.language);
177
+ const what = joinDeliverables(plainDeliverablesIn(input.deliverables, input.language), input.language);
163
178
  if (input.language === 'zh') {
164
- const sentence = what ? `${input.agentName} 做完了${what},细节稍后补在这里。` : `${input.agentName} 把你要的事做完了,细节稍后补在这里。`;
179
+ const sentence = what ? `${input.agentName} 做完了${what}。` : `${input.agentName} 把你要的事做完了。`;
165
180
  return `${sentence}\n— 由 Crewly 代发`;
166
181
  }
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.`;
182
+ const sentence = what ? `${input.agentName} finished ${what}.` : `${input.agentName} finished what you asked for.`;
168
183
  return `${sentence}\n— sent by Crewly`;
169
184
  }
185
+ /**
186
+ * The line the harness posts in the team channel, as the team lead, when the
187
+ * lead never reported team work the orchestrator delegated for the owner
188
+ * (crewly#1371): who finished what the owner approved, and where the owner
189
+ * approved it; plus the short "sent by Crewly" marker.
190
+ *
191
+ * @param input - Worker name, deliverables, language, approval link
192
+ * @returns The lines
193
+ *
194
+ * @example
195
+ * ```typescript
196
+ * leadFallbackLine({ workerName: 'Dana', deliverables: ['两个账号的教程文案'], language: 'zh', approvalLink: 'https://slack.com/archives/D1/p1' });
197
+ * // 'Dana 做完了你批准的两个账号的教程文案。\n批准的对话:https://slack.com/archives/D1/p1\n— 由 Crewly 代发'
198
+ * ```
199
+ */
200
+ export function leadFallbackLine(input) {
201
+ const what = joinDeliverables(plainDeliverablesIn(input.deliverables, input.language), input.language);
202
+ const link = input.approvalLink?.trim();
203
+ if (input.language === 'zh') {
204
+ const sentence = what ? `${input.workerName} 做完了你批准的${what}。` : `${input.workerName} 把你批准的事做完了。`;
205
+ return [sentence, ...(link ? [`批准的对话:${link}`] : []), '— 由 Crewly 代发'].join('\n');
206
+ }
207
+ const sentence = what ? `${input.workerName} finished ${what}, which you approved.` : `${input.workerName} finished what you approved.`;
208
+ return [sentence, ...(link ? [`Where you approved it: ${link}`] : []), '— sent by Crewly'].join('\n');
209
+ }
170
210
  //# sourceMappingURL=owner-completion-report.text.js.map
@@ -1 +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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"}
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"}
@@ -0,0 +1,85 @@
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 { isOrchestratorSender } from './orc-delivery-enforcer.service.js';
8
+ import { findStatusWorkItem } from './orc-status-routing.js';
9
+ import { leadReportOf, planTeamLeadReport } from './team-lead-report.js';
10
+ /**
11
+ * The real sources (lazy imports keep this module light).
12
+ *
13
+ * @returns Sources
14
+ */
15
+ export function defaultLeadReportSources() {
16
+ return {
17
+ channels: async () => {
18
+ const { getSlackTeamChannelService } = await import('../slack/slack-team-channel.service.js');
19
+ const service = getSlackTeamChannelService();
20
+ return service ? service.listMappings() : null;
21
+ },
22
+ teams: async () => {
23
+ const { StorageService } = await import('../core/storage.service.js');
24
+ return StorageService.getInstance().getTeams();
25
+ },
26
+ };
27
+ }
28
+ /**
29
+ * Who reports a new work item to the owner, and where: the stamp to put on
30
+ * it (see {@link planTeamLeadReport}). Never throws.
31
+ *
32
+ * @param input - The item (origin already stamped), its creator, the pool
33
+ * @param sources - Teams and channels (default: the real ones)
34
+ * @returns The stamp, or null
35
+ */
36
+ export async function resolveLeadReport(input, sources = defaultLeadReportSources()) {
37
+ try {
38
+ if (!input.creator || !input.workItem.target)
39
+ return null;
40
+ // No team channels → nowhere for a lead to report; checked first so
41
+ // nothing reads the team store when Slack is not set up.
42
+ const channels = await sources.channels();
43
+ if (!channels || channels.length === 0)
44
+ return null;
45
+ const teams = await sources.teams();
46
+ return planTeamLeadReport({
47
+ workItem: input.workItem,
48
+ creator: input.creator,
49
+ teams,
50
+ isOrchestrator: isOrchestratorSender,
51
+ channelOf: (teamId) => {
52
+ const m = channels.find((c) => c.teamId === teamId);
53
+ return m ? { slackChannelId: m.slackChannelId, channelName: m.slackChannelName } : null;
54
+ },
55
+ items: input.items,
56
+ });
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * The lead report of the work an agent status report is about (the item it
64
+ * names, else the sender's current or just-finished item). Never throws.
65
+ *
66
+ * @param input - Sender and the work item the report named
67
+ * @param poolItems - Pool items (default: the task pool)
68
+ * @param now - Clock (epoch ms)
69
+ * @returns The stamp, or null
70
+ */
71
+ export async function leadReportForStatus(input, poolItems, now = Date.now()) {
72
+ try {
73
+ const load = poolItems ??
74
+ (async () => {
75
+ const { TaskPoolService } = await import('../task-pool/task-pool.service.js');
76
+ return TaskPoolService.getInstance().getAllItems();
77
+ });
78
+ const items = await load();
79
+ return leadReportOf(findStatusWorkItem(items, input.sender, input.workItemId, now));
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ //# sourceMappingURL=team-lead-report.wiring.js.map