crewly 1.20.182 → 1.20.184
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 +4 -0
- package/config/skills/agent/core/report-status/execute.sh +4 -2
- package/dist/backend/backend/src/constants.d.ts +79 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +79 -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 +22 -1
- 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 +25 -24
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts +25 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.js +68 -0
- package/dist/backend/backend/src/controllers/request/open-items.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/request/request.routes.d.ts +2 -0
- package/dist/backend/backend/src/controllers/request/request.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/request/request.routes.js +6 -0
- package/dist/backend/backend/src/controllers/request/request.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +15 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +57 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/scripts/open-items-backfill.d.ts +16 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.js +112 -0
- package/dist/backend/backend/src/scripts/open-items-backfill.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +4 -2
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +11 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +8 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +12 -2
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts +2 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/message-queue.service.js +6 -3
- package/dist/backend/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +6 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-item-card.d.ts +66 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.js +208 -0
- package/dist/backend/backend/src/services/open-items/open-item-card.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js +394 -0
- package/dist/backend/backend/src/services/open-items/open-item-extractor.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts +70 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js +147 -0
- package/dist/backend/backend/src/services/open-items/open-items-backfill.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts +332 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.js +785 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts +44 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js +172 -0
- package/dist/backend/backend/src/services/open-items/open-items.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +3 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +7 -4
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts +110 -0
- package/dist/backend/backend/src/services/orc/orc-status-router.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js +229 -0
- package/dist/backend/backend/src/services/orc/orc-status-router.service.js.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-status-routing.d.ts +108 -0
- package/dist/backend/backend/src/services/orc/orc-status-routing.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-status-routing.js +145 -0
- package/dist/backend/backend/src/services/orc/orc-status-routing.js.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-wake-counter.d.ts +86 -0
- package/dist/backend/backend/src/services/orc/orc-wake-counter.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/orc-wake-counter.js +130 -0
- package/dist/backend/backend/src/services/orc/orc-wake-counter.js.map +1 -0
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +33 -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 +49 -0
- 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 +2 -1
- 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 +10 -4
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +4 -0
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +16 -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 +31 -8
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js +2 -0
- package/dist/backend/backend/src/services/task-pool/give-up/give-up-recovery.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +23 -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 +61 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +15 -1
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.js +5 -1
- package/dist/backend/backend/src/services/v3/ticket-review.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +15 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/index.js +1 -0
- package/dist/backend/backend/src/types/v2/index.js.map +1 -1
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts +73 -0
- package/dist/backend/backend/src/types/v2/open-item.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/v2/open-item.types.js +14 -0
- package/dist/backend/backend/src/types/v2/open-item.types.js.map +1 -0
- package/dist/backend/backend/src/types/v2/request.types.d.ts +22 -1
- package/dist/backend/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/request.types.js +10 -5
- package/dist/backend/backend/src/types/v2/request.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +79 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +79 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +4 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +9 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +11 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +10 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +20 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +8 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +12 -2
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/message-queue.service.d.ts +2 -1
- package/dist/cli/backend/src/services/messaging/message-queue.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/message-queue.service.js +6 -3
- package/dist/cli/backend/src/services/messaging/message-queue.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +6 -1
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-item-card.d.ts +66 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.d.ts.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.js +208 -0
- package/dist/cli/backend/src/services/open-items/open-item-card.js.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts +114 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.d.ts.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js +394 -0
- package/dist/cli/backend/src/services/open-items/open-item-extractor.js.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +3 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +7 -4
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-status-routing.d.ts +108 -0
- package/dist/cli/backend/src/services/orc/orc-status-routing.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-status-routing.js +145 -0
- package/dist/cli/backend/src/services/orc/orc-status-routing.js.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-wake-counter.d.ts +86 -0
- package/dist/cli/backend/src/services/orc/orc-wake-counter.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/orc-wake-counter.js +130 -0
- package/dist/cli/backend/src/services/orc/orc-wake-counter.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +198 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.js +288 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +16 -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 +31 -8
- 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 +23 -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 +61 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +15 -1
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.js +5 -1
- package/dist/cli/backend/src/services/v3/ticket-review.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +15 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/index.js +1 -0
- package/dist/cli/backend/src/types/v2/index.js.map +1 -1
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts +73 -0
- package/dist/cli/backend/src/types/v2/open-item.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/v2/open-item.types.js +14 -0
- package/dist/cli/backend/src/types/v2/open-item.types.js.map +1 -0
- package/dist/cli/backend/src/types/v2/request.types.d.ts +22 -1
- package/dist/cli/backend/src/types/v2/request.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/request.types.js +10 -5
- package/dist/cli/backend/src/types/v2/request.types.js.map +1 -1
- package/frontend/dist/assets/{index-9c91de50.js → index-a6cb8533.js} +265 -265
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find the commitments and questions an agent left open in a reply to the
|
|
3
|
+
* owner (specs/2026-10-01-reply-open-items.md §1). Pure, rules only.
|
|
4
|
+
*
|
|
5
|
+
* Tuned to miss rather than invent: a missed promise costs one follow-up the
|
|
6
|
+
* owner has to ask for himself; an invented question puts a pointless card in
|
|
7
|
+
* front of him. So a sentence only counts when it clearly says
|
|
8
|
+
*
|
|
9
|
+
* - **commitment**: a first-person future deliverable for the owner
|
|
10
|
+
* ("明天中午给我,我核过以后挑最有用的几条发你", "I'll send the draft tonight");
|
|
11
|
+
* - **question**: a direct question that asks the owner to decide or confirm
|
|
12
|
+
* ("这个读法,你同意吗?", "Should I keep the appendix?").
|
|
13
|
+
*
|
|
14
|
+
* Skipped on purpose: past tense ("已经发你了", "attached below"), conditional
|
|
15
|
+
* offers ("要的话我再…", "if you want, I'll…"), quoted text, headings,
|
|
16
|
+
* questions to a colleague (an @-mention or a teammate's name up front) and
|
|
17
|
+
* rhetorical questions that the agent answers itself.
|
|
18
|
+
*
|
|
19
|
+
* @module services/open-items/open-item-extractor
|
|
20
|
+
*/
|
|
21
|
+
import { OPEN_ITEMS_CONSTANTS } from '../../constants.js';
|
|
22
|
+
/**
|
|
23
|
+
* Lines that are not prose: headings, quotes, code.
|
|
24
|
+
*
|
|
25
|
+
* @param line - Trimmed line
|
|
26
|
+
* @returns True to skip the line
|
|
27
|
+
*/
|
|
28
|
+
function isNonProseLine(line) {
|
|
29
|
+
if (/^(#{1,6}\s|>|```|\|)/.test(line))
|
|
30
|
+
return true;
|
|
31
|
+
// A whole line in bold/italics is a heading ("*为什么是你?*").
|
|
32
|
+
if (/^[*_]{1,2}[^*_]+[*_]{1,2}[::]?$/.test(line))
|
|
33
|
+
return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const OPEN_QUOTES = '「『“‘《((';
|
|
37
|
+
const CLOSE_QUOTES = '」』”’》))';
|
|
38
|
+
/**
|
|
39
|
+
* Split one line into sentences at 。!?!?;; (and ". " before a capital or
|
|
40
|
+
* CJK), never inside quotes or brackets, keeping each terminator.
|
|
41
|
+
*
|
|
42
|
+
* @param line - One line
|
|
43
|
+
* @returns Sentences
|
|
44
|
+
*/
|
|
45
|
+
function splitLine(line) {
|
|
46
|
+
const out = [];
|
|
47
|
+
let depth = 0;
|
|
48
|
+
let cur = '';
|
|
49
|
+
const chars = [...line];
|
|
50
|
+
for (let i = 0; i < chars.length; i++) {
|
|
51
|
+
const ch = chars[i];
|
|
52
|
+
cur += ch;
|
|
53
|
+
if (OPEN_QUOTES.includes(ch))
|
|
54
|
+
depth += 1;
|
|
55
|
+
else if (CLOSE_QUOTES.includes(ch))
|
|
56
|
+
depth = Math.max(0, depth - 1);
|
|
57
|
+
if (depth > 0)
|
|
58
|
+
continue;
|
|
59
|
+
const next = chars[i + 1];
|
|
60
|
+
const cut = '。!?!?;;'.includes(ch) || (ch === '.' && next === ' ' && /[A-Z\u4e00-\u9fff]/u.test(chars[i + 2] ?? ''));
|
|
61
|
+
// Keep closing punctuation right after the terminator ("?)", "。」").
|
|
62
|
+
if (cut && !(next && CLOSE_QUOTES.includes(next))) {
|
|
63
|
+
if (cur.trim())
|
|
64
|
+
out.push(cur.trim());
|
|
65
|
+
cur = '';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (cur.trim())
|
|
69
|
+
out.push(cur.trim());
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Split a reply into sentences, line by line.
|
|
74
|
+
*
|
|
75
|
+
* @param text - Reply text
|
|
76
|
+
* @returns Sentences
|
|
77
|
+
*/
|
|
78
|
+
export function splitSentences(text) {
|
|
79
|
+
const out = [];
|
|
80
|
+
const noCode = text.replace(/```[\s\S]*?```/g, ' ');
|
|
81
|
+
for (const raw of noCode.split(/\n+/)) {
|
|
82
|
+
const line = raw.replace(/^\s*(?:[-*•·]|\d+[.)、])\s+/, '').trim();
|
|
83
|
+
if (!line || isNonProseLine(line))
|
|
84
|
+
continue;
|
|
85
|
+
const parts = splitLine(line);
|
|
86
|
+
parts.forEach((p, i) => out.push({ text: p, index: i, line: parts }));
|
|
87
|
+
}
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Whether the sentence's question mark sits inside quotes (a quoted question,
|
|
92
|
+
* e.g. 早报里问你一句「你怎么看?」).
|
|
93
|
+
*
|
|
94
|
+
* @param s - Sentence
|
|
95
|
+
* @returns True when every ?/? is inside quotes
|
|
96
|
+
*/
|
|
97
|
+
function questionIsQuoted(s) {
|
|
98
|
+
let depth = 0;
|
|
99
|
+
let unquoted = false;
|
|
100
|
+
for (const ch of s) {
|
|
101
|
+
if ('「『“‘《'.includes(ch))
|
|
102
|
+
depth += 1;
|
|
103
|
+
else if ('」』”’》'.includes(ch))
|
|
104
|
+
depth = Math.max(0, depth - 1);
|
|
105
|
+
else if ((ch === '?' || ch === '?') && depth === 0)
|
|
106
|
+
unquoted = true;
|
|
107
|
+
}
|
|
108
|
+
return !unquoted;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clip to one line of at most `max` characters.
|
|
112
|
+
*
|
|
113
|
+
* @param s - Text
|
|
114
|
+
* @param max - Max characters
|
|
115
|
+
* @returns Clipped text
|
|
116
|
+
*/
|
|
117
|
+
function clip(s, max) {
|
|
118
|
+
const flat = s.replace(/\s+/g, ' ').replace(/^[*_]+|[*_]+$/g, '').trim();
|
|
119
|
+
return flat.length > max ? `${flat.slice(0, max - 1)}…` : flat;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Whether a sentence is addressed to someone other than the owner: an
|
|
123
|
+
* @-mention of another user, or a colleague's name opening it ("Kai,你…").
|
|
124
|
+
*
|
|
125
|
+
* @param s - Sentence
|
|
126
|
+
* @param opts - Colleague names, owner id
|
|
127
|
+
* @returns True when it is for a colleague
|
|
128
|
+
*/
|
|
129
|
+
function addressedToColleague(s, opts) {
|
|
130
|
+
for (const m of s.matchAll(/<@([A-Z0-9]+)>/g)) {
|
|
131
|
+
if (!opts.ownerSlackUserId || m[1] !== opts.ownerSlackUserId)
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
if (/(^|\s)@[A-Za-z一-鿿][\w一-鿿-]*/u.test(s.replace(/<@[A-Z0-9]+>/g, '')))
|
|
135
|
+
return true;
|
|
136
|
+
for (const name of opts.colleagueNames ?? []) {
|
|
137
|
+
const n = name.trim();
|
|
138
|
+
if (n.length < 2)
|
|
139
|
+
continue;
|
|
140
|
+
const esc = n.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
141
|
+
if (new RegExp(`^${esc}\\s*[,,::]`, 'i').test(s))
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
// Commitments
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
/** A deliverable for the owner (Chinese): 发你 / 给你 / 告诉你 / 发在这里 … */
|
|
150
|
+
const ZH_DELIVER = /(?:发|给|交|传|带|拿|报|汇报|同步|告诉|通知|回复|回|贴|放|整理|写|做|出|补|帮)(?:一下|一份|一版|一个|几条|上来)?(?:给)?(?:你|您)(?![们的])|(?:发|贴|放|交)(?:在|到)(?:这里|这儿|这个线程|群里|频道)|(?:发|贴|交)上来|给你看|拿给你|报给你/u;
|
|
151
|
+
/** Future markers (Chinese). */
|
|
152
|
+
const ZH_FUTURE = /明天|明早|明晚|今晚|今天|后天|下周|周[一二三四五六日天]|星期[一二三四五六日天]|礼拜[一二三四五六日天]|稍后|待会|一会儿|回头|晚点|之后|以后|再|会|先|小时|分钟|中午|下午|晚上|早上|上午|[好完](?:以后|之后|后)|出来[后以]|核过|过一遍|一起/u;
|
|
153
|
+
/** Past / already-done markers (Chinese). */
|
|
154
|
+
const ZH_PAST = /已经|已(?:发|放|附|写|改|存|同步|上传)|刚才|刚刚|附在|附上了|见下|如下|下面附|现在(?:先)?给(?:你|您)|这是|下面是|(?:你|您)了[,。!,.!]?$|(?:你|您)了[,,]/u;
|
|
155
|
+
/** Standing habits, not one deliverable: "以后每章都给你发 PDF", "from now on". */
|
|
156
|
+
const HABITUAL = /每(?:次|章|天|周|个|篇|期|回|晚|早)|以后都|今后|往后|所有|一律|都先|都按|照常|from now on|every (?:time|day|week|chapter)|each time/iu;
|
|
157
|
+
/** Conditional offers (Chinese): "要的话我再…", "如果你想…". */
|
|
158
|
+
const ZH_CONDITIONAL = /如果|要是|假如|的话|需要的话|想要的话/u;
|
|
159
|
+
/** First-person future deliverable (English). */
|
|
160
|
+
const EN_COMMIT = /\b(?:i'?ll|i will|i'm going to|i am going to|we'?ll|we will|i'?m gonna|i can have)\b[^.?!]{0,80}?\b(?:send|share|post|deliver|get back|circle back|follow up|report back|update you|let you know|bring|hand over|draft|write up|put together|wrap up|finish|have (?:it|this|that|them|the \w+)|get (?:it|this|that|them) to you)\b/i;
|
|
161
|
+
/** Conditional / past (English). */
|
|
162
|
+
const EN_SKIP = /\b(?:if|unless|otherwise|whenever|in case|already|attached|below|above|have sent|sent you|i'?d)\b/i;
|
|
163
|
+
/** Someone other than the agent's side does the delivering ("别人第二天白天回你"). */
|
|
164
|
+
const ZH_THIRD_PARTY = /^(?:别人|他们|她们|他|她|它|对方|大家|有人|读者|用户|客户|网友|粉丝|对面)/u;
|
|
165
|
+
/**
|
|
166
|
+
* Whether the clause holding the deliverable has a third party as subject.
|
|
167
|
+
*
|
|
168
|
+
* @param t - Sentence (quotes removed)
|
|
169
|
+
* @returns True when someone outside the team delivers
|
|
170
|
+
*/
|
|
171
|
+
function thirdPartyDelivers(t) {
|
|
172
|
+
const clause = t.split(/[,,;;::]/).find((c) => ZH_DELIVER.test(c));
|
|
173
|
+
return !!clause && ZH_THIRD_PARTY.test(clause.trim());
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Whether a sentence is a commitment to the owner.
|
|
177
|
+
*
|
|
178
|
+
* @param s - Sentence
|
|
179
|
+
* @returns True for a first-person future deliverable
|
|
180
|
+
*/
|
|
181
|
+
export function isCommitment(s) {
|
|
182
|
+
// Quoted words are someone else's ("…原话:「10 分钟就给你做出…」").
|
|
183
|
+
// So are bracketed asides ("(…Gemini 带你玩夏威夷…)").
|
|
184
|
+
const t = s.replace(/「[^」]*」|『[^』]*』|“[^”]*”|"[^"]*"|([^)]*)|\([^)]*\)/g, ' ').trim();
|
|
185
|
+
if (/[??]\s*$/.test(t))
|
|
186
|
+
return false;
|
|
187
|
+
if (thirdPartyDelivers(t))
|
|
188
|
+
return false;
|
|
189
|
+
if (HABITUAL.test(t))
|
|
190
|
+
return false;
|
|
191
|
+
if (/[一-鿿]/.test(t) && ZH_DELIVER.test(t)) {
|
|
192
|
+
if (ZH_PAST.test(t) || ZH_CONDITIONAL.test(t))
|
|
193
|
+
return false;
|
|
194
|
+
return ZH_FUTURE.test(t);
|
|
195
|
+
}
|
|
196
|
+
if (EN_COMMIT.test(t))
|
|
197
|
+
return !EN_SKIP.test(t);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Due times
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
const WEEKDAY_ZH = { 日: 0, 天: 0, 一: 1, 二: 2, 三: 3, 四: 4, 五: 5, 六: 6 };
|
|
204
|
+
const WEEKDAY_EN = { sunday: 0, monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6 };
|
|
205
|
+
/**
|
|
206
|
+
* A local date `days` after `now` at `hour`:00.
|
|
207
|
+
*
|
|
208
|
+
* @param now - Clock
|
|
209
|
+
* @param days - Days ahead
|
|
210
|
+
* @param hour - Local hour
|
|
211
|
+
* @returns Date
|
|
212
|
+
*/
|
|
213
|
+
function dayAt(now, days, hour) {
|
|
214
|
+
const d = new Date(now.getTime());
|
|
215
|
+
d.setDate(d.getDate() + days);
|
|
216
|
+
d.setHours(hour, 0, 0, 0);
|
|
217
|
+
return d;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* The hour a part-of-day word names, or null.
|
|
221
|
+
*
|
|
222
|
+
* @param t - Lower-cased text
|
|
223
|
+
* @returns Local hour
|
|
224
|
+
*/
|
|
225
|
+
function partOfDayHour(t) {
|
|
226
|
+
if (/中午|\bnoon\b|\blunch/.test(t))
|
|
227
|
+
return 12;
|
|
228
|
+
if (/傍晚|下班|end of (?:the )?day|\beod\b/.test(t))
|
|
229
|
+
return 18;
|
|
230
|
+
if (/下午|afternoon/.test(t))
|
|
231
|
+
return 15;
|
|
232
|
+
if (/晚上|晚|evening|night|tonight/.test(t))
|
|
233
|
+
return 21;
|
|
234
|
+
if (/早上|上午|早|morning/.test(t))
|
|
235
|
+
return 10;
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* When a commitment is due.
|
|
240
|
+
*
|
|
241
|
+
* Rules (local time): an explicit day/part of day wins ("明天中午" → tomorrow
|
|
242
|
+
* 12:00, "tonight" → today 21:00, "by Friday" → Friday 12:00); "tomorrow"
|
|
243
|
+
* alone → tomorrow {@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_HOUR_LOCAL}:00;
|
|
244
|
+
* "in 2 hours" → +2 h; nothing → +{@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_MS}.
|
|
245
|
+
*
|
|
246
|
+
* @param s - Sentence
|
|
247
|
+
* @param now - When it was said
|
|
248
|
+
* @returns Due time and whether the text named it
|
|
249
|
+
*/
|
|
250
|
+
export function parseDue(s, now) {
|
|
251
|
+
const t = s.toLowerCase();
|
|
252
|
+
const defaultHour = OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_HOUR_LOCAL;
|
|
253
|
+
const text = (due) => ({ due, source: 'text' });
|
|
254
|
+
const rel = /(\d+(?:\.\d+)?)\s*(?:个)?\s*(小时|hours?|hrs?|分钟|minutes?|mins?)/.exec(t);
|
|
255
|
+
if (rel) {
|
|
256
|
+
const n = Number(rel[1]);
|
|
257
|
+
const ms = /小时|hour|hr/.test(rel[2]) ? n * 3600_000 : n * 60_000;
|
|
258
|
+
if (ms > 0)
|
|
259
|
+
return text(new Date(now.getTime() + ms));
|
|
260
|
+
}
|
|
261
|
+
if (/半小时|half an hour/.test(t))
|
|
262
|
+
return text(new Date(now.getTime() + 1800_000));
|
|
263
|
+
// "晚点" / "早点" mean later / sooner, not evening / morning.
|
|
264
|
+
const part = partOfDayHour(t.replace(/晚点|早点|晚些|早些/g, ''));
|
|
265
|
+
if (/后天|day after tomorrow/.test(t))
|
|
266
|
+
return text(dayAt(now, 2, part ?? defaultHour));
|
|
267
|
+
if (/明早/.test(t))
|
|
268
|
+
return text(dayAt(now, 1, 10));
|
|
269
|
+
if (/明晚/.test(t))
|
|
270
|
+
return text(dayAt(now, 1, 21));
|
|
271
|
+
if (/明天|tomorrow/.test(t))
|
|
272
|
+
return text(dayAt(now, 1, part ?? defaultHour));
|
|
273
|
+
if (/今晚|tonight/.test(t)) {
|
|
274
|
+
const d = dayAt(now, 0, 21);
|
|
275
|
+
return text(d.getTime() > now.getTime() ? d : new Date(now.getTime() + 2 * 3600_000));
|
|
276
|
+
}
|
|
277
|
+
const zhDay = /(下)?(?:周|星期|礼拜)([一二三四五六日天])/.exec(s);
|
|
278
|
+
const enDay = /\b(next\s+)?(sunday|monday|tuesday|wednesday|thursday|friday|saturday)\b/.exec(t);
|
|
279
|
+
if (zhDay || enDay) {
|
|
280
|
+
const target = zhDay ? WEEKDAY_ZH[zhDay[2]] : WEEKDAY_EN[enDay[2]];
|
|
281
|
+
const nextWeek = !!(zhDay ? zhDay[1] : enDay[1]);
|
|
282
|
+
let days = (target - now.getDay() + 7) % 7 || 7;
|
|
283
|
+
if (nextWeek) {
|
|
284
|
+
// "下周三" / "next Wednesday": the one in the coming (Monday-start) week.
|
|
285
|
+
const toNextMonday = (1 - now.getDay() + 7) % 7 || 7;
|
|
286
|
+
days = toNextMonday + ((target + 6) % 7);
|
|
287
|
+
}
|
|
288
|
+
return text(dayAt(now, days, part ?? defaultHour));
|
|
289
|
+
}
|
|
290
|
+
if (/下周|next week/.test(t)) {
|
|
291
|
+
const days = ((1 - now.getDay() + 7) % 7) || 7;
|
|
292
|
+
return text(dayAt(now, days, defaultHour));
|
|
293
|
+
}
|
|
294
|
+
if (/今天|today|later today|end of (?:the )?day|eod|下班前/.test(t) || (part !== null && !/明|tomorrow/.test(t))) {
|
|
295
|
+
const d = dayAt(now, 0, part ?? 18);
|
|
296
|
+
if (d.getTime() > now.getTime())
|
|
297
|
+
return text(d);
|
|
298
|
+
return text(new Date(now.getTime() + 3 * 3600_000));
|
|
299
|
+
}
|
|
300
|
+
if (/稍后|待会|一会儿|晚点|马上|soon|shortly|in a bit|later/.test(t)) {
|
|
301
|
+
return text(new Date(now.getTime() + 2 * 3600_000));
|
|
302
|
+
}
|
|
303
|
+
return { due: new Date(now.getTime() + OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_MS), source: 'default' };
|
|
304
|
+
}
|
|
305
|
+
// ---------------------------------------------------------------------------
|
|
306
|
+
// Questions
|
|
307
|
+
// ---------------------------------------------------------------------------
|
|
308
|
+
/**
|
|
309
|
+
* Asks the owner to decide or confirm (Chinese): a yes/no or either/or shape.
|
|
310
|
+
* Open information questions ("你们每周花多少小时?") are left alone — a card
|
|
311
|
+
* cannot answer them, and the agent sees the owner's reply anyway.
|
|
312
|
+
*/
|
|
313
|
+
const ZH_ASK = /吗|要不要|是不是|是否|可不可以|能不能|行不行|好不好|同意|确认|批准|拍板|还是|对吧|对不对|OK|ok|定一下/u;
|
|
314
|
+
/** Asks the owner to decide or confirm (English): yes/no or either/or. */
|
|
315
|
+
const EN_ASK = /^(?:so,?\s+)?(?:should|shall|do|does|can|could|would|will|is|are|may|want|ok|okay|any objection|happy|good)\b|\bwant me to\b|\bok(?:ay)?\s*\?$|\bright\s*\?$|\bor\b[^?]*\?$/i;
|
|
316
|
+
/** Rhetorical openers: the agent is not asking. */
|
|
317
|
+
const RHETORICAL_OPEN = /^(?:难道|凭什么|谁说|岂不是|何必|你可能会问|你也许会问|有人会问|为什么(?!你)|what if\b|who says\b|isn'?t it\b|why would\b|you might ask\b|you may ask\b|why\b(?! did you| do you| would you))/iu;
|
|
318
|
+
/** A sentence that answers the question before it. */
|
|
319
|
+
const SELF_ANSWER = /^(?:因为|答案|原因是|原因在于|其实|简单说|because\b|the answer\b|that'?s because\b|simple[::])/iu;
|
|
320
|
+
/**
|
|
321
|
+
* Whether a sentence (with its neighbours) is a question for the owner.
|
|
322
|
+
*
|
|
323
|
+
* @param s - The sentence
|
|
324
|
+
* @param next - The sentence after it on the same line, if any
|
|
325
|
+
* @param opts - Extraction options
|
|
326
|
+
* @returns True for a decision/confirmation question to the owner
|
|
327
|
+
*/
|
|
328
|
+
export function isOwnerQuestion(s, next, opts) {
|
|
329
|
+
const t = s.trim();
|
|
330
|
+
if (!/[??]\s*[))]?$/.test(t))
|
|
331
|
+
return false;
|
|
332
|
+
if (questionIsQuoted(t))
|
|
333
|
+
return false;
|
|
334
|
+
if (RHETORICAL_OPEN.test(t))
|
|
335
|
+
return false;
|
|
336
|
+
if (next && SELF_ANSWER.test(next.trim()))
|
|
337
|
+
return false;
|
|
338
|
+
if (addressedToColleague(t, opts))
|
|
339
|
+
return false;
|
|
340
|
+
const core = t.replace(/[??\s]+$/u, '');
|
|
341
|
+
if (core.replace(/[\s*_]/g, '').length < 4)
|
|
342
|
+
return false;
|
|
343
|
+
return /[一-鿿]/.test(t) ? ZH_ASK.test(t) : EN_ASK.test(t);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* A fallback sentence: what the agent does without an answer ("不同意的话我就删掉").
|
|
347
|
+
*
|
|
348
|
+
* @param s - Sentence after the question
|
|
349
|
+
* @returns True when it states a fallback
|
|
350
|
+
*/
|
|
351
|
+
function isFallback(s) {
|
|
352
|
+
if (!s)
|
|
353
|
+
return false;
|
|
354
|
+
return /的话|否则|不然|if not\b|otherwise\b|if you don'?t\b|if you disagree\b|unless you\b|if i don'?t hear\b|if there'?s no objection\b|if no objection\b/iu.test(s);
|
|
355
|
+
}
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
// Entry point
|
|
358
|
+
// ---------------------------------------------------------------------------
|
|
359
|
+
/**
|
|
360
|
+
* Find open items in an agent's reply to the owner.
|
|
361
|
+
*
|
|
362
|
+
* @param text - The reply
|
|
363
|
+
* @param opts - Clock, colleague names, owner id
|
|
364
|
+
* @returns Commitments and questions (each at most
|
|
365
|
+
* {@link OPEN_ITEMS_CONSTANTS.MAX_ITEMS_PER_REPLY})
|
|
366
|
+
*
|
|
367
|
+
* @example
|
|
368
|
+
* extractOpenItems('明天中午给我,我核过以后挑最有用的几条发你。', { now })
|
|
369
|
+
* // → { commitments: [{ text: '明天中午给我,我核过以后挑最有用的几条发你。', due: <tomorrow 12:00>, … }], questions: [] }
|
|
370
|
+
*/
|
|
371
|
+
export function extractOpenItems(text, opts) {
|
|
372
|
+
const out = { commitments: [], questions: [] };
|
|
373
|
+
if (!text || !text.trim())
|
|
374
|
+
return out;
|
|
375
|
+
const max = OPEN_ITEMS_CONSTANTS.MAX_ITEMS_PER_REPLY;
|
|
376
|
+
for (const sentence of splitSentences(text)) {
|
|
377
|
+
const s = sentence.text;
|
|
378
|
+
const next = sentence.line[sentence.index + 1];
|
|
379
|
+
if (out.questions.length < max && isOwnerQuestion(s, next, opts)) {
|
|
380
|
+
out.questions.push({
|
|
381
|
+
type: 'question',
|
|
382
|
+
text: clip(s, OPEN_ITEMS_CONSTANTS.QUESTION_MAX_CHARS),
|
|
383
|
+
...(isFallback(next) ? { fallback: clip(next, OPEN_ITEMS_CONSTANTS.QUESTION_MAX_CHARS) } : {}),
|
|
384
|
+
});
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
if (out.commitments.length < max && !addressedToColleague(s, opts) && isCommitment(s)) {
|
|
388
|
+
const { due, source } = parseDue(s, opts.now);
|
|
389
|
+
out.commitments.push({ type: 'commitment', text: clip(s, OPEN_ITEMS_CONSTANTS.TEXT_MAX_CHARS), due, dueSource: source });
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return out;
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=open-item-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-item-extractor.js","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-item-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -143,6 +143,8 @@ export declare class OrcDeliveryEnforcerService {
|
|
|
143
143
|
* status to a slack-prefixed conversation. Safe to call multiple times
|
|
144
144
|
* for the same thread — the most recent agent message wins (we
|
|
145
145
|
* surface only the latest deliverable summary in the reminder).
|
|
146
|
+
*
|
|
147
|
+
* @returns True when a pending delivery is now tracked (the orchestrator owes the owner this)
|
|
146
148
|
*/
|
|
147
149
|
markPendingDelivery(input: {
|
|
148
150
|
conversationId: string;
|
|
@@ -150,7 +152,7 @@ export declare class OrcDeliveryEnforcerService {
|
|
|
150
152
|
text: string;
|
|
151
153
|
/** Injectable clock (tests). */
|
|
152
154
|
now?: number;
|
|
153
|
-
}):
|
|
155
|
+
}): boolean;
|
|
154
156
|
/**
|
|
155
157
|
* Call this from `slack.controller` after a successful `/api/slack/send`.
|
|
156
158
|
* Cleared regardless of which agent originated the underlying deliverable.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orc-delivery-enforcer.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/orc-delivery-enforcer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAcH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAsB,CAAC;AAK3D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,cAAc,CAAC;IACpB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,IAAI,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qEAAqE;IACrE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,cAAc,GAAG,IAAI,CAAC;AAEpF,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,YAAY,EAAE,oBAAoB,CAAC;IACnC,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgC;IACvE,OAAO,CAAC,KAAK,CAA+B;IAC5C,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,IAAI,EAAE,0BAA0B;IAO5C,MAAM,CAAC,WAAW,IAAI,0BAA0B,GAAG,IAAI;IAIvD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAKjE,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAQZ
|
|
1
|
+
{"version":3,"file":"orc-delivery-enforcer.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/orc-delivery-enforcer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAcH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAsB,CAAC;AAK3D;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,cAAc,CAAC;IACpB,wFAAwF;IACxF,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd,KAAK,IAAI,CAAC;AAEX;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,qEAAqE;IACrE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,cAAc,GAAG,IAAI,CAAC;AAEpF,MAAM,WAAW,0BAA0B;IACzC,2EAA2E;IAC3E,YAAY,EAAE,oBAAoB,CAAC;IACnC,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD;AAED;;GAEG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAgC;IACvE,OAAO,CAAC,KAAK,CAA+B;IAC5C,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;gBAElD,IAAI,EAAE,0BAA0B;IAO5C,MAAM,CAAC,WAAW,IAAI,0BAA0B,GAAG,IAAI;IAIvD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,0BAA0B,GAAG,IAAI,GAAG,IAAI;IAKjE,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAQZ;;;;;;;OAOG;IACH,mBAAmB,CAAC,KAAK,EAAE;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,gCAAgC;QAChC,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO;IAsDX;;;OAGG;IACH,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;IAY3E,sDAAsD;IACtD,YAAY,IAAI,eAAe,EAAE;IAIjC;;;OAGG;IACH,IAAI,CAAC,GAAG,GAAE,MAAmB,GAAG;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IA6DtD;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;CAevB;AAMD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,GACrB,cAAc,GAAG,IAAI,CA6BvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAG5D"}
|
|
@@ -123,10 +123,12 @@ export class OrcDeliveryEnforcerService {
|
|
|
123
123
|
* status to a slack-prefixed conversation. Safe to call multiple times
|
|
124
124
|
* for the same thread — the most recent agent message wins (we
|
|
125
125
|
* surface only the latest deliverable summary in the reminder).
|
|
126
|
+
*
|
|
127
|
+
* @returns True when a pending delivery is now tracked (the orchestrator owes the owner this)
|
|
126
128
|
*/
|
|
127
129
|
markPendingDelivery(input) {
|
|
128
130
|
if (!isAgentDeliveryMarker(input.text))
|
|
129
|
-
return;
|
|
131
|
+
return false;
|
|
130
132
|
// The orchestrator is the deliverer, never the source. Its own
|
|
131
133
|
// `[DONE] Agent crewly-orc: …` status report is bookkeeping about work
|
|
132
134
|
// it already did; treating it as an undelivered deliverable made the
|
|
@@ -137,11 +139,11 @@ export class OrcDeliveryEnforcerService {
|
|
|
137
139
|
this.logger.debug('OrcDeliveryEnforcer ignoring orchestrator self-report', {
|
|
138
140
|
conversationId: input.conversationId,
|
|
139
141
|
});
|
|
140
|
-
return;
|
|
142
|
+
return false;
|
|
141
143
|
}
|
|
142
144
|
const key = parseSlackConversationId(input.conversationId);
|
|
143
145
|
if (!key)
|
|
144
|
-
return; // not a slack thread — ignore
|
|
146
|
+
return false; // not a slack thread — ignore
|
|
145
147
|
const k = serializeKey(key);
|
|
146
148
|
const now = input.now ?? Date.now();
|
|
147
149
|
// Issue #731: a [DONE] can NAME a thread the owner stopped talking in
|
|
@@ -156,7 +158,7 @@ export class OrcDeliveryEnforcerService {
|
|
|
156
158
|
lastOwnerMessageAt: activity.lastOwnerMessageAt,
|
|
157
159
|
staleAfterHours: STALE_THREAD_MAX_AGE_MS / (60 * 60 * 1000),
|
|
158
160
|
});
|
|
159
|
-
return;
|
|
161
|
+
return false;
|
|
160
162
|
}
|
|
161
163
|
const summary = input.text.slice(0, 200);
|
|
162
164
|
this.pending.set(k, {
|
|
@@ -174,6 +176,7 @@ export class OrcDeliveryEnforcerService {
|
|
|
174
176
|
summaryPreview: summary.slice(0, 80),
|
|
175
177
|
firstReminderInSec: REMINDER_CADENCE_MS[0] / 1000,
|
|
176
178
|
});
|
|
179
|
+
return true;
|
|
177
180
|
}
|
|
178
181
|
/**
|
|
179
182
|
* Call this from `slack.controller` after a successful `/api/slack/send`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orc-delivery-enforcer.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/orc-delivery-enforcer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,mBAAmB,GAAG;IAC1B,CAAC,GAAG,EAAE,GAAG,IAAI;IACb,EAAE,GAAG,EAAE,GAAG,IAAI;IACd,EAAE,GAAG,EAAE,GAAG,IAAI;CACN,CAAC;AAEX,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE3D,2EAA2E;AAC3E,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;AAiElE;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAC7B,MAAM,CAAC,QAAQ,GAAsC,IAAI,CAAC;IACjD,MAAM,CAAkB;IACxB,YAAY,CAAuB;IACnC,cAAc,CAAS;IACvB,sBAAsB,CAAgC;IAC/D,KAAK,GAA0B,IAAI,CAAC;IAC5C,wCAAwC;IACvB,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE9D,YAAY,IAAgC;QAC1C,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QACvF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAC;QACtE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAuC;QACxD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC9C,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,cAAc,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;SACtE,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"orc-delivery-enforcer.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/orc-delivery-enforcer.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who an agent status report wakes (specs/2026-10-01-orc-status-wakes.md).
|
|
3
|
+
*
|
|
4
|
+
* Every `report-status` line used to be queued for the orchestrator. On
|
|
5
|
+
* 2026-09-29 that was 134 full-context orchestrator turns, almost all of them
|
|
6
|
+
* team members' [DONE] lines about work their own team lead owns and reviews.
|
|
7
|
+
* Now the report goes to whoever is responsible:
|
|
8
|
+
*
|
|
9
|
+
* | Report | Goes to |
|
|
10
|
+
* |---|---|
|
|
11
|
+
* | [IN_PROGRESS] [ACTIVE] [READY] [WORKING] [IDLE] … | recorded only |
|
|
12
|
+
* | [DONE] that a pending owner delivery is waiting for | orchestrator |
|
|
13
|
+
* | [DONE] on work the orchestrator delegated | orchestrator |
|
|
14
|
+
* | [DONE] on anyone else's work item | recorded (the lead's review path takes it) |
|
|
15
|
+
* | [DONE] with no work item | digest (actionable only without a lead) |
|
|
16
|
+
* | [BLOCKED] [FAILED] [ERROR] | the sender's lead; orchestrator when there is none or the lead sent it |
|
|
17
|
+
* | [MILESTONE] | orchestrator (it forwards milestones to the owner) |
|
|
18
|
+
* | other markers | digest (actionable only on orchestrator work or without a lead) |
|
|
19
|
+
* | no marker (an answer someone waits for) | orchestrator, as before |
|
|
20
|
+
*
|
|
21
|
+
* Pure functions only; {@link OrcStatusRouterService} carries out the plan.
|
|
22
|
+
*
|
|
23
|
+
* @module services/orc/orc-status-routing
|
|
24
|
+
*/
|
|
25
|
+
import type { WorkItem } from '../../types/v2/work-item.types.js';
|
|
26
|
+
/** Why the orchestrator is woken (the hourly counter's categories). */
|
|
27
|
+
export type OrcWakeCategory = 'owner' | 'delegated-done' | 'escalation' | 'digest' | 'other';
|
|
28
|
+
/** What happens to one status report. */
|
|
29
|
+
export type OrcStatusRoute =
|
|
30
|
+
/** Status store / UI / ticket log only */
|
|
31
|
+
{
|
|
32
|
+
action: 'record';
|
|
33
|
+
reason: string;
|
|
34
|
+
}
|
|
35
|
+
/** Wake the orchestrator now */
|
|
36
|
+
| {
|
|
37
|
+
action: 'orc';
|
|
38
|
+
category: Exclude<OrcWakeCategory, 'digest'>;
|
|
39
|
+
reason: string;
|
|
40
|
+
}
|
|
41
|
+
/** Hand it to the sender's team lead */
|
|
42
|
+
| {
|
|
43
|
+
action: 'team-lead';
|
|
44
|
+
lead: string;
|
|
45
|
+
reason: string;
|
|
46
|
+
}
|
|
47
|
+
/** Hold for the next digest; only actionable entries make a digest go out */
|
|
48
|
+
| {
|
|
49
|
+
action: 'digest';
|
|
50
|
+
actionable: boolean;
|
|
51
|
+
reason: string;
|
|
52
|
+
};
|
|
53
|
+
/** Inputs of {@link planOrcStatusRoute}. */
|
|
54
|
+
export interface OrcStatusRouteInput {
|
|
55
|
+
/** The report text (`[DONE] Agent x: …`) */
|
|
56
|
+
content: string;
|
|
57
|
+
/** Reporting agent session */
|
|
58
|
+
sender: string;
|
|
59
|
+
/** The work item the report is about, when known */
|
|
60
|
+
workItem: WorkItem | null;
|
|
61
|
+
/** The sender's lead (parent member, else team lead), never the sender itself */
|
|
62
|
+
lead: string | null;
|
|
63
|
+
/** True when the sender leads its own team (reason text only; a lead with a parent still reports up) */
|
|
64
|
+
senderIsLead: boolean;
|
|
65
|
+
/** True when the owner is waiting on the orchestrator to deliver this (OrcDeliveryEnforcer tracked it) */
|
|
66
|
+
deliveryOwed: boolean;
|
|
67
|
+
/** Orchestrator check for a session / name */
|
|
68
|
+
isOrchestrator: (name: string) => boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* The bracketed marker a report starts with, upper-cased.
|
|
72
|
+
*
|
|
73
|
+
* @param content - Report text
|
|
74
|
+
* @returns e.g. `DONE`, or null when the text has no leading marker
|
|
75
|
+
*/
|
|
76
|
+
export declare function statusMarkerOf(content: string): string | null;
|
|
77
|
+
/**
|
|
78
|
+
* Whether the orchestrator delegated (or created) a work item: its owner is
|
|
79
|
+
* the orchestrator, or the orchestrator stamped itself as the delegator.
|
|
80
|
+
*
|
|
81
|
+
* @param wi - Work item
|
|
82
|
+
* @param isOrchestrator - Orchestrator check
|
|
83
|
+
* @returns True for orchestrator work
|
|
84
|
+
*/
|
|
85
|
+
export declare function isOrcDelegated(wi: WorkItem, isOrchestrator: (name: string) => boolean): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* The work item a report is about: the one it names; else the sender's
|
|
88
|
+
* running/accepted item (newest); else the sender's most recently finished
|
|
89
|
+
* item, when it finished within {@link ORC_WAKE_CONSTANTS.RECENT_COMPLETION_MS}.
|
|
90
|
+
*
|
|
91
|
+
* `report-status` posts the line BEFORE it completes the item, so the
|
|
92
|
+
* running item is normally the answer.
|
|
93
|
+
*
|
|
94
|
+
* @param items - Pool items
|
|
95
|
+
* @param sender - Reporting agent
|
|
96
|
+
* @param workItemId - Id the report named, if any
|
|
97
|
+
* @param now - Clock (epoch ms)
|
|
98
|
+
* @returns The item, or null
|
|
99
|
+
*/
|
|
100
|
+
export declare function findStatusWorkItem(items: readonly WorkItem[], sender: string, workItemId: string | undefined, now: number): WorkItem | null;
|
|
101
|
+
/**
|
|
102
|
+
* Decide where one agent status report goes.
|
|
103
|
+
*
|
|
104
|
+
* @param input - Report, sender, its work item and lead
|
|
105
|
+
* @returns The route
|
|
106
|
+
*/
|
|
107
|
+
export declare function planOrcStatusRoute(input: OrcStatusRouteInput): OrcStatusRoute;
|
|
108
|
+
//# sourceMappingURL=orc-status-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orc-status-routing.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/orc-status-routing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,uEAAuE;AACvE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,gBAAgB,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE7F,yCAAyC;AACzC,MAAM,MAAM,cAAc;AACxB,0CAA0C;AACxC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACtC,gCAAgC;GAC9B;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACjF,wCAAwC;GACtC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACvD,6EAA6E;GAC3E;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,iFAAiF;IACjF,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,wGAAwG;IACxG,YAAY,EAAE,OAAO,CAAC;IACtB,0GAA0G;IAC1G,YAAY,EAAE,OAAO,CAAC;IACtB,8CAA8C;IAC9C,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG7D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAQ/F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,MAAM,GACV,QAAQ,GAAG,IAAI,CA0BjB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CA2C7E"}
|