@machina.ai/cell-cli-core 1.40.1-rc1 → 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.
Files changed (176) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
  2. package/dist/docs/changelogs/index.md +18 -0
  3. package/dist/docs/changelogs/latest.md +243 -255
  4. package/dist/docs/changelogs/preview.md +168 -18
  5. package/dist/docs/cli/sandbox.md +162 -45
  6. package/dist/docs/cli/settings.md +19 -13
  7. package/dist/docs/reference/configuration.md +77 -0
  8. package/dist/docs/reference/keyboard-shortcuts.md +1 -0
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/package.json +2 -1
  13. package/dist/src/agents/browser/browser-tools-manifest.json +20 -20
  14. package/dist/src/agents/local-executor.js +8 -0
  15. package/dist/src/agents/local-executor.js.map +1 -1
  16. package/dist/src/agents/skill-extraction-agent.js +5 -4
  17. package/dist/src/agents/skill-extraction-agent.js.map +1 -1
  18. package/dist/src/agents/skill-extraction-agent.test.js +4 -2
  19. package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
  20. package/dist/src/agents/types.d.ts +2 -0
  21. package/dist/src/agents/types.js.map +1 -1
  22. package/dist/src/code_assist/server.js +16 -0
  23. package/dist/src/code_assist/server.js.map +1 -1
  24. package/dist/src/code_assist/server.test.js +18 -0
  25. package/dist/src/code_assist/server.test.js.map +1 -1
  26. package/dist/src/config/config.d.ts +6 -0
  27. package/dist/src/config/config.js +26 -8
  28. package/dist/src/config/config.js.map +1 -1
  29. package/dist/src/config/config.test.js +39 -1
  30. package/dist/src/config/config.test.js.map +1 -1
  31. package/dist/src/config/defaultModelConfigs.js +34 -0
  32. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  33. package/dist/src/config/models.d.ts +3 -1
  34. package/dist/src/config/models.js +21 -4
  35. package/dist/src/config/models.js.map +1 -1
  36. package/dist/src/config/models.test.js +23 -1
  37. package/dist/src/config/models.test.js.map +1 -1
  38. package/dist/src/context/config/configLoader.d.ts +1 -2
  39. package/dist/src/context/config/configLoader.js +12 -7
  40. package/dist/src/context/config/configLoader.js.map +1 -1
  41. package/dist/src/context/config/configLoader.test.js +8 -12
  42. package/dist/src/context/config/configLoader.test.js.map +1 -1
  43. package/dist/src/context/config/profiles.d.ts +7 -1
  44. package/dist/src/context/config/profiles.js +46 -5
  45. package/dist/src/context/config/profiles.js.map +1 -1
  46. package/dist/src/context/contextManager.js +5 -3
  47. package/dist/src/context/contextManager.js.map +1 -1
  48. package/dist/src/context/eventBus.d.ts +7 -0
  49. package/dist/src/context/eventBus.js +6 -0
  50. package/dist/src/context/eventBus.js.map +1 -1
  51. package/dist/src/context/graph/builtinBehaviors.js +3 -3
  52. package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
  53. package/dist/src/context/graph/mapper.d.ts +4 -2
  54. package/dist/src/context/graph/mapper.js +15 -3
  55. package/dist/src/context/graph/mapper.js.map +1 -1
  56. package/dist/src/context/graph/toGraph.d.ts +13 -2
  57. package/dist/src/context/graph/toGraph.js +88 -32
  58. package/dist/src/context/graph/toGraph.js.map +1 -1
  59. package/dist/src/context/historyObserver.d.ts +1 -0
  60. package/dist/src/context/historyObserver.js +25 -26
  61. package/dist/src/context/historyObserver.js.map +1 -1
  62. package/dist/src/context/initializer.d.ts +9 -0
  63. package/dist/src/context/initializer.js +75 -0
  64. package/dist/src/context/initializer.js.map +1 -0
  65. package/dist/src/context/pipeline/contextWorkingBuffer.js +12 -6
  66. package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
  67. package/dist/src/context/pipeline/contextWorkingBuffer.test.js +1 -1
  68. package/dist/src/context/pipeline/environmentImpl.d.ts +3 -2
  69. package/dist/src/context/pipeline/environmentImpl.js +6 -3
  70. package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
  71. package/dist/src/context/pipeline/environmentImpl.test.js +1 -1
  72. package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
  73. package/dist/src/context/pipeline/orchestrator.js +5 -0
  74. package/dist/src/context/pipeline/orchestrator.js.map +1 -1
  75. package/dist/src/context/processors/toolMaskingProcessor.js +21 -5
  76. package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
  77. package/dist/src/context/processors/toolMaskingProcessor.test.js +22 -0
  78. package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
  79. package/dist/src/context/system-tests/lifecycle.golden.test.js +5 -0
  80. package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
  81. package/dist/src/context/system-tests/simulationHarness.js +1 -1
  82. package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
  83. package/dist/src/context/testing/contextTestUtils.js +7 -3
  84. package/dist/src/context/testing/contextTestUtils.js.map +1 -1
  85. package/dist/src/context/tracer.js +3 -1
  86. package/dist/src/context/tracer.js.map +1 -1
  87. package/dist/src/context/tracer.test.js +4 -2
  88. package/dist/src/context/tracer.test.js.map +1 -1
  89. package/dist/src/context/utils/contextTokenCalculator.d.ts +2 -1
  90. package/dist/src/context/utils/contextTokenCalculator.js +13 -11
  91. package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
  92. package/dist/src/core/client.d.ts +1 -0
  93. package/dist/src/core/client.js +9 -8
  94. package/dist/src/core/client.js.map +1 -1
  95. package/dist/src/core/client.test.js +0 -3
  96. package/dist/src/core/client.test.js.map +1 -1
  97. package/dist/src/core/geminiChat.d.ts +2 -1
  98. package/dist/src/core/geminiChat.js +72 -20
  99. package/dist/src/core/geminiChat.js.map +1 -1
  100. package/dist/src/core/geminiChat.test.js +1 -0
  101. package/dist/src/core/geminiChat.test.js.map +1 -1
  102. package/dist/src/core/geminiChat_network_retry.test.js +1 -0
  103. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  104. package/dist/src/core/tokenLimits.d.ts +1 -0
  105. package/dist/src/core/tokenLimits.js +5 -1
  106. package/dist/src/core/tokenLimits.js.map +1 -1
  107. package/dist/src/generated/git-commit.d.ts +2 -2
  108. package/dist/src/generated/git-commit.js +2 -2
  109. package/dist/src/index.d.ts +9 -1
  110. package/dist/src/index.js +10 -1
  111. package/dist/src/index.js.map +1 -1
  112. package/dist/src/policy/policy-engine.js +12 -7
  113. package/dist/src/policy/policy-engine.js.map +1 -1
  114. package/dist/src/policy/policy-engine.test.js +69 -1
  115. package/dist/src/policy/policy-engine.test.js.map +1 -1
  116. package/dist/src/prompts/snippets.js +2 -1
  117. package/dist/src/prompts/snippets.js.map +1 -1
  118. package/dist/src/prompts/snippets.legacy.js +2 -1
  119. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  120. package/dist/src/services/chatRecordingService.d.ts +1 -0
  121. package/dist/src/services/chatRecordingService.js +23 -0
  122. package/dist/src/services/chatRecordingService.js.map +1 -1
  123. package/dist/src/services/chatRecordingTypes.d.ts +13 -0
  124. package/dist/src/services/memoryService.d.ts +5 -0
  125. package/dist/src/services/memoryService.js +76 -53
  126. package/dist/src/services/memoryService.js.map +1 -1
  127. package/dist/src/services/memoryService.test.js +256 -12
  128. package/dist/src/services/memoryService.test.js.map +1 -1
  129. package/dist/src/services/sessionScratchpadUtils.d.ts +7 -0
  130. package/dist/src/services/sessionScratchpadUtils.js +121 -0
  131. package/dist/src/services/sessionScratchpadUtils.js.map +1 -0
  132. package/dist/src/services/sessionScratchpadUtils.test.d.ts +6 -0
  133. package/dist/src/services/sessionScratchpadUtils.test.js +27 -0
  134. package/dist/src/services/sessionScratchpadUtils.test.js.map +1 -0
  135. package/dist/src/services/sessionSummaryUtils.d.ts +3 -3
  136. package/dist/src/services/sessionSummaryUtils.js +232 -27
  137. package/dist/src/services/sessionSummaryUtils.js.map +1 -1
  138. package/dist/src/services/sessionSummaryUtils.test.js +449 -10
  139. package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
  140. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +283 -259
  141. package/dist/src/services/test-data/resolved-aliases.golden.json +283 -259
  142. package/dist/src/tools/trackerTools.test.js +7 -2
  143. package/dist/src/tools/trackerTools.test.js.map +1 -1
  144. package/dist/src/utils/binaryCheck.d.ts +9 -0
  145. package/dist/src/utils/binaryCheck.js +13 -0
  146. package/dist/src/utils/binaryCheck.js.map +1 -0
  147. package/dist/src/utils/fsErrorMessages.js +4 -0
  148. package/dist/src/utils/fsErrorMessages.js.map +1 -1
  149. package/dist/src/utils/fsErrorMessages.test.js +21 -0
  150. package/dist/src/utils/fsErrorMessages.test.js.map +1 -1
  151. package/dist/src/utils/tokenCalculation.d.ts +2 -2
  152. package/dist/src/utils/tokenCalculation.js +15 -14
  153. package/dist/src/utils/tokenCalculation.js.map +1 -1
  154. package/dist/src/voice/audioRecorder.d.ts +27 -0
  155. package/dist/src/voice/audioRecorder.js +95 -0
  156. package/dist/src/voice/audioRecorder.js.map +1 -0
  157. package/dist/src/voice/geminiLiveTranscriptionProvider.d.ts +20 -0
  158. package/dist/src/voice/geminiLiveTranscriptionProvider.js +140 -0
  159. package/dist/src/voice/geminiLiveTranscriptionProvider.js.map +1 -0
  160. package/dist/src/voice/transcriptionFactory.d.ts +12 -0
  161. package/dist/src/voice/transcriptionFactory.js +32 -0
  162. package/dist/src/voice/transcriptionFactory.js.map +1 -0
  163. package/dist/src/voice/transcriptionProvider.d.ts +29 -0
  164. package/dist/src/voice/transcriptionProvider.js +7 -0
  165. package/dist/src/voice/transcriptionProvider.js.map +1 -0
  166. package/dist/src/voice/whisperModelManager.d.ts +26 -0
  167. package/dist/src/voice/whisperModelManager.js +79 -0
  168. package/dist/src/voice/whisperModelManager.js.map +1 -0
  169. package/dist/src/voice/whisperTranscriptionProvider.d.ts +34 -0
  170. package/dist/src/voice/whisperTranscriptionProvider.js +151 -0
  171. package/dist/src/voice/whisperTranscriptionProvider.js.map +1 -0
  172. package/dist/src/voice/whisperTranscriptionProvider.test.d.ts +6 -0
  173. package/dist/src/voice/whisperTranscriptionProvider.test.js +24 -0
  174. package/dist/src/voice/whisperTranscriptionProvider.test.js.map +1 -0
  175. package/dist/tsconfig.tsbuildinfo +1 -1
  176. package/package.json +2 -1
