@machina.ai/cell-cli-core 1.40.1-rc2 → 1.41.1-rc1
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/docs/AFTER_MERGE_PROMPT.md +1 -1
- package/dist/docs/changelogs/index.md +18 -0
- package/dist/docs/changelogs/latest.md +243 -255
- package/dist/docs/changelogs/preview.md +168 -18
- package/dist/docs/cli/sandbox.md +162 -45
- package/dist/docs/cli/settings.md +19 -13
- package/dist/docs/reference/configuration.md +77 -0
- package/dist/docs/reference/keyboard-shortcuts.md +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/src/agents/local-executor.js +8 -0
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.js +5 -4
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +4 -2
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +2 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/code_assist/server.js +16 -0
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +18 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +6 -0
- package/dist/src/config/config.js +26 -8
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +39 -1
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +34 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.d.ts +3 -1
- package/dist/src/config/models.js +21 -4
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +23 -1
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/context/config/configLoader.d.ts +1 -2
- package/dist/src/context/config/configLoader.js +12 -7
- package/dist/src/context/config/configLoader.js.map +1 -1
- package/dist/src/context/config/configLoader.test.js +8 -12
- package/dist/src/context/config/configLoader.test.js.map +1 -1
- package/dist/src/context/config/profiles.d.ts +7 -1
- package/dist/src/context/config/profiles.js +46 -5
- package/dist/src/context/config/profiles.js.map +1 -1
- package/dist/src/context/contextManager.js +5 -3
- package/dist/src/context/contextManager.js.map +1 -1
- package/dist/src/context/eventBus.d.ts +7 -0
- package/dist/src/context/eventBus.js +6 -0
- package/dist/src/context/eventBus.js.map +1 -1
- package/dist/src/context/graph/builtinBehaviors.js +3 -3
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
- package/dist/src/context/graph/mapper.d.ts +4 -2
- package/dist/src/context/graph/mapper.js +15 -3
- package/dist/src/context/graph/mapper.js.map +1 -1
- package/dist/src/context/graph/toGraph.d.ts +13 -2
- package/dist/src/context/graph/toGraph.js +88 -32
- package/dist/src/context/graph/toGraph.js.map +1 -1
- package/dist/src/context/historyObserver.d.ts +1 -0
- package/dist/src/context/historyObserver.js +25 -26
- package/dist/src/context/historyObserver.js.map +1 -1
- package/dist/src/context/initializer.d.ts +9 -0
- package/dist/src/context/initializer.js +75 -0
- package/dist/src/context/initializer.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js +12 -6
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +1 -1
- package/dist/src/context/pipeline/environmentImpl.d.ts +3 -2
- package/dist/src/context/pipeline/environmentImpl.js +6 -3
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.js +5 -0
- package/dist/src/context/pipeline/orchestrator.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.js +21 -5
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.test.js +22 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
- package/dist/src/context/system-tests/lifecycle.golden.test.js +5 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
- package/dist/src/context/system-tests/simulationHarness.js +1 -1
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
- package/dist/src/context/testing/contextTestUtils.js +7 -3
- package/dist/src/context/testing/contextTestUtils.js.map +1 -1
- package/dist/src/context/tracer.js +3 -1
- package/dist/src/context/tracer.js.map +1 -1
- package/dist/src/context/tracer.test.js +4 -2
- package/dist/src/context/tracer.test.js.map +1 -1
- package/dist/src/context/utils/contextTokenCalculator.d.ts +2 -1
- package/dist/src/context/utils/contextTokenCalculator.js +13 -11
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
- package/dist/src/core/client.d.ts +1 -0
- package/dist/src/core/client.js +9 -8
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +0 -3
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -1
- package/dist/src/core/geminiChat.js +72 -20
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +1 -0
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +1 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/tokenLimits.d.ts +1 -0
- package/dist/src/core/tokenLimits.js +5 -1
- package/dist/src/core/tokenLimits.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/index.d.ts +9 -1
- package/dist/src/index.js +10 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/policy-engine.js +12 -7
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +69 -1
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/prompts/snippets.js +2 -1
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.js +2 -1
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +1 -0
- package/dist/src/services/chatRecordingService.js +23 -0
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingTypes.d.ts +13 -0
- package/dist/src/services/memoryService.d.ts +5 -0
- package/dist/src/services/memoryService.js +76 -53
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +256 -12
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/sessionScratchpadUtils.d.ts +7 -0
- package/dist/src/services/sessionScratchpadUtils.js +121 -0
- package/dist/src/services/sessionScratchpadUtils.js.map +1 -0
- package/dist/src/services/sessionScratchpadUtils.test.d.ts +6 -0
- package/dist/src/services/sessionScratchpadUtils.test.js +27 -0
- package/dist/src/services/sessionScratchpadUtils.test.js.map +1 -0
- package/dist/src/services/sessionSummaryUtils.d.ts +3 -3
- package/dist/src/services/sessionSummaryUtils.js +232 -27
- package/dist/src/services/sessionSummaryUtils.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.test.js +449 -10
- package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +24 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +24 -0
- package/dist/src/tools/trackerTools.test.js +7 -2
- package/dist/src/tools/trackerTools.test.js.map +1 -1
- package/dist/src/utils/binaryCheck.d.ts +9 -0
- package/dist/src/utils/binaryCheck.js +13 -0
- package/dist/src/utils/binaryCheck.js.map +1 -0
- package/dist/src/utils/fsErrorMessages.js +4 -0
- package/dist/src/utils/fsErrorMessages.js.map +1 -1
- package/dist/src/utils/fsErrorMessages.test.js +21 -0
- package/dist/src/utils/fsErrorMessages.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +2 -2
- package/dist/src/utils/tokenCalculation.js +15 -14
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/voice/audioRecorder.d.ts +27 -0
- package/dist/src/voice/audioRecorder.js +95 -0
- package/dist/src/voice/audioRecorder.js.map +1 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.d.ts +20 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.js +140 -0
- package/dist/src/voice/geminiLiveTranscriptionProvider.js.map +1 -0
- package/dist/src/voice/transcriptionFactory.d.ts +12 -0
- package/dist/src/voice/transcriptionFactory.js +32 -0
- package/dist/src/voice/transcriptionFactory.js.map +1 -0
- package/dist/src/voice/transcriptionProvider.d.ts +29 -0
- package/dist/src/voice/transcriptionProvider.js +7 -0
- package/dist/src/voice/transcriptionProvider.js.map +1 -0
- package/dist/src/voice/whisperModelManager.d.ts +26 -0
- package/dist/src/voice/whisperModelManager.js +79 -0
- package/dist/src/voice/whisperModelManager.js.map +1 -0
- package/dist/src/voice/whisperTranscriptionProvider.d.ts +34 -0
- package/dist/src/voice/whisperTranscriptionProvider.js +151 -0
- package/dist/src/voice/whisperTranscriptionProvider.js.map +1 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.d.ts +6 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.js +24 -0
- package/dist/src/voice/whisperTranscriptionProvider.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
|
@@ -97,6 +97,30 @@
|
|
|
97
97
|
"topK": 64
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
|
+
"gemma-4-31b-it": {
|
|
101
|
+
"model": "gemma-4-31b-it",
|
|
102
|
+
"generateContentConfig": {
|
|
103
|
+
"temperature": 1,
|
|
104
|
+
"topP": 0.95,
|
|
105
|
+
"thinkingConfig": {
|
|
106
|
+
"includeThoughts": true,
|
|
107
|
+
"thinkingLevel": "HIGH"
|
|
108
|
+
},
|
|
109
|
+
"topK": 64
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"gemma-4-26b-a4b-it": {
|
|
113
|
+
"model": "gemma-4-26b-a4b-it",
|
|
114
|
+
"generateContentConfig": {
|
|
115
|
+
"temperature": 1,
|
|
116
|
+
"topP": 0.95,
|
|
117
|
+
"thinkingConfig": {
|
|
118
|
+
"includeThoughts": true,
|
|
119
|
+
"thinkingLevel": "HIGH"
|
|
120
|
+
},
|
|
121
|
+
"topK": 64
|
|
122
|
+
}
|
|
123
|
+
},
|
|
100
124
|
"gemini-2.5-flash-base": {
|
|
101
125
|
"model": "gemini-2.5-flash",
|
|
102
126
|
"generateContentConfig": {
|
|
@@ -97,6 +97,30 @@
|
|
|
97
97
|
"topK": 64
|
|
98
98
|
}
|
|
99
99
|
},
|
|
100
|
+
"gemma-4-31b-it": {
|
|
101
|
+
"model": "gemma-4-31b-it",
|
|
102
|
+
"generateContentConfig": {
|
|
103
|
+
"temperature": 1,
|
|
104
|
+
"topP": 0.95,
|
|
105
|
+
"thinkingConfig": {
|
|
106
|
+
"includeThoughts": true,
|
|
107
|
+
"thinkingLevel": "HIGH"
|
|
108
|
+
},
|
|
109
|
+
"topK": 64
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"gemma-4-26b-a4b-it": {
|
|
113
|
+
"model": "gemma-4-26b-a4b-it",
|
|
114
|
+
"generateContentConfig": {
|
|
115
|
+
"temperature": 1,
|
|
116
|
+
"topP": 0.95,
|
|
117
|
+
"thinkingConfig": {
|
|
118
|
+
"includeThoughts": true,
|
|
119
|
+
"thinkingLevel": "HIGH"
|
|
120
|
+
},
|
|
121
|
+
"topK": 64
|
|
122
|
+
}
|
|
123
|
+
},
|
|
100
124
|
"gemini-2.5-flash-base": {
|
|
101
125
|
"model": "gemini-2.5-flash",
|
|
102
126
|
"generateContentConfig": {
|
|
@@ -24,6 +24,7 @@ describe('Tracker Tools Integration', () => {
|
|
|
24
24
|
model: 'gemini-3-flash',
|
|
25
25
|
debugMode: false,
|
|
26
26
|
});
|
|
27
|
+
await config.initialize();
|
|
27
28
|
messageBus = new MessageBus(null, false);
|
|
28
29
|
});
|
|
29
30
|
afterEach(async () => {
|
|
@@ -76,8 +77,12 @@ describe('Tracker Tools Integration', () => {
|
|
|
76
77
|
type: TaskType.TASK,
|
|
77
78
|
}, getSignal());
|
|
78
79
|
const tasks = await config.getTrackerService().listTasks();
|
|
79
|
-
const
|
|
80
|
-
const
|
|
80
|
+
const parentTask = tasks.find((t) => t.title === 'Parent Task');
|
|
81
|
+
const childTask = tasks.find((t) => t.title === 'Child Task');
|
|
82
|
+
expect(parentTask).toBeDefined();
|
|
83
|
+
expect(childTask).toBeDefined();
|
|
84
|
+
const parentId = parentTask.id;
|
|
85
|
+
const childId = childTask.id;
|
|
81
86
|
// Add Dependency
|
|
82
87
|
const addDepTool = new TrackerAddDependencyTool(config, messageBus);
|
|
83
88
|
await addDepTool.buildAndExecute({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackerTools.test.js","sourceRoot":"","sources":["../../../src/tools/trackerTools.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"trackerTools.test.js","sourceRoot":"","sources":["../../../src/tools/trackerTools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { sync as commandExistsSync } from 'command-exists';
|
|
7
|
+
/**
|
|
8
|
+
* Checks if a binary is available in the system PATH.
|
|
9
|
+
*/
|
|
10
|
+
export function isBinaryAvailable(binaryName) {
|
|
11
|
+
return commandExistsSync(binaryName);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=binaryCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binaryCheck.js","sourceRoot":"","sources":["../../../src/utils/binaryCheck.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,IAAI,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -37,6 +37,10 @@ const errorMessageGenerators = {
|
|
|
37
37
|
'Close any programs that might be using the file.',
|
|
38
38
|
EMFILE: () => 'Too many open files. Close some unused files or applications.',
|
|
39
39
|
ENFILE: () => 'Too many open files in system. Close some unused files or applications.',
|
|
40
|
+
ECONNRESET: () => 'Connection reset by peer. The network connection was unexpectedly closed.',
|
|
41
|
+
ETIMEDOUT: () => 'Operation timed out. The network connection or filesystem operation took too long.',
|
|
42
|
+
ENOTDIR: (path) => (path ? `Not a directory: '${path}'. ` : 'Not a directory. ') +
|
|
43
|
+
'Check if the path is correct and that all parent components are directories.',
|
|
40
44
|
};
|
|
41
45
|
/**
|
|
42
46
|
* Converts a Node.js filesystem error to a user-friendly message.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsErrorMessages.js","sourceRoot":"","sources":["../../../src/utils/fsErrorMessages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D;;;GAGG;AACH,MAAM,sBAAsB,GAA8C;IACxE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,qCAAqC,IAAI,KAAK;QAChD,CAAC,CAAC,qBAAqB,CAAC;QAC1B,yDAAyD;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,iCAAiC,IAAI,KAAK;QAC5C,CAAC,CAAC,+BAA+B,CAAC;QACpC,oDAAoD;IACtD,MAAM,EAAE,GAAG,EAAE,CACX,iEAAiE;IACnE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,qCAAqC,IAAI,KAAK;QAChD,CAAC,CAAC,mCAAmC,CAAC;QACxC,0CAA0C;IAC5C,KAAK,EAAE,GAAG,EAAE,CACV,wEAAwE;IAC1E,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACd,CAAC,IAAI;QACH,CAAC,CAAC,6BAA6B,IAAI,KAAK;QACxC,CAAC,CAAC,2BAA2B,CAAC;QAChC,2DAA2D;IAC7D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,sCAAsC,IAAI,KAAK;QACjD,CAAC,CAAC,oCAAoC,CAAC;QACzC,qCAAqC;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACd,CAAC,IAAI;QACH,CAAC,CAAC,6BAA6B,IAAI,KAAK;QACxC,CAAC,CAAC,2BAA2B,CAAC;QAChC,kDAAkD;IACpD,MAAM,EAAE,GAAG,EAAE,CAAC,+DAA+D;IAC7E,MAAM,EAAE,GAAG,EAAE,CACX,yEAAyE;
|
|
1
|
+
{"version":3,"file":"fsErrorMessages.js","sourceRoot":"","sources":["../../../src/utils/fsErrorMessages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE3D;;;GAGG;AACH,MAAM,sBAAsB,GAA8C;IACxE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,qCAAqC,IAAI,KAAK;QAChD,CAAC,CAAC,qBAAqB,CAAC;QAC1B,yDAAyD;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,iCAAiC,IAAI,KAAK;QAC5C,CAAC,CAAC,+BAA+B,CAAC;QACpC,oDAAoD;IACtD,MAAM,EAAE,GAAG,EAAE,CACX,iEAAiE;IACnE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,qCAAqC,IAAI,KAAK;QAChD,CAAC,CAAC,mCAAmC,CAAC;QACxC,0CAA0C;IAC5C,KAAK,EAAE,GAAG,EAAE,CACV,wEAAwE;IAC1E,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACd,CAAC,IAAI;QACH,CAAC,CAAC,6BAA6B,IAAI,KAAK;QACxC,CAAC,CAAC,2BAA2B,CAAC;QAChC,2DAA2D;IAC7D,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACf,CAAC,IAAI;QACH,CAAC,CAAC,sCAAsC,IAAI,KAAK;QACjD,CAAC,CAAC,oCAAoC,CAAC;QACzC,qCAAqC;IACvC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACd,CAAC,IAAI;QACH,CAAC,CAAC,6BAA6B,IAAI,KAAK;QACxC,CAAC,CAAC,2BAA2B,CAAC;QAChC,kDAAkD;IACpD,MAAM,EAAE,GAAG,EAAE,CAAC,+DAA+D;IAC7E,MAAM,EAAE,GAAG,EAAE,CACX,yEAAyE;IAC3E,UAAU,EAAE,GAAG,EAAE,CACf,2EAA2E;IAC7E,SAAS,EAAE,GAAG,EAAE,CACd,oFAAoF;IACtF,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAChB,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,KAAK,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAC7D,8EAA8E;CACjF,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,cAAc,GAAG,2BAA2B;IAE5C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAExB,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,IAAI,CAAC,EAAE,CAAC;YACxD,OAAO,sBAAsB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC;YACpD,OAAO,GAAG,WAAW,KAAK,IAAI,GAAG,CAAC;QACpC,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -105,6 +105,27 @@ describe('getFsErrorMessage', () => {
|
|
|
105
105
|
message: 'ENFILE: file table overflow',
|
|
106
106
|
expected: 'Too many open files in system. Close some unused files or applications.',
|
|
107
107
|
},
|
|
108
|
+
{
|
|
109
|
+
code: 'ECONNRESET',
|
|
110
|
+
message: 'ECONNRESET: connection reset by peer',
|
|
111
|
+
expected: 'Connection reset by peer. The network connection was unexpectedly closed.',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
code: 'ETIMEDOUT',
|
|
115
|
+
message: 'ETIMEDOUT: operation timed out',
|
|
116
|
+
expected: 'Operation timed out. The network connection or filesystem operation took too long.',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
code: 'ENOTDIR',
|
|
120
|
+
message: 'ENOTDIR: not a directory',
|
|
121
|
+
path: '/some/file.txt/inner',
|
|
122
|
+
expected: "Not a directory: '/some/file.txt/inner'. Check if the path is correct and that all parent components are directories.",
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
code: 'ENOTDIR',
|
|
126
|
+
message: 'ENOTDIR: not a directory',
|
|
127
|
+
expected: 'Not a directory. Check if the path is correct and that all parent components are directories.',
|
|
128
|
+
},
|
|
108
129
|
];
|
|
109
130
|
it.each(testCases)('returns friendly message for $code (path: $path)', ({ code, message, path, expected }) => {
|
|
110
131
|
const error = createNodeError(code, message, path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsErrorMessages.test.js","sourceRoot":"","sources":["../../../src/utils/fsErrorMessages.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fsErrorMessages.test.js","sourceRoot":"","sources":["../../../src/utils/fsErrorMessages.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;GAEG;AACH,SAAS,eAAe,CACtB,IAAY,EACZ,OAAe,EACf,IAAa;IAEb,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAA0B,CAAC;IAC1D,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAcD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,MAAM,SAAS,GAAkB;YAC/B;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2BAA2B;gBACpC,IAAI,EAAE,+BAA+B;gBACrC,QAAQ,EACN,2HAA2H;aAC9H;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,2BAA2B;gBACpC,QAAQ,EACN,4EAA4E;aAC/E;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mCAAmC;gBAC5C,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EACN,0GAA0G;aAC7G;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,mCAAmC;gBAC5C,QAAQ,EACN,iFAAiF;aACpF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,iCAAiC;gBAC1C,QAAQ,EACN,iEAAiE;aACpE;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,0CAA0C;gBACnD,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EACN,8FAA8F;aACjG;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,0CAA0C;gBACnD,QAAQ,EACN,2EAA2E;aAC9E;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,8BAA8B;gBACvC,QAAQ,EACN,wEAAwE;aAC3E;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EACN,uGAAuG;aAC1G;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,gCAAgC;gBACzC,QAAQ,EACN,oFAAoF;aACvF;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,6BAA6B;gBACtC,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EACN,yFAAyF;aAC5F;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,6BAA6B;gBACtC,QAAQ,EACN,uEAAuE;aAC1E;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,cAAc;gBACpB,QAAQ,EACN,2FAA2F;aAC9F;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,gCAAgC;gBACzC,QAAQ,EACN,2EAA2E;aAC9E;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,6BAA6B;gBACtC,QAAQ,EACN,+DAA+D;aAClE;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,6BAA6B;gBACtC,QAAQ,EACN,yEAAyE;aAC5E;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,sCAAsC;gBAC/C,QAAQ,EACN,2EAA2E;aAC9E;YACD;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,gCAAgC;gBACzC,QAAQ,EACN,oFAAoF;aACvF;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,0BAA0B;gBACnC,IAAI,EAAE,sBAAsB;gBAC5B,QAAQ,EACN,uHAAuH;aAC1H;YACD;gBACE,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EACN,+FAA+F;aAClG;SACF,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAChB,kDAAkD,EAClD,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,MAAM,SAAS,GAAkB;YAC/B;gBACE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,6BAA6B;gBACtC,QAAQ,EAAE,wCAAwC;aACnD;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,kBAAkB;gBAC3B,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,6BAA6B;aACxC;SACF,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAChB,6CAA6C,EAC7C,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,MAAM,aAAa,GAAwB;YACzC;gBACE,KAAK,EAAE,IAAI,KAAK,CAAC,sBAAsB,CAAC;gBACxC,QAAQ,EAAE,sBAAsB;aACjC;YACD,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE;YACnD,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;YACnC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,2BAA2B,EAAE;YACtD,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;SAC5D,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CACpB,8BAA8B,EAC9B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtB,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CACF,CAAC;QAEF,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,CAAU,CAAC,CACjC,4BAA4B,EAC5B,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,CACrD,gBAAgB,CACjB,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -10,9 +10,9 @@ export declare const NON_ASCII_TOKENS_PER_CHAR = 1.3;
|
|
|
10
10
|
/**
|
|
11
11
|
* Estimates token count for parts synchronously using a heuristic.
|
|
12
12
|
* - Text: character-based heuristic (ASCII vs CJK) for small strings, length/4 for massive ones.
|
|
13
|
-
* - Non-text (Tools, etc): JSON string length /
|
|
13
|
+
* - Non-text (Tools, etc): JSON string length / charsPerToken.
|
|
14
14
|
*/
|
|
15
|
-
export declare function estimateTokenCountSync(parts: Part[], depth?: number): number;
|
|
15
|
+
export declare function estimateTokenCountSync(parts: Part[], depth?: number, charsPerToken?: number): number;
|
|
16
16
|
/**
|
|
17
17
|
* Calculates the token count of the request.
|
|
18
18
|
* If the request contains only text or tools, it estimates the token count locally.
|
|
@@ -22,12 +22,13 @@ const MAX_CHARS_FOR_FULL_HEURISTIC = 100_000;
|
|
|
22
22
|
// malicious or buggy nested structures. A depth of 3 is sufficient given
|
|
23
23
|
// standard multimodal responses are typically depth 1.
|
|
24
24
|
const MAX_RECURSION_DEPTH = 3;
|
|
25
|
+
const DEFAULT_CHARS_PER_TOKEN = 4;
|
|
25
26
|
/**
|
|
26
27
|
* Heuristic estimation of tokens for a text string.
|
|
27
28
|
*/
|
|
28
|
-
function estimateTextTokens(text) {
|
|
29
|
+
function estimateTextTokens(text, charsPerToken) {
|
|
29
30
|
if (text.length > MAX_CHARS_FOR_FULL_HEURISTIC) {
|
|
30
|
-
return text.length /
|
|
31
|
+
return text.length / charsPerToken;
|
|
31
32
|
}
|
|
32
33
|
let tokens = 0;
|
|
33
34
|
// Optimized loop: charCodeAt is faster than for...of on large strings
|
|
@@ -64,43 +65,43 @@ function estimateMediaTokens(part) {
|
|
|
64
65
|
* Heuristic estimation for tool responses, avoiding massive string copies
|
|
65
66
|
* and accounting for nested Gemini 3 multimodal parts.
|
|
66
67
|
*/
|
|
67
|
-
function estimateFunctionResponseTokens(part, depth) {
|
|
68
|
+
function estimateFunctionResponseTokens(part, depth, charsPerToken) {
|
|
68
69
|
const fr = part.functionResponse;
|
|
69
70
|
if (!fr)
|
|
70
71
|
return 0;
|
|
71
|
-
let totalTokens = (fr.name?.length ?? 0) /
|
|
72
|
+
let totalTokens = (fr.name?.length ?? 0) / charsPerToken;
|
|
72
73
|
const response = fr.response;
|
|
73
74
|
if (typeof response === 'string') {
|
|
74
|
-
totalTokens += response.length /
|
|
75
|
+
totalTokens += response.length / charsPerToken;
|
|
75
76
|
}
|
|
76
77
|
else if (response !== undefined && response !== null) {
|
|
77
78
|
// For objects, stringify only the payload, not the whole Part object.
|
|
78
|
-
totalTokens += JSON.stringify(response).length /
|
|
79
|
+
totalTokens += JSON.stringify(response).length / charsPerToken;
|
|
79
80
|
}
|
|
80
81
|
// Gemini 3: Handle nested multimodal parts recursively.
|
|
81
82
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
82
83
|
const nestedParts = fr.parts;
|
|
83
84
|
if (nestedParts && nestedParts.length > 0) {
|
|
84
|
-
totalTokens += estimateTokenCountSync(nestedParts, depth + 1);
|
|
85
|
+
totalTokens += estimateTokenCountSync(nestedParts, depth + 1, charsPerToken);
|
|
85
86
|
}
|
|
86
87
|
return totalTokens;
|
|
87
88
|
}
|
|
88
89
|
/**
|
|
89
90
|
* Estimates token count for parts synchronously using a heuristic.
|
|
90
91
|
* - Text: character-based heuristic (ASCII vs CJK) for small strings, length/4 for massive ones.
|
|
91
|
-
* - Non-text (Tools, etc): JSON string length /
|
|
92
|
+
* - Non-text (Tools, etc): JSON string length / charsPerToken.
|
|
92
93
|
*/
|
|
93
|
-
export function estimateTokenCountSync(parts, depth = 0) {
|
|
94
|
+
export function estimateTokenCountSync(parts, depth = 0, charsPerToken = DEFAULT_CHARS_PER_TOKEN) {
|
|
94
95
|
if (depth > MAX_RECURSION_DEPTH) {
|
|
95
96
|
return 0;
|
|
96
97
|
}
|
|
97
98
|
let totalTokens = 0;
|
|
98
99
|
for (const part of parts) {
|
|
99
100
|
if (typeof part.text === 'string') {
|
|
100
|
-
totalTokens += estimateTextTokens(part.text);
|
|
101
|
+
totalTokens += estimateTextTokens(part.text, charsPerToken);
|
|
101
102
|
}
|
|
102
103
|
else if (part.functionResponse) {
|
|
103
|
-
totalTokens += estimateFunctionResponseTokens(part, depth);
|
|
104
|
+
totalTokens += estimateFunctionResponseTokens(part, depth, charsPerToken);
|
|
104
105
|
}
|
|
105
106
|
else {
|
|
106
107
|
const mediaEstimate = estimateMediaTokens(part);
|
|
@@ -110,7 +111,7 @@ export function estimateTokenCountSync(parts, depth = 0) {
|
|
|
110
111
|
else {
|
|
111
112
|
// Fallback for other non-text parts (e.g., functionCall).
|
|
112
113
|
// Note: JSON.stringify(part) here is safe as these parts are typically small.
|
|
113
|
-
totalTokens += JSON.stringify(part).length /
|
|
114
|
+
totalTokens += JSON.stringify(part).length / charsPerToken;
|
|
114
115
|
}
|
|
115
116
|
}
|
|
116
117
|
}
|
|
@@ -143,9 +144,9 @@ export async function calculateRequestTokenCount(request, contentGenerator, mode
|
|
|
143
144
|
catch (error) {
|
|
144
145
|
// Fallback to local estimation if the API call fails
|
|
145
146
|
debugLogger.debug('countTokens API failed:', error);
|
|
146
|
-
return estimateTokenCountSync(parts);
|
|
147
|
+
return estimateTokenCountSync(parts, 0, DEFAULT_CHARS_PER_TOKEN);
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
|
-
return estimateTokenCountSync(parts);
|
|
150
|
+
return estimateTokenCountSync(parts, 0, DEFAULT_CHARS_PER_TOKEN);
|
|
150
151
|
}
|
|
151
152
|
//# sourceMappingURL=tokenCalculation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenCalculation.js","sourceRoot":"","sources":["../../../src/utils/tokenCalculation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,6BAA6B;AAC7B,yDAAyD;AACzD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,sEAAsE;AACtE,kEAAkE;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AAC7C,kCAAkC;AAClC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,gEAAgE;AAChE,iEAAiE;AACjE,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,0FAA0F;AAC1F,8EAA8E;AAC9E,MAAM,4BAA4B,GAAG,OAAO,CAAC;AAE7C,8EAA8E;AAC9E,yEAAyE;AACzE,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"tokenCalculation.js","sourceRoot":"","sources":["../../../src/utils/tokenCalculation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'node:events';
|
|
7
|
+
export interface AudioRecorderEvents {
|
|
8
|
+
data: [Buffer];
|
|
9
|
+
start: [];
|
|
10
|
+
stop: [];
|
|
11
|
+
error: [Error];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Captures audio from the microphone using `sox` (`rec`).
|
|
15
|
+
* Emits 16kHz, 16-bit, mono PCM chunks.
|
|
16
|
+
*/
|
|
17
|
+
export declare class AudioRecorder extends EventEmitter<AudioRecorderEvents> {
|
|
18
|
+
private recProcess;
|
|
19
|
+
private isRecordingInternal;
|
|
20
|
+
get isRecording(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Checks if `rec` (sox) is available on the system.
|
|
23
|
+
*/
|
|
24
|
+
static isAvailable(): Promise<boolean>;
|
|
25
|
+
start(): Promise<void>;
|
|
26
|
+
stop(): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { EventEmitter } from 'node:events';
|
|
8
|
+
import commandExists from 'command-exists';
|
|
9
|
+
/**
|
|
10
|
+
* Captures audio from the microphone using `sox` (`rec`).
|
|
11
|
+
* Emits 16kHz, 16-bit, mono PCM chunks.
|
|
12
|
+
*/
|
|
13
|
+
export class AudioRecorder extends EventEmitter {
|
|
14
|
+
recProcess = null;
|
|
15
|
+
isRecordingInternal = false;
|
|
16
|
+
get isRecording() {
|
|
17
|
+
return this.isRecordingInternal;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Checks if `rec` (sox) is available on the system.
|
|
21
|
+
*/
|
|
22
|
+
static async isAvailable() {
|
|
23
|
+
try {
|
|
24
|
+
await commandExists('rec');
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async start() {
|
|
32
|
+
if (this.isRecordingInternal)
|
|
33
|
+
return;
|
|
34
|
+
this.isRecordingInternal = true;
|
|
35
|
+
try {
|
|
36
|
+
const available = await AudioRecorder.isAvailable();
|
|
37
|
+
if (!this.isRecordingInternal)
|
|
38
|
+
return; // Check if stopped while checking availability
|
|
39
|
+
if (!available) {
|
|
40
|
+
throw new Error('The `rec` command (provided by SoX) is required for voice mode. Please install SoX (e.g., `brew install sox` on macOS or `sudo apt install sox libsox-fmt-all` on Linux).');
|
|
41
|
+
}
|
|
42
|
+
// rec -q -V0 -e signed -c 1 -b 16 -r 16000 -t raw -
|
|
43
|
+
this.recProcess = spawn('rec', [
|
|
44
|
+
'-q',
|
|
45
|
+
'-V0',
|
|
46
|
+
'-e',
|
|
47
|
+
'signed',
|
|
48
|
+
'-c',
|
|
49
|
+
'1',
|
|
50
|
+
'-b',
|
|
51
|
+
'16',
|
|
52
|
+
'-r',
|
|
53
|
+
'16000',
|
|
54
|
+
'-t',
|
|
55
|
+
'raw',
|
|
56
|
+
'-',
|
|
57
|
+
]);
|
|
58
|
+
if (!this.isRecordingInternal) {
|
|
59
|
+
this.recProcess.kill('SIGTERM');
|
|
60
|
+
this.recProcess = null;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.recProcess.stdout.on('data', (data) => {
|
|
64
|
+
this.emit('data', data);
|
|
65
|
+
});
|
|
66
|
+
this.recProcess.stderr.on('data', (_data) => {
|
|
67
|
+
// rec might print warnings to stderr, we could log them or ignore
|
|
68
|
+
// console.warn(`rec stderr: ${data.toString()}`);
|
|
69
|
+
});
|
|
70
|
+
this.recProcess.on('error', (err) => {
|
|
71
|
+
this.emit('error', err);
|
|
72
|
+
this.stop();
|
|
73
|
+
});
|
|
74
|
+
this.recProcess.on('close', () => {
|
|
75
|
+
this.stop();
|
|
76
|
+
});
|
|
77
|
+
this.emit('start');
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
this.isRecordingInternal = false;
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
stop() {
|
|
85
|
+
if (!this.isRecordingInternal)
|
|
86
|
+
return;
|
|
87
|
+
this.isRecordingInternal = false;
|
|
88
|
+
if (this.recProcess) {
|
|
89
|
+
this.recProcess.kill('SIGTERM');
|
|
90
|
+
this.recProcess = null;
|
|
91
|
+
}
|
|
92
|
+
this.emit('stop');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=audioRecorder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audioRecorder.js","sourceRoot":"","sources":["../../../src/voice/audioRecorder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAS3C;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAiC;IAC1D,UAAU,GAA0C,IAAI,CAAC;IACzD,mBAAmB,GAAG,KAAK,CAAC;IAEpC,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACrC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,mBAAmB;gBAAE,OAAO,CAAC,+CAA+C;YAEtF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,2KAA2K,CAC5K,CAAC;YACJ,CAAC;YAED,oDAAoD;YACpD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,EAAE;gBAC7B,IAAI;gBACJ,KAAK;gBACL,IAAI;gBACJ,QAAQ;gBACR,IAAI;gBACJ,GAAG;gBACH,IAAI;gBACJ,IAAI;gBACJ,IAAI;gBACJ,OAAO;gBACP,IAAI;gBACJ,KAAK;gBACL,GAAG;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACjD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBAClD,kEAAkE;gBAClE,kDAAkD;YACpD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACtC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAEjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'node:events';
|
|
7
|
+
import type { TranscriptionProvider, TranscriptionEvents } from './transcriptionProvider.js';
|
|
8
|
+
/**
|
|
9
|
+
* Connects to the Gemini Live API using raw WebSockets to support API Key authentication.
|
|
10
|
+
*/
|
|
11
|
+
export declare class GeminiLiveTranscriptionProvider extends EventEmitter<TranscriptionEvents> implements TranscriptionProvider {
|
|
12
|
+
private readonly apiKey;
|
|
13
|
+
private ws;
|
|
14
|
+
private currentTranscription;
|
|
15
|
+
constructor(apiKey: string);
|
|
16
|
+
connect(): Promise<void>;
|
|
17
|
+
sendAudioChunk(chunk: Buffer): void;
|
|
18
|
+
getTranscription(): string;
|
|
19
|
+
disconnect(): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import WebSocket from 'ws';
|
|
7
|
+
import { EventEmitter, once } from 'node:events';
|
|
8
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
const LiveAPIResponseSchema = z.object({
|
|
11
|
+
setupComplete: z.record(z.unknown()).optional(),
|
|
12
|
+
serverContent: z
|
|
13
|
+
.object({
|
|
14
|
+
turnComplete: z.boolean().optional(),
|
|
15
|
+
inputTranscription: z
|
|
16
|
+
.object({
|
|
17
|
+
text: z.string().optional(),
|
|
18
|
+
})
|
|
19
|
+
.optional(),
|
|
20
|
+
outputTranscription: z
|
|
21
|
+
.object({
|
|
22
|
+
text: z.string().optional(),
|
|
23
|
+
})
|
|
24
|
+
.optional(),
|
|
25
|
+
modelTurn: z
|
|
26
|
+
.object({
|
|
27
|
+
parts: z
|
|
28
|
+
.array(z.object({
|
|
29
|
+
text: z.string().optional(),
|
|
30
|
+
inlineData: z
|
|
31
|
+
.object({
|
|
32
|
+
data: z.string(),
|
|
33
|
+
})
|
|
34
|
+
.optional(),
|
|
35
|
+
}))
|
|
36
|
+
.optional(),
|
|
37
|
+
})
|
|
38
|
+
.optional(),
|
|
39
|
+
})
|
|
40
|
+
.optional(),
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* Connects to the Gemini Live API using raw WebSockets to support API Key authentication.
|
|
44
|
+
*/
|
|
45
|
+
export class GeminiLiveTranscriptionProvider extends EventEmitter {
|
|
46
|
+
apiKey;
|
|
47
|
+
ws = null;
|
|
48
|
+
currentTranscription = '';
|
|
49
|
+
constructor(apiKey) {
|
|
50
|
+
super();
|
|
51
|
+
this.apiKey = apiKey;
|
|
52
|
+
}
|
|
53
|
+
async connect() {
|
|
54
|
+
const modelName = 'gemini-3.1-flash-live-preview';
|
|
55
|
+
const baseUrl = 'wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent';
|
|
56
|
+
if (!this.apiKey) {
|
|
57
|
+
throw new Error('No API key provided');
|
|
58
|
+
}
|
|
59
|
+
// NOTE: The Generative Language WebSocket API requires the API key to be passed via the 'key' query parameter.
|
|
60
|
+
const url = `${baseUrl}?key=${this.apiKey}`;
|
|
61
|
+
debugLogger.debug(`[GeminiLiveTranscription] Connecting to model ${modelName} via raw WebSocket with API Key...`);
|
|
62
|
+
try {
|
|
63
|
+
this.ws = new WebSocket(url, {
|
|
64
|
+
maxPayload: 1 << 20, // 1MB limit for safety
|
|
65
|
+
});
|
|
66
|
+
this.ws.on('message', (data) => {
|
|
67
|
+
try {
|
|
68
|
+
const parsedData = JSON.parse(data.toString());
|
|
69
|
+
const result = LiveAPIResponseSchema.safeParse(parsedData);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
const response = result.data;
|
|
72
|
+
if (response.serverContent) {
|
|
73
|
+
const content = response.serverContent;
|
|
74
|
+
if (content.turnComplete) {
|
|
75
|
+
this.emit('turnComplete');
|
|
76
|
+
}
|
|
77
|
+
if (content.inputTranscription?.text) {
|
|
78
|
+
const text = content.inputTranscription.text;
|
|
79
|
+
debugLogger.debug(`[GeminiLiveTranscription] Transcription received (Cloud): "${text}"`);
|
|
80
|
+
this.currentTranscription = text;
|
|
81
|
+
this.emit('transcription', this.currentTranscription);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
debugLogger.error('[GeminiLiveTranscription] Error parsing message:', e);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
this.ws.on('error', (error) => {
|
|
91
|
+
debugLogger.error('[GeminiLiveTranscription] WebSocket Error:', error);
|
|
92
|
+
this.emit('error', error);
|
|
93
|
+
});
|
|
94
|
+
this.ws.on('close', (code, reason) => {
|
|
95
|
+
debugLogger.debug(`[GeminiLiveTranscription] Connection Closed. Code: ${code}, Reason: ${reason}`);
|
|
96
|
+
this.emit('close');
|
|
97
|
+
this.ws = null;
|
|
98
|
+
});
|
|
99
|
+
await once(this.ws, 'open');
|
|
100
|
+
const setupMessage = {
|
|
101
|
+
setup: {
|
|
102
|
+
model: `models/${modelName}`,
|
|
103
|
+
generation_config: {
|
|
104
|
+
response_modalities: ['audio'],
|
|
105
|
+
},
|
|
106
|
+
input_audio_transcription: {},
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
this.ws.send(JSON.stringify(setupMessage));
|
|
110
|
+
this.currentTranscription = '';
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
debugLogger.error('[GeminiLiveTranscription] Failed to establish connection:', err);
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
sendAudioChunk(chunk) {
|
|
118
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
|
|
119
|
+
return;
|
|
120
|
+
const audioMessage = {
|
|
121
|
+
realtime_input: {
|
|
122
|
+
audio: {
|
|
123
|
+
data: chunk.toString('base64'),
|
|
124
|
+
mime_type: 'audio/pcm;rate=16000',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
this.ws.send(JSON.stringify(audioMessage));
|
|
129
|
+
}
|
|
130
|
+
getTranscription() {
|
|
131
|
+
return this.currentTranscription;
|
|
132
|
+
}
|
|
133
|
+
disconnect() {
|
|
134
|
+
if (this.ws) {
|
|
135
|
+
this.ws.close();
|
|
136
|
+
this.ws = null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=geminiLiveTranscriptionProvider.js.map
|