crewly 1.20.277 → 1.20.279
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/skills/agent/core/reply/SKILL.md +2 -0
- package/config/skills/agent/core/reply/execute.sh +15 -1
- package/config/skills/agent/core/reply/execute.test.sh +7 -0
- package/dist/backend/backend/src/constants.d.ts +64 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +64 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts +9 -0
- 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 +23 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +121 -3
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/briefing/briefing-cards.d.ts +99 -0
- package/dist/backend/backend/src/services/briefing/briefing-cards.d.ts.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing-cards.js +156 -0
- package/dist/backend/backend/src/services/briefing/briefing-cards.js.map +1 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts +8 -0
- package/dist/backend/backend/src/services/briefing/briefing.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/briefing/briefing.service.js +31 -9
- package/dist/backend/backend/src/services/briefing/briefing.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +33 -1
- 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 +33 -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 +21 -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 +37 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-talk-inbound.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-talk-inbound.service.js +4 -0
- package/dist/backend/backend/src/services/cloud/cloud-talk-inbound.service.js.map +1 -1
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts +228 -0
- package/dist/backend/backend/src/services/drive/drive-agent.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-agent.service.js +412 -0
- package/dist/backend/backend/src/services/drive/drive-agent.service.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts +92 -0
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js +113 -0
- package/dist/backend/backend/src/services/drive/drive-cloud.contract.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-conversation.store.d.ts +86 -0
- package/dist/backend/backend/src/services/drive/drive-conversation.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-conversation.store.js +102 -0
- package/dist/backend/backend/src/services/drive/drive-conversation.store.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-recall.d.ts +65 -0
- package/dist/backend/backend/src/services/drive/drive-recall.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-recall.js +91 -0
- package/dist/backend/backend/src/services/drive/drive-recall.js.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-row.utils.d.ts +19 -0
- package/dist/backend/backend/src/services/drive/drive-row.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/drive/drive-row.utils.js +20 -0
- package/dist/backend/backend/src/services/drive/drive-row.utils.js.map +1 -0
- package/dist/backend/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/open-items/open-items.service.js +14 -2
- package/dist/backend/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js +4 -0
- package/dist/backend/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +2 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- 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 +7 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts +23 -7
- package/dist/backend/backend/src/services/talk/talk-live-token.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/talk/talk-live-token.service.js +80 -40
- package/dist/backend/backend/src/services/talk/talk-live-token.service.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +64 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +64 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +33 -1
- 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 +33 -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 +21 -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 +37 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/drive/drive-row.utils.d.ts +19 -0
- package/dist/cli/backend/src/services/drive/drive-row.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/drive/drive-row.utils.js +20 -0
- package/dist/cli/backend/src/services/drive/drive-row.utils.js.map +1 -0
- package/dist/cli/backend/src/services/open-items/open-items.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/open-items/open-items.service.js +14 -2
- package/dist/cli/backend/src/services/open-items/open-items.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js +4 -0
- package/dist/cli/backend/src/services/slack/slack-agent-dm.service.js.map +1 -1
- 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 +7 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Drive mode voice: Gemini Live ephemeral tokens (specs/2026-10-08-drive-mode.md §3).
|
|
3
3
|
*
|
|
4
|
+
* This is the machine-hosted FALLBACK: the portal starts Drive mode on Crewly
|
|
5
|
+
* Cloud (`POST /api/cloud/talk/session`, Cloud-held key, §7). The setup here
|
|
6
|
+
* is the same voice orchestrator, with the same tools and VAD.
|
|
7
|
+
*
|
|
4
8
|
* The phone talks to Gemini Live directly (realtime audio, barge-in), but it
|
|
5
9
|
* must never see this machine's Gemini API key. So the machine mints a
|
|
6
10
|
* short-lived token (`POST /v1alpha/auth_tokens`) that:
|
|
7
11
|
*
|
|
8
12
|
* - opens ONE session within a minute and lasts at most 30 minutes;
|
|
9
13
|
* - is locked to the briefer's setup — model, audio output, voice, the
|
|
10
|
-
* system instruction and
|
|
14
|
+
* system instruction, the tools and voice activity detection — so a page holding it cannot
|
|
11
15
|
* turn it into a general-purpose Gemini session.
|
|
12
16
|
*
|
|
13
17
|
* The key comes from the Antigravity credential Crewly already stores
|
|
@@ -54,6 +58,16 @@ export interface LiveSetup {
|
|
|
54
58
|
tools: Array<{
|
|
55
59
|
functionDeclarations: LiveFunctionDeclaration[];
|
|
56
60
|
}>;
|
|
61
|
+
/** Voice activity detection: how easily the owner's voice starts / ends a turn */
|
|
62
|
+
realtimeInputConfig: {
|
|
63
|
+
automaticActivityDetection: {
|
|
64
|
+
startOfSpeechSensitivity: string;
|
|
65
|
+
endOfSpeechSensitivity: string;
|
|
66
|
+
prefixPaddingMs: number;
|
|
67
|
+
silenceDurationMs: number;
|
|
68
|
+
};
|
|
69
|
+
activityHandling: string;
|
|
70
|
+
};
|
|
57
71
|
inputAudioTranscription: Record<string, never>;
|
|
58
72
|
outputAudioTranscription: Record<string, never>;
|
|
59
73
|
}
|
|
@@ -94,23 +108,25 @@ export interface TalkLiveTokenDeps {
|
|
|
94
108
|
logger?: ComponentLogger;
|
|
95
109
|
}
|
|
96
110
|
/**
|
|
97
|
-
* The
|
|
98
|
-
*
|
|
111
|
+
* The tools the voice orchestrator may call. The page carries each call to
|
|
112
|
+
* Crewly Cloud (`/api/cloud/talk/session/…`); waiting items come from the
|
|
113
|
+
* owner's machine (`/api/briefing`).
|
|
99
114
|
*
|
|
100
115
|
* @returns Function declarations
|
|
101
116
|
*/
|
|
102
|
-
export declare function
|
|
117
|
+
export declare function driveToolDeclarations(): LiveFunctionDeclaration[];
|
|
103
118
|
/**
|
|
104
|
-
* The
|
|
119
|
+
* The voice orchestrator's system instruction.
|
|
105
120
|
*
|
|
106
121
|
* @param language - Language to start in
|
|
107
122
|
* @returns Instruction text
|
|
108
123
|
*/
|
|
109
|
-
export declare function
|
|
124
|
+
export declare function driveSystemInstruction(language: LiveLanguage): string;
|
|
110
125
|
/**
|
|
111
126
|
* Field mask over a setup, the way the Gemini SDK builds it
|
|
112
127
|
* (`tokens.create` with `lockAdditionalFields: []`): every top-level field
|
|
113
|
-
* and, for an object, each of its keys
|
|
128
|
+
* and, for an object, each of its keys — except the fields in
|
|
129
|
+
* {@link TALK_LIVE_CONSTANTS.FIELD_MASK_WHOLE}, masked by their top-level key.
|
|
114
130
|
*
|
|
115
131
|
* @param setup - The setup
|
|
116
132
|
* @returns Comma-separated field paths
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"talk-live-token.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/talk/talk-live-token.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"talk-live-token.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/talk/talk-live-token.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Drive mode voice: Gemini Live ephemeral tokens (specs/2026-10-08-drive-mode.md §3).
|
|
3
3
|
*
|
|
4
|
+
* This is the machine-hosted FALLBACK: the portal starts Drive mode on Crewly
|
|
5
|
+
* Cloud (`POST /api/cloud/talk/session`, Cloud-held key, §7). The setup here
|
|
6
|
+
* is the same voice orchestrator, with the same tools and VAD.
|
|
7
|
+
*
|
|
4
8
|
* The phone talks to Gemini Live directly (realtime audio, barge-in), but it
|
|
5
9
|
* must never see this machine's Gemini API key. So the machine mints a
|
|
6
10
|
* short-lived token (`POST /v1alpha/auth_tokens`) that:
|
|
7
11
|
*
|
|
8
12
|
* - opens ONE session within a minute and lasts at most 30 minutes;
|
|
9
13
|
* - is locked to the briefer's setup — model, audio output, voice, the
|
|
10
|
-
* system instruction and
|
|
14
|
+
* system instruction, the tools and voice activity detection — so a page holding it cannot
|
|
11
15
|
* turn it into a general-purpose Gemini session.
|
|
12
16
|
*
|
|
13
17
|
* The key comes from the Antigravity credential Crewly already stores
|
|
@@ -37,27 +41,58 @@ export class TalkLiveTokenError extends Error {
|
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
43
|
/**
|
|
40
|
-
* The
|
|
41
|
-
*
|
|
44
|
+
* The tools the voice orchestrator may call. The page carries each call to
|
|
45
|
+
* Crewly Cloud (`/api/cloud/talk/session/…`); waiting items come from the
|
|
46
|
+
* owner's machine (`/api/briefing`).
|
|
42
47
|
*
|
|
43
48
|
* @returns Function declarations
|
|
44
49
|
*/
|
|
45
|
-
export function
|
|
46
|
-
const itemId = { type: 'STRING', description: 'The item id from
|
|
50
|
+
export function driveToolDeclarations() {
|
|
51
|
+
const itemId = { type: 'STRING', description: 'The item id from get_waiting_item.' };
|
|
52
|
+
const target = { type: 'STRING', description: 'Who: an agent name ("Ella"), a team ("CE team") or a channel ("#daily-info") — or a target id from list_targets.' };
|
|
47
53
|
return [
|
|
48
54
|
{
|
|
49
|
-
name: '
|
|
50
|
-
description: '
|
|
55
|
+
name: 'list_targets',
|
|
56
|
+
description: 'Everyone the owner can talk to: agents (with team and machine), teams (answered by their lead) and Crewly channels. Use it when you are not sure who the owner means.',
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'send_to',
|
|
60
|
+
description: "Send the owner's words to an agent, a team or a channel, on any of the owner's machines. Returns at once (status sent) — the answer comes later through check_replies or as a message you are given. If it returns ambiguous, ask the owner which one of the candidates and call again with its id. If it returns offline, tell the owner that machine is offline and the message waits.",
|
|
61
|
+
parameters: {
|
|
62
|
+
type: 'OBJECT',
|
|
63
|
+
properties: {
|
|
64
|
+
target,
|
|
65
|
+
text: { type: 'STRING', description: "The owner's own words for them, in the owner's language, as said (no paraphrase)." },
|
|
66
|
+
},
|
|
67
|
+
required: ['target', 'text'],
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'check_replies',
|
|
72
|
+
description: 'New replies from agents since you last checked, and who is still working. Use it when the owner asks "did Ella answer?" or after a while of silence.',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'recall',
|
|
76
|
+
description: 'What an agent recently sent the owner (their DMs and threads, last few days), best match to a hint first. Use it for "what did Ella send me about X? say it again".',
|
|
77
|
+
parameters: {
|
|
78
|
+
type: 'OBJECT',
|
|
79
|
+
properties: { target, hint: { type: 'STRING', description: 'What it was about, in the owner\'s words (optional).' } },
|
|
80
|
+
required: ['target'],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'get_waiting_item',
|
|
85
|
+
description: 'Only when the owner asks ("anything waiting for me?", "有什么要我处理的?"): the next decision card or finished work waiting for them. Returns empty:true when nothing is waiting. Never call it on your own.',
|
|
51
86
|
},
|
|
52
87
|
{
|
|
53
88
|
name: 'answer_item',
|
|
54
|
-
description: "
|
|
89
|
+
description: "Answer a waiting item: an option_key from its options, and/or the owner's words as text. For finished work use option_key accept, or send_back with text saying what to fix. If it returns needs_confirmation, read confirmQuestion and only after a clear yes call again with the same answer, confirm=true and the confirm_token.",
|
|
55
90
|
parameters: {
|
|
56
91
|
type: 'OBJECT',
|
|
57
92
|
properties: {
|
|
58
93
|
item_id: itemId,
|
|
59
94
|
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,
|
|
95
|
+
text: { type: 'STRING', description: "The owner's own words, as said (no paraphrase)." },
|
|
61
96
|
confirm: { type: 'BOOLEAN', description: 'true only on the second call, after the owner confirmed out loud.' },
|
|
62
97
|
confirm_token: { type: 'STRING', description: 'The token from the needs_confirmation result.' },
|
|
63
98
|
},
|
|
@@ -66,16 +101,12 @@ export function briefingToolDeclarations() {
|
|
|
66
101
|
},
|
|
67
102
|
{
|
|
68
103
|
name: 'skip_item',
|
|
69
|
-
description: 'The owner says next / skip
|
|
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
|
-
},
|
|
104
|
+
description: 'The owner says next / skip about a waiting item: it comes back in a few hours.',
|
|
105
|
+
parameters: { type: 'OBJECT', properties: { item_id: itemId }, required: ['item_id'] },
|
|
75
106
|
},
|
|
76
107
|
{
|
|
77
108
|
name: 'later_item',
|
|
78
|
-
description: 'The owner says later / remind me
|
|
109
|
+
description: 'The owner says later / remind me about a waiting item: it comes back at a time (ISO 8601 with offset), or tomorrow morning.',
|
|
79
110
|
parameters: {
|
|
80
111
|
type: 'OBJECT',
|
|
81
112
|
properties: { item_id: itemId, at: { type: 'STRING', description: 'When to bring it back (ISO 8601), optional.' } },
|
|
@@ -83,52 +114,52 @@ export function briefingToolDeclarations() {
|
|
|
83
114
|
},
|
|
84
115
|
},
|
|
85
116
|
{
|
|
86
|
-
name: '
|
|
87
|
-
description:
|
|
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
|
-
},
|
|
117
|
+
name: 'end_session',
|
|
118
|
+
description: 'The owner says end / 结束 / that is all: every agent posts one recap where its conversation belongs, and the owner gets a summary in Slack. Say goodbye in one sentence after it.',
|
|
93
119
|
},
|
|
94
120
|
];
|
|
95
121
|
}
|
|
96
122
|
/** Spoken name of each starting language. */
|
|
97
123
|
const LANGUAGE_NAMES = { zh: 'Mandarin Chinese', en: 'English', es: 'Spanish' };
|
|
98
124
|
/**
|
|
99
|
-
* The
|
|
125
|
+
* The voice orchestrator's system instruction.
|
|
100
126
|
*
|
|
101
127
|
* @param language - Language to start in
|
|
102
128
|
* @returns Instruction text
|
|
103
129
|
*/
|
|
104
|
-
export function
|
|
130
|
+
export function driveSystemInstruction(language) {
|
|
105
131
|
return [
|
|
106
|
-
"You are Crewly's voice
|
|
132
|
+
"You are Crewly's voice orchestrator. The owner talks to their agents through you, on a phone, often while driving: they cannot look at the screen.",
|
|
107
133
|
`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
|
|
109
|
-
'Start
|
|
110
|
-
'
|
|
111
|
-
'
|
|
112
|
-
'
|
|
113
|
-
'
|
|
114
|
-
'
|
|
115
|
-
|
|
116
|
-
'
|
|
117
|
-
'
|
|
134
|
+
'Be brief: one or two short sentences, natural spoken language, no lists. Never read URLs, ids, file paths or ticket numbers aloud.',
|
|
135
|
+
'Start with one short greeting and listen. Do not read anything out on your own.',
|
|
136
|
+
'Route the owner\'s words: "tell Ella …", "ask the CE team …", "in #daily-info, …" → send_to with the owner\'s own words (never paraphrase or add your own). If it is unclear who is meant, ask, or call list_targets; if send_to says ambiguous, ask which one.',
|
|
137
|
+
'send_to returns at once: say who has it in a few words ("Sent, Ella is on it.") and keep talking with the owner — they can start another conversation while waiting.',
|
|
138
|
+
'Replies arrive as messages "[reply] <name>: …" between turns, or from check_replies. Relay them faithfully and briefly, saying who it is from; never invent or embellish. If someone is still working, say so when asked.',
|
|
139
|
+
'Follow-ups go to the same person: "tell her …" means the agent of the last reply, unless the owner names someone else.',
|
|
140
|
+
'"what did Ella send me about X? say it again" → recall, then read the best match briefly; the owner can then continue with send_to.',
|
|
141
|
+
'Only when the owner asks ("anything waiting for me?") → get_waiting_item, then answer_item / skip_item / later_item as they say. Sensitive answers return 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.',
|
|
142
|
+
'repeat / 再说一遍 → repeat the last thing. pause / 暂停 → say one word and stay silent until the owner speaks.',
|
|
143
|
+
'end / 结束 / that is all → end_session, then one goodbye sentence.',
|
|
144
|
+
'If a tool fails, say so in one sentence and offer to try again.',
|
|
118
145
|
].join('\n');
|
|
119
146
|
}
|
|
120
147
|
/**
|
|
121
148
|
* Field mask over a setup, the way the Gemini SDK builds it
|
|
122
149
|
* (`tokens.create` with `lockAdditionalFields: []`): every top-level field
|
|
123
|
-
* and, for an object, each of its keys
|
|
150
|
+
* and, for an object, each of its keys — except the fields in
|
|
151
|
+
* {@link TALK_LIVE_CONSTANTS.FIELD_MASK_WHOLE}, masked by their top-level key.
|
|
124
152
|
*
|
|
125
153
|
* @param setup - The setup
|
|
126
154
|
* @returns Comma-separated field paths
|
|
127
155
|
*/
|
|
128
156
|
export function setupFieldMask(setup) {
|
|
157
|
+
const whole = new Set(C.FIELD_MASK_WHOLE);
|
|
129
158
|
const fields = [];
|
|
130
159
|
for (const [key, value] of Object.entries(setup)) {
|
|
131
|
-
|
|
160
|
+
// An array (tools) is masked as a whole: Google rejects `tools.0`
|
|
161
|
+
// ("field_mask is invalid for BidiGenerateContentSetup", 2026-10-08).
|
|
162
|
+
if (!whole.has(key) && value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).length > 0) {
|
|
132
163
|
fields.push(...Object.keys(value).map((k) => `${key}.${k}`));
|
|
133
164
|
}
|
|
134
165
|
else {
|
|
@@ -191,8 +222,17 @@ export class TalkLiveTokenService {
|
|
|
191
222
|
responseModalities: ['AUDIO'],
|
|
192
223
|
speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: C.VOICE } } },
|
|
193
224
|
},
|
|
194
|
-
systemInstruction: { parts: [{ text:
|
|
195
|
-
tools: [{ functionDeclarations:
|
|
225
|
+
systemInstruction: { parts: [{ text: driveSystemInstruction(language) }] },
|
|
226
|
+
tools: [{ functionDeclarations: driveToolDeclarations() }],
|
|
227
|
+
realtimeInputConfig: {
|
|
228
|
+
automaticActivityDetection: {
|
|
229
|
+
startOfSpeechSensitivity: C.VAD.START_OF_SPEECH_SENSITIVITY,
|
|
230
|
+
endOfSpeechSensitivity: C.VAD.END_OF_SPEECH_SENSITIVITY,
|
|
231
|
+
prefixPaddingMs: C.VAD.PREFIX_PADDING_MS,
|
|
232
|
+
silenceDurationMs: C.VAD.SILENCE_DURATION_MS,
|
|
233
|
+
},
|
|
234
|
+
activityHandling: C.VAD.ACTIVITY_HANDLING,
|
|
235
|
+
},
|
|
196
236
|
inputAudioTranscription: {},
|
|
197
237
|
outputAudioTranscription: {},
|
|
198
238
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"talk-live-token.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/talk/talk-live-token.service.ts"],"names":[],"mappings":"AAAA
|
|
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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"}
|
|
@@ -7503,6 +7503,12 @@ export declare const BRIEFING_CONSTANTS: {
|
|
|
7503
7503
|
readonly CONFIRM_TTL_MS: number;
|
|
7504
7504
|
/** Agent timeline messages looked at for a lookup answer */
|
|
7505
7505
|
readonly LOOKUP_SCAN_LIMIT: 30;
|
|
7506
|
+
/** An open card this long past its deadline is stale, not read out (ms) */
|
|
7507
|
+
readonly CARD_STALE_AFTER_DEADLINE_MS: number;
|
|
7508
|
+
/** A card (or reply question) asked longer ago than this is stale, not read out (ms) */
|
|
7509
|
+
readonly CARD_MAX_AGE_MS: number;
|
|
7510
|
+
/** Two cards from one asker whose questions are at least this similar (0–1, character bigrams) are duplicates */
|
|
7511
|
+
readonly CARD_DUPLICATE_SIMILARITY: 0.6;
|
|
7506
7512
|
/** Words in a title / question that make an item sensitive (spoken confirmation required) */
|
|
7507
7513
|
readonly SENSITIVE_PATTERN: RegExp;
|
|
7508
7514
|
/** Decision sensitivities that always need a spoken confirmation */
|
|
@@ -7517,6 +7523,42 @@ export declare const BRIEFING_CONSTANTS: {
|
|
|
7517
7523
|
readonly FAILED: "failed";
|
|
7518
7524
|
};
|
|
7519
7525
|
};
|
|
7526
|
+
/**
|
|
7527
|
+
* Drive mode, the machine side (specs/2026-10-08-drive-mode.md §7). Crewly
|
|
7528
|
+
* Cloud hosts the session; this machine delivers the owner's words to its
|
|
7529
|
+
* agents, carries their `reply --drive` answers to Cloud, reads back an
|
|
7530
|
+
* agent's recent messages (recall) and has each agent post its recap.
|
|
7531
|
+
*/
|
|
7532
|
+
export declare const DRIVE_CONSTANTS: {
|
|
7533
|
+
/** Per-machine file under CREWLY_HOME: this machine's Drive mode conversations */
|
|
7534
|
+
readonly STATE_FILENAME: "drive-conversations.json";
|
|
7535
|
+
/** Capability advertised to Cloud while the handler runs */
|
|
7536
|
+
readonly CAPABILITY: "drive_message";
|
|
7537
|
+
/** Relay message type Cloud reuses for Drive mode (told apart by `kind`) */
|
|
7538
|
+
readonly RELAY_MESSAGE_TYPE: "talk_message";
|
|
7539
|
+
readonly RELAY_KIND: "drive";
|
|
7540
|
+
/** Cloud routes (under `/api/cloud/talk/session/:id`) */
|
|
7541
|
+
readonly CLOUD_BASE_PATH: "/api/cloud/talk/session";
|
|
7542
|
+
/** A session id Cloud makes */
|
|
7543
|
+
readonly SESSION_ID_PATTERN: RegExp;
|
|
7544
|
+
/** Local conversations are forgotten this long after they started (ms) */
|
|
7545
|
+
readonly KEEP_MS: number;
|
|
7546
|
+
/** Agent reply: longest length sent (characters) */
|
|
7547
|
+
readonly TEXT_MAX_CHARS: 4000;
|
|
7548
|
+
/** Recall: how far back an agent's messages to the owner are read (ms) */
|
|
7549
|
+
readonly RECALL_WINDOW_MS: number;
|
|
7550
|
+
/** Recall: messages returned at most */
|
|
7551
|
+
readonly RECALL_MAX: 4;
|
|
7552
|
+
/** Recall: one message, longest length (characters) */
|
|
7553
|
+
readonly RECALL_MESSAGE_MAX_CHARS: 900;
|
|
7554
|
+
/** Recall: messages scanned at most */
|
|
7555
|
+
readonly RECALL_SCAN_LIMIT: 3000;
|
|
7556
|
+
/** Cloud calls: timeout and retries */
|
|
7557
|
+
readonly REQUEST_TIMEOUT_MS: 10000;
|
|
7558
|
+
readonly FETCH_RETRIES: 3;
|
|
7559
|
+
/** Metadata `via` on every chat-v2 row Drive mode writes (the Slack mirrors skip them) */
|
|
7560
|
+
readonly VIA: "drive-mode";
|
|
7561
|
+
};
|
|
7520
7562
|
/**
|
|
7521
7563
|
* Drive mode voice layer: Gemini Live ephemeral tokens minted on this
|
|
7522
7564
|
* machine with its Gemini API key (specs/2026-10-08-drive-mode.md §3).
|
|
@@ -7542,6 +7584,28 @@ export declare const TALK_LIVE_CONSTANTS: {
|
|
|
7542
7584
|
readonly TOKEN_USES: 1;
|
|
7543
7585
|
/** Google's answer deadline (ms) */
|
|
7544
7586
|
readonly REQUEST_TIMEOUT_MS: 15000;
|
|
7587
|
+
/**
|
|
7588
|
+
* Gemini Live voice activity detection, locked into the token's setup
|
|
7589
|
+
* (`realtimeInputConfig.automaticActivityDetection`). LOW start
|
|
7590
|
+
* sensitivity: a cough, a click or road noise does not count as the owner
|
|
7591
|
+
* starting to speak, so it no longer cuts the voice off. LOW end
|
|
7592
|
+
* sensitivity + 800 ms of silence: a short pause mid-sentence does not end
|
|
7593
|
+
* the owner's turn. 300 ms of padding keeps the first syllable.
|
|
7594
|
+
*/
|
|
7595
|
+
readonly VAD: {
|
|
7596
|
+
readonly START_OF_SPEECH_SENSITIVITY: "START_SENSITIVITY_LOW";
|
|
7597
|
+
readonly END_OF_SPEECH_SENSITIVITY: "END_SENSITIVITY_LOW";
|
|
7598
|
+
readonly PREFIX_PADDING_MS: 300;
|
|
7599
|
+
readonly SILENCE_DURATION_MS: 800;
|
|
7600
|
+
/** Speech over the voice interrupts it (barge-in stays on) */
|
|
7601
|
+
readonly ACTIVITY_HANDLING: "START_OF_ACTIVITY_INTERRUPTS";
|
|
7602
|
+
};
|
|
7603
|
+
/**
|
|
7604
|
+
* Setup fields locked as a whole in the token's field mask. Google
|
|
7605
|
+
* refuses a mask path into an array (`tools.0`) — and a nested object is
|
|
7606
|
+
* masked by its top-level key too (`realtimeInputConfig`).
|
|
7607
|
+
*/
|
|
7608
|
+
readonly FIELD_MASK_WHOLE: readonly ["tools", "realtimeInputConfig"];
|
|
7545
7609
|
/** Gemini prebuilt voice the briefer speaks with (multilingual) */
|
|
7546
7610
|
readonly VOICE: "Aoede";
|
|
7547
7611
|
/** Languages the briefer starts in */
|