@tyvm/knowhow 0.0.159 → 0.0.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/ts_build/package.json +1 -1
- package/ts_build/src/chat/CliChatService.d.ts +2 -1
- package/ts_build/src/chat/CliChatService.js +29 -3
- package/ts_build/src/chat/CliChatService.js.map +1 -1
- package/ts_build/src/chat/modules/AgentModule.js +21 -17
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
- package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
- package/ts_build/src/logger.d.ts +1 -0
- package/ts_build/src/logger.js +13 -1
- package/ts_build/src/logger.js.map +1 -1
- package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
- package/ts_build/src/utils/InputQueueManager.js +72 -2
- package/ts_build/src/utils/InputQueueManager.js.map +1 -1
- package/ts_build/src/utils/index.d.ts +3 -1
- package/ts_build/src/utils/index.js +11 -3
- package/ts_build/src/utils/index.js.map +1 -1
- package/CONFIG.md +0 -429
- package/PROCESSING.md +0 -450
- package/WORKER.md +0 -260
- package/autodoc/README.md +0 -324
- package/autodoc/chat-guide.md +0 -444
- package/autodoc/cli-reference.md +0 -720
- package/autodoc/config-reference.md +0 -642
- package/autodoc/embeddings-guide.md +0 -467
- package/autodoc/generate-guide.md +0 -437
- package/autodoc/language-plugin-guide.md +0 -417
- package/autodoc/modules-guide.md +0 -379
- package/autodoc/plugins-guide.md +0 -721
- package/autodoc/quickstart-guide.md +0 -126
- package/autodoc/skills-guide.md +0 -584
- package/autodoc/worker-guide.md +0 -519
- package/docs/input-queue-manager.md +0 -142
- package/docs/multi-worker-management.md +0 -142
- package/docs/shell-commands.md +0 -174
- package/jest.config.js +0 -19
- package/jest.manual.config.js +0 -19
- package/scripts/README.md +0 -119
- package/scripts/build-for-node.sh +0 -148
- package/scripts/cache-miss-debug.ts +0 -365
- package/scripts/check-isolated-deps.sh +0 -69
- package/scripts/check-model-pricing.ts +0 -509
- package/scripts/compare-openrouter-coverage.ts +0 -576
- package/scripts/migrate-usage-json.js +0 -147
- package/scripts/publish.sh +0 -86
- package/scripts/restore_keys.sh +0 -59
- package/scripts/test-repetition-hint.ts +0 -302
- package/scripts/unset_keys.sh +0 -60
- package/src/agents/base/base.ts +0 -1963
- package/src/agents/base/prompt.ts +0 -55
- package/src/agents/configurable/ConfigAgent.ts +0 -24
- package/src/agents/developer/developer.ts +0 -76
- package/src/agents/historyRollback.ts +0 -36
- package/src/agents/index.ts +0 -52
- package/src/agents/interface.ts +0 -11
- package/src/agents/patcher/codebase.md +0 -27
- package/src/agents/patcher/patcher.ts +0 -131
- package/src/agents/researcher/researcher.ts +0 -115
- package/src/agents/setup/setup.ts +0 -63
- package/src/agents/tools/addInternalTools.ts +0 -21
- package/src/agents/tools/agentCall.ts +0 -34
- package/src/agents/tools/aiClient.ts +0 -178
- package/src/agents/tools/askHuman.ts +0 -10
- package/src/agents/tools/callPlugin.ts +0 -10
- package/src/agents/tools/connectAgent.ts +0 -355
- package/src/agents/tools/embeddingSearch.ts +0 -6
- package/src/agents/tools/execCommand.ts +0 -162
- package/src/agents/tools/fileSearch.ts +0 -35
- package/src/agents/tools/finalAnswer.ts +0 -4
- package/src/agents/tools/googleSearch.ts +0 -243
- package/src/agents/tools/index.ts +0 -33
- package/src/agents/tools/language/definitions.ts +0 -105
- package/src/agents/tools/language/index.ts +0 -20
- package/src/agents/tools/lazy/definitions.ts +0 -72
- package/src/agents/tools/lazy/disableTools.ts +0 -16
- package/src/agents/tools/lazy/enableTools.ts +0 -16
- package/src/agents/tools/lazy/index.ts +0 -3
- package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
- package/src/agents/tools/lintFile.ts +0 -19
- package/src/agents/tools/list.ts +0 -739
- package/src/agents/tools/loadImageAsBase64.ts +0 -83
- package/src/agents/tools/loadWebpage.ts +0 -19
- package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/definitions.ts +0 -67
- package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
- package/src/agents/tools/mcp/index.ts +0 -3
- package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
- package/src/agents/tools/minimal/callTool.ts +0 -45
- package/src/agents/tools/minimal/definitions.ts +0 -50
- package/src/agents/tools/minimal/index.ts +0 -3
- package/src/agents/tools/minimal/inspectTools.ts +0 -27
- package/src/agents/tools/modifyFile.ts +0 -53
- package/src/agents/tools/observe.ts +0 -247
- package/src/agents/tools/patch.ts +0 -1287
- package/src/agents/tools/readBlocks.ts +0 -83
- package/src/agents/tools/readFile.ts +0 -105
- package/src/agents/tools/replyToParent.ts +0 -123
- package/src/agents/tools/runGenerate.ts +0 -210
- package/src/agents/tools/scanFile.ts +0 -16
- package/src/agents/tools/sendAgentMessage.ts +0 -139
- package/src/agents/tools/skills.ts +0 -79
- package/src/agents/tools/startAgentTask.ts +0 -393
- package/src/agents/tools/stringReplace.ts +0 -105
- package/src/agents/tools/textSearch.ts +0 -128
- package/src/agents/tools/types/fileblock.ts +0 -5
- package/src/agents/tools/visionTool.ts +0 -35
- package/src/agents/tools/waitForAgentCompleted.ts +0 -270
- package/src/agents/tools/writeFile.ts +0 -106
- package/src/agents/tools/ycmd/client.ts +0 -608
- package/src/agents/tools/ycmd/definitions.ts +0 -294
- package/src/agents/tools/ycmd/detection.ts +0 -211
- package/src/agents/tools/ycmd/index.ts +0 -11
- package/src/agents/tools/ycmd/installer.ts +0 -251
- package/src/agents/tools/ycmd/server.ts +0 -545
- package/src/agents/tools/ycmd/serverManager.ts +0 -316
- package/src/agents/tools/ycmd/tools/completion.ts +0 -113
- package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
- package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
- package/src/agents/tools/ycmd/tools/goto.ts +0 -169
- package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
- package/src/agents/tools/ycmd/tools/signature.ts +0 -174
- package/src/agents/tools/ycmd/tools/start.ts +0 -95
- package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
- package/src/ai.ts +0 -306
- package/src/auth/browserLogin.ts +0 -406
- package/src/auth/environmentAuth.ts +0 -51
- package/src/auth/errors.ts +0 -6
- package/src/auth/jwtStore.ts +0 -70
- package/src/auth/keyAuth.ts +0 -142
- package/src/auth/keyManager.ts +0 -331
- package/src/auth/registerIdentity.ts +0 -67
- package/src/auth/spinner.ts +0 -23
- package/src/chat/CliChatService.ts +0 -438
- package/src/chat/modules/AgentModule.ts +0 -1664
- package/src/chat/modules/AskModule.ts +0 -98
- package/src/chat/modules/BaseChatModule.ts +0 -65
- package/src/chat/modules/ClipboardImageModule.ts +0 -136
- package/src/chat/modules/CustomCommandsModule.ts +0 -80
- package/src/chat/modules/InternalChatModule.ts +0 -216
- package/src/chat/modules/RemoteSyncModule.ts +0 -482
- package/src/chat/modules/RendererModule.ts +0 -139
- package/src/chat/modules/SearchModule.ts +0 -168
- package/src/chat/modules/SessionsModule.ts +0 -969
- package/src/chat/modules/SetupModule.ts +0 -185
- package/src/chat/modules/ShellCommandModule.ts +0 -98
- package/src/chat/modules/SystemModule.ts +0 -161
- package/src/chat/modules/ToolCommandModule.ts +0 -102
- package/src/chat/modules/VoiceModule.ts +0 -70
- package/src/chat/modules/index.ts +0 -8
- package/src/chat/renderer/CompactRenderer.ts +0 -229
- package/src/chat/renderer/ConsoleRenderer.ts +0 -160
- package/src/chat/renderer/FancyRenderer.ts +0 -440
- package/src/chat/renderer/PlainRenderer.ts +0 -218
- package/src/chat/renderer/index.ts +0 -6
- package/src/chat/renderer/loadRenderer.ts +0 -316
- package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
- package/src/chat/renderer/types.ts +0 -99
- package/src/chat/types.ts +0 -146
- package/src/chat.ts +0 -140
- package/src/cli.ts +0 -180
- package/src/clients/anthropic.ts +0 -772
- package/src/clients/attribution.ts +0 -53
- package/src/clients/cerebras.ts +0 -10
- package/src/clients/contextLimits.ts +0 -263
- package/src/clients/copilot.ts +0 -23
- package/src/clients/deepseek.ts +0 -16
- package/src/clients/fireworks.ts +0 -71
- package/src/clients/gemini.ts +0 -1169
- package/src/clients/github.ts +0 -16
- package/src/clients/groq.ts +0 -15
- package/src/clients/http.ts +0 -719
- package/src/clients/index.ts +0 -1153
- package/src/clients/knowhow.ts +0 -130
- package/src/clients/knowhowMcp.ts +0 -118
- package/src/clients/llama.ts +0 -16
- package/src/clients/meta.ts +0 -27
- package/src/clients/mistral.ts +0 -16
- package/src/clients/nvidia.ts +0 -16
- package/src/clients/openai.ts +0 -1186
- package/src/clients/openrouter.ts +0 -24
- package/src/clients/pricing/anthropic.ts +0 -149
- package/src/clients/pricing/cerebras.ts +0 -11
- package/src/clients/pricing/copilot.ts +0 -60
- package/src/clients/pricing/deepseek.ts +0 -15
- package/src/clients/pricing/fireworks.ts +0 -182
- package/src/clients/pricing/github.ts +0 -69
- package/src/clients/pricing/google.ts +0 -385
- package/src/clients/pricing/groq.ts +0 -56
- package/src/clients/pricing/index.ts +0 -44
- package/src/clients/pricing/llama.ts +0 -18
- package/src/clients/pricing/meta.ts +0 -12
- package/src/clients/pricing/mistral.ts +0 -34
- package/src/clients/pricing/models.ts +0 -25
- package/src/clients/pricing/nvidia.ts +0 -102
- package/src/clients/pricing/openai.ts +0 -409
- package/src/clients/pricing/openrouter.ts +0 -36
- package/src/clients/pricing/qwen.ts +0 -80
- package/src/clients/pricing/types.ts +0 -125
- package/src/clients/pricing/xai.ts +0 -137
- package/src/clients/qwen.ts +0 -16
- package/src/clients/responseMetadata.ts +0 -221
- package/src/clients/types.ts +0 -531
- package/src/clients/withRetry.ts +0 -89
- package/src/clients/xai.ts +0 -693
- package/src/cloudWorker.ts +0 -394
- package/src/commands/agent.ts +0 -342
- package/src/commands/agents.ts +0 -1037
- package/src/commands/behaviors.ts +0 -47
- package/src/commands/convert.ts +0 -291
- package/src/commands/hash.ts +0 -179
- package/src/commands/mcp.ts +0 -743
- package/src/commands/misc.ts +0 -373
- package/src/commands/modules.ts +0 -704
- package/src/commands/processes.ts +0 -248
- package/src/commands/remote.ts +0 -77
- package/src/commands/replay.ts +0 -503
- package/src/commands/sandbox.ts +0 -566
- package/src/commands/services.ts +0 -168
- package/src/commands/skills.ts +0 -107
- package/src/commands/workers.ts +0 -168
- package/src/config.ts +0 -468
- package/src/conversion.ts +0 -69
- package/src/dataset/diffs/README.md +0 -12
- package/src/dataset/diffs/debug-errors.ts +0 -29
- package/src/dataset/diffs/debug.ts +0 -64
- package/src/dataset/diffs/generate.ts +0 -71
- package/src/dataset/diffs/jsonl.ts +0 -53
- package/src/dataset/diffs/test.ts +0 -194
- package/src/embeddings.ts +0 -494
- package/src/fileSync.ts +0 -369
- package/src/generate.ts +0 -529
- package/src/hashes.ts +0 -180
- package/src/index.ts +0 -261
- package/src/logger.ts +0 -197
- package/src/login.ts +0 -209
- package/src/microphone.ts +0 -141
- package/src/migrations.ts +0 -151
- package/src/plugins/AgentsMdPlugin.ts +0 -118
- package/src/plugins/GitPlugin.ts +0 -598
- package/src/plugins/LinterPlugin.ts +0 -214
- package/src/plugins/PluginBase.ts +0 -70
- package/src/plugins/SkillsPlugin.ts +0 -37
- package/src/plugins/embedding.ts +0 -82
- package/src/plugins/exec.ts +0 -70
- package/src/plugins/language.ts +0 -290
- package/src/plugins/plugins.ts +0 -175
- package/src/plugins/tmux.ts +0 -132
- package/src/plugins/types.ts +0 -36
- package/src/plugins/url.ts +0 -101
- package/src/plugins/vim.ts +0 -89
- package/src/processes/ProcessManager.ts +0 -96
- package/src/processes/managedProcessShim.ts +0 -138
- package/src/processors/Base64ImageDetector.ts +0 -502
- package/src/processors/CustomVariables.ts +0 -693
- package/src/processors/GemmaToolProcessor.ts +0 -163
- package/src/processors/HarmonyToolProcessor.ts +0 -264
- package/src/processors/JsonCompressor.ts +0 -510
- package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
- package/src/processors/TokenCompressor.ts +0 -620
- package/src/processors/ToolResponseCache.ts +0 -322
- package/src/processors/XmlToolCallProcessor.ts +0 -533
- package/src/processors/index.ts +0 -14
- package/src/processors/tools/boundedToolResponse.ts +0 -49
- package/src/processors/tools/grepToolResponse.ts +0 -230
- package/src/processors/tools/index.ts +0 -23
- package/src/processors/tools/jqToolResponse.ts +0 -159
- package/src/processors/tools/listStoredToolResponses.ts +0 -124
- package/src/processors/tools/tailToolResponse.ts +0 -148
- package/src/prompts/BasicCodeDocumenter.ts +0 -1
- package/src/prompts/BasicProjectDocumenter.ts +0 -1
- package/src/prompts/EmbeddingSeachHelper.ts +0 -1
- package/src/prompts/KnowhowConfigExamples.ts +0 -376
- package/src/prompts/index.ts +0 -9
- package/src/remotes.ts +0 -110
- package/src/server/index.ts +0 -16
- package/src/services/AgentService.ts +0 -134
- package/src/services/AgentSyncFs.ts +0 -775
- package/src/services/AgentSyncKnowhowWeb.ts +0 -389
- package/src/services/BehaviorsService.ts +0 -466
- package/src/services/DockerService.ts +0 -511
- package/src/services/EmbeddingService.ts +0 -427
- package/src/services/EmbeddingsService.ts +0 -73
- package/src/services/EventService.ts +0 -279
- package/src/services/ExtensionsService.ts +0 -25
- package/src/services/KnowhowClient.ts +0 -928
- package/src/services/LazyToolsService.ts +0 -210
- package/src/services/Mcp.ts +0 -727
- package/src/services/McpServer.ts +0 -155
- package/src/services/McpWebsocketTransport.ts +0 -87
- package/src/services/MediaProcessorService.ts +0 -669
- package/src/services/MessageProcessor.ts +0 -114
- package/src/services/MinimalToolsService.ts +0 -177
- package/src/services/RuntimeReloadService.ts +0 -31
- package/src/services/S3.ts +0 -61
- package/src/services/SessionManager.ts +0 -358
- package/src/services/SkillsService.ts +0 -822
- package/src/services/SyncedAgentWatcher.ts +0 -124
- package/src/services/SyncerService.ts +0 -191
- package/src/services/TaskRegistry.ts +0 -110
- package/src/services/Tools.ts +0 -580
- package/src/services/TracingService.ts +0 -116
- package/src/services/conversion/ConversionService.ts +0 -757
- package/src/services/conversion/index.ts +0 -2
- package/src/services/conversion/types.ts +0 -87
- package/src/services/flags.ts +0 -51
- package/src/services/index.ts +0 -117
- package/src/services/modules/computerUse.ts +0 -218
- package/src/services/modules/index.ts +0 -314
- package/src/services/modules/types.ts +0 -109
- package/src/services/types.ts +0 -60
- package/src/services/watchers/FsSyncer.ts +0 -199
- package/src/services/watchers/RemoteSyncer.ts +0 -196
- package/src/services/watchers/index.ts +0 -2
- package/src/tunnel.ts +0 -243
- package/src/types.ts +0 -282
- package/src/util/Trace.ts +0 -236
- package/src/utils/InputQueueManager.ts +0 -493
- package/src/utils/errors.ts +0 -0
- package/src/utils/http.ts +0 -150
- package/src/utils/index.ts +0 -111
- package/src/worker.ts +0 -696
- package/src/workerRegistry.ts +0 -152
- package/src/workers/auth/PasskeySetup.ts +0 -181
- package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
- package/src/workers/auth/WsMiddleware.ts +0 -99
- package/src/workers/auth/authMiddleware.ts +0 -104
- package/src/workers/auth/types.ts +0 -70
- package/src/workers/tools/getChallenge.ts +0 -33
- package/src/workers/tools/index.ts +0 -20
- package/src/workers/tools/listAllowedPorts.ts +0 -30
- package/src/workers/tools/lock.ts +0 -31
- package/src/workers/tools/reloadConfig.ts +0 -84
- package/src/workers/tools/unlock.ts +0 -116
- package/tests/XmlToolCallProcessor.test.ts +0 -468
- package/tests/agents/interrupt.test.ts +0 -200
- package/tests/agents/observe-base.test.ts +0 -183
- package/tests/agents/tools/connectAgent.test.ts +0 -138
- package/tests/agents/tools/observe.test.ts +0 -179
- package/tests/agents/tools/readFile.test.ts +0 -88
- package/tests/agents/tools/replyToParent.test.ts +0 -125
- package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
- package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
- package/tests/chat/detach-attach-rendering.test.ts +0 -315
- package/tests/clients/AIClient.test.ts +0 -668
- package/tests/clients/anthropic.test.ts +0 -202
- package/tests/clients/contextLimits.test.ts +0 -97
- package/tests/clients/fireworks.test.ts +0 -65
- package/tests/clients/openai.images.test.ts +0 -105
- package/tests/clients/pricing.test.ts +0 -206
- package/tests/clients/reasoningEffort.test.ts +0 -140
- package/tests/compressor/bigstring.test.ts +0 -450
- package/tests/compressor/bigstring.txt +0 -1
- package/tests/compressor/githubjson.txt +0 -1
- package/tests/compressor/toolResponseCache.test.ts +0 -304
- package/tests/compressor/usageBase64.json +0 -159
- package/tests/compressor/usageBase64.test.ts +0 -175
- package/tests/fixtures/fake-secret.txt +0 -1
- package/tests/manual/agent-events/run-test.ts +0 -203
- package/tests/manual/browser-login/README.md +0 -189
- package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
- package/tests/manual/browser-login/test_cli_integration.ts +0 -169
- package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
- package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
- package/tests/manual/cli/no-env.sh +0 -274
- package/tests/manual/clients/completions.json +0 -1151
- package/tests/manual/clients/completions.test.ts +0 -198
- package/tests/manual/file-edits/figma.test.ts +0 -3
- package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
- package/tests/manual/file-edits/patching/input.txt +0 -145
- package/tests/manual/file-edits/patching/output.txt +0 -145
- package/tests/manual/file-edits/patching/patch.txt +0 -15
- package/tests/manual/file-edits/patching/unseen.txt +0 -80
- package/tests/manual/file-edits/patching.test.ts +0 -139
- package/tests/manual/modalities/README.md +0 -157
- package/tests/manual/modalities/google.modalities.test.ts +0 -335
- package/tests/manual/modalities/openai.modalities.test.ts +0 -329
- package/tests/manual/modalities/streaming.test.ts +0 -260
- package/tests/manual/modalities/xai.modalities.test.ts +0 -294
- package/tests/manual/test-concurrent-ask.ts +0 -43
- package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
- package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
- package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
- package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
- package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
- package/tests/manual/ycmd/simple_test.ts +0 -74
- package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
- package/tests/manual/ycmd/test_advanced_features.ts +0 -407
- package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
- package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
- package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
- package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
- package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
- package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
- package/tests/manual/ycmd/test_discover_commands.ts +0 -310
- package/tests/manual/ycmd/test_endpoints.ts +0 -115
- package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
- package/tests/manual/ycmd/test_final_validation.ts +0 -150
- package/tests/manual/ycmd/test_implementation.js +0 -42
- package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
- package/tests/manual/ycmd/test_server_manager.ts +0 -52
- package/tests/manual/ycmd/test_simple_debug.ts +0 -86
- package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
- package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
- package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
- package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
- package/tests/manual/ycmd/test_workspace_config.ts +0 -90
- package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
- package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
- package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
- package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
- package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
- package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
- package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
- package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
- package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
- package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
- package/tests/manual/ycmd/working_simple_test.ts +0 -134
- package/tests/patching/corrupted.test.ts +0 -78
- package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
- package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
- package/tests/patching/imports.patch.txt +0 -11
- package/tests/patching/imports.test.ts +0 -43
- package/tests/patching/imports.txt +0 -11
- package/tests/patching/interface.patch.txt +0 -15
- package/tests/patching/interface.txt +0 -7
- package/tests/patching/patchFileOutput.test.ts +0 -328
- package/tests/patching/regression-2026.test.ts +0 -752
- package/tests/patching/transcriptMangleRegression.test.ts +0 -125
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
- package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
- package/tests/plugins/language/languagePlugin.test.ts +0 -385
- package/tests/processes/managedProcessShim.test.ts +0 -59
- package/tests/processors/Base64ImageDetector.test.ts +0 -979
- package/tests/processors/CustomVariables.test.ts +0 -981
- package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
- package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
- package/tests/processors/TokenCompressor.test.ts +0 -674
- package/tests/processors/ToolResponseCache.test.ts +0 -864
- package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
- package/tests/processors/tools/grepToolResponse.test.ts +0 -159
- package/tests/services/ConversionService.test.ts +0 -154
- package/tests/services/DockerService.test.ts +0 -24
- package/tests/services/Tools.test.ts +0 -1738
- package/tests/services/ToolsService.setFunction.test.ts +0 -68
- package/tests/services/WorkerReloadConfig.test.ts +0 -141
- package/tests/test.spec.ts +0 -163
- package/tests/unit/InputQueueManager.test.ts +0 -174
- package/tests/unit/McpWebsocketTransport.test.ts +0 -56
- package/tests/unit/agents/historyRollback.test.ts +0 -53
- package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
- package/tests/unit/auth/jwtStore.test.ts +0 -55
- package/tests/unit/auth/keyAuth.test.ts +0 -152
- package/tests/unit/auth/keyManager.test.ts +0 -130
- package/tests/unit/auth/registerIdentity.test.ts +0 -99
- package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
- package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
- package/tests/unit/clients/AIClient.test.ts +0 -454
- package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
- package/tests/unit/clients/attribution.test.ts +0 -185
- package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
- package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
- package/tests/unit/clients/responseMetadata.test.ts +0 -123
- package/tests/unit/clients/withRetry.test.ts +0 -319
- package/tests/unit/commands/agents.test.ts +0 -111
- package/tests/unit/commands/github-credentials.test.ts +0 -210
- package/tests/unit/commands/misc.test.ts +0 -85
- package/tests/unit/commands/remote.test.ts +0 -79
- package/tests/unit/commands/sandbox.test.ts +0 -350
- package/tests/unit/hashes.test.ts +0 -23
- package/tests/unit/input-queue.test.ts +0 -80
- package/tests/unit/login.test.ts +0 -218
- package/tests/unit/modules/moduleLoading.test.ts +0 -305
- package/tests/unit/plugins/pluginLoading.test.ts +0 -97
- package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
- package/tests/unit/services/KnowhowClient.test.ts +0 -84
- package/tests/unit/services/LazyToolsService.test.ts +0 -53
- package/tests/unit/services/Mcp.test.ts +0 -56
- package/tests/unit/services/MinimalToolsService.test.ts +0 -424
- package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
- package/tests/unit/services/SessionManager.test.ts +0 -43
- package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
- package/tests/unit/services/SyncerService.test.ts +0 -45
- package/tests/unit/tunnel.test.ts +0 -51
- package/tests/unit/util/Trace.test.ts +0 -119
- package/tests/unit/utils/http.test.ts +0 -43
- package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
- package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
- package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
- package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
- package/ts_build/tests/agents/interrupt.test.js +0 -136
- package/ts_build/tests/agents/interrupt.test.js.map +0 -1
- package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
- package/ts_build/tests/agents/observe-base.test.js +0 -149
- package/ts_build/tests/agents/observe-base.test.js.map +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
- package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/observe.test.js +0 -148
- package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
- package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/readFile.test.js +0 -90
- package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
- package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
- package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
- package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
- package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
- package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
- package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/clients/AIClient.test.js +0 -483
- package/ts_build/tests/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
- package/ts_build/tests/clients/anthropic.test.js +0 -159
- package/ts_build/tests/clients/anthropic.test.js.map +0 -1
- package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
- package/ts_build/tests/clients/contextLimits.test.js +0 -69
- package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
- package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
- package/ts_build/tests/clients/fireworks.test.js +0 -65
- package/ts_build/tests/clients/fireworks.test.js.map +0 -1
- package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
- package/ts_build/tests/clients/openai.images.test.js +0 -94
- package/ts_build/tests/clients/openai.images.test.js.map +0 -1
- package/ts_build/tests/clients/pricing.test.d.ts +0 -1
- package/ts_build/tests/clients/pricing.test.js +0 -124
- package/ts_build/tests/clients/pricing.test.js.map +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
- package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
- package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
- package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
- package/ts_build/tests/compressor/bigstring.test.js +0 -275
- package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
- package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
- package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
- package/ts_build/tests/compressor/usageBase64.test.js +0 -109
- package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
- package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
- package/ts_build/tests/manual/agent-events/run-test.js +0 -148
- package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
- package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
- package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
- package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
- package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
- package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
- package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
- package/ts_build/tests/manual/clients/completions.test.js +0 -151
- package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
- package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
- package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
- package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
- package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
- package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
- package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
- package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
- package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
- package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
- package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
- package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
- package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
- package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
- package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
- package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
- package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
- package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
- package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
- package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
- package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
- package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
- package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
- package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
- package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
- package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
- package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
- package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
- package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
- package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
- package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
- package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
- package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
- package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
- package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
- package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
- package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
- package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
- package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
- package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
- package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
- package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
- package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
- package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
- package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
- package/ts_build/tests/patching/corrupted.test.js +0 -53
- package/ts_build/tests/patching/corrupted.test.js.map +0 -1
- package/ts_build/tests/patching/imports.test.d.ts +0 -1
- package/ts_build/tests/patching/imports.test.js +0 -71
- package/ts_build/tests/patching/imports.test.js.map +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
- package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
- package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
- package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
- package/ts_build/tests/patching/regression-2026.test.js +0 -528
- package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
- package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
- package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
- package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
- package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
- package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
- package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
- package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariables.test.js +0 -764
- package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
- package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
- package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
- package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
- package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
- package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
- package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
- package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
- package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
- package/ts_build/tests/services/ConversionService.test.js +0 -154
- package/ts_build/tests/services/ConversionService.test.js.map +0 -1
- package/ts_build/tests/services/DockerService.test.d.ts +0 -1
- package/ts_build/tests/services/DockerService.test.js +0 -22
- package/ts_build/tests/services/DockerService.test.js.map +0 -1
- package/ts_build/tests/services/Tools.test.d.ts +0 -1
- package/ts_build/tests/services/Tools.test.js +0 -1365
- package/ts_build/tests/services/Tools.test.js.map +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
- package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
- package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
- package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
- package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
- package/ts_build/tests/test.spec.d.ts +0 -1
- package/ts_build/tests/test.spec.js +0 -139
- package/ts_build/tests/test.spec.js.map +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
- package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
- package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
- package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
- package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
- package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
- package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
- package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
- package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
- package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
- package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
- package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
- package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
- package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/attribution.test.js +0 -153
- package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
- package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
- package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
- package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
- package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
- package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
- package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/agents.test.js +0 -119
- package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
- package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
- package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/misc.test.js +0 -70
- package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
- package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/remote.test.js +0 -70
- package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
- package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
- package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
- package/ts_build/tests/unit/hashes.test.d.ts +0 -1
- package/ts_build/tests/unit/hashes.test.js +0 -25
- package/ts_build/tests/unit/hashes.test.js.map +0 -1
- package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
- package/ts_build/tests/unit/input-queue.test.js +0 -32
- package/ts_build/tests/unit/input-queue.test.js.map +0 -1
- package/ts_build/tests/unit/login.test.d.ts +0 -1
- package/ts_build/tests/unit/login.test.js +0 -166
- package/ts_build/tests/unit/login.test.js.map +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
- package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
- package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
- package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
- package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
- package/ts_build/tests/unit/services/Mcp.test.js +0 -45
- package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
- package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
- package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
- package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
- package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
- package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
- package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
- package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
- package/ts_build/tests/unit/tunnel.test.js +0 -47
- package/ts_build/tests/unit/tunnel.test.js.map +0 -1
- package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
- package/ts_build/tests/unit/util/Trace.test.js +0 -107
- package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
- package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
- package/ts_build/tests/unit/utils/http.test.js +0 -69
- package/ts_build/tests/unit/utils/http.test.js.map +0 -1
- package/tsconfig.json +0 -34
- package/tslint.json +0 -11
package/src/clients/gemini.ts
DELETED
|
@@ -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
|
-
}
|