crewly 1.20.276 → 1.20.278
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/dist/backend/backend/src/constants.d.ts +85 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +85 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/briefing/briefing.controller.d.ts +23 -0
- package/dist/backend/backend/src/controllers/briefing/briefing.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/briefing/briefing.controller.js +79 -0
- package/dist/backend/backend/src/controllers/briefing/briefing.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.d.ts +34 -0
- package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.js +72 -0
- package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +69 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +6 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/briefing/briefing-state.store.d.ts +45 -0
- package/dist/backend/backend/src/services/briefing/briefing-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing-state.store.js +93 -0
- package/dist/backend/backend/src/services/briefing/briefing-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts +214 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.js +585 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.js.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.types.d.ts +172 -0
- package/dist/backend/backend/src/services/briefing/briefing.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.types.js +27 -0
- package/dist/backend/backend/src/services/briefing/briefing.types.js.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.utils.d.ts +71 -0
- package/dist/backend/backend/src/services/briefing/briefing.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.utils.js +134 -0
- package/dist/backend/backend/src/services/briefing/briefing.utils.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +14 -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 +24 -2
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts +166 -0
- package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/talk/talk-live-token.service.js +287 -0
- package/dist/backend/backend/src/services/talk/talk-live-token.service.js.map +1 -0
- package/dist/backend/backend/src/types/decision.types.d.ts +3 -3
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +85 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +85 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +14 -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 +24 -2
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +3 -3
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BriefingService — the owner's Drive mode queue (specs/2026-10-08-drive-mode.md).
|
|
3
|
+
*
|
|
4
|
+
* Gathers everything on this machine that is waiting on the owner, in the
|
|
5
|
+
* order a voice briefer should read it:
|
|
6
|
+
*
|
|
7
|
+
* - open owner decision cards (`D-<n>`, including parked sensitive asks and
|
|
8
|
+
* cards whose "remind me" time came),
|
|
9
|
+
* - questions agents asked the owner in a reply that never became a card
|
|
10
|
+
* (Request open items of type `question`),
|
|
11
|
+
* - finished work handed back for the owner's OK (tickets in 待验收),
|
|
12
|
+
* - anything the owner said "later" about, once its time comes.
|
|
13
|
+
*
|
|
14
|
+
* …and carries out what the owner says, through the paths that already
|
|
15
|
+
* exist: the decision service (as if the owner answered the card, via
|
|
16
|
+
* `voice`), the agent's own conversation (recorded and dispatched like a
|
|
17
|
+
* Talk message, tagged voice), and the ticket review (accept / send back).
|
|
18
|
+
*
|
|
19
|
+
* Sensitive items (deploy, money, delete, email…) need two calls: the first
|
|
20
|
+
* returns `needs_confirmation` with a one-time token, the second must repeat
|
|
21
|
+
* the same answer with `confirm: true` and that token.
|
|
22
|
+
*
|
|
23
|
+
* The owner's answers are never logged or stored here.
|
|
24
|
+
*
|
|
25
|
+
* @module services/briefing/briefing.service
|
|
26
|
+
*/
|
|
27
|
+
import { randomBytes } from 'crypto';
|
|
28
|
+
import { BRIEFING_CONSTANTS, ORCHESTRATOR_SESSION_NAME } from '../../constants.js';
|
|
29
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
30
|
+
import { BriefingError, } from './briefing.types.js';
|
|
31
|
+
import { clip, orderBriefing, parseLaterTime, sensitiveReason, speakable, spokenSummary } from './briefing.utils.js';
|
|
32
|
+
const C = BRIEFING_CONSTANTS;
|
|
33
|
+
/** Decision statuses still waiting on the owner. */
|
|
34
|
+
const PENDING_DECISIONS = new Set(['open', 'parked']);
|
|
35
|
+
/** Open-item statuses in which a question is still unanswered. */
|
|
36
|
+
const OPEN_QUESTION_STATUSES = new Set(['open', 'overdue']);
|
|
37
|
+
/** Review answers. */
|
|
38
|
+
const REVIEW_ACCEPT = 'accept';
|
|
39
|
+
const REVIEW_SEND_BACK = 'send_back';
|
|
40
|
+
/** The Drive mode queue and its actions. */
|
|
41
|
+
export class BriefingService {
|
|
42
|
+
deps;
|
|
43
|
+
logger;
|
|
44
|
+
now;
|
|
45
|
+
confirmations = new Map();
|
|
46
|
+
/**
|
|
47
|
+
* @param deps - Collaborators
|
|
48
|
+
*/
|
|
49
|
+
constructor(deps) {
|
|
50
|
+
this.deps = deps;
|
|
51
|
+
this.logger = deps.logger ?? LoggerService.getInstance().createComponentLogger('Briefing');
|
|
52
|
+
this.now = deps.now ?? (() => new Date());
|
|
53
|
+
}
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// Queue
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
/**
|
|
58
|
+
* The owner's queue right now: items to read (ordered), lookups the agents
|
|
59
|
+
* are still working on, and how many are hidden by next / later.
|
|
60
|
+
*
|
|
61
|
+
* @returns The queue
|
|
62
|
+
*/
|
|
63
|
+
async queue() {
|
|
64
|
+
const now = this.now();
|
|
65
|
+
const all = await this.gather();
|
|
66
|
+
const items = [];
|
|
67
|
+
const lookupsPending = [];
|
|
68
|
+
let hidden = 0;
|
|
69
|
+
for (const g of all) {
|
|
70
|
+
const visibility = await this.visibility(g, now);
|
|
71
|
+
if (visibility === 'pending' && g.state.lookup) {
|
|
72
|
+
lookupsPending.push({ id: g.item.id, agentName: g.item.agentName, question: g.state.lookup.question, askedAt: g.state.lookup.askedAt });
|
|
73
|
+
}
|
|
74
|
+
else if (visibility === 'hidden') {
|
|
75
|
+
hidden += 1;
|
|
76
|
+
}
|
|
77
|
+
else if (visibility === 'visible') {
|
|
78
|
+
items.push(g.item);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Forget state of items that are gone (answered elsewhere, closed…).
|
|
82
|
+
void this.deps.store.prune(new Set(all.map((g) => g.item.id))).catch(() => undefined);
|
|
83
|
+
return { items: orderBriefing(items).slice(0, C.MAX_ITEMS), lookupsPending, hidden, generatedAt: now.toISOString() };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Whether an item is read now, and fold a found lookup answer into it.
|
|
87
|
+
*
|
|
88
|
+
* @param g - Gathered item (mutated: `item.lookupAnswer`, `item.reminder`, `item.urgency`)
|
|
89
|
+
* @param now - Clock
|
|
90
|
+
* @returns visible / hidden / pending (lookup) / answered (gone)
|
|
91
|
+
*/
|
|
92
|
+
async visibility(g, now) {
|
|
93
|
+
const { item } = g;
|
|
94
|
+
let state = g.state;
|
|
95
|
+
if (state.answeredAt)
|
|
96
|
+
return 'answered';
|
|
97
|
+
if (state.lookup) {
|
|
98
|
+
const since = Date.parse(state.lookup.askedAt);
|
|
99
|
+
const reply = await this.deps.findAgentReply(item.agentSession, state.lookup.channelId, state.lookup.threadId, since).catch(() => null);
|
|
100
|
+
if (reply) {
|
|
101
|
+
const lookupAnswer = { question: state.lookup.question, answer: clip(speakable(reply.text), C.LOOKUP_ANSWER_MAX_CHARS), at: reply.at };
|
|
102
|
+
state = (await this.deps.store.update(item.id, (cur) => ({ ...cur, lookup: undefined, lookupAnswer, hiddenUntil: undefined }))) ?? {};
|
|
103
|
+
g.state = state;
|
|
104
|
+
}
|
|
105
|
+
else if (now.getTime() - since > C.LOOKUP_GIVE_UP_MS) {
|
|
106
|
+
state = (await this.deps.store.update(item.id, (cur) => ({ ...cur, lookup: undefined }))) ?? {};
|
|
107
|
+
g.state = state;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
return 'pending';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (state.lookupAnswer) {
|
|
114
|
+
item.lookupAnswer = state.lookupAnswer;
|
|
115
|
+
item.urgency = 'high';
|
|
116
|
+
return 'visible';
|
|
117
|
+
}
|
|
118
|
+
if (state.hiddenUntil && Date.parse(state.hiddenUntil) > now.getTime())
|
|
119
|
+
return 'hidden';
|
|
120
|
+
if (state.hiddenUntil && state.later) {
|
|
121
|
+
item.reminder = true;
|
|
122
|
+
item.urgency = 'high';
|
|
123
|
+
}
|
|
124
|
+
return 'visible';
|
|
125
|
+
}
|
|
126
|
+
/** Everything waiting, unfiltered, with stored state. */
|
|
127
|
+
async gather() {
|
|
128
|
+
const now = this.now();
|
|
129
|
+
const [roster, state, decisions, requests, reviews] = await Promise.all([
|
|
130
|
+
this.deps.roster().catch(() => []),
|
|
131
|
+
this.deps.store.read(),
|
|
132
|
+
(this.deps.decisions()?.list('open') ?? Promise.resolve([])).catch(() => []),
|
|
133
|
+
this.deps.listRequests().catch(() => []),
|
|
134
|
+
this.deps.listReviewTickets().catch(() => []),
|
|
135
|
+
]);
|
|
136
|
+
const who = (session) => {
|
|
137
|
+
const s = session || ORCHESTRATOR_SESSION_NAME;
|
|
138
|
+
const r = roster.find((a) => a.agentSession === s);
|
|
139
|
+
return { name: r?.displayName || s, ...(r?.teamName ? { team: r.teamName } : {}) };
|
|
140
|
+
};
|
|
141
|
+
const out = [];
|
|
142
|
+
for (const d of decisions) {
|
|
143
|
+
const item = decisionItem(d, who(d.system ? ORCHESTRATOR_SESSION_NAME : d.asker), now);
|
|
144
|
+
if (item)
|
|
145
|
+
out.push({ item, state: state.items[item.id] ?? {}, decision: d });
|
|
146
|
+
}
|
|
147
|
+
for (const r of requests) {
|
|
148
|
+
for (const it of r.openItems ?? []) {
|
|
149
|
+
if (it.type !== 'question' || !OPEN_QUESTION_STATUSES.has(it.status) || it.decisionId || !r.chatRef)
|
|
150
|
+
continue;
|
|
151
|
+
const item = questionItem(r, it, who(it.agent));
|
|
152
|
+
out.push({ item, state: state.items[item.id] ?? {}, request: r });
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const t of reviews) {
|
|
156
|
+
const item = reviewItem(t, who(t.assignee ?? t.reply?.by), now);
|
|
157
|
+
out.push({ item, state: state.items[item.id] ?? {} });
|
|
158
|
+
}
|
|
159
|
+
return out;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* One item by id (visible or not).
|
|
163
|
+
*
|
|
164
|
+
* @param id - Item id
|
|
165
|
+
* @returns The item
|
|
166
|
+
* @throws BriefingError(404)
|
|
167
|
+
*/
|
|
168
|
+
async find(id) {
|
|
169
|
+
const g = (await this.gather()).find((x) => x.item.id === id);
|
|
170
|
+
if (!g || g.state.answeredAt)
|
|
171
|
+
throw new BriefingError(404, C.CODES.NOT_FOUND, 'That item is no longer waiting — it was answered or closed.');
|
|
172
|
+
return g;
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// Actions
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
/**
|
|
178
|
+
* Answer an item: choose an option or say something.
|
|
179
|
+
*
|
|
180
|
+
* @param id - Item id
|
|
181
|
+
* @param input - `{ optionKey?, text?, confirm?, confirmToken? }`
|
|
182
|
+
* @returns What happened (`needs_confirmation` for a sensitive item's first call)
|
|
183
|
+
* @throws BriefingError(400/404/409/503)
|
|
184
|
+
*/
|
|
185
|
+
async answer(id, input) {
|
|
186
|
+
const optionKey = cleanText(input.optionKey, 100);
|
|
187
|
+
const text = cleanText(input.text, C.TEXT_MAX_CHARS);
|
|
188
|
+
if (!optionKey && !text)
|
|
189
|
+
throw new BriefingError(400, C.CODES.INVALID, 'Say an option or an answer.');
|
|
190
|
+
const g = await this.find(id);
|
|
191
|
+
const { item } = g;
|
|
192
|
+
if (optionKey && item.options.length > 0 && !matchOptionKey(item, optionKey)) {
|
|
193
|
+
throw new BriefingError(400, C.CODES.INVALID, `Options are: ${item.options.map((o) => `${o.key} (${o.label})`).join(', ')}`);
|
|
194
|
+
}
|
|
195
|
+
if (item.kind === 'review') {
|
|
196
|
+
const key = optionKey ? matchOptionKey(item, optionKey)?.key : undefined;
|
|
197
|
+
if (!key)
|
|
198
|
+
throw new BriefingError(400, C.CODES.INVALID, 'For finished work, say accept, or send back with what still needs fixing.');
|
|
199
|
+
if (key === REVIEW_SEND_BACK && !text)
|
|
200
|
+
throw new BriefingError(400, C.CODES.INVALID, 'Sending it back needs a reason: what still needs fixing?');
|
|
201
|
+
}
|
|
202
|
+
const fingerprint = JSON.stringify([optionKey ? matchOptionKey(item, optionKey)?.key ?? optionKey : null, text ?? null]);
|
|
203
|
+
if (item.sensitive) {
|
|
204
|
+
if (input.confirm !== true)
|
|
205
|
+
return this.askConfirmation(item, fingerprint, optionKey);
|
|
206
|
+
this.consumeConfirmation(item.id, fingerprint, input.confirmToken);
|
|
207
|
+
}
|
|
208
|
+
if (item.kind === 'decision') {
|
|
209
|
+
const decisions = this.requireDecisions();
|
|
210
|
+
const decisionId = item.answerTarget.decisionId;
|
|
211
|
+
await wrapDecisionError(() => optionKey ? decisions.chooseFromDashboard(decisionId, matchOptionKey(item, optionKey)?.key ?? optionKey, 'voice') : decisions.answerInWords(decisionId, text, 'voice'));
|
|
212
|
+
await this.deps.store.update(item.id, () => null);
|
|
213
|
+
this.logger.info('Briefing: decision answered by voice', { itemId: item.id, how: optionKey ? 'option' : 'words' });
|
|
214
|
+
return { status: 'done', itemId: item.id, spoken: `Done. ${item.agentName} has your answer.` };
|
|
215
|
+
}
|
|
216
|
+
if (item.kind === 'question') {
|
|
217
|
+
const target = item.answerTarget;
|
|
218
|
+
const words = text ?? matchOptionKey(item, optionKey ?? '')?.label ?? optionKey;
|
|
219
|
+
await this.deps.postOwnerMessage({ agentSession: target.agentSession, channelId: target.channelId, ...(target.threadId ? { threadId: target.threadId } : {}) }, words);
|
|
220
|
+
await this.deps.store.update(item.id, () => ({ answeredAt: this.now().toISOString() }));
|
|
221
|
+
this.logger.info('Briefing: question answered by voice', { itemId: item.id });
|
|
222
|
+
return { status: 'done', itemId: item.id, spoken: `Sent to ${item.agentName}.` };
|
|
223
|
+
}
|
|
224
|
+
// review
|
|
225
|
+
const review = this.deps.review();
|
|
226
|
+
if (!review)
|
|
227
|
+
throw new BriefingError(503, C.CODES.NOT_READY, 'Tickets are not ready yet — Crewly is still starting.');
|
|
228
|
+
const ticketId = item.answerTarget.ticketId;
|
|
229
|
+
const key = matchOptionKey(item, optionKey)?.key;
|
|
230
|
+
const result = key === REVIEW_ACCEPT ? await review.verify(ticketId) : await review.reject(ticketId, text, 'board');
|
|
231
|
+
if (!result.ok)
|
|
232
|
+
throw new BriefingError(409, C.CODES.FAILED, reviewRefusal(result.reason));
|
|
233
|
+
await this.deps.store.update(item.id, () => null);
|
|
234
|
+
this.logger.info('Briefing: review answered by voice', { itemId: item.id, action: key });
|
|
235
|
+
return { status: 'done', itemId: item.id, spoken: key === REVIEW_ACCEPT ? 'Accepted.' : `Sent back to ${item.agentName}.` };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* "Next": hide an item for a while without settling it, or — with
|
|
239
|
+
* `dismiss` — settle it as "I don't care about this anymore".
|
|
240
|
+
*
|
|
241
|
+
* @param id - Item id
|
|
242
|
+
* @param opts - `{ dismiss? }`
|
|
243
|
+
* @returns What happened
|
|
244
|
+
*/
|
|
245
|
+
async skip(id, opts = {}) {
|
|
246
|
+
const g = await this.find(id);
|
|
247
|
+
const { item } = g;
|
|
248
|
+
if (opts.dismiss) {
|
|
249
|
+
if (item.kind === 'decision') {
|
|
250
|
+
const decisionId = item.answerTarget.decisionId;
|
|
251
|
+
await wrapDecisionError(() => this.requireDecisions().skipFromDashboard(decisionId));
|
|
252
|
+
}
|
|
253
|
+
else if (item.kind === 'question' && g.request) {
|
|
254
|
+
const [, , itemId] = item.id.split(':');
|
|
255
|
+
await this.deps.dismissOpenItem(g.request.id, itemId);
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
throw new BriefingError(400, C.CODES.INVALID, 'Finished work cannot be dismissed — accept it, send it back, or say later.');
|
|
259
|
+
}
|
|
260
|
+
await this.deps.store.update(item.id, () => null);
|
|
261
|
+
this.logger.info('Briefing: item dismissed by voice', { itemId: item.id });
|
|
262
|
+
return { status: 'done', itemId: item.id, spoken: `Dropped. ${item.agentName} will let it go.` };
|
|
263
|
+
}
|
|
264
|
+
const until = new Date(this.now().getTime() + C.SKIP_HIDE_MS).toISOString();
|
|
265
|
+
await this.deps.store.update(item.id, (cur) => ({ ...cur, hiddenUntil: until, later: undefined, lookupAnswer: undefined }));
|
|
266
|
+
return { status: 'hidden', itemId: item.id, until, spoken: 'Skipped for now.' };
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* "Later" / "remind me": hide until a time (default tomorrow morning), then
|
|
270
|
+
* bring it back first, flagged as a reminder.
|
|
271
|
+
*
|
|
272
|
+
* @param id - Item id
|
|
273
|
+
* @param opts - `{ at?: ISO }`
|
|
274
|
+
* @returns What happened
|
|
275
|
+
*/
|
|
276
|
+
async later(id, opts = {}) {
|
|
277
|
+
const now = this.now();
|
|
278
|
+
const at = parseLaterTime(opts.at, now);
|
|
279
|
+
if (!at)
|
|
280
|
+
throw new BriefingError(400, C.CODES.INVALID, 'Give a future time (ISO), at most 30 days away — or leave it out for tomorrow morning.');
|
|
281
|
+
const g = await this.find(id);
|
|
282
|
+
if (g.item.kind === 'decision' && (opts.at === undefined || opts.at === null || opts.at === '') && g.decision && !g.decision.system && g.decision.kind !== 'browser_action') {
|
|
283
|
+
// The card itself also says "remind tomorrow", so Slack shows the same.
|
|
284
|
+
await this.deps.decisions()?.remindFromDashboard(g.decision.id).catch(() => undefined);
|
|
285
|
+
}
|
|
286
|
+
const until = at.toISOString();
|
|
287
|
+
await this.deps.store.update(id, (cur) => ({ ...cur, hiddenUntil: until, later: true, lookupAnswer: undefined }));
|
|
288
|
+
return { status: 'hidden', itemId: id, until, spoken: `I'll bring it back ${opts.at ? 'then' : 'tomorrow morning'}.` };
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* A follow-up question the details do not answer: hand it to the agent in
|
|
292
|
+
* its conversation and keep the item out of the queue until it replies.
|
|
293
|
+
*
|
|
294
|
+
* @param id - Item id
|
|
295
|
+
* @param question - What the owner asked
|
|
296
|
+
* @returns `lookup_pending` (with the details, so the briefer can say what is already known)
|
|
297
|
+
*/
|
|
298
|
+
async ask(id, question) {
|
|
299
|
+
const q = cleanText(question, C.TEXT_MAX_CHARS);
|
|
300
|
+
if (!q)
|
|
301
|
+
throw new BriefingError(400, C.CODES.INVALID, 'What should I ask?');
|
|
302
|
+
const { item } = await this.find(id);
|
|
303
|
+
let target;
|
|
304
|
+
let message;
|
|
305
|
+
if (item.answerTarget.kind === 'thread') {
|
|
306
|
+
// The question was asked in that conversation: the owner's words go back there.
|
|
307
|
+
target = { agentSession: item.agentSession, channelId: item.answerTarget.channelId, ...(item.answerTarget.threadId ? { threadId: item.answerTarget.threadId } : {}) };
|
|
308
|
+
message = q;
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
const about = item.answerTarget.kind === 'decision'
|
|
312
|
+
? `decision ${item.answerTarget.decisionId}`
|
|
313
|
+
: `ticket ${item.answerTarget.tkt ?? item.answerTarget.ticketId}`;
|
|
314
|
+
target = { agentSession: item.agentSession };
|
|
315
|
+
message = `[Drive mode] The owner asked about ${about} ("${clip(speakable(item.details.split('\n')[0] ?? ''), 160)}"): ${q}\nAnswer briefly in plain words — it will be read aloud.`;
|
|
316
|
+
}
|
|
317
|
+
const posted = await this.deps.postOwnerMessage(target, message);
|
|
318
|
+
const askedAt = this.now().toISOString();
|
|
319
|
+
await this.deps.store.update(item.id, (cur) => ({
|
|
320
|
+
...cur,
|
|
321
|
+
lookupAnswer: undefined,
|
|
322
|
+
hiddenUntil: undefined,
|
|
323
|
+
later: undefined,
|
|
324
|
+
lookup: { question: clip(q, 500), askedAt, channelId: posted.channelId, ...(posted.threadId ? { threadId: posted.threadId } : {}) },
|
|
325
|
+
}));
|
|
326
|
+
this.logger.info('Briefing: follow-up handed to the agent', { itemId: item.id, agent: item.agentSession });
|
|
327
|
+
return { status: 'lookup_pending', itemId: item.id, handedTo: item.agentName, details: item.details, spoken: `I asked ${item.agentName}. It comes back to the queue when they answer.` };
|
|
328
|
+
}
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
// Confirmation
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
askConfirmation(item, fingerprint, optionKey) {
|
|
333
|
+
this.sweepConfirmations();
|
|
334
|
+
const token = randomBytes(9).toString('base64url');
|
|
335
|
+
this.confirmations.set(token, { itemId: item.id, fingerprint, expiresAt: this.now().getTime() + C.CONFIRM_TTL_MS });
|
|
336
|
+
const label = optionKey ? matchOptionKey(item, optionKey)?.label ?? optionKey : null;
|
|
337
|
+
const what = label ? `"${label}"` : 'your answer';
|
|
338
|
+
return {
|
|
339
|
+
status: 'needs_confirmation',
|
|
340
|
+
itemId: item.id,
|
|
341
|
+
confirmToken: token,
|
|
342
|
+
confirmQuestion: `This one is sensitive (${item.sensitiveReason ?? 'sensitive'}). Confirm ${what} for: ${clip(item.summary, 160)}`,
|
|
343
|
+
spoken: `Ask the owner to confirm ${what}. Only after a clear yes, call again with the same answer, confirm true and this token.`,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
consumeConfirmation(itemId, fingerprint, token) {
|
|
347
|
+
this.sweepConfirmations();
|
|
348
|
+
const pending = typeof token === 'string' ? this.confirmations.get(token) : undefined;
|
|
349
|
+
if (!pending || pending.itemId !== itemId || pending.fingerprint !== fingerprint) {
|
|
350
|
+
throw new BriefingError(409, C.CODES.CONFIRM_MISMATCH, 'Confirm the same answer first: call without confirm, ask the owner, then call again with the token.');
|
|
351
|
+
}
|
|
352
|
+
this.confirmations.delete(token);
|
|
353
|
+
}
|
|
354
|
+
sweepConfirmations() {
|
|
355
|
+
const now = this.now().getTime();
|
|
356
|
+
for (const [token, c] of this.confirmations)
|
|
357
|
+
if (c.expiresAt <= now)
|
|
358
|
+
this.confirmations.delete(token);
|
|
359
|
+
}
|
|
360
|
+
requireDecisions() {
|
|
361
|
+
const d = this.deps.decisions();
|
|
362
|
+
if (!d)
|
|
363
|
+
throw new BriefingError(503, C.CODES.NOT_READY, 'Decision cards are not ready yet — Crewly is still starting.');
|
|
364
|
+
return d;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
// Item builders (pure)
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
/**
|
|
371
|
+
* A decision card as a briefing item (null while it is snoozed by the card's
|
|
372
|
+
* own "remind me tomorrow").
|
|
373
|
+
*
|
|
374
|
+
* @param d - Decision
|
|
375
|
+
* @param who - Asker's name / team
|
|
376
|
+
* @param now - Clock
|
|
377
|
+
* @returns Item or null
|
|
378
|
+
*/
|
|
379
|
+
export function decisionItem(d, who, now) {
|
|
380
|
+
if (!PENDING_DECISIONS.has(d.status))
|
|
381
|
+
return null;
|
|
382
|
+
const remindAt = d.remindAt ? Date.parse(d.remindAt) : NaN;
|
|
383
|
+
if (!Number.isNaN(remindAt) && remindAt > now.getTime())
|
|
384
|
+
return null;
|
|
385
|
+
const reminder = !Number.isNaN(remindAt);
|
|
386
|
+
const deadline = Date.parse(d.deadline);
|
|
387
|
+
const urgent = d.status === 'parked' || reminder || (!Number.isNaN(deadline) && deadline - now.getTime() <= C.URGENT_DEADLINE_MS);
|
|
388
|
+
const question = d.title ? `${d.title}: ${d.question}` : d.question;
|
|
389
|
+
const reason = sensitiveReason([d.question, d.title, ...d.options.map((o) => o.label), d.ticket?.title, d.browser?.target], d.sensitive ?? (d.kind === 'browser_action' ? 'browser_action' : null));
|
|
390
|
+
const defaultLabel = d.options.find((o) => o.key === d.defaultKey)?.label;
|
|
391
|
+
const lines = [
|
|
392
|
+
`Question: ${speakable(d.question)}`,
|
|
393
|
+
...(d.title ? [`Title: ${speakable(d.title)}`] : []),
|
|
394
|
+
...d.options.map((o) => `Option ${o.key}: ${speakable(o.label)}${o.detail ? ` — ${speakable(o.detail)}` : ''}`),
|
|
395
|
+
...(d.body ?? []).map((b) => speakable(b)),
|
|
396
|
+
...(d.ticket ? [`Ticket ${d.ticket.id}: ${speakable(d.ticket.title)}${d.ticket.projectName ? ` (project ${d.ticket.projectName})` : ''}`] : []),
|
|
397
|
+
...(d.browser ? [`Held browser action: ${speakable(d.browser.target)}${d.browser.where ? ` on ${d.browser.where}` : ''}`] : []),
|
|
398
|
+
`Asked by ${who.name}${who.team ? ` (${who.team})` : ''} at ${d.askedAt ?? d.createdAt}.`,
|
|
399
|
+
d.status === 'parked'
|
|
400
|
+
? 'Nothing happens until the owner answers (sensitive, parked).'
|
|
401
|
+
: d.defaultKey === 'wait' || !defaultLabel
|
|
402
|
+
? `Deadline ${d.deadline}; with no answer the agent keeps waiting.`
|
|
403
|
+
: `Deadline ${d.deadline}; with no answer: ${speakable(defaultLabel)}${d.sensitive ? ' is NOT applied (sensitive)' : ''}.`,
|
|
404
|
+
];
|
|
405
|
+
return {
|
|
406
|
+
id: `d:${d.id}`,
|
|
407
|
+
kind: 'decision',
|
|
408
|
+
urgency: urgent ? 'high' : 'normal',
|
|
409
|
+
agentSession: d.system ? ORCHESTRATOR_SESSION_NAME : d.asker,
|
|
410
|
+
agentName: who.name,
|
|
411
|
+
...(who.team ? { teamName: who.team } : {}),
|
|
412
|
+
summary: spokenSummary('decision', who.name, question, d.options.map((o) => o.label)),
|
|
413
|
+
details: clip(lines.join('\n'), C.DETAILS_MAX_CHARS),
|
|
414
|
+
options: d.options.map((o) => ({ key: o.key, label: o.label, ...(o.detail ? { detail: o.detail } : {}) })),
|
|
415
|
+
acceptsText: d.kind !== 'browser_action' && !d.system,
|
|
416
|
+
sensitive: reason !== null,
|
|
417
|
+
...(reason ? { sensitiveReason: reason } : {}),
|
|
418
|
+
answerTarget: { kind: 'decision', decisionId: d.id },
|
|
419
|
+
since: d.askedAt ?? d.createdAt,
|
|
420
|
+
deadline: d.deadline,
|
|
421
|
+
...(reminder ? { reminder: true } : {}),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* An unanswered question from an agent's reply as a briefing item.
|
|
426
|
+
*
|
|
427
|
+
* @param r - Request holding it (has `chatRef`)
|
|
428
|
+
* @param it - The open item
|
|
429
|
+
* @param who - Agent name / team
|
|
430
|
+
* @returns Item
|
|
431
|
+
*/
|
|
432
|
+
export function questionItem(r, it, who) {
|
|
433
|
+
const reason = sensitiveReason([it.text, r.title]);
|
|
434
|
+
const lines = [
|
|
435
|
+
`Question: ${speakable(it.text)}`,
|
|
436
|
+
`About: ${speakable(r.title)}${r.ticketNumber ? ` (TKT-${r.ticketNumber})` : ''}`,
|
|
437
|
+
...(r.description ? [`Request: ${clip(speakable(r.description), 600)}`] : []),
|
|
438
|
+
...(r.reply?.excerpt ? [`${who.name}'s latest reply: ${clip(speakable(r.reply.excerpt), 600)}`] : []),
|
|
439
|
+
`Asked by ${who.name}${who.team ? ` (${who.team})` : ''} at ${it.createdAt}. The answer is posted in that conversation.`,
|
|
440
|
+
];
|
|
441
|
+
const chatRef = r.chatRef;
|
|
442
|
+
return {
|
|
443
|
+
id: `q:${r.id}:${it.id}`,
|
|
444
|
+
kind: 'question',
|
|
445
|
+
urgency: it.status === 'overdue' ? 'high' : 'normal',
|
|
446
|
+
agentSession: it.agent,
|
|
447
|
+
agentName: who.name,
|
|
448
|
+
...(who.team ? { teamName: who.team } : {}),
|
|
449
|
+
summary: spokenSummary('question', who.name, it.text),
|
|
450
|
+
details: clip(lines.join('\n'), C.DETAILS_MAX_CHARS),
|
|
451
|
+
options: [],
|
|
452
|
+
acceptsText: true,
|
|
453
|
+
sensitive: reason !== null,
|
|
454
|
+
...(reason ? { sensitiveReason: reason } : {}),
|
|
455
|
+
answerTarget: { kind: 'thread', channelId: chatRef.channelId, threadId: chatRef.threadRootId, agentSession: it.agent },
|
|
456
|
+
since: it.createdAt,
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* A ticket in 待验收 as a briefing item.
|
|
461
|
+
*
|
|
462
|
+
* @param t - Board row
|
|
463
|
+
* @param who - Agent name / team
|
|
464
|
+
* @param now - Clock
|
|
465
|
+
* @returns Item
|
|
466
|
+
*/
|
|
467
|
+
export function reviewItem(t, who, now) {
|
|
468
|
+
const autoAt = t.autoAcceptAt ? Date.parse(t.autoAcceptAt) : NaN;
|
|
469
|
+
const soon = !Number.isNaN(autoAt) && autoAt - now.getTime() <= C.REVIEW_SOON_MS;
|
|
470
|
+
const reason = sensitiveReason([t.title, t.description]);
|
|
471
|
+
const lines = [
|
|
472
|
+
`Finished work: ${speakable(t.title)}${t.tkt ? ` (${t.tkt})` : ''}`,
|
|
473
|
+
...(t.description ? [`Asked for: ${clip(speakable(t.description), 600)}`] : []),
|
|
474
|
+
...(t.reply?.excerpt ? [`${who.name}'s answer: ${clip(speakable(t.reply.excerpt), 800)}`] : []),
|
|
475
|
+
...t.acceptance.filter((a) => a.text).map((a) => `Check: ${speakable(a.text)}`),
|
|
476
|
+
...(t.rejectCount > 0 ? [`Sent back ${t.rejectCount} time(s) before.`] : []),
|
|
477
|
+
t.autoAcceptAt ? `If the owner says nothing it is accepted at ${t.autoAcceptAt}.` : 'It waits for the owner.',
|
|
478
|
+
];
|
|
479
|
+
return {
|
|
480
|
+
id: `t:${t.id}`,
|
|
481
|
+
kind: 'review',
|
|
482
|
+
urgency: soon ? 'normal' : 'low',
|
|
483
|
+
agentSession: t.assignee ?? t.reply?.by ?? ORCHESTRATOR_SESSION_NAME,
|
|
484
|
+
agentName: who.name,
|
|
485
|
+
...(who.team ? { teamName: who.team } : {}),
|
|
486
|
+
summary: spokenSummary('review', who.name, t.title),
|
|
487
|
+
details: clip(lines.join('\n'), C.DETAILS_MAX_CHARS),
|
|
488
|
+
options: [
|
|
489
|
+
{ key: REVIEW_ACCEPT, label: 'Accept' },
|
|
490
|
+
{ key: REVIEW_SEND_BACK, label: 'Send back', detail: 'with what still needs fixing' },
|
|
491
|
+
],
|
|
492
|
+
acceptsText: true,
|
|
493
|
+
sensitive: reason !== null,
|
|
494
|
+
...(reason ? { sensitiveReason: reason } : {}),
|
|
495
|
+
answerTarget: { kind: 'ticket', ticketId: t.id, ...(t.tkt ? { tkt: t.tkt } : {}) },
|
|
496
|
+
since: t.submittedAt ?? t.updatedAt,
|
|
497
|
+
...(t.autoAcceptAt ? { deadline: t.autoAcceptAt } : {}),
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
// ---------------------------------------------------------------------------
|
|
501
|
+
// Helpers
|
|
502
|
+
// ---------------------------------------------------------------------------
|
|
503
|
+
/**
|
|
504
|
+
* A trimmed, length-checked string, or null when absent / empty.
|
|
505
|
+
*
|
|
506
|
+
* @param value - Body value
|
|
507
|
+
* @param max - Longest length
|
|
508
|
+
* @returns Text or null
|
|
509
|
+
* @throws BriefingError(400) when too long or not a string
|
|
510
|
+
*/
|
|
511
|
+
function cleanText(value, max) {
|
|
512
|
+
if (value === undefined || value === null)
|
|
513
|
+
return null;
|
|
514
|
+
if (typeof value !== 'string')
|
|
515
|
+
throw new BriefingError(400, C.CODES.INVALID, 'Expected text.');
|
|
516
|
+
const t = value.trim();
|
|
517
|
+
if (t.length > max)
|
|
518
|
+
throw new BriefingError(400, C.CODES.INVALID, `Too long (max ${max} characters).`);
|
|
519
|
+
return t || null;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* The option an owner meant by a key or a label.
|
|
523
|
+
*
|
|
524
|
+
* @param item - Item
|
|
525
|
+
* @param key - Key or label
|
|
526
|
+
* @returns Option or undefined
|
|
527
|
+
*/
|
|
528
|
+
function matchOptionKey(item, key) {
|
|
529
|
+
const k = key.trim().toLowerCase();
|
|
530
|
+
return item.options.find((o) => o.key.toLowerCase() === k) ?? item.options.find((o) => o.label.toLowerCase() === k);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Run a decision call, turning its HTTP-like errors into briefing errors.
|
|
534
|
+
*
|
|
535
|
+
* @param fn - Call
|
|
536
|
+
*/
|
|
537
|
+
async function wrapDecisionError(fn) {
|
|
538
|
+
try {
|
|
539
|
+
await fn();
|
|
540
|
+
}
|
|
541
|
+
catch (err) {
|
|
542
|
+
const status = typeof err.status === 'number' ? err.status : 500;
|
|
543
|
+
throw new BriefingError(status, status === 404 ? C.CODES.NOT_FOUND : status >= 500 ? C.CODES.FAILED : C.CODES.INVALID, err instanceof Error ? err.message : String(err));
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Speakable reason a ticket action was refused.
|
|
548
|
+
*
|
|
549
|
+
* @param reason - Review refusal
|
|
550
|
+
* @returns Text
|
|
551
|
+
*/
|
|
552
|
+
function reviewRefusal(reason) {
|
|
553
|
+
switch (reason) {
|
|
554
|
+
case 'open_work':
|
|
555
|
+
return 'Work on it is still running — it cannot be accepted yet.';
|
|
556
|
+
case 'already_done':
|
|
557
|
+
return 'It was already accepted.';
|
|
558
|
+
case 'not_in_review':
|
|
559
|
+
return 'It is no longer waiting for review.';
|
|
560
|
+
case 'cancelled':
|
|
561
|
+
return 'It was cancelled.';
|
|
562
|
+
case 'not_found':
|
|
563
|
+
return 'That ticket no longer exists.';
|
|
564
|
+
default:
|
|
565
|
+
return 'That did not work.';
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
let instance = null;
|
|
569
|
+
/**
|
|
570
|
+
* The running briefing service (null until boot wired it).
|
|
571
|
+
*
|
|
572
|
+
* @returns Service or null
|
|
573
|
+
*/
|
|
574
|
+
export function getBriefingService() {
|
|
575
|
+
return instance;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Install the briefing service (boot, tests).
|
|
579
|
+
*
|
|
580
|
+
* @param service - Service or null
|
|
581
|
+
*/
|
|
582
|
+
export function setBriefingService(service) {
|
|
583
|
+
instance = service;
|
|
584
|
+
}
|
|
585
|
+
//# sourceMappingURL=briefing.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/briefing/briefing.service.ts"],"names":[],"mappings":"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"}
|