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.
Files changed (59) hide show
  1. package/dist/backend/backend/src/constants.d.ts +85 -0
  2. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  3. package/dist/backend/backend/src/constants.js +85 -0
  4. package/dist/backend/backend/src/constants.js.map +1 -1
  5. package/dist/backend/backend/src/controllers/briefing/briefing.controller.d.ts +23 -0
  6. package/dist/backend/backend/src/controllers/briefing/briefing.controller.d.ts.map +1 -0
  7. package/dist/backend/backend/src/controllers/briefing/briefing.controller.js +79 -0
  8. package/dist/backend/backend/src/controllers/briefing/briefing.controller.js.map +1 -0
  9. package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.d.ts +34 -0
  10. package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.d.ts.map +1 -0
  11. package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.js +72 -0
  12. package/dist/backend/backend/src/controllers/talk/talk-live-token.controller.js.map +1 -0
  13. package/dist/backend/backend/src/index.d.ts.map +1 -1
  14. package/dist/backend/backend/src/index.js +69 -1
  15. package/dist/backend/backend/src/index.js.map +1 -1
  16. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/routes/api.routes.js +6 -0
  18. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  19. package/dist/backend/backend/src/services/briefing/briefing-state.store.d.ts +45 -0
  20. package/dist/backend/backend/src/services/briefing/briefing-state.store.d.ts.map +1 -0
  21. package/dist/backend/backend/src/services/briefing/briefing-state.store.js +93 -0
  22. package/dist/backend/backend/src/services/briefing/briefing-state.store.js.map +1 -0
  23. package/dist/backend/backend/src/services/briefing/briefing.service.d.ts +214 -0
  24. package/dist/backend/backend/src/services/briefing/briefing.service.d.ts.map +1 -0
  25. package/dist/backend/backend/src/services/briefing/briefing.service.js +585 -0
  26. package/dist/backend/backend/src/services/briefing/briefing.service.js.map +1 -0
  27. package/dist/backend/backend/src/services/briefing/briefing.types.d.ts +172 -0
  28. package/dist/backend/backend/src/services/briefing/briefing.types.d.ts.map +1 -0
  29. package/dist/backend/backend/src/services/briefing/briefing.types.js +27 -0
  30. package/dist/backend/backend/src/services/briefing/briefing.types.js.map +1 -0
  31. package/dist/backend/backend/src/services/briefing/briefing.utils.d.ts +71 -0
  32. package/dist/backend/backend/src/services/briefing/briefing.utils.d.ts.map +1 -0
  33. package/dist/backend/backend/src/services/briefing/briefing.utils.js +134 -0
  34. package/dist/backend/backend/src/services/briefing/briefing.utils.js.map +1 -0
  35. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +8 -0
  37. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +14 -1
  39. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/decisions/decision.service.js +24 -2
  41. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  42. package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts +166 -0
  43. package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts.map +1 -0
  44. package/dist/backend/backend/src/services/talk/talk-live-token.service.js +287 -0
  45. package/dist/backend/backend/src/services/talk/talk-live-token.service.js.map +1 -0
  46. package/dist/backend/backend/src/types/decision.types.d.ts +3 -3
  47. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  48. package/dist/backend/build-info.json +2 -2
  49. package/dist/cli/backend/src/constants.d.ts +85 -0
  50. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  51. package/dist/cli/backend/src/constants.js +85 -0
  52. package/dist/cli/backend/src/constants.js.map +1 -1
  53. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +14 -1
  54. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  55. package/dist/cli/backend/src/services/decisions/decision.service.js +24 -2
  56. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  57. package/dist/cli/backend/src/types/decision.types.d.ts +3 -3
  58. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  59. package/package.json +1 -1
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Drive mode voice: Gemini Live ephemeral tokens (specs/2026-10-08-drive-mode.md §3).
3
+ *
4
+ * The phone talks to Gemini Live directly (realtime audio, barge-in), but it
5
+ * must never see this machine's Gemini API key. So the machine mints a
6
+ * short-lived token (`POST /v1alpha/auth_tokens`) that:
7
+ *
8
+ * - opens ONE session within a minute and lasts at most 30 minutes;
9
+ * - is locked to the briefer's setup — model, audio output, voice, the
10
+ * system instruction and the briefing tools — so a page holding it cannot
11
+ * turn it into a general-purpose Gemini session.
12
+ *
13
+ * The key comes from the Antigravity credential Crewly already stores
14
+ * (`harness-credentials.json`), else `GEMINI_API_KEY`. Neither the key nor
15
+ * the token is ever logged.
16
+ *
17
+ * @module services/talk/talk-live-token.service
18
+ */
19
+ import { TALK_LIVE_CONSTANTS } from '../../constants.js';
20
+ import { getHarnessCredentialsStore } from '../harness/harness-credentials.store.js';
21
+ import { LoggerService } from '../core/logger.service.js';
22
+ const C = TALK_LIVE_CONSTANTS;
23
+ /** A token failure with an HTTP status and code. */
24
+ export class TalkLiveTokenError extends Error {
25
+ status;
26
+ code;
27
+ /**
28
+ * @param status - HTTP status
29
+ * @param code - One of {@link TALK_LIVE_CONSTANTS.CODES}
30
+ * @param message - Owner-readable message
31
+ */
32
+ constructor(status, code, message) {
33
+ super(message);
34
+ this.status = status;
35
+ this.code = code;
36
+ this.name = 'TalkLiveTokenError';
37
+ }
38
+ }
39
+ /**
40
+ * The briefing tools the voice model may call. The page carries each call to
41
+ * this machine's `/api/briefing` over the relay.
42
+ *
43
+ * @returns Function declarations
44
+ */
45
+ export function briefingToolDeclarations() {
46
+ const itemId = { type: 'STRING', description: 'The item id from get_next_item.' };
47
+ return [
48
+ {
49
+ name: 'get_next_item',
50
+ description: 'Get the next thing waiting on the owner (most urgent first) with its details and answer options. Call it when the session starts, after each item is settled, and whenever the owner asks what is next. Returns empty:true when nothing is waiting.',
51
+ },
52
+ {
53
+ name: 'answer_item',
54
+ description: "Give the owner's answer to an item: an option_key from its options, and/or their words as text. For finished work (review) use option_key accept, or send_back with text saying what to fix. If it returns needs_confirmation, read confirmQuestion to the owner and only after a clear yes call again with the same answer, confirm=true and the confirm_token.",
55
+ parameters: {
56
+ type: 'OBJECT',
57
+ properties: {
58
+ item_id: itemId,
59
+ option_key: { type: 'STRING', description: 'Key of the chosen option (e.g. a, b, accept, send_back).' },
60
+ text: { type: 'STRING', description: "The owner's own words, in their language, as said (no paraphrase)." },
61
+ confirm: { type: 'BOOLEAN', description: 'true only on the second call, after the owner confirmed out loud.' },
62
+ confirm_token: { type: 'STRING', description: 'The token from the needs_confirmation result.' },
63
+ },
64
+ required: ['item_id'],
65
+ },
66
+ },
67
+ {
68
+ name: 'skip_item',
69
+ description: 'The owner says next / skip / not now: hide the item for a few hours without answering. With dismiss=true it is dropped for good ("I don\'t care about this anymore") — only when the owner says so.',
70
+ parameters: {
71
+ type: 'OBJECT',
72
+ properties: { item_id: itemId, dismiss: { type: 'BOOLEAN', description: 'Drop it for good (owner said they do not care).' } },
73
+ required: ['item_id'],
74
+ },
75
+ },
76
+ {
77
+ name: 'later_item',
78
+ description: 'The owner says later / remind me: bring the item back at a time (ISO 8601 with timezone offset), or tomorrow morning when no time is given.',
79
+ parameters: {
80
+ type: 'OBJECT',
81
+ properties: { item_id: itemId, at: { type: 'STRING', description: 'When to bring it back (ISO 8601), optional.' } },
82
+ required: ['item_id'],
83
+ },
84
+ },
85
+ {
86
+ name: 'ask_about_item',
87
+ description: "The owner asks something about an item that its details do not answer. The question goes to the agent who is waiting; the item comes back to the queue (with the agent's answer) when they reply. Answer from details yourself whenever you can instead.",
88
+ parameters: {
89
+ type: 'OBJECT',
90
+ properties: { item_id: itemId, question: { type: 'STRING', description: "The owner's question, in their words." } },
91
+ required: ['item_id', 'question'],
92
+ },
93
+ },
94
+ ];
95
+ }
96
+ /** Spoken name of each starting language. */
97
+ const LANGUAGE_NAMES = { zh: 'Mandarin Chinese', en: 'English', es: 'Spanish' };
98
+ /**
99
+ * The briefer's system instruction.
100
+ *
101
+ * @param language - Language to start in
102
+ * @returns Instruction text
103
+ */
104
+ export function briefingSystemInstruction(language) {
105
+ return [
106
+ "You are Crewly's voice briefer. The owner is listening on a phone, often while driving: they cannot look at the screen.",
107
+ `Speak ${LANGUAGE_NAMES[language]} to start; if the owner speaks another language, switch to it and stay in it.`,
108
+ 'Be brief: one or two short sentences at a time, natural spoken language, no lists, no URLs, no ids unless asked.',
109
+ 'Start by calling get_next_item. Read ONE item at a time: who is waiting and the summary, then the options. Then stop and listen.',
110
+ 'Never invent facts. Everything you say about an item comes from get_next_item results; if the details do not answer a question, say you will ask, and call ask_about_item.',
111
+ 'When the owner answers, call answer_item with their choice (option_key) and/or their own words (text) — never put words in their mouth. If the result is needs_confirmation, ask exactly: confirm? (in their language, e.g. 确认吗?) and call again with confirm=true and the confirm_token only after a clear yes.',
112
+ 'next / skip / 下一个 / 跳过 → skip_item, then get_next_item. later / remind me / 晚点 / 明天提醒我 → later_item. drop it / 不管了 → skip_item with dismiss=true.',
113
+ 'wait / what does this mean / 等一下 / 这是什么意思 → explain from the details; if they do not cover it, ask_about_item and move on to the next item. continue / 继续 → carry on where you were.',
114
+ 'repeat / 再说一遍 → repeat the current item. pause / 暂停 → say one word and stay silent until the owner speaks.',
115
+ "If an item has lookupAnswer, say first that the agent answered the owner's earlier question, and what they said. If it has reminder, say it is the reminder they asked for.",
116
+ 'When nothing is waiting, say so in one sentence and stay listening; call get_next_item again if the owner asks.',
117
+ 'If a tool fails, say so in one sentence and offer to try again or move on.',
118
+ ].join('\n');
119
+ }
120
+ /**
121
+ * Field mask over a setup, the way the Gemini SDK builds it
122
+ * (`tokens.create` with `lockAdditionalFields: []`): every top-level field
123
+ * and, for an object, each of its keys.
124
+ *
125
+ * @param setup - The setup
126
+ * @returns Comma-separated field paths
127
+ */
128
+ export function setupFieldMask(setup) {
129
+ const fields = [];
130
+ for (const [key, value] of Object.entries(setup)) {
131
+ // An array (tools) is masked as a whole: Google rejects `tools.0`
132
+ // ("field_mask is invalid for BidiGenerateContentSetup", 2026-10-08).
133
+ if (value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length > 0) {
134
+ fields.push(...Object.keys(value).map((k) => `${key}.${k}`));
135
+ }
136
+ else {
137
+ fields.push(key);
138
+ }
139
+ }
140
+ return fields.join(',');
141
+ }
142
+ /**
143
+ * Normalise the requested language.
144
+ *
145
+ * @param raw - Body value
146
+ * @returns A supported language (default Chinese)
147
+ */
148
+ export function parseLiveLanguage(raw) {
149
+ const v = typeof raw === 'string' ? raw.trim().toLowerCase().slice(0, 2) : '';
150
+ return C.LANGUAGES.includes(v) ? v : C.DEFAULT_LANGUAGE;
151
+ }
152
+ /** Mints Gemini Live ephemeral tokens for Drive mode. */
153
+ export class TalkLiveTokenService {
154
+ deps;
155
+ logger;
156
+ /**
157
+ * @param deps - Collaborators
158
+ */
159
+ constructor(deps = {}) {
160
+ this.deps = deps;
161
+ this.logger = deps.logger ?? LoggerService.getInstance().createComponentLogger('TalkLiveToken');
162
+ }
163
+ /** @returns The Gemini API key, or null */
164
+ apiKey() {
165
+ if (this.deps.getApiKey)
166
+ return this.deps.getApiKey();
167
+ let stored = null;
168
+ try {
169
+ stored = getHarnessCredentialsStore().getAntigravityGeminiApiKey();
170
+ }
171
+ catch {
172
+ stored = null;
173
+ }
174
+ const env = (this.deps.env ?? process.env)[C.API_KEY_ENV];
175
+ return stored || (typeof env === 'string' && env.trim() ? env.trim() : null);
176
+ }
177
+ /** @returns Whether a key is configured (no network) */
178
+ hasKey() {
179
+ return !!this.apiKey();
180
+ }
181
+ /**
182
+ * The setup for a language.
183
+ *
184
+ * @param language - Starting language
185
+ * @returns Setup
186
+ */
187
+ buildSetup(language) {
188
+ const env = this.deps.env ?? process.env;
189
+ const model = (env[C.MODEL_ENV] || C.DEFAULT_MODEL).trim();
190
+ return {
191
+ model: `models/${model}`,
192
+ generationConfig: {
193
+ responseModalities: ['AUDIO'],
194
+ speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: C.VOICE } } },
195
+ },
196
+ systemInstruction: { parts: [{ text: briefingSystemInstruction(language) }] },
197
+ tools: [{ functionDeclarations: briefingToolDeclarations() }],
198
+ inputAudioTranscription: {},
199
+ outputAudioTranscription: {},
200
+ };
201
+ }
202
+ /**
203
+ * Mint one token for one Live session.
204
+ *
205
+ * @param language - Starting language
206
+ * @returns Token, URL and the setup it is locked to
207
+ * @throws TalkLiveTokenError — `no_gemini_key` (409), `google_rejected` / `unreachable` (502)
208
+ */
209
+ async mint(language) {
210
+ const key = this.apiKey();
211
+ if (!key)
212
+ throw new TalkLiveTokenError(409, C.CODES.NO_KEY, 'Add a Gemini API key in Settings to use Drive mode.');
213
+ const env = this.deps.env ?? process.env;
214
+ const apiVersion = (env[C.API_VERSION_ENV] || C.DEFAULT_API_VERSION).trim();
215
+ const now = (this.deps.now ?? (() => new Date()))();
216
+ const expireTime = new Date(now.getTime() + C.TOKEN_TTL_MS).toISOString();
217
+ const newSessionExpireTime = new Date(now.getTime() + C.NEW_SESSION_WINDOW_MS).toISOString();
218
+ const setup = this.buildSetup(language);
219
+ const body = {
220
+ uses: C.TOKEN_USES,
221
+ expireTime,
222
+ newSessionExpireTime,
223
+ bidiGenerateContentSetup: setup,
224
+ fieldMask: setupFieldMask(setup),
225
+ };
226
+ const fetchImpl = this.deps.fetchImpl ?? fetch;
227
+ let res;
228
+ try {
229
+ res = await fetchImpl(`${C.API_BASE}/${apiVersion}/auth_tokens`, {
230
+ method: 'POST',
231
+ headers: { 'Content-Type': 'application/json', 'x-goog-api-key': key },
232
+ body: JSON.stringify(body),
233
+ signal: AbortSignal.timeout(C.REQUEST_TIMEOUT_MS),
234
+ });
235
+ }
236
+ catch (error) {
237
+ this.logger.warn('Gemini Live token request failed', { error: error instanceof Error ? error.name : 'unknown' });
238
+ throw new TalkLiveTokenError(502, C.CODES.UNREACHABLE, 'Could not reach Google to start the voice session.');
239
+ }
240
+ let json = {};
241
+ try {
242
+ json = (await res.json());
243
+ }
244
+ catch {
245
+ json = {};
246
+ }
247
+ if (!res.ok || typeof json.name !== 'string' || !json.name) {
248
+ // Google's status word only ("PERMISSION_DENIED"): never the body, which may echo the request.
249
+ const status = typeof json.error?.status === 'string' ? json.error.status : String(res.status);
250
+ this.logger.warn('Gemini Live token refused', { httpStatus: res.status, status });
251
+ const hint = res.status === 400 || res.status === 403 ? ' Check that the Gemini API key in Settings is valid and has the Live API enabled.' : '';
252
+ throw new TalkLiveTokenError(502, C.CODES.GOOGLE_REJECTED, `Google refused the voice session (${status}).${hint}`);
253
+ }
254
+ const token = json.name;
255
+ const model = setup.model.replace(/^models\//, '');
256
+ this.logger.info('Gemini Live token minted', { model, apiVersion, language });
257
+ return {
258
+ token,
259
+ wsUrl: `${C.WS_BASE}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateContentConstrained?access_token=${encodeURIComponent(token)}`,
260
+ model,
261
+ apiVersion,
262
+ setup,
263
+ newSessionExpireTime,
264
+ expireTime,
265
+ language,
266
+ };
267
+ }
268
+ }
269
+ let instance = null;
270
+ /**
271
+ * The process-wide token service.
272
+ *
273
+ * @returns Service
274
+ */
275
+ export function getTalkLiveTokenService() {
276
+ instance ??= new TalkLiveTokenService();
277
+ return instance;
278
+ }
279
+ /**
280
+ * Replace the token service (tests).
281
+ *
282
+ * @param service - Service or null (reset)
283
+ */
284
+ export function setTalkLiveTokenService(service) {
285
+ instance = service;
286
+ }
287
+ //# sourceMappingURL=talk-live-token.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"talk-live-token.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/talk/talk-live-token.service.ts"],"names":[],"mappings":"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"}
@@ -172,13 +172,13 @@ export type DecisionStatus =
172
172
  | 'expired'
