@tyvm/knowhow 0.0.159 → 0.0.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +2 -2
- package/ts_build/package.json +2 -2
- 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/clients/anthropic.js +4 -1
- package/ts_build/src/clients/anthropic.js.map +1 -1
- package/ts_build/src/clients/contextLimits.js +13 -7
- package/ts_build/src/clients/contextLimits.js.map +1 -1
- package/ts_build/src/clients/index.js +3 -1
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/clients/openai.js +18 -5
- package/ts_build/src/clients/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/anthropic.d.ts +2 -0
- package/ts_build/src/clients/pricing/anthropic.js +21 -1
- package/ts_build/src/clients/pricing/anthropic.js.map +1 -1
- package/ts_build/src/clients/pricing/openai.d.ts +2 -0
- package/ts_build/src/clients/pricing/openai.js +32 -7
- package/ts_build/src/clients/pricing/openai.js.map +1 -1
- package/ts_build/src/clients/pricing/types.d.ts +4 -0
- package/ts_build/src/clients/pricing/types.js.map +1 -1
- package/ts_build/src/clients/pricing/xai.d.ts +2 -0
- package/ts_build/src/clients/pricing/xai.js +13 -8
- package/ts_build/src/clients/pricing/xai.js.map +1 -1
- package/ts_build/src/clients/xai.js +20 -8
- package/ts_build/src/clients/xai.js.map +1 -1
- package/ts_build/src/commands/misc.js +15 -2
- package/ts_build/src/commands/misc.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/remotes.d.ts +2 -0
- package/ts_build/src/remotes.js +20 -2
- package/ts_build/src/remotes.js.map +1 -1
- package/ts_build/src/tunnel.js +7 -2
- package/ts_build/src/tunnel.js.map +1 -1
- package/ts_build/src/types.d.ts +12 -1
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
- package/ts_build/src/utils/InputQueueManager.js +74 -3
- 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/ts_build/src/worker.js +4 -1
- package/ts_build/src/worker.js.map +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.d.ts +2 -1
- package/ts_build/src/workers/tools/listAllowedPorts.js +1 -1
- package/ts_build/src/workers/tools/listAllowedPorts.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
|
@@ -1,979 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Base64ImageProcessor,
|
|
3
|
-
globalBase64ImageDetector,
|
|
4
|
-
} from "../../src/processors/Base64ImageDetector";
|
|
5
|
-
import { Message, MessageContent } from "../../src/clients/types";
|
|
6
|
-
import { ToolsService } from "../../src/services/Tools";
|
|
7
|
-
import * as fs from "fs";
|
|
8
|
-
|
|
9
|
-
describe("Base64ImageDetector", () => {
|
|
10
|
-
let detector: Base64ImageProcessor;
|
|
11
|
-
|
|
12
|
-
beforeEach(() => {
|
|
13
|
-
detector = new Base64ImageProcessor();
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
describe("Constructor", () => {
|
|
17
|
-
it("should create instance with default parameters", () => {
|
|
18
|
-
const instance = new Base64ImageProcessor();
|
|
19
|
-
expect(instance).toBeInstanceOf(Base64ImageProcessor);
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it("should create instance with custom image detail", () => {
|
|
23
|
-
const instance = new Base64ImageProcessor();
|
|
24
|
-
instance.setImageDetail("high");
|
|
25
|
-
expect(instance).toBeInstanceOf(Base64ImageProcessor);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it("should create instance with custom supported formats", () => {
|
|
29
|
-
const instance = new Base64ImageProcessor();
|
|
30
|
-
instance.setImageDetail("low");
|
|
31
|
-
instance.setSupportedFormats(["png", "jpeg"]);
|
|
32
|
-
expect(instance).toBeInstanceOf(Base64ImageProcessor);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
describe("Configuration methods", () => {
|
|
37
|
-
it("should allow setting image detail", () => {
|
|
38
|
-
detector.setImageDetail("high");
|
|
39
|
-
expect(() => detector.setImageDetail("high")).not.toThrow();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it("should allow setting supported formats", () => {
|
|
43
|
-
detector.setSupportedFormats(["png", "jpeg"]);
|
|
44
|
-
expect(() => detector.setSupportedFormats(["png", "jpeg"])).not.toThrow();
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
describe("createProcessor", () => {
|
|
49
|
-
it("should return a function", () => {
|
|
50
|
-
const processor = detector.createProcessor();
|
|
51
|
-
expect(typeof processor).toBe("function");
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("should process messages without throwing", () => {
|
|
55
|
-
const processor = detector.createProcessor();
|
|
56
|
-
const originalMessages: Message[] = [];
|
|
57
|
-
const modifiedMessages: Message[] = [];
|
|
58
|
-
expect(() => processor(originalMessages, modifiedMessages)).not.toThrow();
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe("String content processing", () => {
|
|
62
|
-
const validPngBase64 =
|
|
63
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
64
|
-
const validJpegBase64 =
|
|
65
|
-
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVR";
|
|
66
|
-
const plainBase64 =
|
|
67
|
-
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
68
|
-
const regularText = "This is just regular text";
|
|
69
|
-
|
|
70
|
-
it("should convert data URL base64 string to image content", () => {
|
|
71
|
-
const originalMessages: Message[] = [];
|
|
72
|
-
const modifiedMessages: Message[] = [
|
|
73
|
-
{
|
|
74
|
-
role: "user",
|
|
75
|
-
content: validPngBase64,
|
|
76
|
-
},
|
|
77
|
-
];
|
|
78
|
-
|
|
79
|
-
const processor = detector.createProcessor();
|
|
80
|
-
processor(originalMessages, modifiedMessages);
|
|
81
|
-
|
|
82
|
-
expect(Array.isArray(modifiedMessages[0].content)).toBe(true);
|
|
83
|
-
const content = modifiedMessages[0].content as any[];
|
|
84
|
-
expect(content[0]).toEqual({
|
|
85
|
-
type: "image_url",
|
|
86
|
-
image_url: {
|
|
87
|
-
url: validPngBase64,
|
|
88
|
-
detail: "auto",
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
it("should convert plain base64 PNG to image content", () => {
|
|
93
|
-
const originalMessages: Message[] = [];
|
|
94
|
-
const modifiedMessages: Message[] = [
|
|
95
|
-
{
|
|
96
|
-
role: "user",
|
|
97
|
-
content:
|
|
98
|
-
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
|
|
99
|
-
},
|
|
100
|
-
];
|
|
101
|
-
|
|
102
|
-
const processor = detector.createProcessor();
|
|
103
|
-
processor(originalMessages, modifiedMessages);
|
|
104
|
-
|
|
105
|
-
// The plain base64 detection might not work in test environment due to atob limitations
|
|
106
|
-
// If it's converted to array, check the conversion; if not, that's also acceptable behavior
|
|
107
|
-
if (Array.isArray(modifiedMessages[0].content)) {
|
|
108
|
-
const content = modifiedMessages[0].content as any[];
|
|
109
|
-
expect(content[0].type).toBe("image_url");
|
|
110
|
-
expect(content[0].image_url.url).toContain("data:image/png;base64,");
|
|
111
|
-
} else {
|
|
112
|
-
// Plain base64 detection may not work in all environments
|
|
113
|
-
expect(typeof modifiedMessages[0].content).toBe("string");
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it("should not process regular text as image", () => {
|
|
118
|
-
const originalMessages: Message[] = [];
|
|
119
|
-
const modifiedMessages: Message[] = [
|
|
120
|
-
{
|
|
121
|
-
role: "user",
|
|
122
|
-
content: regularText,
|
|
123
|
-
},
|
|
124
|
-
];
|
|
125
|
-
|
|
126
|
-
const processor = detector.createProcessor();
|
|
127
|
-
processor(originalMessages, modifiedMessages);
|
|
128
|
-
|
|
129
|
-
expect(modifiedMessages[0].content).toBe(regularText);
|
|
130
|
-
});
|
|
131
|
-
it("should only process user messages for content", () => {
|
|
132
|
-
const originalMessages: Message[] = [];
|
|
133
|
-
const modifiedMessages: Message[] = [
|
|
134
|
-
{
|
|
135
|
-
role: "assistant",
|
|
136
|
-
content: validPngBase64,
|
|
137
|
-
},
|
|
138
|
-
{
|
|
139
|
-
role: "system",
|
|
140
|
-
content: validPngBase64,
|
|
141
|
-
},
|
|
142
|
-
];
|
|
143
|
-
|
|
144
|
-
const processor = detector.createProcessor();
|
|
145
|
-
processor(originalMessages, modifiedMessages);
|
|
146
|
-
|
|
147
|
-
expect(modifiedMessages[0].content).toBe(validPngBase64);
|
|
148
|
-
expect(modifiedMessages[1].content).toBe(validPngBase64);
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
it("should process tool messages with JSON string containing image_url", () => {
|
|
152
|
-
const imageDataUrl =
|
|
153
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
154
|
-
|
|
155
|
-
const toolResponseJson = JSON.stringify({
|
|
156
|
-
type: "image_url",
|
|
157
|
-
image_url: {
|
|
158
|
-
url: imageDataUrl,
|
|
159
|
-
detail: "auto",
|
|
160
|
-
},
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
const originalMessages: Message[] = [];
|
|
164
|
-
const modifiedMessages: Message[] = [
|
|
165
|
-
{
|
|
166
|
-
role: "tool",
|
|
167
|
-
content: toolResponseJson,
|
|
168
|
-
tool_call_id: "call_123",
|
|
169
|
-
},
|
|
170
|
-
];
|
|
171
|
-
|
|
172
|
-
const processor = detector.createProcessor();
|
|
173
|
-
processor(originalMessages, modifiedMessages);
|
|
174
|
-
|
|
175
|
-
// Tool message content should be converted from JSON string to array
|
|
176
|
-
expect(Array.isArray(modifiedMessages[0].content)).toBe(true);
|
|
177
|
-
const content = modifiedMessages[0].content as any[];
|
|
178
|
-
expect(content).toHaveLength(1);
|
|
179
|
-
expect(content[0]).toEqual({
|
|
180
|
-
type: "image_url",
|
|
181
|
-
image_url: {
|
|
182
|
-
url: imageDataUrl,
|
|
183
|
-
detail: "auto",
|
|
184
|
-
},
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it("should process tool messages with JSON string containing an ARRAY of image_url parts", () => {
|
|
189
|
-
// Computer-use screenshot tools and loadWebpage(mode:"screenshot") return
|
|
190
|
-
// an array of parts, not a single object. This shape was previously missed
|
|
191
|
-
// by the single-object check, leaving the model to see a raw base64 string.
|
|
192
|
-
const imageDataUrl =
|
|
193
|
-
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAv/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCdABmX/9k=";
|
|
194
|
-
|
|
195
|
-
const toolResponseJson = JSON.stringify([
|
|
196
|
-
{
|
|
197
|
-
type: "image_url",
|
|
198
|
-
image_url: { url: imageDataUrl },
|
|
199
|
-
},
|
|
200
|
-
]);
|
|
201
|
-
|
|
202
|
-
const originalMessages: Message[] = [];
|
|
203
|
-
const modifiedMessages: Message[] = [
|
|
204
|
-
{
|
|
205
|
-
role: "tool",
|
|
206
|
-
content: toolResponseJson,
|
|
207
|
-
tool_call_id: "call_arr",
|
|
208
|
-
},
|
|
209
|
-
];
|
|
210
|
-
|
|
211
|
-
const processor = detector.createProcessor();
|
|
212
|
-
processor(originalMessages, modifiedMessages);
|
|
213
|
-
|
|
214
|
-
// Tool message content should become a real multimodal array so the model
|
|
215
|
-
// actually receives the image instead of a base64 JSON string.
|
|
216
|
-
expect(Array.isArray(modifiedMessages[0].content)).toBe(true);
|
|
217
|
-
const content = modifiedMessages[0].content as any[];
|
|
218
|
-
expect(content).toHaveLength(1);
|
|
219
|
-
expect(content[0].type).toBe("image_url");
|
|
220
|
-
expect(content[0].image_url.url).toBe(imageDataUrl);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it("should process an image result that is not the newest parallel tool result", () => {
|
|
224
|
-
const imageDataUrl =
|
|
225
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
226
|
-
const modifiedMessages: Message[] = [
|
|
227
|
-
{
|
|
228
|
-
role: "tool",
|
|
229
|
-
content: JSON.stringify({
|
|
230
|
-
type: "image_url",
|
|
231
|
-
image_url: { url: imageDataUrl, detail: "high" },
|
|
232
|
-
}),
|
|
233
|
-
tool_call_id: "call_image",
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
role: "tool",
|
|
237
|
-
content: "A later readFile result",
|
|
238
|
-
tool_call_id: "call_file",
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
role: "user",
|
|
242
|
-
content: "A pending workflow update",
|
|
243
|
-
},
|
|
244
|
-
];
|
|
245
|
-
|
|
246
|
-
detector.createProcessor()([], modifiedMessages);
|
|
247
|
-
|
|
248
|
-
expect(Array.isArray(modifiedMessages[0].content)).toBe(true);
|
|
249
|
-
expect((modifiedMessages[0].content as any[])[0]).toEqual({
|
|
250
|
-
type: "image_url",
|
|
251
|
-
image_url: { url: imageDataUrl, detail: "high" },
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
it("should not promote a compressed image URL placeholder to image content", () => {
|
|
256
|
-
const toolResponseJson = JSON.stringify({
|
|
257
|
-
type: "image_url",
|
|
258
|
-
image_url: {
|
|
259
|
-
url: "[COMPRESSED_JSON_PROPERTY - 24614 tokens]\nKey: compressed_image_url",
|
|
260
|
-
detail: "high",
|
|
261
|
-
},
|
|
262
|
-
});
|
|
263
|
-
const modifiedMessages: Message[] = [
|
|
264
|
-
{
|
|
265
|
-
role: "tool",
|
|
266
|
-
content: toolResponseJson,
|
|
267
|
-
tool_call_id: "call_compressed_image",
|
|
268
|
-
},
|
|
269
|
-
];
|
|
270
|
-
|
|
271
|
-
detector.createProcessor()([], modifiedMessages);
|
|
272
|
-
|
|
273
|
-
expect(modifiedMessages[0].content).toBe(toolResponseJson);
|
|
274
|
-
});
|
|
275
|
-
|
|
276
|
-
it("should process tool messages with plain base64 string", () => {
|
|
277
|
-
const validPngBase64 =
|
|
278
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
279
|
-
|
|
280
|
-
const originalMessages: Message[] = [];
|
|
281
|
-
const modifiedMessages: Message[] = [
|
|
282
|
-
{
|
|
283
|
-
role: "tool",
|
|
284
|
-
content: validPngBase64,
|
|
285
|
-
tool_call_id: "call_456",
|
|
286
|
-
},
|
|
287
|
-
];
|
|
288
|
-
|
|
289
|
-
const processor = detector.createProcessor();
|
|
290
|
-
processor(originalMessages, modifiedMessages);
|
|
291
|
-
|
|
292
|
-
// Should convert to array if it's detected as an image
|
|
293
|
-
if (Array.isArray(modifiedMessages[0].content)) {
|
|
294
|
-
const content = modifiedMessages[0].content as any[];
|
|
295
|
-
expect(content[0].type).toBe("image_url");
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
|
|
299
|
-
it("should not process tool messages with regular text", () => {
|
|
300
|
-
const originalMessages: Message[] = [];
|
|
301
|
-
const modifiedMessages: Message[] = [
|
|
302
|
-
{
|
|
303
|
-
role: "tool",
|
|
304
|
-
content: "Tool completed successfully",
|
|
305
|
-
tool_call_id: "call_789",
|
|
306
|
-
},
|
|
307
|
-
];
|
|
308
|
-
|
|
309
|
-
const processor = detector.createProcessor();
|
|
310
|
-
processor(originalMessages, modifiedMessages);
|
|
311
|
-
|
|
312
|
-
expect(modifiedMessages[0].content).toBe("Tool completed successfully");
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
it("should use custom image detail setting", () => {
|
|
316
|
-
detector.setImageDetail("high");
|
|
317
|
-
|
|
318
|
-
const originalMessages: Message[] = [];
|
|
319
|
-
const modifiedMessages: Message[] = [
|
|
320
|
-
{
|
|
321
|
-
role: "user",
|
|
322
|
-
content: validPngBase64,
|
|
323
|
-
},
|
|
324
|
-
];
|
|
325
|
-
|
|
326
|
-
const processor = detector.createProcessor();
|
|
327
|
-
processor(originalMessages, modifiedMessages);
|
|
328
|
-
|
|
329
|
-
const content = modifiedMessages[0].content as any[];
|
|
330
|
-
expect(content[0].image_url.detail).toBe("high");
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
describe("Array content processing", () => {
|
|
334
|
-
const validPngBase64 =
|
|
335
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
336
|
-
|
|
337
|
-
it("should process text items in content array", () => {
|
|
338
|
-
const originalMessages: Message[] = [];
|
|
339
|
-
const modifiedMessages: Message[] = [
|
|
340
|
-
{
|
|
341
|
-
role: "user",
|
|
342
|
-
content: [
|
|
343
|
-
{ type: "text", text: "Here is an image:" },
|
|
344
|
-
{ type: "text", text: validPngBase64 },
|
|
345
|
-
{ type: "text", text: "And some more text" },
|
|
346
|
-
],
|
|
347
|
-
},
|
|
348
|
-
];
|
|
349
|
-
|
|
350
|
-
const processor = detector.createProcessor();
|
|
351
|
-
processor(originalMessages, modifiedMessages);
|
|
352
|
-
|
|
353
|
-
const content = modifiedMessages[0].content as any[];
|
|
354
|
-
expect(content).toHaveLength(3);
|
|
355
|
-
expect(content[0].type).toBe("text");
|
|
356
|
-
expect(content[1].type).toBe("image_url");
|
|
357
|
-
expect(content[2].type).toBe("text");
|
|
358
|
-
});
|
|
359
|
-
it("should preserve existing image_url items in array", () => {
|
|
360
|
-
const originalMessages: Message[] = [];
|
|
361
|
-
const modifiedMessages: Message[] = [
|
|
362
|
-
{
|
|
363
|
-
role: "user",
|
|
364
|
-
content: [
|
|
365
|
-
{ type: "text", text: "Some text" },
|
|
366
|
-
{
|
|
367
|
-
type: "image_url",
|
|
368
|
-
image_url: { url: "http://example.com/image.png" },
|
|
369
|
-
},
|
|
370
|
-
],
|
|
371
|
-
},
|
|
372
|
-
];
|
|
373
|
-
|
|
374
|
-
const processor = detector.createProcessor();
|
|
375
|
-
processor(originalMessages, modifiedMessages);
|
|
376
|
-
|
|
377
|
-
const content = modifiedMessages[0].content as any[];
|
|
378
|
-
expect(content).toHaveLength(2);
|
|
379
|
-
expect(content[0].type).toBe("text");
|
|
380
|
-
expect(content[1].type).toBe("image_url");
|
|
381
|
-
expect(content[1].image_url.url).toBe("http://example.com/image.png");
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
it("should handle empty content array", () => {
|
|
385
|
-
const originalMessages: Message[] = [];
|
|
386
|
-
const modifiedMessages: Message[] = [
|
|
387
|
-
{
|
|
388
|
-
role: "user",
|
|
389
|
-
content: [],
|
|
390
|
-
},
|
|
391
|
-
];
|
|
392
|
-
|
|
393
|
-
const processor = detector.createProcessor();
|
|
394
|
-
expect(() => processor(originalMessages, modifiedMessages)).not.toThrow();
|
|
395
|
-
expect(Array.isArray(modifiedMessages[0].content)).toBe(true);
|
|
396
|
-
});
|
|
397
|
-
});
|
|
398
|
-
describe("Tool call argument processing", () => {
|
|
399
|
-
const validPngBase64 =
|
|
400
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
401
|
-
|
|
402
|
-
it("should process base64 images in tool call arguments", () => {
|
|
403
|
-
const originalMessages: Message[] = [];
|
|
404
|
-
const modifiedMessages: Message[] = [
|
|
405
|
-
{
|
|
406
|
-
role: "assistant",
|
|
407
|
-
content: "Using a tool",
|
|
408
|
-
tool_calls: [
|
|
409
|
-
{
|
|
410
|
-
id: "call_123",
|
|
411
|
-
type: "function",
|
|
412
|
-
function: {
|
|
413
|
-
name: "analyze_image",
|
|
414
|
-
arguments: JSON.stringify({
|
|
415
|
-
image: validPngBase64,
|
|
416
|
-
description: "Test image",
|
|
417
|
-
}),
|
|
418
|
-
},
|
|
419
|
-
},
|
|
420
|
-
],
|
|
421
|
-
},
|
|
422
|
-
];
|
|
423
|
-
|
|
424
|
-
const processor = detector.createProcessor();
|
|
425
|
-
processor(originalMessages, modifiedMessages);
|
|
426
|
-
|
|
427
|
-
const toolCall = modifiedMessages[0].tool_calls![0];
|
|
428
|
-
const args = JSON.parse(toolCall.function.arguments);
|
|
429
|
-
expect(args.image).toContain("[CONVERTED TO IMAGE:");
|
|
430
|
-
expect(args.description).toBe("Test image");
|
|
431
|
-
});
|
|
432
|
-
it("should handle nested objects in tool call arguments", () => {
|
|
433
|
-
const originalMessages: Message[] = [];
|
|
434
|
-
const modifiedMessages: Message[] = [
|
|
435
|
-
{
|
|
436
|
-
role: "assistant",
|
|
437
|
-
content: "Using a tool",
|
|
438
|
-
tool_calls: [
|
|
439
|
-
{
|
|
440
|
-
id: "call_123",
|
|
441
|
-
type: "function",
|
|
442
|
-
function: {
|
|
443
|
-
name: "complex_tool",
|
|
444
|
-
arguments: JSON.stringify({
|
|
445
|
-
data: {
|
|
446
|
-
images: [validPngBase64, "regular text"],
|
|
447
|
-
metadata: {
|
|
448
|
-
thumbnail: validPngBase64,
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
}),
|
|
452
|
-
},
|
|
453
|
-
},
|
|
454
|
-
],
|
|
455
|
-
},
|
|
456
|
-
];
|
|
457
|
-
|
|
458
|
-
const processor = detector.createProcessor();
|
|
459
|
-
processor(originalMessages, modifiedMessages);
|
|
460
|
-
|
|
461
|
-
const toolCall = modifiedMessages[0].tool_calls![0];
|
|
462
|
-
const args = JSON.parse(toolCall.function.arguments);
|
|
463
|
-
expect(args.data.images[0]).toContain("[CONVERTED TO IMAGE:");
|
|
464
|
-
expect(args.data.images[1]).toBe("regular text");
|
|
465
|
-
expect(args.data.metadata.thumbnail).toContain("[CONVERTED TO IMAGE:");
|
|
466
|
-
});
|
|
467
|
-
it("should handle invalid JSON in tool call arguments", () => {
|
|
468
|
-
const originalMessages: Message[] = [];
|
|
469
|
-
const modifiedMessages: Message[] = [
|
|
470
|
-
{
|
|
471
|
-
role: "assistant",
|
|
472
|
-
content: "Using a tool",
|
|
473
|
-
tool_calls: [
|
|
474
|
-
{
|
|
475
|
-
id: "call_123",
|
|
476
|
-
type: "function",
|
|
477
|
-
function: {
|
|
478
|
-
name: "tool_with_plain_text",
|
|
479
|
-
arguments: validPngBase64,
|
|
480
|
-
},
|
|
481
|
-
},
|
|
482
|
-
],
|
|
483
|
-
},
|
|
484
|
-
];
|
|
485
|
-
|
|
486
|
-
const processor = detector.createProcessor();
|
|
487
|
-
processor(originalMessages, modifiedMessages);
|
|
488
|
-
|
|
489
|
-
const toolCall = modifiedMessages[0].tool_calls![0];
|
|
490
|
-
expect(toolCall.function.arguments).toContain("[CONVERTED TO IMAGE:");
|
|
491
|
-
});
|
|
492
|
-
|
|
493
|
-
it("should handle messages without tool calls", () => {
|
|
494
|
-
const originalMessages: Message[] = [];
|
|
495
|
-
const modifiedMessages: Message[] = [
|
|
496
|
-
{
|
|
497
|
-
role: "assistant",
|
|
498
|
-
content: "Just a regular message",
|
|
499
|
-
},
|
|
500
|
-
];
|
|
501
|
-
|
|
502
|
-
const processor = detector.createProcessor();
|
|
503
|
-
expect(() => processor(originalMessages, modifiedMessages)).not.toThrow();
|
|
504
|
-
});
|
|
505
|
-
});
|
|
506
|
-
describe("Edge cases and error handling", () => {
|
|
507
|
-
it("should handle empty messages array", () => {
|
|
508
|
-
const originalMessages: Message[] = [];
|
|
509
|
-
const modifiedMessages: Message[] = [];
|
|
510
|
-
|
|
511
|
-
const processor = detector.createProcessor();
|
|
512
|
-
expect(() => processor(originalMessages, modifiedMessages)).not.toThrow();
|
|
513
|
-
});
|
|
514
|
-
|
|
515
|
-
it("should handle null and undefined content", () => {
|
|
516
|
-
const originalMessages: Message[] = [];
|
|
517
|
-
const modifiedMessages: Message[] = [
|
|
518
|
-
{
|
|
519
|
-
role: "user",
|
|
520
|
-
content: null as any,
|
|
521
|
-
},
|
|
522
|
-
{
|
|
523
|
-
role: "user",
|
|
524
|
-
content: undefined as any,
|
|
525
|
-
},
|
|
526
|
-
];
|
|
527
|
-
|
|
528
|
-
const processor = detector.createProcessor();
|
|
529
|
-
expect(() => processor(originalMessages, modifiedMessages)).not.toThrow();
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
it("should handle unsupported image formats", () => {
|
|
533
|
-
detector.setSupportedFormats(["png"]);
|
|
534
|
-
|
|
535
|
-
const originalMessages: Message[] = [];
|
|
536
|
-
const modifiedMessages: Message[] = [
|
|
537
|
-
{
|
|
538
|
-
role: "user",
|
|
539
|
-
content:
|
|
540
|
-
"data:image/bmp;base64,Qk1GAAAAAAAAADYAAAAoAAAAAQAAAAEAAAABACAAAAAAAAAAAAATCwAAEwsAAAAAAAAAAAAA/////wA=",
|
|
541
|
-
},
|
|
542
|
-
];
|
|
543
|
-
|
|
544
|
-
const processor = detector.createProcessor();
|
|
545
|
-
processor(originalMessages, modifiedMessages);
|
|
546
|
-
|
|
547
|
-
expect(typeof modifiedMessages[0].content).toBe("string");
|
|
548
|
-
});
|
|
549
|
-
it("should handle short base64 strings", () => {
|
|
550
|
-
const originalMessages: Message[] = [];
|
|
551
|
-
const modifiedMessages: Message[] = [
|
|
552
|
-
{
|
|
553
|
-
role: "user",
|
|
554
|
-
content: "SGVsbG8=", // "Hello" in base64, but too short to be an image
|
|
555
|
-
},
|
|
556
|
-
];
|
|
557
|
-
|
|
558
|
-
const processor = detector.createProcessor();
|
|
559
|
-
processor(originalMessages, modifiedMessages);
|
|
560
|
-
|
|
561
|
-
expect(modifiedMessages[0].content).toBe("SGVsbG8=");
|
|
562
|
-
});
|
|
563
|
-
|
|
564
|
-
it("should handle malformed data URLs", () => {
|
|
565
|
-
const originalMessages: Message[] = [];
|
|
566
|
-
const modifiedMessages: Message[] = [
|
|
567
|
-
{
|
|
568
|
-
role: "user",
|
|
569
|
-
content: "data:image/png;base64", // Missing comma and data
|
|
570
|
-
},
|
|
571
|
-
];
|
|
572
|
-
|
|
573
|
-
const processor = detector.createProcessor();
|
|
574
|
-
processor(originalMessages, modifiedMessages);
|
|
575
|
-
|
|
576
|
-
expect(modifiedMessages[0].content).toBe("data:image/png;base64");
|
|
577
|
-
});
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
describe("Global instance", () => {
|
|
581
|
-
it("should provide global instance", () => {
|
|
582
|
-
expect(globalBase64ImageDetector).toBeInstanceOf(Base64ImageProcessor);
|
|
583
|
-
});
|
|
584
|
-
});
|
|
585
|
-
|
|
586
|
-
describe("loadImageAsBase64 tool", () => {
|
|
587
|
-
let toolsService: ToolsService;
|
|
588
|
-
let testImagePath: string;
|
|
589
|
-
|
|
590
|
-
beforeEach(() => {
|
|
591
|
-
toolsService = new ToolsService();
|
|
592
|
-
detector.registerTool(toolsService);
|
|
593
|
-
|
|
594
|
-
// Create a minimal test PNG image (1x1 red pixel)
|
|
595
|
-
testImagePath = "/tmp/test-image.png";
|
|
596
|
-
const pngBuffer = Buffer.from(
|
|
597
|
-
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg==",
|
|
598
|
-
"base64"
|
|
599
|
-
);
|
|
600
|
-
fs.writeFileSync(testImagePath, pngBuffer);
|
|
601
|
-
});
|
|
602
|
-
|
|
603
|
-
afterEach(() => {
|
|
604
|
-
// Clean up test file
|
|
605
|
-
if (fs.existsSync(testImagePath)) {
|
|
606
|
-
fs.unlinkSync(testImagePath);
|
|
607
|
-
}
|
|
608
|
-
});
|
|
609
|
-
|
|
610
|
-
it("should register loadImageAsBase64 tool", () => {
|
|
611
|
-
const tools = toolsService.getTools();
|
|
612
|
-
const loadImageTool = tools.find(
|
|
613
|
-
(t) => t.function.name === "loadImageAsBase64"
|
|
614
|
-
);
|
|
615
|
-
|
|
616
|
-
expect(loadImageTool).toBeDefined();
|
|
617
|
-
expect(loadImageTool?.function.name).toBe("loadImageAsBase64");
|
|
618
|
-
expect(loadImageTool?.function.description).toContain(
|
|
619
|
-
"Load an image file"
|
|
620
|
-
);
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
it("should have function implementation", () => {
|
|
624
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
625
|
-
expect(func).toBeDefined();
|
|
626
|
-
expect(typeof func).toBe("function");
|
|
627
|
-
});
|
|
628
|
-
|
|
629
|
-
it("should load image and return base64 data URL", async () => {
|
|
630
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
631
|
-
const result = await func(testImagePath);
|
|
632
|
-
|
|
633
|
-
expect(typeof result).toBe("string");
|
|
634
|
-
const parsed = JSON.parse(result);
|
|
635
|
-
expect(parsed.type).toBe("image_url");
|
|
636
|
-
expect(parsed.image_url.url).toContain("data:image/png;base64,");
|
|
637
|
-
expect(parsed.image_url.detail).toBe("auto");
|
|
638
|
-
});
|
|
639
|
-
|
|
640
|
-
it("should accept custom detail parameter", async () => {
|
|
641
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
642
|
-
const result = await func(testImagePath, "high");
|
|
643
|
-
|
|
644
|
-
const parsed = JSON.parse(result);
|
|
645
|
-
expect(parsed.image_url.detail).toBe("high");
|
|
646
|
-
});
|
|
647
|
-
|
|
648
|
-
it("should throw error for non-existent file", async () => {
|
|
649
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
650
|
-
|
|
651
|
-
await expect(func("/path/to/nonexistent.png")).rejects.toThrow(
|
|
652
|
-
"File not found"
|
|
653
|
-
);
|
|
654
|
-
});
|
|
655
|
-
|
|
656
|
-
it("should throw error for unsupported format", async () => {
|
|
657
|
-
const txtPath = "/tmp/test-file.txt";
|
|
658
|
-
fs.writeFileSync(txtPath, "test content");
|
|
659
|
-
|
|
660
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
661
|
-
|
|
662
|
-
try {
|
|
663
|
-
await expect(func(txtPath)).rejects.toThrow("Unsupported image format");
|
|
664
|
-
} finally {
|
|
665
|
-
fs.unlinkSync(txtPath);
|
|
666
|
-
}
|
|
667
|
-
});
|
|
668
|
-
|
|
669
|
-
it("should throw error for directory path", async () => {
|
|
670
|
-
const dirPath = "/tmp/test-dir";
|
|
671
|
-
if (!fs.existsSync(dirPath)) {
|
|
672
|
-
fs.mkdirSync(dirPath);
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
const func = toolsService.getFunction("loadImageAsBase64");
|
|
676
|
-
|
|
677
|
-
try {
|
|
678
|
-
await expect(func(dirPath)).rejects.toThrow("Path is not a file");
|
|
679
|
-
} finally {
|
|
680
|
-
fs.rmdirSync(dirPath);
|
|
681
|
-
}
|
|
682
|
-
});
|
|
683
|
-
});
|
|
684
|
-
});
|
|
685
|
-
|
|
686
|
-
describe("Base64ImageDetector - image path hint detection", () => {
|
|
687
|
-
let detector: Base64ImageProcessor;
|
|
688
|
-
let processor: ReturnType<Base64ImageProcessor["createProcessor"]>;
|
|
689
|
-
|
|
690
|
-
beforeEach(() => {
|
|
691
|
-
detector = new Base64ImageProcessor();
|
|
692
|
-
processor = detector.createProcessor();
|
|
693
|
-
});
|
|
694
|
-
|
|
695
|
-
/**
|
|
696
|
-
* Simulates the actual output from the Playwright MCP browser_take_screenshot tool.
|
|
697
|
-
* When an agent calls browser_take_screenshot, the tool message content looks like:
|
|
698
|
-
*
|
|
699
|
-
* ### Result
|
|
700
|
-
* - [Screenshot of viewport](./hackernews-screenshot.png)
|
|
701
|
-
* ### Ran Playwright code
|
|
702
|
-
* ...
|
|
703
|
-
*
|
|
704
|
-
* The Base64ImageDetector should detect the .png path in this text and add a hint
|
|
705
|
-
* telling the model it can call loadImageAsBase64 to actually view the image.
|
|
706
|
-
*/
|
|
707
|
-
describe("browser screenshot tool response", () => {
|
|
708
|
-
it("should detect image path from a browser screenshot tool message and add hint", () => {
|
|
709
|
-
// This is the exact format returned by the browser MCP take_screenshot tool
|
|
710
|
-
const screenshotToolResponse =
|
|
711
|
-
"### Result\n- [Screenshot of viewport](./hackernews-screenshot.png)\n### Ran Playwright code\n```js\nawait page.screenshot({ path: './hackernews-screenshot.png', scale: 'css', type: 'png' });\n```";
|
|
712
|
-
|
|
713
|
-
const originalMessages: Message[] = [];
|
|
714
|
-
const modifiedMessages: Message[] = [
|
|
715
|
-
{
|
|
716
|
-
role: "tool",
|
|
717
|
-
content: screenshotToolResponse,
|
|
718
|
-
tool_call_id: "call_abc123",
|
|
719
|
-
},
|
|
720
|
-
];
|
|
721
|
-
|
|
722
|
-
processor(originalMessages, modifiedMessages);
|
|
723
|
-
|
|
724
|
-
const content = modifiedMessages[0].content as string;
|
|
725
|
-
expect(typeof content).toBe("string");
|
|
726
|
-
// Should still contain the original text
|
|
727
|
-
expect(content).toContain("Screenshot of viewport");
|
|
728
|
-
expect(content).toContain("./hackernews-screenshot.png");
|
|
729
|
-
// Should contain the hint
|
|
730
|
-
expect(content).toContain("[TIP:");
|
|
731
|
-
expect(content).toContain("loadImageAsBase64");
|
|
732
|
-
expect(content).toContain("./hackernews-screenshot.png");
|
|
733
|
-
});
|
|
734
|
-
|
|
735
|
-
it("should include the exact file path in the hint", () => {
|
|
736
|
-
const screenshotPath = "./hackernews-screenshot.png";
|
|
737
|
-
const toolResponse = `### Result\n- [Screenshot of viewport](${screenshotPath})\n`;
|
|
738
|
-
|
|
739
|
-
const originalMessages: Message[] = [];
|
|
740
|
-
const modifiedMessages: Message[] = [
|
|
741
|
-
{
|
|
742
|
-
role: "tool",
|
|
743
|
-
content: toolResponse,
|
|
744
|
-
tool_call_id: "call_xyz789",
|
|
745
|
-
},
|
|
746
|
-
];
|
|
747
|
-
|
|
748
|
-
processor(originalMessages, modifiedMessages);
|
|
749
|
-
|
|
750
|
-
const content = modifiedMessages[0].content as string;
|
|
751
|
-
// The hint should reference the exact path
|
|
752
|
-
expect(content).toContain(`loadImageAsBase64("${screenshotPath}")`);
|
|
753
|
-
});
|
|
754
|
-
|
|
755
|
-
it("should not add hint when message contains no image paths", () => {
|
|
756
|
-
const toolResponse = "The page has been loaded successfully.";
|
|
757
|
-
|
|
758
|
-
const originalMessages: Message[] = [];
|
|
759
|
-
const modifiedMessages: Message[] = [
|
|
760
|
-
{
|
|
761
|
-
role: "tool",
|
|
762
|
-
content: toolResponse,
|
|
763
|
-
tool_call_id: "call_noimages",
|
|
764
|
-
},
|
|
765
|
-
];
|
|
766
|
-
|
|
767
|
-
processor(originalMessages, modifiedMessages);
|
|
768
|
-
|
|
769
|
-
const content = modifiedMessages[0].content as string;
|
|
770
|
-
expect(content).toBe(toolResponse);
|
|
771
|
-
expect(content).not.toContain("[TIP:");
|
|
772
|
-
});
|
|
773
|
-
|
|
774
|
-
it("should detect absolute paths like /tmp/page-123.png", () => {
|
|
775
|
-
const toolResponse =
|
|
776
|
-
"Screenshot saved to /tmp/page-2026-01-01T12-00-00.png for review.";
|
|
777
|
-
|
|
778
|
-
const originalMessages: Message[] = [];
|
|
779
|
-
const modifiedMessages: Message[] = [
|
|
780
|
-
{
|
|
781
|
-
role: "tool",
|
|
782
|
-
content: toolResponse,
|
|
783
|
-
tool_call_id: "call_abs",
|
|
784
|
-
},
|
|
785
|
-
];
|
|
786
|
-
|
|
787
|
-
processor(originalMessages, modifiedMessages);
|
|
788
|
-
|
|
789
|
-
const content = modifiedMessages[0].content as string;
|
|
790
|
-
expect(content).toContain("[TIP:");
|
|
791
|
-
expect(content).toContain("loadImageAsBase64");
|
|
792
|
-
expect(content).toContain("/tmp/page-2026-01-01T12-00-00.png");
|
|
793
|
-
});
|
|
794
|
-
|
|
795
|
-
it("should detect multiple image paths and hint about all of them", () => {
|
|
796
|
-
const toolResponse =
|
|
797
|
-
"Before: ./before.png\nAfter: ./after.jpg\nDiff: ./diff.png";
|
|
798
|
-
|
|
799
|
-
const originalMessages: Message[] = [];
|
|
800
|
-
const modifiedMessages: Message[] = [
|
|
801
|
-
{
|
|
802
|
-
role: "tool",
|
|
803
|
-
content: toolResponse,
|
|
804
|
-
tool_call_id: "call_multi",
|
|
805
|
-
},
|
|
806
|
-
];
|
|
807
|
-
|
|
808
|
-
processor(originalMessages, modifiedMessages);
|
|
809
|
-
|
|
810
|
-
const content = modifiedMessages[0].content as string;
|
|
811
|
-
expect(content).toContain("[TIP:");
|
|
812
|
-
expect(content).toContain("./before.png");
|
|
813
|
-
expect(content).toContain("./after.jpg");
|
|
814
|
-
expect(content).toContain("./diff.png");
|
|
815
|
-
});
|
|
816
|
-
|
|
817
|
-
it("should not add hint to messages that are actual base64 image data (already converted)", () => {
|
|
818
|
-
const validPngBase64 =
|
|
819
|
-
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==";
|
|
820
|
-
|
|
821
|
-
const originalMessages: Message[] = [];
|
|
822
|
-
const modifiedMessages: Message[] = [
|
|
823
|
-
{
|
|
824
|
-
role: "tool",
|
|
825
|
-
content: validPngBase64,
|
|
826
|
-
tool_call_id: "call_base64",
|
|
827
|
-
},
|
|
828
|
-
];
|
|
829
|
-
|
|
830
|
-
processor(originalMessages, modifiedMessages);
|
|
831
|
-
|
|
832
|
-
// Should be converted to image array, not get a text hint
|
|
833
|
-
const content = modifiedMessages[0].content;
|
|
834
|
-
if (Array.isArray(content)) {
|
|
835
|
-
// Good - was converted to image content, no hint needed
|
|
836
|
-
expect(content[0]).toHaveProperty("type", "image_url");
|
|
837
|
-
} else {
|
|
838
|
-
// If kept as string, the hint should NOT be about a file path
|
|
839
|
-
// because base64 data URLs don't contain file paths
|
|
840
|
-
expect(content as string).not.toMatch(/loadImageAsBase64\("data:/);
|
|
841
|
-
}
|
|
842
|
-
});
|
|
843
|
-
});
|
|
844
|
-
|
|
845
|
-
describe("Cache-busting prevention", () => {
|
|
846
|
-
/**
|
|
847
|
-
* These tests verify that the image-path hint processor does NOT cause
|
|
848
|
-
* cache-busting on Anthropic's prefix cache. The processor must be
|
|
849
|
-
* idempotent: calling it N times on the same message array must produce
|
|
850
|
-
* byte-identical content for all prior messages.
|
|
851
|
-
*/
|
|
852
|
-
|
|
853
|
-
it("DEMONSTRATES BUG (pre-fix): hint accumulates on repeated processor calls", () => {
|
|
854
|
-
// This test documents the original cache-busting behaviour.
|
|
855
|
-
// After the fix it should pass (hint appears exactly once regardless of
|
|
856
|
-
// how many times the processor is called).
|
|
857
|
-
const processor = new Base64ImageProcessor();
|
|
858
|
-
const processorFn = processor.createProcessor();
|
|
859
|
-
|
|
860
|
-
const toolMessage: Message = {
|
|
861
|
-
role: "tool",
|
|
862
|
-
content: "Screenshot saved to ./fandango-search.png",
|
|
863
|
-
tool_call_id: "call_screenshot",
|
|
864
|
-
};
|
|
865
|
-
|
|
866
|
-
const originalMessages: Message[] = [];
|
|
867
|
-
const modifiedMessages: Message[] = [toolMessage];
|
|
868
|
-
|
|
869
|
-
// Call the processor 3 times, simulating 3 agent loop turns where the
|
|
870
|
-
// same historical message is present in modifiedMessages.
|
|
871
|
-
processorFn(originalMessages, modifiedMessages);
|
|
872
|
-
processorFn(originalMessages, modifiedMessages);
|
|
873
|
-
processorFn(originalMessages, modifiedMessages);
|
|
874
|
-
|
|
875
|
-
const content = modifiedMessages[0].content as string;
|
|
876
|
-
const occurrences = (content.match(/\[TIP:/g) || []).length;
|
|
877
|
-
|
|
878
|
-
// After the fix the hint must appear exactly once (not 3 times).
|
|
879
|
-
expect(occurrences).toBe(1);
|
|
880
|
-
});
|
|
881
|
-
|
|
882
|
-
it("hint appears exactly once on the last message even after multiple processor calls", () => {
|
|
883
|
-
const processor = new Base64ImageProcessor();
|
|
884
|
-
const processorFn = processor.createProcessor();
|
|
885
|
-
|
|
886
|
-
const toolMessage: Message = {
|
|
887
|
-
role: "tool",
|
|
888
|
-
content: "Screenshot saved to ./screenshot.png",
|
|
889
|
-
tool_call_id: "call_1",
|
|
890
|
-
};
|
|
891
|
-
|
|
892
|
-
const originalMessages: Message[] = [];
|
|
893
|
-
const modifiedMessages: Message[] = [toolMessage];
|
|
894
|
-
|
|
895
|
-
// Simulate the processor running 5 times (5 agent turns)
|
|
896
|
-
for (let i = 0; i < 5; i++) {
|
|
897
|
-
processorFn(originalMessages, modifiedMessages);
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
const content = modifiedMessages[0].content as string;
|
|
901
|
-
const tipCount = (content.match(/\[TIP:/g) || []).length;
|
|
902
|
-
expect(tipCount).toBe(1);
|
|
903
|
-
expect(content).toContain("loadImageAsBase64");
|
|
904
|
-
});
|
|
905
|
-
|
|
906
|
-
it("historical messages are NOT modified when a new message is added", () => {
|
|
907
|
-
const processor = new Base64ImageProcessor();
|
|
908
|
-
const processorFn = processor.createProcessor();
|
|
909
|
-
|
|
910
|
-
// Turn 1: tool message with image path
|
|
911
|
-
const toolMsg: Message = {
|
|
912
|
-
role: "tool",
|
|
913
|
-
content: "Saved to ./turn1.png",
|
|
914
|
-
tool_call_id: "call_t1",
|
|
915
|
-
};
|
|
916
|
-
const modifiedMessages: Message[] = [toolMsg];
|
|
917
|
-
processorFn([], modifiedMessages);
|
|
918
|
-
|
|
919
|
-
const contentAfterTurn1 = modifiedMessages[0].content as string;
|
|
920
|
-
expect(contentAfterTurn1).toContain("[TIP:");
|
|
921
|
-
|
|
922
|
-
// Turn 2: a new user message is appended — the OLD tool message must
|
|
923
|
-
// remain byte-identical so Anthropic's prefix cache is preserved.
|
|
924
|
-
const userMsg: Message = {
|
|
925
|
-
role: "user",
|
|
926
|
-
content: "Okay I see it, now do something else.",
|
|
927
|
-
};
|
|
928
|
-
modifiedMessages.push(userMsg);
|
|
929
|
-
processorFn([], modifiedMessages);
|
|
930
|
-
|
|
931
|
-
// The historical tool message must be unchanged
|
|
932
|
-
expect(modifiedMessages[0].content).toBe(contentAfterTurn1);
|
|
933
|
-
});
|
|
934
|
-
|
|
935
|
-
it("no processor causes hint duplication across two successive calls", () => {
|
|
936
|
-
// General regression: verify the processor is fully idempotent for tool,
|
|
937
|
-
// assistant, and user messages that contain image paths.
|
|
938
|
-
const processor = new Base64ImageProcessor();
|
|
939
|
-
const processorFn = processor.createProcessor();
|
|
940
|
-
|
|
941
|
-
const messages: Message[] = [
|
|
942
|
-
{
|
|
943
|
-
role: "tool",
|
|
944
|
-
content: "See ./result.png for details",
|
|
945
|
-
tool_call_id: "c1",
|
|
946
|
-
},
|
|
947
|
-
];
|
|
948
|
-
|
|
949
|
-
processorFn([], messages);
|
|
950
|
-
const snapshotAfterFirst = messages[0].content;
|
|
951
|
-
|
|
952
|
-
processorFn([], messages);
|
|
953
|
-
const snapshotAfterSecond = messages[0].content;
|
|
954
|
-
|
|
955
|
-
// Content must be byte-identical between calls (cache-safe)
|
|
956
|
-
expect(snapshotAfterSecond).toBe(snapshotAfterFirst);
|
|
957
|
-
});
|
|
958
|
-
|
|
959
|
-
it("hint is not added to messages that already have the hint (idempotent string)", () => {
|
|
960
|
-
const processor = new Base64ImageProcessor();
|
|
961
|
-
const processorFn = processor.createProcessor();
|
|
962
|
-
|
|
963
|
-
const messages: Message[] = [
|
|
964
|
-
{
|
|
965
|
-
role: "tool",
|
|
966
|
-
content:
|
|
967
|
-
"Screenshot at ./page.png\n\n[TIP: An image file path was detected: ./page.png. Use the `loadImageAsBase64` tool with this path to load and view the image: loadImageAsBase64(\"./page.png\") to view the image at ./page.png]",
|
|
968
|
-
tool_call_id: "c2",
|
|
969
|
-
},
|
|
970
|
-
];
|
|
971
|
-
|
|
972
|
-
processorFn([], messages);
|
|
973
|
-
|
|
974
|
-
const content = messages[0].content as string;
|
|
975
|
-
const tipCount = (content.match(/\[TIP:/g) || []).length;
|
|
976
|
-
expect(tipCount).toBe(1);
|
|
977
|
-
});
|
|
978
|
-
});
|
|
979
|
-
});
|