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.
- package/config/roles/orchestrator/prompt.md +3 -3
- package/config/roles/team-leader/prompt.md +4 -0
- package/config/skills/agent/core/reply/SKILL.md +10 -2
- package/config/skills/agent/core/reply-channel/SKILL.md +10 -0
- package/config/skills/agent/core/send-message/SKILL.md +14 -0
- package/config/skills/orchestrator/delegate-task/SKILL.md +14 -0
- package/config/skills/orchestrator/delegate-task/execute.sh +19 -2
- package/config/skills/orchestrator/delegate-task/execute.test.sh +30 -0
- package/config/skills/team-leader/delegate-task/execute.sh +6 -0
- package/dist/backend/backend/src/constants.d.ts +11 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +11 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +2 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +14 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +59 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +40 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +7 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +9 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js +5 -1
- package/dist/backend/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts +98 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js +115 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts +7 -0
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js +36 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts +66 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js +78 -0
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +5 -2
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts +84 -5
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js +168 -19
- package/dist/backend/backend/src/services/orc/owner-completion-report.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts +42 -2
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js +45 -5
- package/dist/backend/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts +16 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js +19 -3
- package/dist/backend/backend/src/services/orc/owner-completion-report.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +33 -4
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +97 -12
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +6 -0
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +42 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/backend/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +6 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +8 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.d.ts +7 -3
- package/dist/backend/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/room-responder.js +26 -20
- package/dist/backend/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +35 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +72 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.js +6 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.d.ts +6 -0
- package/dist/backend/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/event-bus.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +11 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +11 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js +5 -1
- package/dist/cli/backend/src/services/event-bus/event-bus.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts +98 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js +115 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +15 -5
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +22 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts +42 -2
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js +45 -5
- package/dist/cli/backend/src/services/orc/owner-completion-report.text.js.map +1 -1
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts +120 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js +198 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.js.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts +53 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js +85 -0
- package/dist/cli/backend/src/services/orc/team-lead-report.wiring.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +35 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +38 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.d.ts +7 -3
- package/dist/cli/backend/src/services/slack/room-responder.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/room-responder.js +26 -20
- package/dist/cli/backend/src/services/slack/room-responder.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +17 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +35 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +36 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +72 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.js +6 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.d.ts +6 -0
- package/dist/cli/backend/src/types/event-bus.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/event-bus.types.js.map +1 -1
- 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
|
|
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
|
|
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
|
|
173
|
+
* // 'Ella 做完了排期里 5 张卡的文案和教程页的录屏。\n— 由 Crewly 代发'
|
|
159
174
|
* ```
|
|
160
175
|
*/
|
|
161
176
|
export function fallbackLine(input) {
|
|
162
|
-
const what = joinDeliverables(
|
|
177
|
+
const what = joinDeliverables(plainDeliverablesIn(input.deliverables, input.language), input.language);
|
|
163
178
|
if (input.language === 'zh') {
|
|
164
|
-
const sentence = what ? `${input.agentName} 做完了${what}
|
|
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}
|
|
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
|