@@ -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;CAC5E,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"}
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":"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"}
@@ -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 / 4.
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 / 4;
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) / 4;
72
+ let totalTokens = (fr.name?.length ?? 0) / charsPerToken;
72
73
  const response = fr.response;
73
74
  if (typeof response === 'string') {
74
- totalTokens += response.length / 4;
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 / 4;
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 / 4.
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 / 4;
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":"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"}
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":"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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geminiLiveTranscriptionProvider.js","sourceRoot":"","sources":["../../../src/voice/geminiLiveTranscriptionProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { TranscriptionProvider } from './transcriptionProvider.js';
7
+ export declare class TranscriptionFactory {
8
+ static createProvider(voiceConfig: {
9
+ backend?: string;
10
+ whisperModel?: string;
11
+ } | undefined, apiKey: string): TranscriptionProvider;
12
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as path from 'node:path';
7
+ import * as fs from 'node:fs';
8
+ import { homedir, CELL_DIR } from '../utils/paths.js';
9
+ import { GeminiLiveTranscriptionProvider } from './geminiLiveTranscriptionProvider.js';
10
+ import { WhisperTranscriptionProvider } from './whisperTranscriptionProvider.js';
11
+ export class TranscriptionFactory {
12
+ static createProvider(voiceConfig, apiKey) {
13
+ const backend = voiceConfig?.backend ?? 'gemini-live';
14
+ if (backend === 'whisper') {
15
+ const modelsDir = path.join(homedir(), CELL_DIR, 'whisper_models');
16
+ if (!fs.existsSync(modelsDir)) {
17
+ fs.mkdirSync(modelsDir, { recursive: true });
18
+ }
19
+ const modelName = voiceConfig?.whisperModel ?? 'ggml-base.en.bin';
20
+ const modelPath = path.join(modelsDir, modelName);
21
+ return new WhisperTranscriptionProvider({
22
+ modelPath,
23
+ threads: 4,
24
+ step: 0,
25
+ length: 5000,
26
+ });
27
+ }
28
+ // Default to Gemini Live
29
+ return new GeminiLiveTranscriptionProvider(apiKey);
30
+ }
31
+ }
32
+ //# sourceMappingURL=transcriptionFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriptionFactory.js","sourceRoot":"","sources":["../../../src/voice/transcriptionFactory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AACvF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAGjF,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAC,cAAc,CACnB,WAAoE,EACpE,MAAc;QAEd,MAAM,OAAO,GAAG,WAAW,EAAE,OAAO,IAAI,aAAa,CAAC;QAEtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;YACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,CAAC;YAED,MAAM,SAAS,GAAG,WAAW,EAAE,YAAY,IAAI,kBAAkB,CAAC;YAClE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAElD,OAAO,IAAI,4BAA4B,CAAC;gBACtC,SAAS;gBACT,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC;QAED,yBAAyB;QACzB,OAAO,IAAI,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { EventEmitter } from 'node:events';
7
+ export interface TranscriptionEvents {
8
+ /** Emitted when partial or full transcription text is available. */
9
+ transcription: [string];
10
+ /** Emitted when a speaking turn is considered complete. */
11
+ turnComplete: [];
12
+ /** Emitted when an error occurs during transcription. */
13
+ error: [Error];
14
+ /** Emitted when the transcription service connection is closed. */
15
+ close: [];
16
+ }
17
+ /**
18
+ * Common interface for all transcription backends (Cloud or Local).
19
+ */
20
+ export interface TranscriptionProvider extends EventEmitter<TranscriptionEvents> {
21
+ /** Establish connection to the transcription service. */
22
+ connect(): Promise<void>;
23
+ /** Send a chunk of raw audio data to the service. */
24
+ sendAudioChunk(chunk: Buffer): void;
25
+ /** Disconnect from the transcription service. */
26
+ disconnect(): void;
27
+ /** Get the current full transcription for the session. */
28
+ getTranscription(): string;
29
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=transcriptionProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriptionProvider.js","sourceRoot":"","sources":["../../../src/voice/transcriptionProvider.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,26 @@
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 WhisperModelProgress {
8
+ modelName: string;
9
+ transferred: number;
10
+ total: number;
11
+ percentage: number;
12
+ }
13
+ export interface WhisperModelManagerEvents {
14
+ progress: [WhisperModelProgress];
15
+ }
16
+ /**
17
+ * Manages Whisper models (checking existence, downloading).
18
+ */
19
+ export declare class WhisperModelManager extends EventEmitter<WhisperModelManagerEvents> {
20
+ private readonly modelsDir;
21
+ constructor();
22
+ isModelInstalled(modelName: string): boolean;
23
+ getModelPath(modelName: string): string;
24
+ downloadModel(modelName: string): Promise<void>;
25
+ private validateModelName;
26
+ }