@tyvm/knowhow 0.0.159 → 0.0.161

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 (906) hide show
  1. package/README.md +6 -6
  2. package/package.json +2 -2
  3. package/ts_build/package.json +2 -2
  4. package/ts_build/src/chat/CliChatService.d.ts +2 -1
  5. package/ts_build/src/chat/CliChatService.js +29 -3
  6. package/ts_build/src/chat/CliChatService.js.map +1 -1
  7. package/ts_build/src/chat/modules/AgentModule.js +21 -17
  8. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  9. package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
  10. package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
  11. package/ts_build/src/clients/anthropic.js +4 -1
  12. package/ts_build/src/clients/anthropic.js.map +1 -1
  13. package/ts_build/src/clients/contextLimits.js +13 -7
  14. package/ts_build/src/clients/contextLimits.js.map +1 -1
  15. package/ts_build/src/clients/index.js +3 -1
  16. package/ts_build/src/clients/index.js.map +1 -1
  17. package/ts_build/src/clients/openai.js +18 -5
  18. package/ts_build/src/clients/openai.js.map +1 -1
  19. package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
  20. package/ts_build/src/clients/pricing/anthropic.js +21 -1
  21. package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
  22. package/ts_build/src/clients/pricing/openai.d.ts +2 -0
  23. package/ts_build/src/clients/pricing/openai.js +32 -7
  24. package/ts_build/src/clients/pricing/openai.js.map +1 -1
  25. package/ts_build/src/clients/pricing/types.d.ts +4 -0
  26. package/ts_build/src/clients/pricing/types.js.map +1 -1
  27. package/ts_build/src/clients/pricing/xai.d.ts +2 -0
  28. package/ts_build/src/clients/pricing/xai.js +13 -8
  29. package/ts_build/src/clients/pricing/xai.js.map +1 -1
  30. package/ts_build/src/clients/xai.js +20 -8
  31. package/ts_build/src/clients/xai.js.map +1 -1
  32. package/ts_build/src/commands/misc.js +15 -2
  33. package/ts_build/src/commands/misc.js.map +1 -1
  34. package/ts_build/src/logger.d.ts +1 -0
  35. package/ts_build/src/logger.js +13 -1
  36. package/ts_build/src/logger.js.map +1 -1
  37. package/ts_build/src/remotes.d.ts +2 -0
  38. package/ts_build/src/remotes.js +20 -2
  39. package/ts_build/src/remotes.js.map +1 -1
  40. package/ts_build/src/tunnel.js +7 -2
  41. package/ts_build/src/tunnel.js.map +1 -1
  42. package/ts_build/src/types.d.ts +12 -1
  43. package/ts_build/src/types.js.map +1 -1
  44. package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
  45. package/ts_build/src/utils/InputQueueManager.js +74 -3
  46. package/ts_build/src/utils/InputQueueManager.js.map +1 -1
  47. package/ts_build/src/utils/index.d.ts +3 -1
  48. package/ts_build/src/utils/index.js +11 -3
  49. package/ts_build/src/utils/index.js.map +1 -1
  50. package/ts_build/src/worker.js +4 -1
  51. package/ts_build/src/worker.js.map +1 -1
  52. package/ts_build/src/workers/tools/listAllowedPorts.d.ts +2 -1
  53. package/ts_build/src/workers/tools/listAllowedPorts.js +1 -1
  54. package/ts_build/src/workers/tools/listAllowedPorts.js.map +1 -1
  55. package/CONFIG.md +0 -429
  56. package/PROCESSING.md +0 -450
  57. package/WORKER.md +0 -260
  58. package/autodoc/README.md +0 -324
  59. package/autodoc/chat-guide.md +0 -444
  60. package/autodoc/cli-reference.md +0 -720
  61. package/autodoc/config-reference.md +0 -642
  62. package/autodoc/embeddings-guide.md +0 -467
  63. package/autodoc/generate-guide.md +0 -437
  64. package/autodoc/language-plugin-guide.md +0 -417
  65. package/autodoc/modules-guide.md +0 -379
  66. package/autodoc/plugins-guide.md +0 -721
  67. package/autodoc/quickstart-guide.md +0 -126
  68. package/autodoc/skills-guide.md +0 -584
  69. package/autodoc/worker-guide.md +0 -519
  70. package/docs/input-queue-manager.md +0 -142
  71. package/docs/multi-worker-management.md +0 -142
  72. package/docs/shell-commands.md +0 -174
  73. package/jest.config.js +0 -19
  74. package/jest.manual.config.js +0 -19
  75. package/scripts/README.md +0 -119
  76. package/scripts/build-for-node.sh +0 -148
  77. package/scripts/cache-miss-debug.ts +0 -365
  78. package/scripts/check-isolated-deps.sh +0 -69
  79. package/scripts/check-model-pricing.ts +0 -509
  80. package/scripts/compare-openrouter-coverage.ts +0 -576
  81. package/scripts/migrate-usage-json.js +0 -147
  82. package/scripts/publish.sh +0 -86
  83. package/scripts/restore_keys.sh +0 -59
  84. package/scripts/test-repetition-hint.ts +0 -302
  85. package/scripts/unset_keys.sh +0 -60
  86. package/src/agents/base/base.ts +0 -1963
  87. package/src/agents/base/prompt.ts +0 -55
  88. package/src/agents/configurable/ConfigAgent.ts +0 -24
  89. package/src/agents/developer/developer.ts +0 -76
  90. package/src/agents/historyRollback.ts +0 -36
  91. package/src/agents/index.ts +0 -52
  92. package/src/agents/interface.ts +0 -11
  93. package/src/agents/patcher/codebase.md +0 -27
  94. package/src/agents/patcher/patcher.ts +0 -131
  95. package/src/agents/researcher/researcher.ts +0 -115
  96. package/src/agents/setup/setup.ts +0 -63
  97. package/src/agents/tools/addInternalTools.ts +0 -21
  98. package/src/agents/tools/agentCall.ts +0 -34
  99. package/src/agents/tools/aiClient.ts +0 -178
  100. package/src/agents/tools/askHuman.ts +0 -10
  101. package/src/agents/tools/callPlugin.ts +0 -10
  102. package/src/agents/tools/connectAgent.ts +0 -355
  103. package/src/agents/tools/embeddingSearch.ts +0 -6
  104. package/src/agents/tools/execCommand.ts +0 -162
  105. package/src/agents/tools/fileSearch.ts +0 -35
  106. package/src/agents/tools/finalAnswer.ts +0 -4
  107. package/src/agents/tools/googleSearch.ts +0 -243
  108. package/src/agents/tools/index.ts +0 -33
  109. package/src/agents/tools/language/definitions.ts +0 -105
  110. package/src/agents/tools/language/index.ts +0 -20
  111. package/src/agents/tools/lazy/definitions.ts +0 -72
  112. package/src/agents/tools/lazy/disableTools.ts +0 -16
  113. package/src/agents/tools/lazy/enableTools.ts +0 -16
  114. package/src/agents/tools/lazy/index.ts +0 -3
  115. package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
  116. package/src/agents/tools/lintFile.ts +0 -19
  117. package/src/agents/tools/list.ts +0 -739
  118. package/src/agents/tools/loadImageAsBase64.ts +0 -83
  119. package/src/agents/tools/loadWebpage.ts +0 -19
  120. package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
  121. package/src/agents/tools/mcp/definitions.ts +0 -67
  122. package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
  123. package/src/agents/tools/mcp/index.ts +0 -3
  124. package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
  125. package/src/agents/tools/minimal/callTool.ts +0 -45
  126. package/src/agents/tools/minimal/definitions.ts +0 -50
  127. package/src/agents/tools/minimal/index.ts +0 -3
  128. package/src/agents/tools/minimal/inspectTools.ts +0 -27
  129. package/src/agents/tools/modifyFile.ts +0 -53
  130. package/src/agents/tools/observe.ts +0 -247
  131. package/src/agents/tools/patch.ts +0 -1287
  132. package/src/agents/tools/readBlocks.ts +0 -83
  133. package/src/agents/tools/readFile.ts +0 -105
  134. package/src/agents/tools/replyToParent.ts +0 -123
  135. package/src/agents/tools/runGenerate.ts +0 -210
  136. package/src/agents/tools/scanFile.ts +0 -16
  137. package/src/agents/tools/sendAgentMessage.ts +0 -139
  138. package/src/agents/tools/skills.ts +0 -79
  139. package/src/agents/tools/startAgentTask.ts +0 -393
  140. package/src/agents/tools/stringReplace.ts +0 -105
  141. package/src/agents/tools/textSearch.ts +0 -128
  142. package/src/agents/tools/types/fileblock.ts +0 -5
  143. package/src/agents/tools/visionTool.ts +0 -35
  144. package/src/agents/tools/waitForAgentCompleted.ts +0 -270
  145. package/src/agents/tools/writeFile.ts +0 -106
  146. package/src/agents/tools/ycmd/client.ts +0 -608
  147. package/src/agents/tools/ycmd/definitions.ts +0 -294
  148. package/src/agents/tools/ycmd/detection.ts +0 -211
  149. package/src/agents/tools/ycmd/index.ts +0 -11
  150. package/src/agents/tools/ycmd/installer.ts +0 -251
  151. package/src/agents/tools/ycmd/server.ts +0 -545
  152. package/src/agents/tools/ycmd/serverManager.ts +0 -316
  153. package/src/agents/tools/ycmd/tools/completion.ts +0 -113
  154. package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
  155. package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
  156. package/src/agents/tools/ycmd/tools/goto.ts +0 -169
  157. package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
  158. package/src/agents/tools/ycmd/tools/signature.ts +0 -174
  159. package/src/agents/tools/ycmd/tools/start.ts +0 -95
  160. package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
  161. package/src/ai.ts +0 -306
  162. package/src/auth/browserLogin.ts +0 -406
  163. package/src/auth/environmentAuth.ts +0 -51
  164. package/src/auth/errors.ts +0 -6
  165. package/src/auth/jwtStore.ts +0 -70
  166. package/src/auth/keyAuth.ts +0 -142
  167. package/src/auth/keyManager.ts +0 -331
  168. package/src/auth/registerIdentity.ts +0 -67
  169. package/src/auth/spinner.ts +0 -23
  170. package/src/chat/CliChatService.ts +0 -438
  171. package/src/chat/modules/AgentModule.ts +0 -1664
  172. package/src/chat/modules/AskModule.ts +0 -98
  173. package/src/chat/modules/BaseChatModule.ts +0 -65
  174. package/src/chat/modules/ClipboardImageModule.ts +0 -136
  175. package/src/chat/modules/CustomCommandsModule.ts +0 -80
  176. package/src/chat/modules/InternalChatModule.ts +0 -216
  177. package/src/chat/modules/RemoteSyncModule.ts +0 -482
  178. package/src/chat/modules/RendererModule.ts +0 -139
  179. package/src/chat/modules/SearchModule.ts +0 -168
  180. package/src/chat/modules/SessionsModule.ts +0 -969
  181. package/src/chat/modules/SetupModule.ts +0 -185
  182. package/src/chat/modules/ShellCommandModule.ts +0 -98
  183. package/src/chat/modules/SystemModule.ts +0 -161
  184. package/src/chat/modules/ToolCommandModule.ts +0 -102
  185. package/src/chat/modules/VoiceModule.ts +0 -70
  186. package/src/chat/modules/index.ts +0 -8
  187. package/src/chat/renderer/CompactRenderer.ts +0 -229
  188. package/src/chat/renderer/ConsoleRenderer.ts +0 -160
  189. package/src/chat/renderer/FancyRenderer.ts +0 -440
  190. package/src/chat/renderer/PlainRenderer.ts +0 -218
  191. package/src/chat/renderer/index.ts +0 -6
  192. package/src/chat/renderer/loadRenderer.ts +0 -316
  193. package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
  194. package/src/chat/renderer/types.ts +0 -99
  195. package/src/chat/types.ts +0 -146
  196. package/src/chat.ts +0 -140
  197. package/src/cli.ts +0 -180
  198. package/src/clients/anthropic.ts +0 -772
  199. package/src/clients/attribution.ts +0 -53
  200. package/src/clients/cerebras.ts +0 -10
  201. package/src/clients/contextLimits.ts +0 -263
  202. package/src/clients/copilot.ts +0 -23
  203. package/src/clients/deepseek.ts +0 -16
  204. package/src/clients/fireworks.ts +0 -71
  205. package/src/clients/gemini.ts +0 -1169
  206. package/src/clients/github.ts +0 -16
  207. package/src/clients/groq.ts +0 -15
  208. package/src/clients/http.ts +0 -719
  209. package/src/clients/index.ts +0 -1153
  210. package/src/clients/knowhow.ts +0 -130
  211. package/src/clients/knowhowMcp.ts +0 -118
  212. package/src/clients/llama.ts +0 -16
  213. package/src/clients/meta.ts +0 -27
  214. package/src/clients/mistral.ts +0 -16
  215. package/src/clients/nvidia.ts +0 -16
  216. package/src/clients/openai.ts +0 -1186
  217. package/src/clients/openrouter.ts +0 -24
  218. package/src/clients/pricing/anthropic.ts +0 -149
  219. package/src/clients/pricing/cerebras.ts +0 -11
  220. package/src/clients/pricing/copilot.ts +0 -60
  221. package/src/clients/pricing/deepseek.ts +0 -15
  222. package/src/clients/pricing/fireworks.ts +0 -182
  223. package/src/clients/pricing/github.ts +0 -69
  224. package/src/clients/pricing/google.ts +0 -385
  225. package/src/clients/pricing/groq.ts +0 -56
  226. package/src/clients/pricing/index.ts +0 -44
  227. package/src/clients/pricing/llama.ts +0 -18
  228. package/src/clients/pricing/meta.ts +0 -12
  229. package/src/clients/pricing/mistral.ts +0 -34
  230. package/src/clients/pricing/models.ts +0 -25
  231. package/src/clients/pricing/nvidia.ts +0 -102
  232. package/src/clients/pricing/openai.ts +0 -409
  233. package/src/clients/pricing/openrouter.ts +0 -36
  234. package/src/clients/pricing/qwen.ts +0 -80
  235. package/src/clients/pricing/types.ts +0 -125
  236. package/src/clients/pricing/xai.ts +0 -137
  237. package/src/clients/qwen.ts +0 -16
  238. package/src/clients/responseMetadata.ts +0 -221
  239. package/src/clients/types.ts +0 -531
  240. package/src/clients/withRetry.ts +0 -89
  241. package/src/clients/xai.ts +0 -693
  242. package/src/cloudWorker.ts +0 -394
  243. package/src/commands/agent.ts +0 -342
  244. package/src/commands/agents.ts +0 -1037
  245. package/src/commands/behaviors.ts +0 -47
  246. package/src/commands/convert.ts +0 -291
  247. package/src/commands/hash.ts +0 -179
  248. package/src/commands/mcp.ts +0 -743
  249. package/src/commands/misc.ts +0 -373
  250. package/src/commands/modules.ts +0 -704
  251. package/src/commands/processes.ts +0 -248
  252. package/src/commands/remote.ts +0 -77
  253. package/src/commands/replay.ts +0 -503
  254. package/src/commands/sandbox.ts +0 -566
  255. package/src/commands/services.ts +0 -168
  256. package/src/commands/skills.ts +0 -107
  257. package/src/commands/workers.ts +0 -168
  258. package/src/config.ts +0 -468
  259. package/src/conversion.ts +0 -69
  260. package/src/dataset/diffs/README.md +0 -12
  261. package/src/dataset/diffs/debug-errors.ts +0 -29
  262. package/src/dataset/diffs/debug.ts +0 -64
  263. package/src/dataset/diffs/generate.ts +0 -71
  264. package/src/dataset/diffs/jsonl.ts +0 -53
  265. package/src/dataset/diffs/test.ts +0 -194
  266. package/src/embeddings.ts +0 -494
  267. package/src/fileSync.ts +0 -369
  268. package/src/generate.ts +0 -529
  269. package/src/hashes.ts +0 -180
  270. package/src/index.ts +0 -261
  271. package/src/logger.ts +0 -197
  272. package/src/login.ts +0 -209
  273. package/src/microphone.ts +0 -141
  274. package/src/migrations.ts +0 -151
  275. package/src/plugins/AgentsMdPlugin.ts +0 -118
  276. package/src/plugins/GitPlugin.ts +0 -598
  277. package/src/plugins/LinterPlugin.ts +0 -214
  278. package/src/plugins/PluginBase.ts +0 -70
  279. package/src/plugins/SkillsPlugin.ts +0 -37
  280. package/src/plugins/embedding.ts +0 -82
  281. package/src/plugins/exec.ts +0 -70
  282. package/src/plugins/language.ts +0 -290
  283. package/src/plugins/plugins.ts +0 -175
  284. package/src/plugins/tmux.ts +0 -132
  285. package/src/plugins/types.ts +0 -36
  286. package/src/plugins/url.ts +0 -101
  287. package/src/plugins/vim.ts +0 -89
  288. package/src/processes/ProcessManager.ts +0 -96
  289. package/src/processes/managedProcessShim.ts +0 -138
  290. package/src/processors/Base64ImageDetector.ts +0 -502
  291. package/src/processors/CustomVariables.ts +0 -693
  292. package/src/processors/GemmaToolProcessor.ts +0 -163
  293. package/src/processors/HarmonyToolProcessor.ts +0 -264
  294. package/src/processors/JsonCompressor.ts +0 -510
  295. package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
  296. package/src/processors/TokenCompressor.ts +0 -620
  297. package/src/processors/ToolResponseCache.ts +0 -322
  298. package/src/processors/XmlToolCallProcessor.ts +0 -533
  299. package/src/processors/index.ts +0 -14
  300. package/src/processors/tools/boundedToolResponse.ts +0 -49
  301. package/src/processors/tools/grepToolResponse.ts +0 -230
  302. package/src/processors/tools/index.ts +0 -23
  303. package/src/processors/tools/jqToolResponse.ts +0 -159
  304. package/src/processors/tools/listStoredToolResponses.ts +0 -124
  305. package/src/processors/tools/tailToolResponse.ts +0 -148
  306. package/src/prompts/BasicCodeDocumenter.ts +0 -1
  307. package/src/prompts/BasicProjectDocumenter.ts +0 -1
  308. package/src/prompts/EmbeddingSeachHelper.ts +0 -1
  309. package/src/prompts/KnowhowConfigExamples.ts +0 -376
  310. package/src/prompts/index.ts +0 -9
  311. package/src/remotes.ts +0 -110
  312. package/src/server/index.ts +0 -16
  313. package/src/services/AgentService.ts +0 -134
  314. package/src/services/AgentSyncFs.ts +0 -775
  315. package/src/services/AgentSyncKnowhowWeb.ts +0 -389
  316. package/src/services/BehaviorsService.ts +0 -466
  317. package/src/services/DockerService.ts +0 -511
  318. package/src/services/EmbeddingService.ts +0 -427
  319. package/src/services/EmbeddingsService.ts +0 -73
  320. package/src/services/EventService.ts +0 -279
  321. package/src/services/ExtensionsService.ts +0 -25
  322. package/src/services/KnowhowClient.ts +0 -928
  323. package/src/services/LazyToolsService.ts +0 -210
  324. package/src/services/Mcp.ts +0 -727
  325. package/src/services/McpServer.ts +0 -155
  326. package/src/services/McpWebsocketTransport.ts +0 -87
  327. package/src/services/MediaProcessorService.ts +0 -669
  328. package/src/services/MessageProcessor.ts +0 -114
  329. package/src/services/MinimalToolsService.ts +0 -177
  330. package/src/services/RuntimeReloadService.ts +0 -31
  331. package/src/services/S3.ts +0 -61
  332. package/src/services/SessionManager.ts +0 -358
  333. package/src/services/SkillsService.ts +0 -822
  334. package/src/services/SyncedAgentWatcher.ts +0 -124
  335. package/src/services/SyncerService.ts +0 -191
  336. package/src/services/TaskRegistry.ts +0 -110
  337. package/src/services/Tools.ts +0 -580
  338. package/src/services/TracingService.ts +0 -116
  339. package/src/services/conversion/ConversionService.ts +0 -757
  340. package/src/services/conversion/index.ts +0 -2
  341. package/src/services/conversion/types.ts +0 -87
  342. package/src/services/flags.ts +0 -51
  343. package/src/services/index.ts +0 -117
  344. package/src/services/modules/computerUse.ts +0 -218
  345. package/src/services/modules/index.ts +0 -314
  346. package/src/services/modules/types.ts +0 -109
  347. package/src/services/types.ts +0 -60
  348. package/src/services/watchers/FsSyncer.ts +0 -199
  349. package/src/services/watchers/RemoteSyncer.ts +0 -196
  350. package/src/services/watchers/index.ts +0 -2
  351. package/src/tunnel.ts +0 -243
  352. package/src/types.ts +0 -282
  353. package/src/util/Trace.ts +0 -236
  354. package/src/utils/InputQueueManager.ts +0 -493
  355. package/src/utils/errors.ts +0 -0
  356. package/src/utils/http.ts +0 -150
  357. package/src/utils/index.ts +0 -111
  358. package/src/worker.ts +0 -696
  359. package/src/workerRegistry.ts +0 -152
  360. package/src/workers/auth/PasskeySetup.ts +0 -181
  361. package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
  362. package/src/workers/auth/WsMiddleware.ts +0 -99
  363. package/src/workers/auth/authMiddleware.ts +0 -104
  364. package/src/workers/auth/types.ts +0 -70
  365. package/src/workers/tools/getChallenge.ts +0 -33
  366. package/src/workers/tools/index.ts +0 -20
  367. package/src/workers/tools/listAllowedPorts.ts +0 -30
  368. package/src/workers/tools/lock.ts +0 -31
  369. package/src/workers/tools/reloadConfig.ts +0 -84
  370. package/src/workers/tools/unlock.ts +0 -116
  371. package/tests/XmlToolCallProcessor.test.ts +0 -468
  372. package/tests/agents/interrupt.test.ts +0 -200
  373. package/tests/agents/observe-base.test.ts +0 -183
  374. package/tests/agents/tools/connectAgent.test.ts +0 -138
  375. package/tests/agents/tools/observe.test.ts +0 -179
  376. package/tests/agents/tools/readFile.test.ts +0 -88
  377. package/tests/agents/tools/replyToParent.test.ts +0 -125
  378. package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
  379. package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
  380. package/tests/chat/detach-attach-rendering.test.ts +0 -315
  381. package/tests/clients/AIClient.test.ts +0 -668
  382. package/tests/clients/anthropic.test.ts +0 -202
  383. package/tests/clients/contextLimits.test.ts +0 -97
  384. package/tests/clients/fireworks.test.ts +0 -65
  385. package/tests/clients/openai.images.test.ts +0 -105
  386. package/tests/clients/pricing.test.ts +0 -206
  387. package/tests/clients/reasoningEffort.test.ts +0 -140
  388. package/tests/compressor/bigstring.test.ts +0 -450
  389. package/tests/compressor/bigstring.txt +0 -1
  390. package/tests/compressor/githubjson.txt +0 -1
  391. package/tests/compressor/toolResponseCache.test.ts +0 -304
  392. package/tests/compressor/usageBase64.json +0 -159
  393. package/tests/compressor/usageBase64.test.ts +0 -175
  394. package/tests/fixtures/fake-secret.txt +0 -1
  395. package/tests/manual/agent-events/run-test.ts +0 -203
  396. package/tests/manual/browser-login/README.md +0 -189
  397. package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
  398. package/tests/manual/browser-login/test_cli_integration.ts +0 -169
  399. package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
  400. package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
  401. package/tests/manual/cli/no-env.sh +0 -274
  402. package/tests/manual/clients/completions.json +0 -1151
  403. package/tests/manual/clients/completions.test.ts +0 -198
  404. package/tests/manual/file-edits/figma.test.ts +0 -3
  405. package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
  406. package/tests/manual/file-edits/patching/input.txt +0 -145
  407. package/tests/manual/file-edits/patching/output.txt +0 -145
  408. package/tests/manual/file-edits/patching/patch.txt +0 -15
  409. package/tests/manual/file-edits/patching/unseen.txt +0 -80
  410. package/tests/manual/file-edits/patching.test.ts +0 -139
  411. package/tests/manual/modalities/README.md +0 -157
  412. package/tests/manual/modalities/google.modalities.test.ts +0 -335
  413. package/tests/manual/modalities/openai.modalities.test.ts +0 -329
  414. package/tests/manual/modalities/streaming.test.ts +0 -260
  415. package/tests/manual/modalities/xai.modalities.test.ts +0 -294
  416. package/tests/manual/test-concurrent-ask.ts +0 -43
  417. package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
  418. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
  419. package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
  420. package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
  421. package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
  422. package/tests/manual/ycmd/simple_test.ts +0 -74
  423. package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
  424. package/tests/manual/ycmd/test_advanced_features.ts +0 -407
  425. package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
  426. package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
  427. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
  428. package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
  429. package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
  430. package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
  431. package/tests/manual/ycmd/test_discover_commands.ts +0 -310
  432. package/tests/manual/ycmd/test_endpoints.ts +0 -115
  433. package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
  434. package/tests/manual/ycmd/test_final_validation.ts +0 -150
  435. package/tests/manual/ycmd/test_implementation.js +0 -42
  436. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
  437. package/tests/manual/ycmd/test_server_manager.ts +0 -52
  438. package/tests/manual/ycmd/test_simple_debug.ts +0 -86
  439. package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
  440. package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
  441. package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
  442. package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
  443. package/tests/manual/ycmd/test_workspace_config.ts +0 -90
  444. package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
  445. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
  446. package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
  447. package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
  448. package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
  449. package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
  450. package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
  451. package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
  452. package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
  453. package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
  454. package/tests/manual/ycmd/working_simple_test.ts +0 -134
  455. package/tests/patching/corrupted.test.ts +0 -78
  456. package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
  457. package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
  458. package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
  459. package/tests/patching/imports.patch.txt +0 -11
  460. package/tests/patching/imports.test.ts +0 -43
  461. package/tests/patching/imports.txt +0 -11
  462. package/tests/patching/interface.patch.txt +0 -15
  463. package/tests/patching/interface.txt +0 -7
  464. package/tests/patching/patchFileOutput.test.ts +0 -328
  465. package/tests/patching/regression-2026.test.ts +0 -752
  466. package/tests/patching/transcriptMangleRegression.test.ts +0 -125
  467. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
  468. package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
  469. package/tests/plugins/language/languagePlugin.test.ts +0 -385
  470. package/tests/processes/managedProcessShim.test.ts +0 -59
  471. package/tests/processors/Base64ImageDetector.test.ts +0 -979
  472. package/tests/processors/CustomVariables.test.ts +0 -981
  473. package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
  474. package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
  475. package/tests/processors/TokenCompressor.test.ts +0 -674
  476. package/tests/processors/ToolResponseCache.test.ts +0 -864
  477. package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
  478. package/tests/processors/tools/grepToolResponse.test.ts +0 -159
  479. package/tests/services/ConversionService.test.ts +0 -154
  480. package/tests/services/DockerService.test.ts +0 -24
  481. package/tests/services/Tools.test.ts +0 -1738
  482. package/tests/services/ToolsService.setFunction.test.ts +0 -68
  483. package/tests/services/WorkerReloadConfig.test.ts +0 -141
  484. package/tests/test.spec.ts +0 -163
  485. package/tests/unit/InputQueueManager.test.ts +0 -174
  486. package/tests/unit/McpWebsocketTransport.test.ts +0 -56
  487. package/tests/unit/agents/historyRollback.test.ts +0 -53
  488. package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
  489. package/tests/unit/auth/jwtStore.test.ts +0 -55
  490. package/tests/unit/auth/keyAuth.test.ts +0 -152
  491. package/tests/unit/auth/keyManager.test.ts +0 -130
  492. package/tests/unit/auth/registerIdentity.test.ts +0 -99
  493. package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
  494. package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
  495. package/tests/unit/clients/AIClient.test.ts +0 -454
  496. package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
  497. package/tests/unit/clients/attribution.test.ts +0 -185
  498. package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
  499. package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
  500. package/tests/unit/clients/responseMetadata.test.ts +0 -123
  501. package/tests/unit/clients/withRetry.test.ts +0 -319
  502. package/tests/unit/commands/agents.test.ts +0 -111
  503. package/tests/unit/commands/github-credentials.test.ts +0 -210
  504. package/tests/unit/commands/misc.test.ts +0 -85
  505. package/tests/unit/commands/remote.test.ts +0 -79
  506. package/tests/unit/commands/sandbox.test.ts +0 -350
  507. package/tests/unit/hashes.test.ts +0 -23
  508. package/tests/unit/input-queue.test.ts +0 -80
  509. package/tests/unit/login.test.ts +0 -218
  510. package/tests/unit/modules/moduleLoading.test.ts +0 -305
  511. package/tests/unit/plugins/pluginLoading.test.ts +0 -97
  512. package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
  513. package/tests/unit/services/KnowhowClient.test.ts +0 -84
  514. package/tests/unit/services/LazyToolsService.test.ts +0 -53
  515. package/tests/unit/services/Mcp.test.ts +0 -56
  516. package/tests/unit/services/MinimalToolsService.test.ts +0 -424
  517. package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
  518. package/tests/unit/services/SessionManager.test.ts +0 -43
  519. package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
  520. package/tests/unit/services/SyncerService.test.ts +0 -45
  521. package/tests/unit/tunnel.test.ts +0 -51
  522. package/tests/unit/util/Trace.test.ts +0 -119
  523. package/tests/unit/utils/http.test.ts +0 -43
  524. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
  525. package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
  526. package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
  527. package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
  528. package/ts_build/tests/agents/interrupt.test.js +0 -136
  529. package/ts_build/tests/agents/interrupt.test.js.map +0 -1
  530. package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
  531. package/ts_build/tests/agents/observe-base.test.js +0 -149
  532. package/ts_build/tests/agents/observe-base.test.js.map +0 -1
  533. package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
  534. package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
  535. package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
  536. package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
  537. package/ts_build/tests/agents/tools/observe.test.js +0 -148
  538. package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
  539. package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
  540. package/ts_build/tests/agents/tools/readFile.test.js +0 -90
  541. package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
  542. package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
  543. package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
  544. package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
  545. package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
  546. package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
  547. package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
  548. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
  549. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
  550. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
  551. package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
  552. package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
  553. package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
  554. package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
  555. package/ts_build/tests/clients/AIClient.test.js +0 -483
  556. package/ts_build/tests/clients/AIClient.test.js.map +0 -1
  557. package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
  558. package/ts_build/tests/clients/anthropic.test.js +0 -159
  559. package/ts_build/tests/clients/anthropic.test.js.map +0 -1
  560. package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
  561. package/ts_build/tests/clients/contextLimits.test.js +0 -69
  562. package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
  563. package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
  564. package/ts_build/tests/clients/fireworks.test.js +0 -65
  565. package/ts_build/tests/clients/fireworks.test.js.map +0 -1
  566. package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
  567. package/ts_build/tests/clients/openai.images.test.js +0 -94
  568. package/ts_build/tests/clients/openai.images.test.js.map +0 -1
  569. package/ts_build/tests/clients/pricing.test.d.ts +0 -1
  570. package/ts_build/tests/clients/pricing.test.js +0 -124
  571. package/ts_build/tests/clients/pricing.test.js.map +0 -1
  572. package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
  573. package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
  574. package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
  575. package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
  576. package/ts_build/tests/compressor/bigstring.test.js +0 -275
  577. package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
  578. package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
  579. package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
  580. package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
  581. package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
  582. package/ts_build/tests/compressor/usageBase64.test.js +0 -109
  583. package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
  584. package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
  585. package/ts_build/tests/manual/agent-events/run-test.js +0 -148
  586. package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
  587. package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
  588. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
  589. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
  590. package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
  591. package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
  592. package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
  593. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
  594. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
  595. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
  596. package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
  597. package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
  598. package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
  599. package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
  600. package/ts_build/tests/manual/clients/completions.test.js +0 -151
  601. package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
  602. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
  603. package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
  604. package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
  605. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
  606. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
  607. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
  608. package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
  609. package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
  610. package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
  611. package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
  612. package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
  613. package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
  614. package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
  615. package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
  616. package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
  617. package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
  618. package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
  619. package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
  620. package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
  621. package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
  622. package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
  623. package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
  624. package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
  625. package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
  626. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
  627. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
  628. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
  629. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
  630. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
  631. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
  632. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
  633. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
  634. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
  635. package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
  636. package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
  637. package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
  638. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
  639. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
  640. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
  641. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
  642. package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
  643. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
  644. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
  645. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
  646. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
  647. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
  648. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
  649. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
  650. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
  651. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
  652. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
  653. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
  654. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
  655. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
  656. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
  657. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
  658. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
  659. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
  660. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
  661. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
  662. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
  663. package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
  664. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
  665. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
  666. package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
  667. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
  668. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
  669. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
  670. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
  671. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
  672. package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
  673. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
  674. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
  675. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
  676. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
  677. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
  678. package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
  679. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
  680. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
  681. package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
  682. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
  683. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
  684. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
  685. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
  686. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
  687. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
  688. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
  689. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
  690. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
  691. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
  692. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
  693. package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
  694. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
  695. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
  696. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
  697. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
  698. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
  699. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
  700. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
  701. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
  702. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
  703. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
  704. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
  705. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
  706. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
  707. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
  708. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
  709. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
  710. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
  711. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
  712. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
  713. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
  714. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
  715. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
  716. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
  717. package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
  718. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
  719. package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
  720. package/ts_build/tests/patching/corrupted.test.js +0 -53
  721. package/ts_build/tests/patching/corrupted.test.js.map +0 -1
  722. package/ts_build/tests/patching/imports.test.d.ts +0 -1
  723. package/ts_build/tests/patching/imports.test.js +0 -71
  724. package/ts_build/tests/patching/imports.test.js.map +0 -1
  725. package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
  726. package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
  727. package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
  728. package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
  729. package/ts_build/tests/patching/regression-2026.test.js +0 -528
  730. package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
  731. package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
  732. package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
  733. package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
  734. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
  735. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
  736. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
  737. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
  738. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
  739. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
  740. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
  741. package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
  742. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
  743. package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
  744. package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
  745. package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
  746. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
  747. package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
  748. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
  749. package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
  750. package/ts_build/tests/processors/CustomVariables.test.js +0 -764
  751. package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
  752. package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
  753. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
  754. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
  755. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
  756. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
  757. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
  758. package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
  759. package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
  760. package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
  761. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
  762. package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
  763. package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
  764. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
  765. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
  766. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
  767. package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
  768. package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
  769. package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
  770. package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
  771. package/ts_build/tests/services/ConversionService.test.js +0 -154
  772. package/ts_build/tests/services/ConversionService.test.js.map +0 -1
  773. package/ts_build/tests/services/DockerService.test.d.ts +0 -1
  774. package/ts_build/tests/services/DockerService.test.js +0 -22
  775. package/ts_build/tests/services/DockerService.test.js.map +0 -1
  776. package/ts_build/tests/services/Tools.test.d.ts +0 -1
  777. package/ts_build/tests/services/Tools.test.js +0 -1365
  778. package/ts_build/tests/services/Tools.test.js.map +0 -1
  779. package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
  780. package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
  781. package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
  782. package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
  783. package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
  784. package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
  785. package/ts_build/tests/test.spec.d.ts +0 -1
  786. package/ts_build/tests/test.spec.js +0 -139
  787. package/ts_build/tests/test.spec.js.map +0 -1
  788. package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
  789. package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
  790. package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
  791. package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
  792. package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
  793. package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
  794. package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
  795. package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
  796. package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
  797. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
  798. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
  799. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
  800. package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
  801. package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
  802. package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
  803. package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
  804. package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
  805. package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
  806. package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
  807. package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
  808. package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
  809. package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
  810. package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
  811. package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
  812. package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
  813. package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
  814. package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
  815. package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
  816. package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
  817. package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
  818. package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
  819. package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
  820. package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
  821. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
  822. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
  823. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
  824. package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
  825. package/ts_build/tests/unit/clients/attribution.test.js +0 -153
  826. package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
  827. package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
  828. package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
  829. package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
  830. package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
  831. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
  832. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
  833. package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
  834. package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
  835. package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
  836. package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
  837. package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
  838. package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
  839. package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
  840. package/ts_build/tests/unit/commands/agents.test.js +0 -119
  841. package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
  842. package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
  843. package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
  844. package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
  845. package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
  846. package/ts_build/tests/unit/commands/misc.test.js +0 -70
  847. package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
  848. package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
  849. package/ts_build/tests/unit/commands/remote.test.js +0 -70
  850. package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
  851. package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
  852. package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
  853. package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
  854. package/ts_build/tests/unit/hashes.test.d.ts +0 -1
  855. package/ts_build/tests/unit/hashes.test.js +0 -25
  856. package/ts_build/tests/unit/hashes.test.js.map +0 -1
  857. package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
  858. package/ts_build/tests/unit/input-queue.test.js +0 -32
  859. package/ts_build/tests/unit/input-queue.test.js.map +0 -1
  860. package/ts_build/tests/unit/login.test.d.ts +0 -1
  861. package/ts_build/tests/unit/login.test.js +0 -166
  862. package/ts_build/tests/unit/login.test.js.map +0 -1
  863. package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
  864. package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
  865. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
  866. package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
  867. package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
  868. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
  869. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
  870. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
  871. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
  872. package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
  873. package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
  874. package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
  875. package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
  876. package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
  877. package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
  878. package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
  879. package/ts_build/tests/unit/services/Mcp.test.js +0 -45
  880. package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
  881. package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
  882. package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
  883. package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
  884. package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
  885. package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
  886. package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
  887. package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
  888. package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
  889. package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
  890. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
  891. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
  892. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
  893. package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
  894. package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
  895. package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
  896. package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
  897. package/ts_build/tests/unit/tunnel.test.js +0 -47
  898. package/ts_build/tests/unit/tunnel.test.js.map +0 -1
  899. package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
  900. package/ts_build/tests/unit/util/Trace.test.js +0 -107
  901. package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
  902. package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
  903. package/ts_build/tests/unit/utils/http.test.js +0 -69
  904. package/ts_build/tests/unit/utils/http.test.js.map +0 -1
  905. package/tsconfig.json +0 -34
  906. package/tslint.json +0 -11
