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,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turn a question an agent asked the owner in its reply into a decision card
|
|
3
|
+
* (specs/2026-10-01-reply-open-items.md §4). Pure.
|
|
4
|
+
*
|
|
5
|
+
* - A stated fallback decides the default: "不同意的话我就删掉,只留事实" →
|
|
6
|
+
* options Yes / No (No = "删掉,只留事实"), default No — what the agent said
|
|
7
|
+
* it would do without an answer. "没意见的话我就发" → default Yes.
|
|
8
|
+
* - "A 还是 B?" / "Should I A or B?" → options A and B, default wait.
|
|
9
|
+
* - Anything else → Yes / No / Reply in thread, default wait.
|
|
10
|
+
*
|
|
11
|
+
* Option labels the harness writes are English; the agent's own words stay
|
|
12
|
+
* as they are (in an option's label or detail).
|
|
13
|
+
*
|
|
14
|
+
* @module services/open-items/open-item-card
|
|
15
|
+
*/
|
|
16
|
+
import { DECISION_CONSTANTS, OPEN_ITEMS_CONSTANTS } from '../../constants.js';
|
|
17
|
+
const KEYS = ['a', 'b', 'c'];
|
|
18
|
+
/** "If not, I'll …" — what happens on a no (Chinese / English). */
|
|
19
|
+
const FALLBACK_NO = [
|
|
20
|
+
/^(?:如果|要是)?(?:你|您)?(?:觉得)?(?:不同意|不认同|不行|不要|不需要|不用|不合适|不妥|不喜欢|不OK|不ok|不好)的话[,,\s]*(?:那)?(?:我)?(?:就|会|再|先)?(.+)$/iu,
|
|
21
|
+
/^(?:否则|不然)(?:的话)?[,,\s]*(?:那)?(?:我)?(?:就|会)?(.+)$/u,
|
|
22
|
+
/^(?:if not|if you don'?t (?:agree|want (?:it|that|this|to)|like (?:it|that))|if you disagree|otherwise),?\s*(?:i'?ll|i will|i'?d|we'?ll)\s+(.+)$/i,
|
|
23
|
+
];
|
|
24
|
+
/** "If no objection, I'll …" — what happens on a yes / by default. */
|
|
25
|
+
const FALLBACK_YES = [
|
|
26
|
+
/^(?:如果|要是)?(?:你|您)?(?:觉得)?(?:没意见|没问题|同意|可以|OK|ok|没异议|不反对|行)的话[,,\s]*(?:那)?(?:我)?(?:就|会)?(.+)$/iu,
|
|
27
|
+
/^(?:if (?:i don'?t hear back|there'?s no objection|you don'?t object|no objection|that works|you agree)|unless you object),?\s*(?:i'?ll|i will|we'?ll)\s+(.+)$/i,
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Tidy an action phrase for an option detail.
|
|
31
|
+
*
|
|
32
|
+
* @param s - Raw phrase
|
|
33
|
+
* @returns Phrase without the closing punctuation
|
|
34
|
+
*/
|
|
35
|
+
function tidy(s) {
|
|
36
|
+
return s.replace(/\s+/g, ' ').replace(/[。.!!;;]+$/u, '').trim();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Clip to the option detail limit.
|
|
40
|
+
*
|
|
41
|
+
* @param s - Text
|
|
42
|
+
* @returns Clipped text
|
|
43
|
+
*/
|
|
44
|
+
function detail(s) {
|
|
45
|
+
const max = DECISION_CONSTANTS.OPTION_DETAIL_MAX_CHARS;
|
|
46
|
+
return s.length > max ? `${s.slice(0, max - 1)}…` : s;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The two alternatives of a choice question, when each fits on a button.
|
|
50
|
+
*
|
|
51
|
+
* @param q - Question sentence
|
|
52
|
+
* @returns [A, B] or null
|
|
53
|
+
*/
|
|
54
|
+
export function choiceAlternatives(q) {
|
|
55
|
+
const max = DECISION_CONSTANTS.OPTION_LABEL_MAX_CHARS;
|
|
56
|
+
const t = q.trim();
|
|
57
|
+
const en = /^(?:should (?:i|we)|shall (?:i|we)|do you want (?:me|us) to|would you (?:prefer|like (?:me|us) to)|do you prefer)\s+(.+?),?\s+or\s+(.+?)\s*\?$/i.exec(t);
|
|
58
|
+
if (en) {
|
|
59
|
+
const a = tidy(en[1]);
|
|
60
|
+
const b = tidy(en[2]);
|
|
61
|
+
return a && b && a.length <= max && b.length <= max && a.toLowerCase() !== b.toLowerCase() ? [a, b] : null;
|
|
62
|
+
}
|
|
63
|
+
if (!/还是/.test(t))
|
|
64
|
+
return null;
|
|
65
|
+
// The clause holding 还是: "…,你想先发 A 还是 B?" → "先发 A" / "B".
|
|
66
|
+
// "要现在先发文字版,还是等图好了再发?": A may sit in the clause before.
|
|
67
|
+
const clauses = t.replace(/[??]\s*$/u, '').split(/[,,::;;]/).map((c) => c.trim());
|
|
68
|
+
const i = clauses.findIndex((c) => c.includes('还是'));
|
|
69
|
+
if (i < 0)
|
|
70
|
+
return null;
|
|
71
|
+
let rawA;
|
|
72
|
+
let rawB;
|
|
73
|
+
if (clauses[i].startsWith('还是') && i > 0) {
|
|
74
|
+
rawA = clauses[i - 1];
|
|
75
|
+
rawB = clauses[i].slice(2);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
[rawA, rawB] = clauses[i].split('还是');
|
|
79
|
+
}
|
|
80
|
+
if (rawA === undefined || rawB === undefined)
|
|
81
|
+
return null;
|
|
82
|
+
const a = tidy(rawA.replace(/^(?:那)?(?:你|您)?(?:觉得|想|要|看)?(?:是)?(?:要|用|选|先)?/u, ''));
|
|
83
|
+
const b = tidy(rawB.replace(/(?:呢|吗|吧|啊|好|比较好|更好)+$/u, ''));
|
|
84
|
+
if (!a || !b || a === b)
|
|
85
|
+
return null;
|
|
86
|
+
return a.length <= max && b.length <= max ? [a, b] : null;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Which approval boundary a question touches (never auto-applied), if any.
|
|
90
|
+
*
|
|
91
|
+
* @param text - Question and fallback
|
|
92
|
+
* @returns Sensitive kind, or undefined
|
|
93
|
+
*/
|
|
94
|
+
export function sensitiveKindOf(text) {
|
|
95
|
+
const t = text.toLowerCase();
|
|
96
|
+
if (/\be-?mail\b|邮件|发信/.test(t))
|
|
97
|
+
return 'email';
|
|
98
|
+
if (/\bdeploy|\bproduction\b|\bprod\b|部署|上生产|上线/.test(t))
|
|
99
|
+
return 'deploy';
|
|
100
|
+
if (/\bpay\b|\bpurchase\b|\bbuy\b|\bsubscri|\bcharge|付款|付费|花钱|购买|订阅|扣费/.test(t))
|
|
101
|
+
return 'spend';
|
|
102
|
+
if (/\bpublish|\bpost (?:it )?publicly\b|\btweet\b|公开发布|发布出去|发出去|发帖/.test(t))
|
|
103
|
+
return 'publish';
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build the card for a question.
|
|
108
|
+
*
|
|
109
|
+
* @param q - The question (and its fallback sentence)
|
|
110
|
+
* @returns Card fields
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* deriveQuestionCard({ type: 'question', text: '这个读法,你同意吗?', fallback: '不同意的话我就删掉,只留事实。' })
|
|
114
|
+
* // → options Yes / No ("删掉,只留事实"), default b (No), yesKey a
|
|
115
|
+
*/
|
|
116
|
+
export function deriveQuestionCard(q) {
|
|
117
|
+
const C = OPEN_ITEMS_CONSTANTS;
|
|
118
|
+
const question = q.text;
|
|
119
|
+
const sensitive = sensitiveKindOf(`${q.text} ${q.fallback ?? ''}`);
|
|
120
|
+
const base = { question, ...(sensitive ? { sensitive } : {}) };
|
|
121
|
+
const fb = q.fallback?.trim();
|
|
122
|
+
if (fb) {
|
|
123
|
+
for (const re of FALLBACK_NO) {
|
|
124
|
+
const m = re.exec(fb);
|
|
125
|
+
if (m && tidy(m[1])) {
|
|
126
|
+
return {
|
|
127
|
+
...base,
|
|
128
|
+
options: [
|
|
129
|
+
{ key: 'a', label: C.YES_LABEL },
|
|
130
|
+
{ key: 'b', label: C.NO_LABEL, detail: detail(tidy(m[1])) },
|
|
131
|
+
],
|
|
132
|
+
defaultKey: 'b',
|
|
133
|
+
yesKey: 'a',
|
|
134
|
+
derivedFrom: 'fallback_no',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const re of FALLBACK_YES) {
|
|
139
|
+
const m = re.exec(fb);
|
|
140
|
+
if (m && tidy(m[1])) {
|
|
141
|
+
return {
|
|
142
|
+
...base,
|
|
143
|
+
options: [
|
|
144
|
+
{ key: 'a', label: C.YES_LABEL, detail: detail(tidy(m[1])) },
|
|
145
|
+
{ key: 'b', label: C.NO_LABEL },
|
|
146
|
+
],
|
|
147
|
+
defaultKey: 'a',
|
|
148
|
+
yesKey: 'a',
|
|
149
|
+
derivedFrom: 'fallback_yes',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const alt = choiceAlternatives(q.text);
|
|
155
|
+
if (alt) {
|
|
156
|
+
return {
|
|
157
|
+
...base,
|
|
158
|
+
options: alt.map((label, i) => ({ key: KEYS[i], label })),
|
|
159
|
+
defaultKey: DECISION_CONSTANTS.WAIT_DEFAULT,
|
|
160
|
+
derivedFrom: 'choice',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
...base,
|
|
165
|
+
options: [
|
|
166
|
+
{ key: 'a', label: C.YES_LABEL },
|
|
167
|
+
{ key: 'b', label: C.NO_LABEL },
|
|
168
|
+
{ key: 'c', label: C.REPLY_LABEL, detail: "you'll answer in words in this thread" },
|
|
169
|
+
],
|
|
170
|
+
defaultKey: DECISION_CONSTANTS.WAIT_DEFAULT,
|
|
171
|
+
yesKey: 'a',
|
|
172
|
+
derivedFrom: 'generic',
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Character-bigram overlap of two questions (Dice coefficient), ignoring
|
|
177
|
+
* spaces and punctuation. Used to tell "the agent asked this through
|
|
178
|
+
* ask-owner already".
|
|
179
|
+
*
|
|
180
|
+
* @param a - Question
|
|
181
|
+
* @param b - Question
|
|
182
|
+
* @returns 0..1
|
|
183
|
+
*/
|
|
184
|
+
export function questionSimilarity(a, b) {
|
|
185
|
+
const norm = (s) => s.toLowerCase().replace(/[\s\p{P}\p{S}]+/gu, '');
|
|
186
|
+
const grams = (s) => {
|
|
187
|
+
const m = new Map();
|
|
188
|
+
for (let i = 0; i < s.length - 1; i++) {
|
|
189
|
+
const g = s.slice(i, i + 2);
|
|
190
|
+
m.set(g, (m.get(g) ?? 0) + 1);
|
|
191
|
+
}
|
|
192
|
+
return m;
|
|
193
|
+
};
|
|
194
|
+
const x = norm(a);
|
|
195
|
+
const y = norm(b);
|
|
196
|
+
if (!x || !y)
|
|
197
|
+
return 0;
|
|
198
|
+
if (x === y)
|
|
199
|
+
return 1;
|
|
200
|
+
const gx = grams(x);
|
|
201
|
+
const gy = grams(y);
|
|
202
|
+
let overlap = 0;
|
|
203
|
+
for (const [g, n] of gx)
|
|
204
|
+
overlap += Math.min(n, gy.get(g) ?? 0);
|
|
205
|
+
const total = Math.max(1, x.length - 1) + Math.max(1, y.length - 1);
|
|
206
|
+
return (2 * overlap) / total;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=open-item-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-item-card.js","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-item-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAkB9E,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAE7B,mEAAmE;AACnE,MAAM,WAAW,GAAa;IAC5B,kHAAkH;IAClH,oDAAoD;IACpD,mJAAmJ;CACpJ,CAAC;AAEF,sEAAsE;AACtE,MAAM,YAAY,GAAa;IAC7B,iGAAiG;IACjG,iKAAiK;CAClK,CAAC;AAEF;;;;;GAKG;AACH,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC;AAED;;;;;GAKG;AACH,SAAS,MAAM,CAAC,CAAS;IACvB,MAAM,GAAG,GAAG,kBAAkB,CAAC,uBAAuB,CAAC;IACvD,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,sBAAsB,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,iJAAiJ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrK,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,0DAA0D;IAC1D,wDAAwD;IACxD,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAwB,CAAC;IAC7B,IAAI,IAAwB,CAAC;IAC7B,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1E,IAAI,mEAAmE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IAChG,IAAI,gEAAgE,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAoB;IACrD,MAAM,CAAC,GAAG,oBAAoB,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;IACxB,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC/D,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,EAAE,EAAE,CAAC;QACP,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,OAAO;oBACL,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;wBAChC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;qBAC5D;oBACD,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,GAAG;oBACX,WAAW,EAAE,aAAa;iBAC3B,CAAC;YACJ,CAAC;QACH,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpB,OAAO;oBACL,GAAG,IAAI;oBACP,OAAO,EAAE;wBACP,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC5D,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;qBAChC;oBACD,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,GAAG;oBACX,WAAW,EAAE,cAAc;iBAC5B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,GAAG,EAAE,CAAC;QACR,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,UAAU,EAAE,kBAAkB,CAAC,YAAY;YAC3C,WAAW,EAAE,QAAQ;SACtB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE;YACP,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;YAChC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC/B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,uCAAuC,EAAE;SACpF;QACD,UAAU,EAAE,kBAAkB,CAAC,YAAY;QAC3C,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,SAAS;KACvB,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,CAAS,EAAE,CAAS;IACrD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IACrF,MAAM,KAAK,GAAG,CAAC,CAAS,EAAuB,EAAE;QAC/C,MAAM,CAAC,GAAG,IAAI,GAAG,EAAkB,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
/** A commitment found in a reply. */
|
|
22
|
+
export interface ExtractedCommitment {
|
|
23
|
+
type: 'commitment';
|
|
24
|
+
/** The sentence (clipped) */
|
|
25
|
+
text: string;
|
|
26
|
+
/** When it is due */
|
|
27
|
+
due: Date;
|
|
28
|
+
/** `text` = a time was said; `default` = none was, so +24 h */
|
|
29
|
+
dueSource: 'text' | 'default';
|
|
30
|
+
}
|
|
31
|
+
/** A question to the owner found in a reply. */
|
|
32
|
+
export interface ExtractedQuestion {
|
|
33
|
+
type: 'question';
|
|
34
|
+
/** The question sentence (clipped, one line) */
|
|
35
|
+
text: string;
|
|
36
|
+
/** The sentence after it, when it states a fallback ("不同意的话我就删掉") */
|
|
37
|
+
fallback?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Everything found in one reply. */
|
|
40
|
+
export interface ExtractedOpenItems {
|
|
41
|
+
commitments: ExtractedCommitment[];
|
|
42
|
+
questions: ExtractedQuestion[];
|
|
43
|
+
}
|
|
44
|
+
/** Options for {@link extractOpenItems}. */
|
|
45
|
+
export interface ExtractOptions {
|
|
46
|
+
/** When the reply was posted (due times are relative to it) */
|
|
47
|
+
now: Date;
|
|
48
|
+
/** Display names of the agent's colleagues (a question addressed to one is not for the owner) */
|
|
49
|
+
colleagueNames?: readonly string[];
|
|
50
|
+
/** The owner's Slack user id: an @-mention of anyone else makes a sentence not for the owner */
|
|
51
|
+
ownerSlackUserId?: string;
|
|
52
|
+
}
|
|
53
|
+
/** One sentence with the line it came from. */
|
|
54
|
+
interface Sentence {
|
|
55
|
+
text: string;
|
|
56
|
+
/** Index of the sentence within its line */
|
|
57
|
+
index: number;
|
|
58
|
+
/** All sentences of the same line */
|
|
59
|
+
line: string[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Split a reply into sentences, line by line.
|
|
63
|
+
*
|
|
64
|
+
* @param text - Reply text
|
|
65
|
+
* @returns Sentences
|
|
66
|
+
*/
|
|
67
|
+
export declare function splitSentences(text: string): Sentence[];
|
|
68
|
+
/**
|
|
69
|
+
* Whether a sentence is a commitment to the owner.
|
|
70
|
+
*
|
|
71
|
+
* @param s - Sentence
|
|
72
|
+
* @returns True for a first-person future deliverable
|
|
73
|
+
*/
|
|
74
|
+
export declare function isCommitment(s: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* When a commitment is due.
|
|
77
|
+
*
|
|
78
|
+
* Rules (local time): an explicit day/part of day wins ("明天中午" → tomorrow
|
|
79
|
+
* 12:00, "tonight" → today 21:00, "by Friday" → Friday 12:00); "tomorrow"
|
|
80
|
+
* alone → tomorrow {@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_HOUR_LOCAL}:00;
|
|
81
|
+
* "in 2 hours" → +2 h; nothing → +{@link OPEN_ITEMS_CONSTANTS.DEFAULT_DUE_MS}.
|
|
82
|
+
*
|
|
83
|
+
* @param s - Sentence
|
|
84
|
+
* @param now - When it was said
|
|
85
|
+
* @returns Due time and whether the text named it
|
|
86
|
+
*/
|
|
87
|
+
export declare function parseDue(s: string, now: Date): {
|
|
88
|
+
due: Date;
|
|
89
|
+
source: 'text' | 'default';
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Whether a sentence (with its neighbours) is a question for the owner.
|
|
93
|
+
*
|
|
94
|
+
* @param s - The sentence
|
|
95
|
+
* @param next - The sentence after it on the same line, if any
|
|
96
|
+
* @param opts - Extraction options
|
|
97
|
+
* @returns True for a decision/confirmation question to the owner
|
|
98
|
+
*/
|
|
99
|
+
export declare function isOwnerQuestion(s: string, next: string | undefined, opts: ExtractOptions): boolean;
|
|
100
|
+
/**
|
|
101
|
+
* Find open items in an agent's reply to the owner.
|
|
102
|
+
*
|
|
103
|
+
* @param text - The reply
|
|
104
|
+
* @param opts - Clock, colleague names, owner id
|
|
105
|
+
* @returns Commitments and questions (each at most
|
|
106
|
+
* {@link OPEN_ITEMS_CONSTANTS.MAX_ITEMS_PER_REPLY})
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* extractOpenItems('明天中午给我,我核过以后挑最有用的几条发你。', { now })
|
|
110
|
+
* // → { commitments: [{ text: '明天中午给我,我核过以后挑最有用的几条发你。', due: <tomorrow 12:00>, … }], questions: [] }
|
|
111
|
+
*/
|
|
112
|
+
export declare function extractOpenItems(text: string, opts: ExtractOptions): ExtractedOpenItems;
|
|
113
|
+
export {};
|
|
114
|
+
//# sourceMappingURL=open-item-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-item-extractor.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/open-items/open-item-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,qCAAqC;AACrC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,YAAY,CAAC;IACnB,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,GAAG,EAAE,IAAI,CAAC;IACV,+DAA+D;IAC/D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED,gDAAgD;AAChD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qCAAqC;AACrC,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,GAAG,EAAE,IAAI,CAAC;IACV,iGAAiG;IACjG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,+CAA+C;AAC/C,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAgDD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAUvD;AAgGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAa/C;AAuCD;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAkDxF;AAuBD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAUlG;AAiBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAqBvF"}
|