@livx.cc/agentx 0.99.113 → 0.99.115
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/cli.d.ts +3 -1
- package/dist/cli.js +83 -23
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.js +61 -13
- package/dist/index.js.map +1 -1
- package/dist/{secondChannel-CJMY5EbL.d.ts → secondChannel-BCEr_QyM.d.ts} +31 -27
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as AgentOptions, H as Hooks, p as RunResult, f as Decider, A as Agent, i as PermissionPolicy, L as LineKind, C as ChannelMode, q as SecondChannelOptions, S as SecondChannel } from './secondChannel-
|
|
2
|
-
export { b as ChatFragment, c as Classification, d as Classifier, e as CompactResult, D as DEFAULT_MUTATING, g as Decision, M as ModelRouter, h as ModelRouterOptions, P as PermissionOptions, j as PermissionRule, k as PreToolUseDecision, R as ReasoningEffort, l as RecordingHooks, m as RecordingLifecycle, n as RouteDecision, o as RouterState, T as Tier, r as ToolUse, s as ToolUseMeta, t as claudeCodeDisallowedTools, u as composeHooks, v as estimateTokens, w as jevAvailable, x as jevClassifier, y as pickTier, z as planMode, B as reasoningToChatFragment } from './secondChannel-
|
|
1
|
+
import { a as AgentOptions, H as Hooks, p as RunResult, f as Decider, A as Agent, i as PermissionPolicy, G as Gender, L as LineKind, C as ChannelMode, q as SecondChannelOptions, S as SecondChannel } from './secondChannel-BCEr_QyM.js';
|
|
2
|
+
export { b as ChatFragment, c as Classification, d as Classifier, e as CompactResult, D as DEFAULT_MUTATING, g as Decision, M as ModelRouter, h as ModelRouterOptions, P as PermissionOptions, j as PermissionRule, k as PreToolUseDecision, R as ReasoningEffort, l as RecordingHooks, m as RecordingLifecycle, n as RouteDecision, o as RouterState, T as Tier, r as ToolUse, s as ToolUseMeta, t as claudeCodeDisallowedTools, u as composeHooks, v as estimateTokens, w as jevAvailable, x as jevClassifier, y as pickTier, z as planMode, B as reasoningToChatFragment } from './secondChannel-BCEr_QyM.js';
|
|
3
3
|
export { MODEL_ALIASES, ModelSwitch, ResolveModelSwitchOpts, latestClaude, modelShortLabel, resolveModelAlias, resolveModelSwitch } from './models.js';
|
|
4
4
|
import { IFilesystem, FileMetadata } from '@livx.cc/wcli/core';
|
|
5
5
|
export { CommandExecutor, FileMetadata, IFilesystem, IndexedDbFilesystem, MemFilesystem, registerHeadlessCommands } from '@livx.cc/wcli/core';
|
|
@@ -1621,11 +1621,14 @@ declare function makeTaskBatchTool(opts: TaskToolOptions): AgentTool;
|
|
|
1621
1621
|
/** Component-scoped logger (libx.js). debug/verbose gated via DEBUG env/localStorage. */
|
|
1622
1622
|
declare const forComponent: (name: string) => libx_js_src_modules_log.ComponentLogger;
|
|
1623
1623
|
|
|
1624
|
-
type Topic = 'board' | 'search' | '
|
|
1625
|
-
/** Two phrasings per topic and language (never the same line twice in a call).
|
|
1624
|
+
type Topic = 'board' | 'websearch' | 'page' | 'browser' | 'search' | 'mail' | 'calendar' | 'memory' | 'write' | 'run' | 'read' | 'delegate';
|
|
1625
|
+
/** Two phrasings per topic and language (never the same line twice in a call). Hebrew is gendered on the speaker:
|
|
1626
|
+
* 'he-f' / 'he-m' follow the voice (ProgressOptions.gender); 'he' (plural present) when the gender is unknown. */
|
|
1626
1627
|
declare const PROGRESS_TEMPLATES: Record<string, Record<Topic, string[]>>;
|
|
1627
1628
|
declare class ProgressOptions {
|
|
1628
1629
|
templates: Record<string, Partial<Record<Topic, string[]>>>;
|
|
1630
|
+
/** The voice's gender: picks the gendered table (`${lang}-f`/`-m`) when one exists. */
|
|
1631
|
+
gender: Gender;
|
|
1629
1632
|
/** Fast-model fallback for a tool with no template (fastProgressGenerator). Absent → silence. */
|
|
1630
1633
|
generate?: (tool: string, hint: string, lang: string, signal: AbortSignal) => Promise<string>;
|
|
1631
1634
|
generateBudgetMs: number;
|
|
@@ -1695,6 +1698,8 @@ declare class VoiceCallOptions {
|
|
|
1695
1698
|
bankCacheDir?: string;
|
|
1696
1699
|
/** The host STT's language (BCP-47) — the starting language; each turn's own words still decide. */
|
|
1697
1700
|
lang?: string;
|
|
1701
|
+
/** The voice's gender: generated fill/progress lines speak of themselves in it (Hebrew templates too). '' = neutral. */
|
|
1702
|
+
gender: Gender;
|
|
1698
1703
|
aec: boolean;
|
|
1699
1704
|
mode: ChannelMode;
|
|
1700
1705
|
gate: Partial<TurnGateOptions>;
|
package/dist/index.js
CHANGED
|
@@ -9804,6 +9804,9 @@ var KIND_HINT = {
|
|
|
9804
9804
|
bridge: `neutral one-moment cues while the answer is prepared (like "let me see\u2026", "one sec\u2026") \u2014 never the start of a statement or opinion ("the thing is", "well actually", "here's the deal")`,
|
|
9805
9805
|
phatic: 'greetings, thanks and yes/no openers a person starts a turn with (like "hi", "thanks", "how are you")'
|
|
9806
9806
|
};
|
|
9807
|
+
function personaHint(gender) {
|
|
9808
|
+
return gender === "female" ? 'You are a woman: when you refer to yourself, use feminine grammatical forms (e.g. Hebrew "\u05D1\u05D5\u05D3\u05E7\u05EA", not "\u05D1\u05D5\u05D3\u05E7").' : gender === "male" ? 'You are a man: when you refer to yourself, use masculine grammatical forms (e.g. Hebrew "\u05D1\u05D5\u05D3\u05E7", not "\u05D1\u05D5\u05D3\u05E7\u05EA").' : 'Your gender is unknown: never refer to yourself in a gendered form (in Hebrew use plural "\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD" or no verb at all, never "\u05D1\u05D5\u05D3\u05E7"/"\u05D1\u05D5\u05D3\u05E7\u05EA").';
|
|
9809
|
+
}
|
|
9807
9810
|
function fastBankGenerator(ai, model, perKind = 12) {
|
|
9808
9811
|
return async (lang, avoid, signal) => {
|
|
9809
9812
|
const name = languageName(lang);
|
|
@@ -12560,14 +12563,19 @@ init_logging();
|
|
|
12560
12563
|
var log26 = forComponent("Progress");
|
|
12561
12564
|
var HE_RESULT_CLAIM = /(?:^|\s)(?:מצאתי|סיימתי|בוצע|הנה|אין)(?=\s|$|[.,!…])/u;
|
|
12562
12565
|
var TOPICS = [
|
|
12566
|
+
[/toolsearch|^mcp__.*__(list_commands|call_info)$/, null],
|
|
12567
|
+
// tool plumbing — no line (and no generated one)
|
|
12563
12568
|
[/kanban|board|card|\bkb\b|list_cards/, "board"],
|
|
12564
12569
|
[/mail|gmail|inbox/, "mail"],
|
|
12565
12570
|
[/calendar|event|schedule/, "calendar"],
|
|
12566
12571
|
[/memory|recall|remember/, "memory"],
|
|
12567
|
-
[/web_?search|
|
|
12572
|
+
[/web_?search|search_web|google/, "websearch"],
|
|
12573
|
+
[/fetch|read_page|get_page|page_text|navigate|url|history/, "page"],
|
|
12574
|
+
[/click|type|press_key|scroll|screenshot|tab|browser|highlight|point|wait_for|upload/, "browser"],
|
|
12568
12575
|
[/grep|glob|search|find|lookup|quicklook/, "search"],
|
|
12576
|
+
[/^(agent|task)$|subagent|delegate/, "delegate"],
|
|
12569
12577
|
[/edit|write|patch|create|update|save|delete|move/, "write"],
|
|
12570
|
-
[/shell|bash|exec|run|command|terminal/, "run"],
|
|
12578
|
+
[/shell|bash|exec|run|command|terminal|eval/, "run"],
|
|
12571
12579
|
[/read|open|view|cat|look|get|list|ls/, "read"]
|
|
12572
12580
|
];
|
|
12573
12581
|
var PROGRESS_TEMPLATES = {
|
|
@@ -12576,27 +12584,62 @@ var PROGRESS_TEMPLATES = {
|
|
|
12576
12584
|
mail: ["checking the mail\u2026", "going through the inbox\u2026"],
|
|
12577
12585
|
calendar: ["checking the calendar\u2026", "looking at the schedule\u2026"],
|
|
12578
12586
|
memory: ["checking my notes\u2026", "looking back\u2026"],
|
|
12579
|
-
|
|
12587
|
+
websearch: ["searching\u2026", "searching the web\u2026"],
|
|
12588
|
+
page: ["reading the page\u2026", "going through the page\u2026"],
|
|
12589
|
+
browser: ["working in the browser\u2026", "on the page now\u2026"],
|
|
12580
12590
|
search: ["searching\u2026", "still looking\u2026"],
|
|
12591
|
+
delegate: ["working on it\u2026", "still on it\u2026"],
|
|
12581
12592
|
write: ["making the change\u2026", "writing it down\u2026"],
|
|
12582
12593
|
run: ["running it\u2026", "still running\u2026"],
|
|
12583
12594
|
read: ["reading it\u2026", "going through it\u2026"]
|
|
12584
12595
|
},
|
|
12585
12596
|
he: {
|
|
12586
|
-
// plural present: gender-neutral for a voice of either gender
|
|
12587
12597
|
board: ["\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05D1\u05DC\u05D5\u05D7\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC\u05D9\u05DD \u05E2\u05DC \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05DD\u2026"],
|
|
12588
12598
|
mail: ["\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05D0\u05EA \u05D4\u05DE\u05D9\u05D9\u05DC\u2026", "\u05E2\u05D5\u05D1\u05E8\u05D9\u05DD \u05E2\u05DC \u05D4\u05D3\u05D5\u05D0\u05E8\u2026"],
|
|
12589
12599
|
calendar: ["\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05D1\u05D9\u05D5\u05DE\u05DF\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC\u05D9\u05DD \u05D1\u05DC\u05D5\u05F4\u05D6\u2026"],
|
|
12590
12600
|
memory: ["\u05D1\u05D5\u05D3\u05E7\u05D9\u05DD \u05D1\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA\u2026", "\u05DE\u05D7\u05E4\u05E9\u05D9\u05DD \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF\u2026"],
|
|
12591
|
-
|
|
12601
|
+
websearch: ["\u05DE\u05D7\u05E4\u05E9\u05D9\u05DD\u2026", "\u05DE\u05D7\u05E4\u05E9\u05D9\u05DD \u05D1\u05E8\u05E9\u05EA\u2026"],
|
|
12602
|
+
page: ["\u05E7\u05D5\u05E8\u05D0\u05D9\u05DD \u05D0\u05EA \u05D4\u05D3\u05E3\u2026", "\u05E2\u05D5\u05D1\u05E8\u05D9\u05DD \u05E2\u05DC \u05D4\u05D3\u05E3\u2026"],
|
|
12603
|
+
browser: ["\u05E2\u05D5\u05D1\u05D3\u05D9\u05DD \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF\u2026", "\u05E2\u05DC \u05D4\u05D3\u05E3 \u05E2\u05DB\u05E9\u05D9\u05D5\u2026"],
|
|
12592
12604
|
search: ["\u05DE\u05D7\u05E4\u05E9\u05D9\u05DD\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05D7\u05E4\u05E9\u05D9\u05DD\u2026"],
|
|
12605
|
+
delegate: ["\u05E2\u05D5\u05D1\u05D3\u05D9\u05DD \u05E2\u05DC \u05D6\u05D4\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E2\u05DC \u05D6\u05D4\u2026"],
|
|
12593
12606
|
write: ["\u05DE\u05D1\u05E6\u05E2\u05D9\u05DD \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u2026", "\u05DB\u05D5\u05EA\u05D1\u05D9\u05DD \u05D0\u05EA \u05D6\u05D4\u2026"],
|
|
12594
12607
|
run: ["\u05DE\u05E8\u05D9\u05E6\u05D9\u05DD\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E8\u05E5\u2026"],
|
|
12595
12608
|
read: ["\u05E7\u05D5\u05E8\u05D0\u05D9\u05DD\u2026", "\u05E2\u05D5\u05D1\u05E8\u05D9\u05DD \u05E2\u05DC \u05D6\u05D4\u2026"]
|
|
12609
|
+
},
|
|
12610
|
+
"he-f": {
|
|
12611
|
+
board: ["\u05D1\u05D5\u05D3\u05E7\u05EA \u05D1\u05DC\u05D5\u05D7\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC\u05EA \u05E2\u05DC \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05DD\u2026"],
|
|
12612
|
+
mail: ["\u05D1\u05D5\u05D3\u05E7\u05EA \u05D0\u05EA \u05D4\u05DE\u05D9\u05D9\u05DC\u2026", "\u05E2\u05D5\u05D1\u05E8\u05EA \u05E2\u05DC \u05D4\u05D3\u05D5\u05D0\u05E8\u2026"],
|
|
12613
|
+
calendar: ["\u05D1\u05D5\u05D3\u05E7\u05EA \u05D1\u05D9\u05D5\u05DE\u05DF\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC\u05EA \u05D1\u05DC\u05D5\u05F4\u05D6\u2026"],
|
|
12614
|
+
memory: ["\u05D1\u05D5\u05D3\u05E7\u05EA \u05D1\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA\u2026", "\u05DE\u05D7\u05E4\u05E9\u05EA \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF\u2026"],
|
|
12615
|
+
websearch: ["\u05DE\u05D7\u05E4\u05E9\u05EA\u2026", "\u05DE\u05D7\u05E4\u05E9\u05EA \u05D1\u05E8\u05E9\u05EA\u2026"],
|
|
12616
|
+
page: ["\u05E7\u05D5\u05E8\u05D0\u05EA \u05D0\u05EA \u05D4\u05D3\u05E3\u2026", "\u05E2\u05D5\u05D1\u05E8\u05EA \u05E2\u05DC \u05D4\u05D3\u05E3\u2026"],
|
|
12617
|
+
browser: ["\u05E2\u05D5\u05D1\u05D3\u05EA \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF\u2026", "\u05E2\u05DC \u05D4\u05D3\u05E3 \u05E2\u05DB\u05E9\u05D9\u05D5\u2026"],
|
|
12618
|
+
search: ["\u05DE\u05D7\u05E4\u05E9\u05EA\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05D7\u05E4\u05E9\u05EA\u2026"],
|
|
12619
|
+
delegate: ["\u05E2\u05D5\u05D1\u05D3\u05EA \u05E2\u05DC \u05D6\u05D4\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E2\u05DC \u05D6\u05D4\u2026"],
|
|
12620
|
+
write: ["\u05DE\u05D1\u05E6\u05E2\u05EA \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u2026", "\u05DB\u05D5\u05EA\u05D1\u05EA \u05D0\u05EA \u05D6\u05D4\u2026"],
|
|
12621
|
+
run: ["\u05DE\u05E8\u05D9\u05E6\u05D4\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E8\u05E5\u2026"],
|
|
12622
|
+
read: ["\u05E7\u05D5\u05E8\u05D0\u05EA\u2026", "\u05E2\u05D5\u05D1\u05E8\u05EA \u05E2\u05DC \u05D6\u05D4\u2026"]
|
|
12623
|
+
},
|
|
12624
|
+
"he-m": {
|
|
12625
|
+
board: ["\u05D1\u05D5\u05D3\u05E7 \u05D1\u05DC\u05D5\u05D7\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC \u05E2\u05DC \u05D4\u05DB\u05E8\u05D8\u05D9\u05E1\u05D9\u05DD\u2026"],
|
|
12626
|
+
mail: ["\u05D1\u05D5\u05D3\u05E7 \u05D0\u05EA \u05D4\u05DE\u05D9\u05D9\u05DC\u2026", "\u05E2\u05D5\u05D1\u05E8 \u05E2\u05DC \u05D4\u05D3\u05D5\u05D0\u05E8\u2026"],
|
|
12627
|
+
calendar: ["\u05D1\u05D5\u05D3\u05E7 \u05D1\u05D9\u05D5\u05DE\u05DF\u2026", "\u05DE\u05E1\u05EA\u05DB\u05DC \u05D1\u05DC\u05D5\u05F4\u05D6\u2026"],
|
|
12628
|
+
memory: ["\u05D1\u05D5\u05D3\u05E7 \u05D1\u05E8\u05E9\u05D9\u05DE\u05D5\u05EA\u2026", "\u05DE\u05D7\u05E4\u05E9 \u05D1\u05D6\u05D9\u05DB\u05E8\u05D5\u05DF\u2026"],
|
|
12629
|
+
websearch: ["\u05DE\u05D7\u05E4\u05E9\u2026", "\u05DE\u05D7\u05E4\u05E9 \u05D1\u05E8\u05E9\u05EA\u2026"],
|
|
12630
|
+
page: ["\u05E7\u05D5\u05E8\u05D0 \u05D0\u05EA \u05D4\u05D3\u05E3\u2026", "\u05E2\u05D5\u05D1\u05E8 \u05E2\u05DC \u05D4\u05D3\u05E3\u2026"],
|
|
12631
|
+
browser: ["\u05E2\u05D5\u05D1\u05D3 \u05D1\u05D3\u05E4\u05D3\u05E4\u05DF\u2026", "\u05E2\u05DC \u05D4\u05D3\u05E3 \u05E2\u05DB\u05E9\u05D9\u05D5\u2026"],
|
|
12632
|
+
search: ["\u05DE\u05D7\u05E4\u05E9\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05DE\u05D7\u05E4\u05E9\u2026"],
|
|
12633
|
+
delegate: ["\u05E2\u05D5\u05D1\u05D3 \u05E2\u05DC \u05D6\u05D4\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E2\u05DC \u05D6\u05D4\u2026"],
|
|
12634
|
+
write: ["\u05DE\u05D1\u05E6\u05E2 \u05D0\u05EA \u05D4\u05E9\u05D9\u05E0\u05D5\u05D9\u2026", "\u05DB\u05D5\u05EA\u05D1 \u05D0\u05EA \u05D6\u05D4\u2026"],
|
|
12635
|
+
run: ["\u05DE\u05E8\u05D9\u05E5\u2026", "\u05E2\u05D3\u05D9\u05D9\u05DF \u05E8\u05E5\u2026"],
|
|
12636
|
+
read: ["\u05E7\u05D5\u05E8\u05D0\u2026", "\u05E2\u05D5\u05D1\u05E8 \u05E2\u05DC \u05D6\u05D4\u2026"]
|
|
12596
12637
|
}
|
|
12597
12638
|
};
|
|
12598
12639
|
var ProgressOptions = class {
|
|
12599
12640
|
templates = PROGRESS_TEMPLATES;
|
|
12641
|
+
/** The voice's gender: picks the gendered table (`${lang}-f`/`-m`) when one exists. */
|
|
12642
|
+
gender = "";
|
|
12600
12643
|
/** Fast-model fallback for a tool with no template (fastProgressGenerator). Absent → silence. */
|
|
12601
12644
|
generate;
|
|
12602
12645
|
generateBudgetMs = 800;
|
|
@@ -12645,8 +12688,11 @@ var Progress = class {
|
|
|
12645
12688
|
async line(tool, args, lang) {
|
|
12646
12689
|
if (this.streamed) return "";
|
|
12647
12690
|
const name = tool.toLowerCase();
|
|
12648
|
-
const
|
|
12649
|
-
|
|
12691
|
+
const hit = TOPICS.find(([re]) => re.test(name));
|
|
12692
|
+
if (hit && hit[1] === null) return "";
|
|
12693
|
+
const topic = hit?.[1];
|
|
12694
|
+
const g = this.o.gender ? this.o.templates[`${lang}-${this.o.gender[0]}`] : void 0;
|
|
12695
|
+
const pool = topic ? (g ?? this.o.templates[lang])?.[topic] ?? [] : [];
|
|
12650
12696
|
const fresh = pool.find((l2) => !this.said.has(norm3(l2)));
|
|
12651
12697
|
if (fresh) return fresh;
|
|
12652
12698
|
if (!this.o.generate) return "";
|
|
@@ -12667,9 +12713,9 @@ var Progress = class {
|
|
|
12667
12713
|
return l;
|
|
12668
12714
|
}
|
|
12669
12715
|
};
|
|
12670
|
-
function fastProgressGenerator(ai, model) {
|
|
12716
|
+
function fastProgressGenerator(ai, model, gender) {
|
|
12671
12717
|
return async (tool, hint, lang, signal) => {
|
|
12672
|
-
const prompt = `An assistant on a live voice call is running the tool "${tool}"${hint ? ` (about: "${hint}")` : ""}. Write ONE spoken line of 2-5 words, in ${languageName(lang)}, saying what it is doing right now (like "checking the board\u2026"). Never state a result or a finding. Output only the line.`;
|
|
12718
|
+
const prompt = `An assistant on a live voice call is running the tool "${tool}"${hint ? ` (about: "${hint}")` : ""}. Write ONE spoken line of 2-5 words, in ${languageName(lang)}, saying what it is doing right now (like "checking the board\u2026"). Never state a result or a finding. ${personaHint(gender)} Output only the line.`;
|
|
12673
12719
|
const reasoning = /gpt-oss/.test(model) ? { providerOptions: { reasoning_effort: "low" } } : {};
|
|
12674
12720
|
const r = await ai.chat({ model, messages: [{ role: "user", content: prompt }], stream: false, signal, maxTokens: 150, ...reasoning });
|
|
12675
12721
|
return r.content ?? "";
|
|
@@ -13256,14 +13302,14 @@ var KIND_HINT2 = {
|
|
|
13256
13302
|
bridge: 'a neutral one-moment cue while the answer is prepared ("let me see\u2026", "one sec\u2026") \u2014 never the start of a statement or opinion ("the thing is", "well actually")'
|
|
13257
13303
|
};
|
|
13258
13304
|
var REACT_HINT = 'a short reaction to their LAST words instead: feeling ("oh no", "ha, nice", "ugh"), surprise ("wait, really?", "huh"), a light laugh if they joke or laugh ("ha!"), or an echo of their key word ("the deploy?") \u2014 still never asks for an answer or takes the turn; if nothing there deserves a reaction, a plain "mm-hm"';
|
|
13259
|
-
function fastLineGenerator(ai, model) {
|
|
13305
|
+
function fastLineGenerator(ai, model, gender) {
|
|
13260
13306
|
return async (c, signal) => {
|
|
13261
13307
|
const prompt = `You voice the tiny side-sounds of a live spoken conversation. Write ONE line of 1-5 words: ${KIND_HINT2[c.kind]}.
|
|
13262
13308
|
` + (c.react ? `Here the line may be ${REACT_HINT}.
|
|
13263
13309
|
` : "") + `The user just said: "${c.heard}"
|
|
13264
13310
|
The assistant is: ${c.state}.
|
|
13265
13311
|
` + (c.avoid.length ? `Do not reuse any of: ${c.avoid.map((a) => `"${a}"`).join(", ")}.
|
|
13266
|
-
` : "") + `React to their actual words, casually, in ${languageName(c.lang)}. Output only the line.`;
|
|
13312
|
+
` : "") + `React to their actual words, casually, in ${languageName(c.lang)}. ${personaHint(gender)} Output only the line.`;
|
|
13267
13313
|
const reasoning = /gpt-oss/.test(model) ? { providerOptions: { reasoning_effort: "low" } } : {};
|
|
13268
13314
|
const r = await ai.chat({ model, messages: [{ role: "user", content: prompt }], stream: false, signal, maxTokens: 150, ...reasoning });
|
|
13269
13315
|
return r.content ?? "";
|
|
@@ -13301,6 +13347,8 @@ var VoiceCallOptions = class {
|
|
|
13301
13347
|
bankCacheDir;
|
|
13302
13348
|
/** The host STT's language (BCP-47) — the starting language; each turn's own words still decide. */
|
|
13303
13349
|
lang;
|
|
13350
|
+
/** The voice's gender: generated fill/progress lines speak of themselves in it (Hebrew templates too). '' = neutral. */
|
|
13351
|
+
gender = "";
|
|
13304
13352
|
aec = false;
|
|
13305
13353
|
mode = "normal";
|
|
13306
13354
|
gate = {};
|
|
@@ -13324,7 +13372,7 @@ var VoiceCall = class {
|
|
|
13324
13372
|
...ai ? {
|
|
13325
13373
|
banks: new ChannelBanks({ generate: fastBankGenerator(ai, o.fastModel), ...o.bankCacheDir ? { cacheDir: o.bankCacheDir } : {} }),
|
|
13326
13374
|
decide: channelDecide(ai),
|
|
13327
|
-
generate: fastLineGenerator(ai, o.fastModel)
|
|
13375
|
+
generate: fastLineGenerator(ai, o.fastModel, o.gender)
|
|
13328
13376
|
} : {},
|
|
13329
13377
|
mode: o.mode,
|
|
13330
13378
|
aec: o.aec,
|
|
@@ -13338,7 +13386,7 @@ var VoiceCall = class {
|
|
|
13338
13386
|
cancel: () => o.cancel(),
|
|
13339
13387
|
now: o.now
|
|
13340
13388
|
});
|
|
13341
|
-
this.progress = new Progress({ ...ai ? { generate: fastProgressGenerator(ai, o.fastModel) } : {}, now: o.now, ...o.progress });
|
|
13389
|
+
this.progress = new Progress({ ...ai ? { generate: fastProgressGenerator(ai, o.fastModel, o.gender) } : {}, gender: o.gender, now: o.now, ...o.progress });
|
|
13342
13390
|
this.judge = new OverlapJudge({ ...ai ? { model: overlapModelFor(ai) } : {}, now: o.now });
|
|
13343
13391
|
this.gate = new TurnGate({
|
|
13344
13392
|
now: o.now,
|