@@ -1,1169 +0,0 @@
1
- import {
2
- GoogleGenAI,
3
- Part,
4
- Content,
5
- Tool as GoogleTool, // Rename to avoid conflict with your Tool type
6
- FunctionDeclaration,
7
- FunctionCallingConfigMode,
8
- GenerationConfig,
9
- ToolConfig,
10
- UsageMetadata,
11
- } from "@google/genai";
12
- import * as os from "os";
13
- import * as fsSync from "fs";
14
- import * as pathSync from "path";
15
- import { wait } from "../utils";
16
- import {
17
- EmbeddingModels,
18
- Models,
19
- GoogleThinkingLevelModels,
20
- GoogleThinkingBudgetModels,
21
- GoogleImageModels,
22
- GoogleVideoModels,
23
- GoogleTTSModels,
24
- GoogleEmbeddingModelsList,
25
- GoogleReasoningModels,
26
- } from "../types";
27
- import { GeminiTextPricing } from "./pricing";
28
- import { ContextLimits } from "./contextLimits";
29
- import { ModelModality, TokenUsage } from "./types";
30
-
31
- import {
32
- GenericClient,
33
- CompletionOptions,
34
- CompletionResponse,
35
- EmbeddingOptions,
36
- EmbeddingResponse,
37
- Tool,
38
- Message,
39
- MessageContent,
40
- ToolCall,
41
- OutputMessage,
42
- AudioTranscriptionOptions,
43
- AudioTranscriptionResponse,
44
- AudioGenerationOptions,
45
- AudioGenerationResponse,
46
- ImageGenerationOptions,
47
- ImageGenerationResponse,
48
- VideoGenerationOptions,
49
- VideoGenerationResponse,
50
- VideoStatusOptions,
51
- VideoStatusResponse,
52
- FileUploadOptions,
53
- FileUploadResponse,
54
- FileDownloadOptions,
55
- FileDownloadResponse,
56
- } from "./types";
57
-
58
- function getMimeTypeFromUrl(url: string): string {
59
- if (url.endsWith(".png")) return "image/png";
60
- if (url.endsWith(".gif")) return "image/gif";
61
- if (url.endsWith(".webp")) return "image/webp";
62
- return "image/jpeg";
63
- }
64
-
65
- function getVideoMimeTypeFromUrl(url: string): string {
66
- if (url.endsWith(".mp4")) return "video/mp4";
67
- if (url.endsWith(".webm")) return "video/webm";
68
- if (url.endsWith(".mov")) return "video/quicktime";
69
- if (url.endsWith(".avi")) return "video/x-msvideo";
70
- return "video/mp4";
71
- }
72
-
73
- /**
74
- * Converts raw PCM audio data to WAV format by prepending a WAV header.
75
- * Gemini TTS returns raw 16-bit PCM (audio/L16) which needs a WAV header to be playable.
76
- */
77
- function pcmToWav(
78
- pcmData: Buffer,
79
- sampleRate: number = 24000,
80
- numChannels: number = 1,
81
- bitsPerSample: number = 16
82
- ): Buffer {
83
- const dataSize = pcmData.length;
84
- const headerSize = 44;
85
- const wavBuffer = Buffer.alloc(headerSize + dataSize);
86
-
87
- // RIFF header
88
- wavBuffer.write("RIFF", 0);
89
- wavBuffer.writeUInt32LE(36 + dataSize, 4); // file size - 8
90
- wavBuffer.write("WAVE", 8);
91
-
92
- // fmt chunk
93
- wavBuffer.write("fmt ", 12);
94
- wavBuffer.writeUInt32LE(16, 16); // chunk size
95
- wavBuffer.writeUInt16LE(1, 20); // PCM format
96
- wavBuffer.writeUInt16LE(numChannels, 22);
97
- wavBuffer.writeUInt32LE(sampleRate, 24);
98
- wavBuffer.writeUInt32LE(sampleRate * numChannels * (bitsPerSample / 8), 28); // byte rate
99
- wavBuffer.writeUInt16LE(numChannels * (bitsPerSample / 8), 32); // block align
100
- wavBuffer.writeUInt16LE(bitsPerSample, 34);
101
-
102
- // data chunk
103
- wavBuffer.write("data", 36);
104
- wavBuffer.writeUInt32LE(dataSize, 40);
105
- pcmData.copy(wavBuffer, 44);
106
-
107
- return wavBuffer;
108
- }
109
-
110
- export class GenericGeminiClient implements GenericClient {
111
- private client: GoogleGenAI;
112
- private apiKey?: string;
113
-
114
- constructor(apiKey?: string) {
115
- this.setKey(apiKey || process.env.GEMINI_API_KEY || "");
116
- }
117
-
118
- setKey(apiKey: string) {
119
- this.apiKey = apiKey;
120
- this.client = new GoogleGenAI({
121
- apiKey: apiKey || process.env.GEMINI_API_KEY,
122
- });
123
- }
124
-
125
- /**
126
- * Transforms a generic MessageContent array or string into Google GenAI ContentPart array.
127
- * Handles text and image_url types.
128
- * @param content The generic message content.
129
- * @returns An array of Google GenAI ContentPart.
130
- */
131
- transformContentParts(content: string | MessageContent[]): Part[] {
132
- if (typeof content === "string") {
133
- return [{ text: content }];
134
- }
135
-
136
- return content
137
- .map((part) => {
138
- if (part.type === "text") {
139
- return { text: part.text };
140
- }
141
- if (part.type === "image_url") {
142
- const url = part.image_url.url;
143
- if (url.startsWith("data:")) {
144
- const [header, base64Data] = url.split(",");
145
- const mimeType = header.split(":")[1].split(";")[0];
146
- return {
147
- inlineData: {
148
- data: base64Data,
149
- mimeType,
150
- },
151
- };
152
- }
153
-
154
- // If it's a File API URI
155
- if (url.startsWith("https://generativelanguage.googleapis.com")) {
156
- return {
157
- fileData: {
158
- fileUri: url,
159
- mimeType: getMimeTypeFromUrl(url),
160
- },
161
- };
162
- }
163
- }
164
- if (part.type === "video_url") {
165
- const mimeType = getVideoMimeTypeFromUrl(part.video_url.url);
166
- return {
167
- fileData: {
168
- fileUri: part.video_url.url,
169
- mimeType,
170
- },
171
- };
172
- }
173
- // Handle other potential generic message content types if necessary
174
- // For now, only text and image_url are explicitly handled.
175
- console.warn(
176
- `Unsupported generic message content part type: ${part.type}`
177
- );
178
- return { text: `[Unsupported content type: ${part.type}]` };
179
- })
180
- .filter((part) => !!part); // Filter out any null/undefined parts if transformation fails
181
- }
182
-
183
- /**
184
- * Transforms a generic Message array into a Google GenAI Content array.
185
- * Extracts system messages separately. Maps user, assistant, and tool roles.
186
- * Maps OpenAI-style tool messages to Google's functionResponse parts within user roles.
187
- * Maps OpenAI-style assistant messages with tool_calls to Google's tool_use parts within assistant roles.
188
- * @param messages The generic message array.
189
- * @returns An object containing the system instruction (if any) and the Content array for the API call.
190
- */
191
- transformMessages(messages: Message[]): {
192
- systemInstruction: string | undefined;
193
- contents: Content[];
194
- } {
195
- const googleContents: Content[] = [];
196
- let systemInstruction: string | undefined;
197
-
198
- // Temporary storage for assistant tool calls keyed by ID, needed to map tool results
199
- const assistantToolCalls: { [id: string]: ToolCall } = {};
200
-
201
- for (const msg of messages) {
202
- if (msg.role === "system") {
203
- // System messages go into the systemInstruction field
204
- if (typeof msg.content === "string") {
205
- systemInstruction =
206
- (systemInstruction ? systemInstruction + "\n" : "") + msg.content;
207
- } else {
208
- // System message content is typically string, handle array as text parts?
209
- // Google's systemInstruction is string, so concatenate text parts if array.
210
- systemInstruction =
211
- (systemInstruction ? systemInstruction + "\n" : "") +
212
- this.transformContentParts(msg.content)
213
- .filter((p) => "text" in p && typeof p.text === "string")
214
- .map((p) => p.text)
215
- .join("\n");
216
- }
217
- } else if (msg.role === "user" || msg.role === "assistant") {
218
- const parts = msg.content
219
- ? this.transformContentParts(msg.content)
220
- : [];
221
-
222
- // Add tool_use parts if the assistant message has tool_calls
223
- if (
224
- msg.role === "assistant" &&
225
- msg.tool_calls &&
226
- msg.tool_calls.length > 0
227
- ) {
228
- // Look up any captured thoughtSignatures for this assistant message so
229
- // we can re-attach them to the matching functionCall part (required by
230
- // Gemini 3 to preserve reasoning continuity across tool-use turns).
231
- const details = (msg as any)._reasoning_details;
232
- const sigByCallId: { [id: string]: string } = {};
233
- const standaloneThoughtSigs: string[] = [];
234
- if (details && details.provider === "gemini" && Array.isArray(details.items)) {
235
- for (const item of details.items) {
236
- if (item?.kind === "functionCall" && item.callId) {
237
- sigByCallId[item.callId] = item.thoughtSignature;
238
- } else if (item?.kind === "thoughtSignature" && item.thoughtSignature) {
239
- standaloneThoughtSigs.push(item.thoughtSignature);
240
- }
241
- }
242
- }
243
- for (const toolCall of msg.tool_calls) {
244
- const callPart: any = {
245
- functionCall: {
246
- name: toolCall.function.name,
247
- // Google expects arguments as a parsed object, not a string
248
- args: JSON.parse(toolCall.function.arguments || "{}"),
249
- },
250
- };
251
- if (sigByCallId[toolCall.id]) {
252
- callPart.thoughtSignature = sigByCallId[toolCall.id];
253
- }
254
- parts.push(callPart);
255
- // Store the tool call to potentially link with a future tool response message
256
- assistantToolCalls[toolCall.id] = toolCall;
257
- }
258
- // Re-attach any standalone thought-part signatures onto the leading
259
- // text part(s) so reasoning-only thoughts are also round-tripped.
260
- for (let s = 0; s < standaloneThoughtSigs.length; s++) {
261
- const p: any = parts[s];
262
- if (p && "text" in p && !p.thoughtSignature) {
263
- p.thoughtSignature = standaloneThoughtSigs[s];
264
- }
265
- }
266
- }
267
-
268
- if (parts.length > 0) {
269
- googleContents.push({
270
- role: msg.role === "user" ? "user" : "model",
271
- parts,
272
- });
273
- }
274
- } else if (msg.role === "tool") {
275
- // OpenAI tool messages represent the *result* of a tool call.
276
- // Google represents this as a 'functionResponse' part within a 'user' role message.
277
- // The content of the tool message is the tool output (usually a string).
278
- // The tool_call_id links it back to the assistant's tool_use part.
279
-
280
- if (!msg.tool_call_id) {
281
- throw new Error("Tool message must have a tool_call_id.");
282
- }
283
-
284
- // Ensure content is treated as string for functionResponse
285
- const toolOutputContent =
286
- typeof msg.content === "string"
287
- ? msg.content
288
- : JSON.stringify(msg.content); // Coerce array content to string representation if necessary
289
-
290
- // Find the matching tool call name from the stored assistant tool calls
291
- // This is needed for the functionResponse part's name field in Google's API.
292
- const matchingToolCall = assistantToolCalls[msg.tool_call_id];
293
- const functionName = matchingToolCall
294
- ? matchingToolCall.function.name
295
- : "unknown_function";
296
-
297
- if (!matchingToolCall) {
298
- console.warn(
299
- `Matching assistant tool call not found for tool_call_id: ${msg.tool_call_id}. Using name '${functionName}'.`,
300
- msg
301
- );
302
- }
303
-
304
- // Add the user message with the functionResponse part
305
- // Google's API expects the user role for tool results.
306
- googleContents.push({
307
- role: "user",
308
- parts: [
309
- {
310
- functionResponse: {
311
- name: functionName, // Google API requires the function name here
312
- response: {
313
- result: toolOutputContent,
314
- },
315
- },
316
- },
317
- ],
318
- });
319
- } else {
320
- console.warn(
321
- `Unsupported generic message role: ${msg.role}, skipping.`
322
- );
323
- }
324
- }
325
-
326
- return { systemInstruction, contents: googleContents };
327
- }
328
-
329
- /**
330
- * Recursively cleans a JSON schema to remove properties not supported by Gemini API.
331
- * Removes: additionalProperties, $ref, and other unsupported fields.
332
- * Converts type strings to uppercase as required by Gemini.
333
- * @param schema The schema object to clean
334
- * @returns A cleaned schema object compatible with Gemini API
335
- */
336
- private cleanSchemaForGemini(schema: any): any {
337
- if (!schema || typeof schema !== "object") {
338
- return schema;
339
- }
340
-
341
- // Handle arrays
342
- if (Array.isArray(schema)) {
343
- return schema.map((item) => this.cleanSchemaForGemini(item));
344
- }
345
-
346
- const cleaned: any = {};
347
-
348
- for (const key in schema) {
349
- if (!Object.prototype.hasOwnProperty.call(schema, key)) {
350
- continue;
351
- }
352
-
353
- // Skip unsupported properties:
354
- // - additionalProperties: not supported by Gemini
355
- // - $ref: JSON Schema references not supported
356
- // - $defs: JSON Schema definitions not supported
357
- // - positional: internal knowhow property, not part of JSON Schema
358
- if (
359
- key === "additionalProperties" ||
360
- key === "$ref" ||
361
- key === "$defs" ||
362
- key === "positional"
363
- ) {
364
- continue;
365
- }
366
-
367
- const value = schema[key];
368
-
369
- // Convert type to uppercase if it's a string
370
- if (key === "type" && typeof value === "string") {
371
- cleaned[key] = value.toUpperCase();
372
- }
373
- // Handle type arrays (e.g., ["string", "null"])
374
- else if (key === "type" && Array.isArray(value)) {
375
- cleaned[key] = value.map((t: string) =>
376
- typeof t === "string" ? t.toUpperCase() : t
377
- );
378
- }
379
- // Recursively clean nested objects
380
- else if (typeof value === "object" && value !== null) {
381
- cleaned[key] = this.cleanSchemaForGemini(value);
382
- }
383
- // Copy primitive values as-is
384
- else {
385
- cleaned[key] = value;
386
- }
387
- }
388
-
389
- return cleaned;
390
- }
391
-
392
- /**
393
- * Transforms generic Tool array into Google GenAI tools format.
394
- * @param tools The generic tool array.
395
- * @returns An array of Google GenAI Tool objects, or undefined if no tools.
396
- */
397
- transformTools(tools?: Tool[]): GoogleTool[] | undefined {
398
- if (!tools || tools.length === 0) {
399
- return undefined;
400
- }
401
-
402
- const functionDeclarations: FunctionDeclaration[] = tools.map((tool) => {
403
- // Clean the entire parameters schema to remove unsupported fields
404
- const cleanedParameters = this.cleanSchemaForGemini(
405
- tool.function.parameters
406
- );
407
-
408
- return {
409
- name: tool.function.name,
410
- description: tool.function.description || "",
411
- parameters: cleanedParameters,
412
- };
413
- });
414
-
415
- // Google's tools structure is an array of objects, where each object
416
- // can contain 'functionDeclarations', 'googleSearch', 'codeExecution', etc.
417
- // Based on the provided docs, function calling tools go under `functionDeclarations`.
418
- return [{ functionDeclarations }];
419
- }
420
-
421
- /**
422
- * Builds the thinkingConfig for Gemini models that support it.
423
- * - Gemini 3.x models use thinkingLevel (supported levels vary by model)
424
- * - Gemini 2.5 models use thinkingBudget: number (0 = off, -1 = dynamic)
425
- *
426
- * Maps CompletionOptions.reasoning_effort to provider-specific values.
427
- */
428
- buildThinkingConfig(
429
- options: CompletionOptions
430
- ): Record<string, unknown> | undefined {
431
- const model = options.model;
432
- const effort = options.reasoning_effort ?? "low";
433
-
434
- // Gemini 3.x — use thinkingLevel
435
- if (GoogleThinkingLevelModels.includes(model)) {
436
- // Gemini 3.7 Flash rejects "minimal"; low is its least intensive level.
437
- const minimumLevel = model === Models.google.Gemini_37_Flash ? "low" : "minimal";
438
- const levelMap: Record<string, string> = {
439
- none: minimumLevel,
440
- minimal: minimumLevel,
441
- low: "low",
442
- medium: "medium",
443
- high: "high",
444
- xhigh: "high",
445
- max: "high",
446
- };
447
- return {
448
- thinkingLevel: levelMap[effort] ?? "low",
449
- };
450
- }
451
-
452
- // Gemini 2.5 — use thinkingBudget
453
- if (GoogleThinkingBudgetModels.includes(model)) {
454
- // Map effort to token budget
455
- const budgetMap: Record<string, number> = {
456
- none: 0,
457
- minimal: 512,
458
- low: 1024,
459
- medium: 8192,
460
- high: -1, // dynamic
461
- xhigh: -1,
462
- max: -1,
463
- };
464
- return {
465
- thinkingBudget: budgetMap[effort] ?? 1024,
466
- };
467
- }
468
-
469
- return undefined;
470
- }
471
-
472
- async createChatCompletion(
473
- options: CompletionOptions
474
- ): Promise<CompletionResponse> {
475
- const thinkingConfig = this.buildThinkingConfig(options);
476
- const { systemInstruction, contents } = this.transformMessages(
477
- options.messages
478
- );
479
- const tools = this.transformTools(options.tools);
480
-
481
- try {
482
- await wait(2000);
483
- const response = await this.client.models.generateContent({
484
- model: options.model,
485
- contents,
486
- config: {
487
- systemInstruction,
488
- thinkingConfig,
489
- tools,
490
- ...(tools.length && {
491
- toolConfig: {
492
- functionCallingConfig: {
493
- mode: options.tool_choice === "none"
494
- ? FunctionCallingConfigMode.NONE
495
- : FunctionCallingConfigMode.AUTO,
496
- },
497
- },
498
- }),
499
- maxOutputTokens: options.max_tokens,
500
- },
501
- });
502
-
503
- let toolCalls: ToolCall[] = [];
504
-
505
- if (response.functionCalls) {
506
- for (const call of response.functionCalls) {
507
- toolCalls.push({
508
- id:
509
- call.id ||
510
- `fc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
511
- type: "function",
512
- function: {
513
- name: call.name,
514
- arguments: JSON.stringify(call.args || {}),
515
- },
516
- });
517
- }
518
- }
519
-
520
- if (response?.promptFeedback?.blockReason) {
521
- // lame
522
- throw new Error(
523
- `Google GenAI blocked the response due to: ${response.promptFeedback.blockReason}`
524
- );
525
- }
526
-
527
- // Map Google response to generic CompletionResponse
528
- const choices: CompletionResponse["choices"] =
529
- response.candidates?.map((candidate) => {
530
- const message: OutputMessage = {
531
- role: candidate.content.role === "model" ? "assistant" : "user",
532
- content: "", // Initialize content
533
- tool_calls: [...toolCalls], // Initialize tool calls
534
- };
535
-
536
- // Collect text and tool_use parts
537
- let textContent = "";
538
-
539
- // after the first message uses the top level tool calls we should empty it
540
- if (toolCalls.length) {
541
- toolCalls = [];
542
- }
543
-
544
- if (!candidate?.content?.parts) {
545
- console.warn("No content parts in candidate:", candidate);
546
- return { message };
547
- }
548
-
549
- // Capture Gemini thoughtSignatures so they can be round-tripped on the
550
- // next turn. Gemini 3 REQUIRES these to be echoed back on the matching
551
- // functionCall part or it returns a 400 "Thought signature is not
552
- // valid" on the 2nd+ tool-calling turn. We key them by tool-call id
553
- // (and also keep any standalone thought-part signatures in order).
554
- const reasoningItems: any[] = [];
555
-
556
- candidate?.content?.parts?.forEach((part) => {
557
- if ("text" in part && typeof part.text === "string") {
558
- textContent += part.text; // Concatenate text parts
559
- if ((part as any).thoughtSignature) {
560
- reasoningItems.push({
561
- kind: "thoughtSignature",
562
- thoughtSignature: (part as any).thoughtSignature,
563
- });
564
- }
565
- } else if ("functionCall" in part && part.functionCall) {
566
- const callId =
567
- part.functionCall.id ||
568
- `fc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
569
- message.tool_calls.push({
570
- id: callId,
571
- type: "function",
572
- function: {
573
- name: part.functionCall.name,
574
- arguments: JSON.stringify(part.functionCall.args || {}),
575
- },
576
- });
577
- if ((part as any).thoughtSignature) {
578
- reasoningItems.push({
579
- kind: "functionCall",
580
- callId,
581
- thoughtSignature: (part as any).thoughtSignature,
582
- });
583
- }
584
- }
585
- });
586
-
587
- message.content = textContent || null;
588
- if (reasoningItems.length > 0) {
589
- (message as any)._reasoning_details = {
590
- provider: "gemini",
591
- items: reasoningItems,
592
- };
593
- }
594
-
595
- return { message };
596
- }) || []; // Handle case with no candidates
597
-
598
- const usage = response.usageMetadata;
599
- const usdCost = usage
600
- ? this.calculateCost(options.model, usage)
601
- : undefined;
602
-
603
- // Map cachedContentTokenCount → prompt_tokens_details.cached_tokens so that
604
- // base.ts can read cache hit tokens via usage.prompt_tokens_details?.cached_tokens
605
- const cachedTokens = usage?.cachedContentTokenCount ?? 0;
606
- const usageWithCache: TokenUsage | undefined = usage
607
- ? ({
608
- prompt_tokens: usage.promptTokenCount ?? 0,
609
- completion_tokens: usage.candidatesTokenCount ?? 0,
610
- total_tokens: usage.totalTokenCount,
611
- prompt_tokens_details: { cached_tokens: cachedTokens },
612
- } as TokenUsage)
613
- : undefined;
614
-
615
- return {
616
- choices,
617
- model: options.model,
618
- usage: usageWithCache,
619
- usd_cost: usdCost,
620
- };
621
- } catch (error) {
622
- console.error(
623
- "Error calling Google GenAI generateContent:",
624
- error.message
625
- );
626
- throw error;
627
- }
628
- }
629
-
630
- pricesPerMillion() {
631
- return GeminiTextPricing;
632
- }
633
-
634
- getPricing(
635
- model?: string
636
- ):
637
- | import("./pricing/types").ModelPricing
638
- | Record<string, import("./pricing/types").ModelPricing>
639
- | undefined {
640
- if (model !== undefined) {
641
- return GeminiTextPricing[model as keyof typeof GeminiTextPricing] as
642
- | import("./pricing/types").ModelPricing
643
- | undefined;
644
- }
645
- return GeminiTextPricing as unknown as Record<
646
- string,
647
- import("./pricing/types").ModelPricing
648
- >;
649
- }
650
-
651
- calculateCost(model: string, usage: UsageMetadata): number | undefined {
652
- const pricing = this.pricesPerMillion()[model];
653
- if (!pricing || !usage) {
654
- return 0;
655
- }
656
-
657
- let cost = 0;
658
-
659
- // ── Input tokens ──────────────────────────────────────────────────────────
660
- // Use per-modality breakdowns when available (inputTokensDetails) so that
661
- // audio tokens (which can cost 3–10× more than text) are billed correctly.
662
- const inputDetails = (usage as any).inputTokensDetails as
663
- | { modality?: string; tokenCount?: number }[]
664
- | undefined;
665
-
666
- if (
667
- inputDetails &&
668
- inputDetails.length > 0 &&
669
- pricing.input_audio !== undefined
670
- ) {
671
- // Modality-aware billing
672
- for (const detail of inputDetails) {
673
- const tokens = detail.tokenCount || 0;
674
- if (!tokens) continue;
675
- const modality = (detail.modality || "").toUpperCase();
676
- if (modality === "AUDIO") {
677
- const rate = pricing.input_audio ?? pricing.input ?? 0;
678
- cost += (tokens * rate) / 1e6;
679
- } else {
680
- // TEXT / IMAGE / VIDEO all use the base `input` rate
681
- const isGt200k = tokens > 200_000 && pricing.input_gt_200k;
682
- const rate = isGt200k ? pricing.input_gt_200k! : pricing.input ?? 0;
683
- cost += (tokens * rate) / 1e6;
684
- }
685
- }
686
- } else if ("promptTokenCount" in usage && usage.promptTokenCount) {
687
- // Fallback: no modality breakdown available — use total token count
688
- const isGt200k =
689
- usage.promptTokenCount > 200_000 && pricing.input_gt_200k;
690
- const rate = isGt200k ? pricing.input_gt_200k! : pricing.input ?? 0;
691
- cost += (usage.promptTokenCount * rate) / 1e6;
692
- }
693
-
694
- // ── Output tokens ─────────────────────────────────────────────────────────
695
- const outputDetails = (usage as any).outputTokensDetails as
696
- | { modality?: string; tokenCount?: number }[]
697
- | undefined;
698
-
699
- if (
700
- outputDetails &&
701
- outputDetails.length > 0 &&
702
- pricing.output_audio !== undefined
703
- ) {
704
- // Modality-aware billing
705
- for (const detail of outputDetails) {
706
- const tokens = detail.tokenCount || 0;
707
- if (!tokens) continue;
708
- const modality = (detail.modality || "").toUpperCase();
709
- if (modality === "AUDIO") {
710
- const rate = pricing.output_audio ?? pricing.output ?? 0;
711
- cost += (tokens * rate) / 1e6;
712
- } else {
713
- const isGt200k = tokens > 200_000 && pricing.output_gt_200k;
714
- const rate = isGt200k ? pricing.output_gt_200k! : pricing.output ?? 0;
715
- cost += (tokens * rate) / 1e6;
716
- }
717
- }
718
- } else if ("responseTokenCount" in usage && usage.responseTokenCount) {
719
- // Fallback: no modality breakdown — use total token count
720
- const isGt200k =
721
- usage.responseTokenCount > 200_000 && pricing.output_gt_200k;
722
- const rate = isGt200k ? pricing.output_gt_200k! : pricing.output ?? 0;
723
- cost += (usage.responseTokenCount * rate) / 1e6;
724
- }
725
-
726
- // ── Context caching ───────────────────────────────────────────────────────
727
- if (
728
- "cachedContentTokenCount" in usage &&
729
- usage.cachedContentTokenCount &&
730
- pricing.context_caching
731
- ) {
732
- if (
733
- usage.cachedContentTokenCount > 200_000 &&
734
- pricing.context_caching_gt_200k
735
- ) {
736
- cost +=
737
- (usage.cachedContentTokenCount * pricing.context_caching_gt_200k) /
738
- 1e6;
739
- } else {
740
- cost += (usage.cachedContentTokenCount * pricing.context_caching) / 1e6;
741
- }
742
- }
743
-
744
- return cost;
745
- }
746
-
747
- async getModels(modality?: ModelModality): Promise<{ id: string }[]> {
748
- if (modality) {
749
- const map: Partial<Record<ModelModality, string[]>> = {
750
- completion: GoogleReasoningModels,
751
- embedding: GoogleEmbeddingModelsList,
752
- image: GoogleImageModels,
753
- audio: GoogleTTSModels,
754
- video: GoogleVideoModels,
755
- };
756
- return (map[modality] ?? []).map((id) => ({ id }));
757
- }
758
- // No modality — live API call (backward compat)
759
- try {
760
- const models = await this.client.models.list();
761
- return models.page.map((m) => ({ id: m.name! }));
762
- } catch (error) {
763
- console.error("Error fetching Google GenAI models:", error);
764
- throw error;
765
- }
766
- }
767
-
768
- async createEmbedding(options: EmbeddingOptions): Promise<EmbeddingResponse> {
769
- if (!options.model) {
770
- console.warn(
771
- "Embedding model not specified, using default 'text-embedding-004'."
772
- );
773
- }
774
-
775
- try {
776
- const googleEmbedding = await this.client.models.embedContent({
777
- model: options.model,
778
- contents: options.input,
779
- });
780
-
781
- // Map Google EmbeddingResponse to generic EmbeddingResponse
782
- const data = googleEmbedding.embeddings.map((e, index) => ({
783
- object: "embedding", // Hardcode as per OpenAI's object type for embeddings
784
- embedding: e.values, // Google's embedding values
785
- index, // Use array index
786
- }));
787
-
788
- const usage = {
789
- promptTokenCount: googleEmbedding.metadata.billableCharacterCount || 0,
790
- totalTokenCount: googleEmbedding.metadata.billableCharacterCount || 0,
791
- };
792
-
793
- const usdCost = this.calculateCost(options.model, usage);
794
-
795
- return {
796
- data,
797
- model: options.model,
798
- usage: {
799
- prompt_tokens: usage.promptTokenCount,
800
- total_tokens: usage.totalTokenCount,
801
- },
802
- usd_cost: usdCost,
803
- };
804
- } catch (error) {
805
- console.error("Error calling Google GenAI embedContent:", error);
806
- throw error;
807
- }
808
- }
809
-
810
- async createAudioTranscription(
811
- options: AudioTranscriptionOptions
812
- ): Promise<AudioTranscriptionResponse> {
813
- throw new Error(
814
- "Audio transcription is not yet supported by the Gemini client. Use OpenAI client with Whisper model instead."
815
- );
816
- }
817
-
818
- async createAudioGeneration(
819
- options: AudioGenerationOptions
820
- ): Promise<AudioGenerationResponse> {
821
- try {
822
- const response = await this.client.models.generateContent({
823
- model: options.model,
824
- contents: [
825
- {
826
- role: "user",
827
- parts: [{ text: options.input }],
828
- },
829
- ],
830
- config: {
831
- responseModalities: ["AUDIO"],
832
- speechConfig: {
833
- voiceConfig: {
834
- prebuiltVoiceConfig: {
835
- voiceName: options.voice || "Puck",
836
- },
837
- },
838
- },
839
- },
840
- });
841
-
842
- // Extract audio data from the response
843
- // Gemini returns inline audio data in the response parts
844
- const audioPart = response.candidates?.[0]?.content?.parts?.find(
845
- (part: any) => part.inlineData?.mimeType?.startsWith("audio/")
846
- );
847
-
848
- if (!audioPart || !audioPart.inlineData) {
849
- throw new Error("No audio data returned from Gemini TTS");
850
- }
851
-
852
- // Convert base64 to buffer
853
- const rawBuffer = Buffer.from(audioPart.inlineData.data, "base64");
854
- const mimeType = audioPart.inlineData.mimeType || "audio/wav";
855
-
856
- // Gemini returns raw PCM (audio/L16) - convert to WAV format for playability
857
- let audioBuffer: Buffer = rawBuffer;
858
- if (mimeType.includes("L16") || mimeType.includes("pcm")) {
859
- // Parse sample rate from mime type e.g. "audio/L16;codec=pcm;rate=24000"
860
- const rateMatch = mimeType.match(/rate=(\d+)/);
861
- const sampleRate = rateMatch ? parseInt(rateMatch[1], 10) : 24000;
862
- audioBuffer = pcmToWav(rawBuffer, sampleRate);
863
- }
864
-
865
- return {
866
- audio: audioBuffer,
867
- format: "audio/wav",
868
- };
869
- } catch (error) {
870
- console.error("Error calling Gemini TTS:", error);
871
- throw error;
872
- }
873
- }
874
-
875
- async createImageGeneration(
876
- options: ImageGenerationOptions
877
- ): Promise<ImageGenerationResponse> {
878
- try {
879
- // Check if using Imagen 3 model or Gemini Flash inline generation
880
- const isImagen3 = options.model?.includes("imagen");
881
-
882
- if (isImagen3) {
883
- // Imagen 3 uses the generateImages endpoint
884
- const response = await this.client.models.generateImages({
885
- model: options.model,
886
- prompt: options.prompt,
887
- config: {
888
- numberOfImages: options.n || 1,
889
- },
890
- });
891
-
892
- // Convert response to ImageGenerationResponse format
893
- const generatedImages = response.generatedImages || [];
894
- const images = generatedImages.map((img) => ({
895
- // imageBytes is already a base64-encoded string from the API
896
- // Don't re-encode it, just use it directly
897
- b64_json: img.image?.imageBytes ? img.image.imageBytes : "",
898
- revised_prompt: options.prompt,
899
- }));
900
-
901
- return {
902
- created: Math.floor(Date.now() / 1000),
903
- data: images,
904
- usd_cost: 0.03 * images.length,
905
- };
906
- } else {
907
- // Use Gemini Flash inline image generation (e.g., gemini-2.0-flash-preview-image-generation)
908
- const response = await this.client.models.generateContent({
909
- model: options.model,
910
- contents: [
911
- {
912
- role: "user",
913
- parts: [{ text: options.prompt }],
914
- },
915
- ],
916
- config: {
917
- responseModalities: ["IMAGE", "TEXT"],
918
- },
919
- });
920
-
921
- // Extract image data from the response
922
- const imageParts =
923
- response.candidates?.[0]?.content?.parts?.filter((part: any) =>
924
- part.inlineData?.mimeType?.startsWith("image/")
925
- ) || [];
926
-
927
- if (imageParts.length === 0) {
928
- throw new Error("No image data returned from Gemini");
929
- }
930
-
931
- const images = imageParts.map((part: any) => ({
932
- b64_json: part.inlineData.data,
933
- revised_prompt: options.prompt,
934
- }));
935
-
936
- const usageMetadata = response.usageMetadata;
937
- const usdCost = usageMetadata
938
- ? this.calculateCost(options.model, usageMetadata)
939
- : undefined;
940
-
941
- return {
942
- created: Math.floor(Date.now() / 1000),
943
- data: images,
944
- usd_cost: usdCost,
945
- };
946
- }
947
- } catch (error) {
948
- console.error("Error calling Gemini image generation:", error);
949
- throw error;
950
- }
951
- }
952
-
953
- async createVideoGeneration(
954
- options: VideoGenerationOptions
955
- ): Promise<VideoGenerationResponse> {
956
- try {
957
- // Submit the video generation job – do NOT poll here.
958
- // Use getVideoStatus() to poll and downloadFile() to fetch the result.
959
- const operation = await this.client.models.generateVideos({
960
- model: options.model,
961
- prompt: options.prompt,
962
- config: {
963
- numberOfVideos: options.n || 1,
964
- ...(options.duration && {
965
- durationSeconds: Math.max(6, options.duration),
966
- }),
967
- ...(options.resolution && { resolution: options.resolution }),
968
- ...(options.aspect_ratio && { aspectRatio: options.aspect_ratio }),
969
- },
970
- });
971
-
972
- // Calculate estimated cost using model-specific per-second rate
973
- const duration = options.duration || 5; // Default 5 seconds
974
- const pricingEntry = GeminiTextPricing[options.model];
975
- const ratePerSec = pricingEntry?.video_generation ?? 0.4; // default to $0.40/sec (Veo 3 rate)
976
- const usdCost = (options.n || 1) * duration * ratePerSec;
977
-
978
- // Return the operation name as jobId so callers can use getVideoStatus / downloadVideo
979
- return {
980
- created: Math.floor(Date.now() / 1000),
981
- data: [],
982
- jobId: operation.name,
983
- usd_cost: usdCost,
984
- };
985
- } catch (error) {
986
- console.error("Error calling Gemini video generation:", error);
987
- throw error;
988
- }
989
- }
990
-
991
- async getVideoStatus(
992
- options: VideoStatusOptions
993
- ): Promise<VideoStatusResponse> {
994
- try {
995
- const operation = await this.client.operations.getVideosOperation({
996
- operation: { name: options.jobId } as any,
997
- });
998
-
999
- if (operation.error) {
1000
- return {
1001
- jobId: options.jobId,
1002
- status: "failed",
1003
- error: JSON.stringify(operation.error),
1004
- };
1005
- }
1006
-
1007
- if (!operation.done) {
1008
- return {
1009
- jobId: options.jobId,
1010
- status: "in_progress",
1011
- };
1012
- }
1013
-
1014
- // Completed – extract file URIs
1015
- const generatedVideos = operation.response?.generatedVideos || [];
1016
- const data = generatedVideos.map((vid) => {
1017
- const videoBytes: string | undefined = vid.video?.videoBytes;
1018
- const uri: string | undefined = vid.video?.uri;
1019
- return {
1020
- b64_json: videoBytes || undefined,
1021
- url: uri || undefined,
1022
- fileUri: uri || undefined,
1023
- };
1024
- });
1025
-
1026
- return {
1027
- jobId: options.jobId,
1028
- status: "completed",
1029
- data,
1030
- };
1031
- } catch (error) {
1032
- console.error("Error checking Gemini video status:", error);
1033
- throw error;
1034
- }
1035
- }
1036
-
1037
- /**
1038
- * Download a video (or any file) via the Google GenAI Files API.
1039
- * Pass either `fileId` (the files/* name) or `uri` (the full URI).
1040
- */
1041
- async downloadVideo(
1042
- options: FileDownloadOptions
1043
- ): Promise<FileDownloadResponse> {
1044
- return this.downloadFile(options);
1045
- }
1046
-
1047
- /**
1048
- * Upload a file to the Google GenAI Files API.
1049
- */
1050
- async uploadFile(options: FileUploadOptions): Promise<FileUploadResponse> {
1051
- try {
1052
- const blob = new Blob([new Uint8Array(options.data)], {
1053
- type: options.mimeType,
1054
- });
1055
- const uploadedFile = await this.client.files.upload({
1056
- file: blob,
1057
- config: {
1058
- mimeType: options.mimeType,
1059
- displayName: options.displayName,
1060
- name: options.fileName,
1061
- },
1062
- });
1063
-
1064
- return {
1065
- fileId: uploadedFile.name,
1066
- uri: uploadedFile.uri,
1067
- url: uploadedFile.downloadUri || uploadedFile.uri,
1068
- mimeType: uploadedFile.mimeType,
1069
- sizeBytes: uploadedFile.sizeBytes
1070
- ? Number(uploadedFile.sizeBytes)
1071
- : undefined,
1072
- };
1073
- } catch (error) {
1074
- console.error("Error uploading file to Google GenAI Files API:", error);
1075
- throw error;
1076
- }
1077
- }
1078
-
1079
- /**
1080
- * Download a file from the Google GenAI Files API.
1081
- *
1082
- * The SDK's `files.download()` writes to disk, so we use a temp file and
1083
- * read it back as a Buffer. Pass either:
1084
- * - `fileId`: the files/* resource name (e.g. "files/abc-123") or a Video uri
1085
- * - `uri`: the full Video.uri returned in GeneratedVideo (also accepted as fileId)
1086
- *
1087
- * For generated videos the `file` param accepts the Video object directly
1088
- * (uri + optional mimeType), which the SDK resolves to a download URL.
1089
- */
1090
- async downloadFile(
1091
- options: FileDownloadOptions
1092
- ): Promise<FileDownloadResponse> {
1093
- const mimeMap: Record<string, string> = {
1094
- ".mp4": "video/mp4",
1095
- ".webm": "video/webm",
1096
- ".mov": "video/quicktime",
1097
- ".png": "image/png",
1098
- ".jpg": "image/jpeg",
1099
- ".jpeg": "image/jpeg",
1100
- ".gif": "image/gif",
1101
- ".wav": "audio/wav",
1102
- ".mp3": "audio/mpeg",
1103
- };
1104
-
1105
- try {
1106
- // The Google GenAI SDK's files.download() uses an async pipe that is NOT
1107
- // properly awaited, so we fetch the file directly via HTTP instead.
1108
- // Build the download URL from the uri/fileId.
1109
- const rawUri = options.uri || options.fileId || "";
1110
-
1111
- // If it's already a full https URL, use it directly (append API key).
1112
- // Otherwise construct the Files API download URL from the resource name.
1113
- let downloadUrl: string;
1114
- if (rawUri.startsWith("https://")) {
1115
- // Append API key if not already present
1116
- const sep = rawUri.includes("?") ? "&" : "?";
1117
- downloadUrl = `${rawUri}${sep}key=${this.apiKey}`;
1118
- } else {
1119
- // Strip leading "files/" if present to get just the file ID
1120
- const fileId = rawUri.replace(/^files\//, "");
1121
- downloadUrl = `https://generativelanguage.googleapis.com/v1beta/files/${fileId}:download?alt=media&key=${this.apiKey}`;
1122
- }
1123
-
1124
- const response = await fetch(downloadUrl);
1125
- if (!response.ok) {
1126
- throw new Error(
1127
- `HTTP ${response.status} ${response.statusText} downloading ${downloadUrl}`
1128
- );
1129
- }
1130
-
1131
- const arrayBuffer = await response.arrayBuffer();
1132
- const data = Buffer.from(arrayBuffer);
1133
-
1134
- // If caller supplied a filePath, write to it (creating dirs as needed)
1135
- if (options.filePath) {
1136
- fsSync.mkdirSync(pathSync.dirname(options.filePath), {
1137
- recursive: true,
1138
- });
1139
- fsSync.writeFileSync(options.filePath, data);
1140
- }
1141
-
1142
- // Infer mime type from the URI/fileId first (more reliable), then from the path
1143
- const sourceForExt =
1144
- options.uri || options.fileId || options.filePath || "";
1145
- const ext = pathSync.extname(sourceForExt.split("?")[0]).toLowerCase();
1146
- const mimeType = mimeMap[ext] || "video/mp4";
1147
-
1148
- return { data, mimeType };
1149
- } catch (error) {
1150
- console.error(
1151
- "Error downloading file from Google GenAI Files API:",
1152
- error
1153
- );
1154
- throw error;
1155
- }
1156
- }
1157
-
1158
- getContextLimit(
1159
- model: string
1160
- ): { contextLimit: number; threshold: number } | undefined {
1161
- const contextLimit = ContextLimits[model];
1162
- if (contextLimit === undefined) return undefined;
1163
- const pricing = GeminiTextPricing[model];
1164
- // If the model has tiered pricing above 200k tokens, use 200k as the threshold
1165
- const threshold =
1166
- pricing && "input_gt_200k" in pricing ? 200_000 : contextLimit;
1167
- return { contextLimit, threshold };
1168
- }
1169
- }