173
173
  /** The owner skipped it ("I don't care about this anymore"): the asker drops it and must not ask again */
174
174
  | 'skipped';
175
- /** How an answer arrived. */
176
175
  /**
177
176
  * How an answer arrived. `thread`: the owner answered in the card's thread
178
177
  * with a voice note, audio or another file and no text
179
- * (specs/2026-10-02-decision-card-thread-answers.md §1).
178
+ * (specs/2026-10-02-decision-card-thread-answers.md §1). `voice`: spoken in
179
+ * Drive mode on the phone (specs/2026-10-08-drive-mode.md).
180
180
  */
181
- export type DecisionAnswerVia = 'button' | 'reaction' | 'reply' | 'thread' | 'dashboard' | 'deadline' | 'bulk';
181
+ export type DecisionAnswerVia = 'button' | 'reaction' | 'reply' | 'thread' | 'dashboard' | 'deadline' | 'bulk' | 'voice';
182
182
  /** A file the owner answered with in a card's thread. */
183
183
  export interface DecisionAnswerFile {
184
184
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"decision.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/decision.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,6DAA6D;AAC7D,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;AAEjI;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,eAAe,GAAG,gBAAgB,GAAG,WAAW,GAAG,sBAAsB,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAE3M,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjD,gEAAgE;AAChE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,IAAI,EAAE,OAAO,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5C,EAAE,EAAE,OAAO,YAAY,EAAE,SAAS,CAAC;IACnC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qGAAqG;IACrG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,+BAA+B;AAC/B,MAAM,MAAM,cAAc;AACxB,2DAA2D;AACzD,MAAM;AACR,qEAAqE;GACnE,UAAU;AACZ,sDAAsD;GACpD,WAAW;AACb,gGAAgG;GAC9F,QAAQ;AACV,2DAA2D;GACzD,WAAW;AACb,4FAA4F;GAC1F,SAAS;AACX,0GAA0G;GACxG,SAAS,CAAC;AAEd,6BAA6B;AAC7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/G,yDAAyD;AACzD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,MAAM,EAAE,OAAO,CAAC;IAChB,4GAA4G;IAC5G,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,sEAAsE;IACtE,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,sDAAsD;IACtD,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,wEAAwE;IACxE,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,2GAA2G;IAC3G,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,MAAM,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACrG,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,KAAK,CAAC,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wGAAwG;IACxG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uBAAuB;AACvB,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,kBAAkB;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;IACV,qEAAqE;IACrE,CAAC,EAAE,MAAM,CAAC;CACX;AAED,kFAAkF;AAClF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE;AACpB,wCAAwC;GACtC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChC,mGAAmG;GACjG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"decision.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/decision.types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  {
2
- "commit": "0bc34b77f8e13dd7c4e26c66ce59292e80a860a9",
3
- "builtAt": "2026-10-08T22:14:55.024Z"
2
+ "commit": "7252102d4707b912ca056a308745eef17ec604f7",
3
+ "builtAt": "2026-10-09T00:19:39.504Z"
4
4
  }
@@ -7470,4 +7470,89 @@ export declare const OWNER_THREAD_SENTINEL_CONSTANTS: {
7470
7470
  /** A card goes into an owner thread only when that thread was active this recently */
7471
7471
  readonly CARD_THREAD_MAX_AGE_MS: number;
7472
7472
  };
7473
+ /**
7474
+ * Drive mode briefing (specs/2026-10-08-drive-mode.md): the owner's queue of
7475
+ * things waiting on them, read out one at a time by the voice briefer.
7476
+ */
7477
+ export declare const BRIEFING_CONSTANTS: {
7478
+ /** Per-machine state file under CREWLY_HOME (snoozes, passes, pending lookups) */
7479
+ readonly STATE_FILENAME: "briefing-state.json";
7480
+ /** "Next" / skip hides an item for this long without settling it (ms) */
7481
+ readonly SKIP_HIDE_MS: number;
7482
+ /** "Later" with no time: tomorrow at this local hour */
7483
+ readonly LATER_DEFAULT_HOUR_LOCAL: 9;
7484
+ /** Longest snooze accepted (ms) */
7485
+ readonly LATER_MAX_MS: number;
7486
+ /** A decision whose deadline is this close counts as urgent (ms) */
7487
+ readonly URGENT_DEADLINE_MS: number;
7488
+ /** A ticket that silence accepts this soon counts as normal instead of low (ms) */
7489
+ readonly REVIEW_SOON_MS: number;
7490
+ /** A pending lookup older than this is given up and the item comes back (ms) */
7491
+ readonly LOOKUP_GIVE_UP_MS: number;
7492
+ /** Spoken summary: longest length (characters) */
7493
+ readonly SUMMARY_MAX_CHARS: 220;
7494
+ /** Details: longest length (characters) */
7495
+ readonly DETAILS_MAX_CHARS: 2400;
7496
+ /** An agent's lookup answer: longest length handed to the briefer (characters) */
7497
+ readonly LOOKUP_ANSWER_MAX_CHARS: 1500;
7498
+ /** Owner answer / question: longest length accepted (characters) */
7499
+ readonly TEXT_MAX_CHARS: 2000;
7500
+ /** Items listed at most */
7501
+ readonly MAX_ITEMS: 50;
7502
+ /** A confirmation token stays valid this long (ms) */
7503
+ readonly CONFIRM_TTL_MS: number;
7504
+ /** Agent timeline messages looked at for a lookup answer */
7505
+ readonly LOOKUP_SCAN_LIMIT: 30;
7506
+ /** Words in a title / question that make an item sensitive (spoken confirmation required) */
7507
+ readonly SENSITIVE_PATTERN: RegExp;
7508
+ /** Decision sensitivities that always need a spoken confirmation */
7509
+ readonly SENSITIVE_DECISION_KINDS: readonly ["email", "publish", "deploy", "spend", "browser_action", "app_access"];
7510
+ /** Error codes returned to the page / the voice model */
7511
+ readonly CODES: {
7512
+ readonly OWNER_ONLY: "owner_only";
7513
+ readonly NOT_FOUND: "not_found";
7514
+ readonly NOT_READY: "not_ready";
7515
+ readonly INVALID: "invalid";
7516
+ readonly CONFIRM_MISMATCH: "confirm_mismatch";
7517
+ readonly FAILED: "failed";
7518
+ };
7519
+ };
7520
+ /**
7521
+ * Drive mode voice layer: Gemini Live ephemeral tokens minted on this
7522
+ * machine with its Gemini API key (specs/2026-10-08-drive-mode.md §3).
7523
+ */
7524
+ export declare const TALK_LIVE_CONSTANTS: {
7525
+ /** Live model (stable, low latency, native audio). Override: CREWLY_GEMINI_LIVE_MODEL */
7526
+ readonly DEFAULT_MODEL: "gemini-3.8-live";
7527
+ readonly MODEL_ENV: "CREWLY_GEMINI_LIVE_MODEL";
7528
+ /** API version ephemeral tokens work on (the SDK uses v1alpha). Override: CREWLY_GEMINI_LIVE_API_VERSION */
7529
+ readonly DEFAULT_API_VERSION: "v1alpha";
7530
+ readonly API_VERSION_ENV: "CREWLY_GEMINI_LIVE_API_VERSION";
7531
+ /** Gemini API base */
7532
+ readonly API_BASE: "https://generativelanguage.googleapis.com";
7533
+ /** Live WebSocket base (the page appends `/ws/google.ai.generativelanguage.<v>.GenerativeService.BidiGenerateContentConstrained`) */
7534
+ readonly WS_BASE: "wss://generativelanguage.googleapis.com";
7535
+ /** Env fallback when no key is stored for Antigravity */
7536
+ readonly API_KEY_ENV: "GEMINI_API_KEY";
7537
+ /** The token opens one session within this window (ms) */
7538
+ readonly NEW_SESSION_WINDOW_MS: number;
7539
+ /** The session may run this long on one token (ms) */
7540
+ readonly TOKEN_TTL_MS: number;
7541
+ /** Sessions one token may open */
7542
+ readonly TOKEN_USES: 1;
7543
+ /** Google's answer deadline (ms) */
7544
+ readonly REQUEST_TIMEOUT_MS: 15000;
7545
+ /** Gemini prebuilt voice the briefer speaks with (multilingual) */
7546
+ readonly VOICE: "Aoede";
7547
+ /** Languages the briefer starts in */
7548
+ readonly LANGUAGES: readonly ["zh", "en", "es"];
7549
+ readonly DEFAULT_LANGUAGE: "zh";
7550
+ readonly CODES: {
7551
+ readonly OWNER_ONLY: "owner_only";
7552
+ readonly NO_KEY: "no_gemini_key";
7553
+ readonly GOOGLE_REJECTED: "google_rejected";
7554
+ readonly UNREACHABLE: "unreachable";
7555
+ readonly FAILED: "failed";
7556
+ };
7557
+ };
7473
7558
  //# sourceMappingURL=constants.d.ts.map