@tyvm/knowhow 0.0.158 → 0.0.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (870) hide show
  1. package/package.json +2 -2
  2. package/ts_build/package.json +2 -2
  3. package/ts_build/src/chat/CliChatService.d.ts +2 -1
  4. package/ts_build/src/chat/CliChatService.js +29 -3
  5. package/ts_build/src/chat/CliChatService.js.map +1 -1
  6. package/ts_build/src/chat/modules/AgentModule.js +21 -17
  7. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  8. package/ts_build/src/chat/renderer/ConsoleRenderer.js +32 -25
  9. package/ts_build/src/chat/renderer/ConsoleRenderer.js.map +1 -1
  10. package/ts_build/src/logger.d.ts +1 -0
  11. package/ts_build/src/logger.js +13 -1
  12. package/ts_build/src/logger.js.map +1 -1
  13. package/ts_build/src/utils/InputQueueManager.d.ts +8 -1
  14. package/ts_build/src/utils/InputQueueManager.js +72 -2
  15. package/ts_build/src/utils/InputQueueManager.js.map +1 -1
  16. package/ts_build/src/utils/index.d.ts +3 -1
  17. package/ts_build/src/utils/index.js +11 -3
  18. package/ts_build/src/utils/index.js.map +1 -1
  19. package/CONFIG.md +0 -429
  20. package/PROCESSING.md +0 -450
  21. package/WORKER.md +0 -260
  22. package/autodoc/README.md +0 -324
  23. package/autodoc/chat-guide.md +0 -444
  24. package/autodoc/cli-reference.md +0 -720
  25. package/autodoc/config-reference.md +0 -642
  26. package/autodoc/embeddings-guide.md +0 -467
  27. package/autodoc/generate-guide.md +0 -437
  28. package/autodoc/language-plugin-guide.md +0 -417
  29. package/autodoc/modules-guide.md +0 -379
  30. package/autodoc/plugins-guide.md +0 -721
  31. package/autodoc/quickstart-guide.md +0 -126
  32. package/autodoc/skills-guide.md +0 -584
  33. package/autodoc/worker-guide.md +0 -519
  34. package/docs/input-queue-manager.md +0 -142
  35. package/docs/multi-worker-management.md +0 -142
  36. package/docs/shell-commands.md +0 -174
  37. package/jest.config.js +0 -19
  38. package/jest.manual.config.js +0 -19
  39. package/scripts/README.md +0 -119
  40. package/scripts/build-for-node.sh +0 -148
  41. package/scripts/cache-miss-debug.ts +0 -365
  42. package/scripts/check-isolated-deps.sh +0 -69
  43. package/scripts/check-model-pricing.ts +0 -509
  44. package/scripts/compare-openrouter-coverage.ts +0 -576
  45. package/scripts/migrate-usage-json.js +0 -147
  46. package/scripts/publish.sh +0 -86
  47. package/scripts/restore_keys.sh +0 -59
  48. package/scripts/test-repetition-hint.ts +0 -302
  49. package/scripts/unset_keys.sh +0 -60
  50. package/src/agents/base/base.ts +0 -1963
  51. package/src/agents/base/prompt.ts +0 -55
  52. package/src/agents/configurable/ConfigAgent.ts +0 -24
  53. package/src/agents/developer/developer.ts +0 -76
  54. package/src/agents/historyRollback.ts +0 -36
  55. package/src/agents/index.ts +0 -52
  56. package/src/agents/interface.ts +0 -11
  57. package/src/agents/patcher/codebase.md +0 -27
  58. package/src/agents/patcher/patcher.ts +0 -131
  59. package/src/agents/researcher/researcher.ts +0 -115
  60. package/src/agents/setup/setup.ts +0 -63
  61. package/src/agents/tools/addInternalTools.ts +0 -21
  62. package/src/agents/tools/agentCall.ts +0 -34
  63. package/src/agents/tools/aiClient.ts +0 -178
  64. package/src/agents/tools/askHuman.ts +0 -10
  65. package/src/agents/tools/callPlugin.ts +0 -10
  66. package/src/agents/tools/connectAgent.ts +0 -355
  67. package/src/agents/tools/embeddingSearch.ts +0 -6
  68. package/src/agents/tools/execCommand.ts +0 -162
  69. package/src/agents/tools/fileSearch.ts +0 -35
  70. package/src/agents/tools/finalAnswer.ts +0 -4
  71. package/src/agents/tools/googleSearch.ts +0 -243
  72. package/src/agents/tools/index.ts +0 -33
  73. package/src/agents/tools/language/definitions.ts +0 -105
  74. package/src/agents/tools/language/index.ts +0 -20
  75. package/src/agents/tools/lazy/definitions.ts +0 -72
  76. package/src/agents/tools/lazy/disableTools.ts +0 -16
  77. package/src/agents/tools/lazy/enableTools.ts +0 -16
  78. package/src/agents/tools/lazy/index.ts +0 -3
  79. package/src/agents/tools/lazy/listAvailableTools.ts +0 -17
  80. package/src/agents/tools/lintFile.ts +0 -19
  81. package/src/agents/tools/list.ts +0 -739
  82. package/src/agents/tools/loadImageAsBase64.ts +0 -83
  83. package/src/agents/tools/loadWebpage.ts +0 -19
  84. package/src/agents/tools/mcp/connectMcpServer.ts +0 -40
  85. package/src/agents/tools/mcp/definitions.ts +0 -67
  86. package/src/agents/tools/mcp/disconnectMcpServer.ts +0 -40
  87. package/src/agents/tools/mcp/index.ts +0 -3
  88. package/src/agents/tools/mcp/listAvailableMcpServers.ts +0 -28
  89. package/src/agents/tools/minimal/callTool.ts +0 -45
  90. package/src/agents/tools/minimal/definitions.ts +0 -50
  91. package/src/agents/tools/minimal/index.ts +0 -3
  92. package/src/agents/tools/minimal/inspectTools.ts +0 -27
  93. package/src/agents/tools/modifyFile.ts +0 -53
  94. package/src/agents/tools/observe.ts +0 -247
  95. package/src/agents/tools/patch.ts +0 -1287
  96. package/src/agents/tools/readBlocks.ts +0 -83
  97. package/src/agents/tools/readFile.ts +0 -105
  98. package/src/agents/tools/replyToParent.ts +0 -123
  99. package/src/agents/tools/runGenerate.ts +0 -210
  100. package/src/agents/tools/scanFile.ts +0 -16
  101. package/src/agents/tools/sendAgentMessage.ts +0 -139
  102. package/src/agents/tools/skills.ts +0 -79
  103. package/src/agents/tools/startAgentTask.ts +0 -393
  104. package/src/agents/tools/stringReplace.ts +0 -105
  105. package/src/agents/tools/textSearch.ts +0 -128
  106. package/src/agents/tools/types/fileblock.ts +0 -5
  107. package/src/agents/tools/visionTool.ts +0 -35
  108. package/src/agents/tools/waitForAgentCompleted.ts +0 -270
  109. package/src/agents/tools/writeFile.ts +0 -106
  110. package/src/agents/tools/ycmd/client.ts +0 -608
  111. package/src/agents/tools/ycmd/definitions.ts +0 -294
  112. package/src/agents/tools/ycmd/detection.ts +0 -211
  113. package/src/agents/tools/ycmd/index.ts +0 -11
  114. package/src/agents/tools/ycmd/installer.ts +0 -251
  115. package/src/agents/tools/ycmd/server.ts +0 -545
  116. package/src/agents/tools/ycmd/serverManager.ts +0 -316
  117. package/src/agents/tools/ycmd/tools/completion.ts +0 -113
  118. package/src/agents/tools/ycmd/tools/diagnostics.ts +0 -166
  119. package/src/agents/tools/ycmd/tools/getLocations.ts +0 -173
  120. package/src/agents/tools/ycmd/tools/goto.ts +0 -169
  121. package/src/agents/tools/ycmd/tools/refactor.ts +0 -204
  122. package/src/agents/tools/ycmd/tools/signature.ts +0 -174
  123. package/src/agents/tools/ycmd/tools/start.ts +0 -95
  124. package/src/agents/tools/ycmd/utils/pathUtils.ts +0 -59
  125. package/src/ai.ts +0 -306
  126. package/src/auth/browserLogin.ts +0 -406
  127. package/src/auth/environmentAuth.ts +0 -51
  128. package/src/auth/errors.ts +0 -6
  129. package/src/auth/jwtStore.ts +0 -70
  130. package/src/auth/keyAuth.ts +0 -142
  131. package/src/auth/keyManager.ts +0 -331
  132. package/src/auth/registerIdentity.ts +0 -67
  133. package/src/auth/spinner.ts +0 -23
  134. package/src/chat/CliChatService.ts +0 -438
  135. package/src/chat/modules/AgentModule.ts +0 -1664
  136. package/src/chat/modules/AskModule.ts +0 -98
  137. package/src/chat/modules/BaseChatModule.ts +0 -65
  138. package/src/chat/modules/ClipboardImageModule.ts +0 -136
  139. package/src/chat/modules/CustomCommandsModule.ts +0 -80
  140. package/src/chat/modules/InternalChatModule.ts +0 -216
  141. package/src/chat/modules/RemoteSyncModule.ts +0 -482
  142. package/src/chat/modules/RendererModule.ts +0 -139
  143. package/src/chat/modules/SearchModule.ts +0 -168
  144. package/src/chat/modules/SessionsModule.ts +0 -969
  145. package/src/chat/modules/SetupModule.ts +0 -185
  146. package/src/chat/modules/ShellCommandModule.ts +0 -98
  147. package/src/chat/modules/SystemModule.ts +0 -161
  148. package/src/chat/modules/ToolCommandModule.ts +0 -102
  149. package/src/chat/modules/VoiceModule.ts +0 -70
  150. package/src/chat/modules/index.ts +0 -8
  151. package/src/chat/renderer/CompactRenderer.ts +0 -229
  152. package/src/chat/renderer/ConsoleRenderer.ts +0 -160
  153. package/src/chat/renderer/FancyRenderer.ts +0 -440
  154. package/src/chat/renderer/PlainRenderer.ts +0 -218
  155. package/src/chat/renderer/index.ts +0 -6
  156. package/src/chat/renderer/loadRenderer.ts +0 -316
  157. package/src/chat/renderer/messagesToRenderEvents.ts +0 -96
  158. package/src/chat/renderer/types.ts +0 -99
  159. package/src/chat/types.ts +0 -146
  160. package/src/chat.ts +0 -140
  161. package/src/cli.ts +0 -180
  162. package/src/clients/anthropic.ts +0 -772
  163. package/src/clients/attribution.ts +0 -53
  164. package/src/clients/cerebras.ts +0 -10
  165. package/src/clients/contextLimits.ts +0 -263
  166. package/src/clients/copilot.ts +0 -23
  167. package/src/clients/deepseek.ts +0 -16
  168. package/src/clients/fireworks.ts +0 -71
  169. package/src/clients/gemini.ts +0 -1169
  170. package/src/clients/github.ts +0 -16
  171. package/src/clients/groq.ts +0 -15
  172. package/src/clients/http.ts +0 -719
  173. package/src/clients/index.ts +0 -1153
  174. package/src/clients/knowhow.ts +0 -130
  175. package/src/clients/knowhowMcp.ts +0 -118
  176. package/src/clients/llama.ts +0 -16
  177. package/src/clients/meta.ts +0 -27
  178. package/src/clients/mistral.ts +0 -16
  179. package/src/clients/nvidia.ts +0 -16
  180. package/src/clients/openai.ts +0 -1186
  181. package/src/clients/openrouter.ts +0 -24
  182. package/src/clients/pricing/anthropic.ts +0 -149
  183. package/src/clients/pricing/cerebras.ts +0 -11
  184. package/src/clients/pricing/copilot.ts +0 -60
  185. package/src/clients/pricing/deepseek.ts +0 -15
  186. package/src/clients/pricing/fireworks.ts +0 -182
  187. package/src/clients/pricing/github.ts +0 -69
  188. package/src/clients/pricing/google.ts +0 -385
  189. package/src/clients/pricing/groq.ts +0 -56
  190. package/src/clients/pricing/index.ts +0 -44
  191. package/src/clients/pricing/llama.ts +0 -18
  192. package/src/clients/pricing/meta.ts +0 -12
  193. package/src/clients/pricing/mistral.ts +0 -34
  194. package/src/clients/pricing/models.ts +0 -25
  195. package/src/clients/pricing/nvidia.ts +0 -102
  196. package/src/clients/pricing/openai.ts +0 -409
  197. package/src/clients/pricing/openrouter.ts +0 -36
  198. package/src/clients/pricing/qwen.ts +0 -80
  199. package/src/clients/pricing/types.ts +0 -125
  200. package/src/clients/pricing/xai.ts +0 -137
  201. package/src/clients/qwen.ts +0 -16
  202. package/src/clients/responseMetadata.ts +0 -221
  203. package/src/clients/types.ts +0 -531
  204. package/src/clients/withRetry.ts +0 -89
  205. package/src/clients/xai.ts +0 -693
  206. package/src/cloudWorker.ts +0 -394
  207. package/src/commands/agent.ts +0 -342
  208. package/src/commands/agents.ts +0 -1037
  209. package/src/commands/behaviors.ts +0 -47
  210. package/src/commands/convert.ts +0 -291
  211. package/src/commands/hash.ts +0 -179
  212. package/src/commands/mcp.ts +0 -743
  213. package/src/commands/misc.ts +0 -373
  214. package/src/commands/modules.ts +0 -704
  215. package/src/commands/processes.ts +0 -248
  216. package/src/commands/remote.ts +0 -77
  217. package/src/commands/replay.ts +0 -503
  218. package/src/commands/sandbox.ts +0 -566
  219. package/src/commands/services.ts +0 -168
  220. package/src/commands/skills.ts +0 -107
  221. package/src/commands/workers.ts +0 -168
  222. package/src/config.ts +0 -468
  223. package/src/conversion.ts +0 -69
  224. package/src/dataset/diffs/README.md +0 -12
  225. package/src/dataset/diffs/debug-errors.ts +0 -29
  226. package/src/dataset/diffs/debug.ts +0 -64
  227. package/src/dataset/diffs/generate.ts +0 -71
  228. package/src/dataset/diffs/jsonl.ts +0 -53
  229. package/src/dataset/diffs/test.ts +0 -194
  230. package/src/embeddings.ts +0 -494
  231. package/src/fileSync.ts +0 -369
  232. package/src/generate.ts +0 -529
  233. package/src/hashes.ts +0 -180
  234. package/src/index.ts +0 -261
  235. package/src/logger.ts +0 -197
  236. package/src/login.ts +0 -209
  237. package/src/microphone.ts +0 -141
  238. package/src/migrations.ts +0 -151
  239. package/src/plugins/AgentsMdPlugin.ts +0 -118
  240. package/src/plugins/GitPlugin.ts +0 -598
  241. package/src/plugins/LinterPlugin.ts +0 -214
  242. package/src/plugins/PluginBase.ts +0 -70
  243. package/src/plugins/SkillsPlugin.ts +0 -37
  244. package/src/plugins/embedding.ts +0 -82
  245. package/src/plugins/exec.ts +0 -70
  246. package/src/plugins/language.ts +0 -290
  247. package/src/plugins/plugins.ts +0 -175
  248. package/src/plugins/tmux.ts +0 -132
  249. package/src/plugins/types.ts +0 -36
  250. package/src/plugins/url.ts +0 -101
  251. package/src/plugins/vim.ts +0 -89
  252. package/src/processes/ProcessManager.ts +0 -96
  253. package/src/processes/managedProcessShim.ts +0 -138
  254. package/src/processors/Base64ImageDetector.ts +0 -502
  255. package/src/processors/CustomVariables.ts +0 -693
  256. package/src/processors/GemmaToolProcessor.ts +0 -163
  257. package/src/processors/HarmonyToolProcessor.ts +0 -264
  258. package/src/processors/JsonCompressor.ts +0 -510
  259. package/src/processors/MinimalToolsMessageProcessor.ts +0 -113
  260. package/src/processors/TokenCompressor.ts +0 -620
  261. package/src/processors/ToolResponseCache.ts +0 -322
  262. package/src/processors/XmlToolCallProcessor.ts +0 -533
  263. package/src/processors/index.ts +0 -14
  264. package/src/processors/tools/boundedToolResponse.ts +0 -49
  265. package/src/processors/tools/grepToolResponse.ts +0 -230
  266. package/src/processors/tools/index.ts +0 -23
  267. package/src/processors/tools/jqToolResponse.ts +0 -159
  268. package/src/processors/tools/listStoredToolResponses.ts +0 -124
  269. package/src/processors/tools/tailToolResponse.ts +0 -148
  270. package/src/prompts/BasicCodeDocumenter.ts +0 -1
  271. package/src/prompts/BasicProjectDocumenter.ts +0 -1
  272. package/src/prompts/EmbeddingSeachHelper.ts +0 -1
  273. package/src/prompts/KnowhowConfigExamples.ts +0 -376
  274. package/src/prompts/index.ts +0 -9
  275. package/src/remotes.ts +0 -110
  276. package/src/server/index.ts +0 -16
  277. package/src/services/AgentService.ts +0 -134
  278. package/src/services/AgentSyncFs.ts +0 -775
  279. package/src/services/AgentSyncKnowhowWeb.ts +0 -389
  280. package/src/services/BehaviorsService.ts +0 -466
  281. package/src/services/DockerService.ts +0 -511
  282. package/src/services/EmbeddingService.ts +0 -427
  283. package/src/services/EmbeddingsService.ts +0 -73
  284. package/src/services/EventService.ts +0 -279
  285. package/src/services/ExtensionsService.ts +0 -25
  286. package/src/services/KnowhowClient.ts +0 -928
  287. package/src/services/LazyToolsService.ts +0 -210
  288. package/src/services/Mcp.ts +0 -727
  289. package/src/services/McpServer.ts +0 -155
  290. package/src/services/McpWebsocketTransport.ts +0 -87
  291. package/src/services/MediaProcessorService.ts +0 -669
  292. package/src/services/MessageProcessor.ts +0 -114
  293. package/src/services/MinimalToolsService.ts +0 -177
  294. package/src/services/RuntimeReloadService.ts +0 -31
  295. package/src/services/S3.ts +0 -61
  296. package/src/services/SessionManager.ts +0 -358
  297. package/src/services/SkillsService.ts +0 -822
  298. package/src/services/SyncedAgentWatcher.ts +0 -124
  299. package/src/services/SyncerService.ts +0 -191
  300. package/src/services/TaskRegistry.ts +0 -110
  301. package/src/services/Tools.ts +0 -580
  302. package/src/services/TracingService.ts +0 -116
  303. package/src/services/conversion/ConversionService.ts +0 -757
  304. package/src/services/conversion/index.ts +0 -2
  305. package/src/services/conversion/types.ts +0 -87
  306. package/src/services/flags.ts +0 -51
  307. package/src/services/index.ts +0 -117
  308. package/src/services/modules/computerUse.ts +0 -218
  309. package/src/services/modules/index.ts +0 -314
  310. package/src/services/modules/types.ts +0 -109
  311. package/src/services/types.ts +0 -60
  312. package/src/services/watchers/FsSyncer.ts +0 -199
  313. package/src/services/watchers/RemoteSyncer.ts +0 -196
  314. package/src/services/watchers/index.ts +0 -2
  315. package/src/tunnel.ts +0 -243
  316. package/src/types.ts +0 -282
  317. package/src/util/Trace.ts +0 -236
  318. package/src/utils/InputQueueManager.ts +0 -493
  319. package/src/utils/errors.ts +0 -0
  320. package/src/utils/http.ts +0 -150
  321. package/src/utils/index.ts +0 -111
  322. package/src/worker.ts +0 -696
  323. package/src/workerRegistry.ts +0 -152
  324. package/src/workers/auth/PasskeySetup.ts +0 -181
  325. package/src/workers/auth/WorkerPasskeyAuth.ts +0 -190
  326. package/src/workers/auth/WsMiddleware.ts +0 -99
  327. package/src/workers/auth/authMiddleware.ts +0 -104
  328. package/src/workers/auth/types.ts +0 -70
  329. package/src/workers/tools/getChallenge.ts +0 -33
  330. package/src/workers/tools/index.ts +0 -20
  331. package/src/workers/tools/listAllowedPorts.ts +0 -30
  332. package/src/workers/tools/lock.ts +0 -31
  333. package/src/workers/tools/reloadConfig.ts +0 -84
  334. package/src/workers/tools/unlock.ts +0 -116
  335. package/tests/XmlToolCallProcessor.test.ts +0 -468
  336. package/tests/agents/interrupt.test.ts +0 -200
  337. package/tests/agents/observe-base.test.ts +0 -183
  338. package/tests/agents/tools/connectAgent.test.ts +0 -138
  339. package/tests/agents/tools/observe.test.ts +0 -179
  340. package/tests/agents/tools/readFile.test.ts +0 -88
  341. package/tests/agents/tools/replyToParent.test.ts +0 -125
  342. package/tests/agents/tools/sendAgentMessage.test.ts +0 -99
  343. package/tests/agents/tools/waitForAgentCompleted.test.ts +0 -147
  344. package/tests/chat/detach-attach-rendering.test.ts +0 -315
  345. package/tests/clients/AIClient.test.ts +0 -668
  346. package/tests/clients/anthropic.test.ts +0 -202
  347. package/tests/clients/contextLimits.test.ts +0 -97
  348. package/tests/clients/fireworks.test.ts +0 -65
  349. package/tests/clients/openai.images.test.ts +0 -105
  350. package/tests/clients/pricing.test.ts +0 -206
  351. package/tests/clients/reasoningEffort.test.ts +0 -140
  352. package/tests/compressor/bigstring.test.ts +0 -450
  353. package/tests/compressor/bigstring.txt +0 -1
  354. package/tests/compressor/githubjson.txt +0 -1
  355. package/tests/compressor/toolResponseCache.test.ts +0 -304
  356. package/tests/compressor/usageBase64.json +0 -159
  357. package/tests/compressor/usageBase64.test.ts +0 -175
  358. package/tests/fixtures/fake-secret.txt +0 -1
  359. package/tests/manual/agent-events/run-test.ts +0 -203
  360. package/tests/manual/browser-login/README.md +0 -189
  361. package/tests/manual/browser-login/test_browser_login_basic.ts +0 -115
  362. package/tests/manual/browser-login/test_cli_integration.ts +0 -169
  363. package/tests/manual/browser-login/test_cross_platform_browser.ts +0 -186
  364. package/tests/manual/browser-login/test_error_scenarios.ts +0 -223
  365. package/tests/manual/cli/no-env.sh +0 -274
  366. package/tests/manual/clients/completions.json +0 -1151
  367. package/tests/manual/clients/completions.test.ts +0 -198
  368. package/tests/manual/file-edits/figma.test.ts +0 -3
  369. package/tests/manual/file-edits/fileblocks/readwrite.test.ts +0 -100
  370. package/tests/manual/file-edits/patching/input.txt +0 -145
  371. package/tests/manual/file-edits/patching/output.txt +0 -145
  372. package/tests/manual/file-edits/patching/patch.txt +0 -15
  373. package/tests/manual/file-edits/patching/unseen.txt +0 -80
  374. package/tests/manual/file-edits/patching.test.ts +0 -139
  375. package/tests/manual/modalities/README.md +0 -157
  376. package/tests/manual/modalities/google.modalities.test.ts +0 -335
  377. package/tests/manual/modalities/openai.modalities.test.ts +0 -329
  378. package/tests/manual/modalities/streaming.test.ts +0 -260
  379. package/tests/manual/modalities/xai.modalities.test.ts +0 -294
  380. package/tests/manual/test-concurrent-ask.ts +0 -43
  381. package/tests/manual/ycmd/debug_diagnostics_test.ts +0 -127
  382. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +0 -26
  383. package/tests/manual/ycmd/fixtures/file_change_test.ts +0 -17
  384. package/tests/manual/ycmd/minimal_advanced_test.ts +0 -108
  385. package/tests/manual/ycmd/simple_diagnostics_test.ts +0 -61
  386. package/tests/manual/ycmd/simple_test.ts +0 -74
  387. package/tests/manual/ycmd/test-typescript-sample.ts +0 -34
  388. package/tests/manual/ycmd/test_advanced_features.ts +0 -407
  389. package/tests/manual/ycmd/test_advanced_with_tools.ts +0 -320
  390. package/tests/manual/ycmd/test_comprehensive_typescript.ts +0 -179
  391. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +0 -249
  392. package/tests/manual/ycmd/test_diagnostics_fix.ts +0 -99
  393. package/tests/manual/ycmd/test_diagnostics_simple.ts +0 -100
  394. package/tests/manual/ycmd/test_diagnostics_timing.ts +0 -120
  395. package/tests/manual/ycmd/test_discover_commands.ts +0 -310
  396. package/tests/manual/ycmd/test_endpoints.ts +0 -115
  397. package/tests/manual/ycmd/test_final_comprehensive.ts +0 -218
  398. package/tests/manual/ycmd/test_final_validation.ts +0 -150
  399. package/tests/manual/ycmd/test_implementation.js +0 -42
  400. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +0 -39
  401. package/tests/manual/ycmd/test_server_manager.ts +0 -52
  402. package/tests/manual/ycmd/test_simple_debug.ts +0 -86
  403. package/tests/manual/ycmd/test_tsserver_workflow.js +0 -83
  404. package/tests/manual/ycmd/test_tsserver_workflow.ts +0 -122
  405. package/tests/manual/ycmd/test_typescript_simple.ts +0 -48
  406. package/tests/manual/ycmd/test_typescript_ycmd.ts +0 -105
  407. package/tests/manual/ycmd/test_workspace_config.ts +0 -90
  408. package/tests/manual/ycmd/test_ycmd_auto_start.ts +0 -137
  409. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +0 -73
  410. package/tests/manual/ycmd/test_ycmd_connection.py +0 -10
  411. package/tests/manual/ycmd/test_ycmd_direct.ts +0 -142
  412. package/tests/manual/ycmd/test_ycmd_experiment.ts +0 -48
  413. package/tests/manual/ycmd/test_ycmd_final.ts +0 -200
  414. package/tests/manual/ycmd/test_ycmd_fixed.py +0 -18
  415. package/tests/manual/ycmd/test_ycmd_integration.ts +0 -112
  416. package/tests/manual/ycmd/test_ycmd_simple.ts +0 -45
  417. package/tests/manual/ycmd/test_ycmd_usage.py +0 -27
  418. package/tests/manual/ycmd/working_simple_test.ts +0 -134
  419. package/tests/patching/corrupted.test.ts +0 -78
  420. package/tests/patching/fixtures/transcript-mangles/agent-sync-fs-nested-catch.json +0 -9
  421. package/tests/patching/fixtures/transcript-mangles/automation-functions-crossed.json +0 -9
  422. package/tests/patching/fixtures/transcript-mangles/fruit-ninja-confirmed-retirement.json +0 -8
  423. package/tests/patching/imports.patch.txt +0 -11
  424. package/tests/patching/imports.test.ts +0 -43
  425. package/tests/patching/imports.txt +0 -11
  426. package/tests/patching/interface.patch.txt +0 -15
  427. package/tests/patching/interface.txt +0 -7
  428. package/tests/patching/patchFileOutput.test.ts +0 -328
  429. package/tests/patching/regression-2026.test.ts +0 -752
  430. package/tests/patching/transcriptMangleRegression.test.ts +0 -125
  431. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +0 -346
  432. package/tests/plugins/language/languagePlugin-integration.test.ts +0 -471
  433. package/tests/plugins/language/languagePlugin.test.ts +0 -385
  434. package/tests/processes/managedProcessShim.test.ts +0 -59
  435. package/tests/processors/Base64ImageDetector.test.ts +0 -979
  436. package/tests/processors/CustomVariables.test.ts +0 -981
  437. package/tests/processors/CustomVariablesBenchmark.test.ts +0 -237
  438. package/tests/processors/HarmonyToolProcessor.test.ts +0 -490
  439. package/tests/processors/TokenCompressor.test.ts +0 -674
  440. package/tests/processors/ToolResponseCache.test.ts +0 -864
  441. package/tests/processors/tools/boundedRetrievalTools.test.ts +0 -68
  442. package/tests/processors/tools/grepToolResponse.test.ts +0 -159
  443. package/tests/services/ConversionService.test.ts +0 -154
  444. package/tests/services/DockerService.test.ts +0 -24
  445. package/tests/services/Tools.test.ts +0 -1738
  446. package/tests/services/ToolsService.setFunction.test.ts +0 -68
  447. package/tests/services/WorkerReloadConfig.test.ts +0 -141
  448. package/tests/test.spec.ts +0 -163
  449. package/tests/unit/InputQueueManager.test.ts +0 -174
  450. package/tests/unit/McpWebsocketTransport.test.ts +0 -56
  451. package/tests/unit/agents/historyRollback.test.ts +0 -53
  452. package/tests/unit/agents/tools/loadImageAsBase64.test.ts +0 -44
  453. package/tests/unit/auth/jwtStore.test.ts +0 -55
  454. package/tests/unit/auth/keyAuth.test.ts +0 -152
  455. package/tests/unit/auth/keyManager.test.ts +0 -130
  456. package/tests/unit/auth/registerIdentity.test.ts +0 -99
  457. package/tests/unit/chat/ToolCommandModule.test.ts +0 -71
  458. package/tests/unit/chat/historyCommandArgs.test.ts +0 -37
  459. package/tests/unit/clients/AIClient.test.ts +0 -454
  460. package/tests/unit/clients/anthropic.responseMetadata.test.ts +0 -81
  461. package/tests/unit/clients/attribution.test.ts +0 -185
  462. package/tests/unit/clients/http.responseMetadata.test.ts +0 -86
  463. package/tests/unit/clients/openai.responseMetadata.test.ts +0 -90
  464. package/tests/unit/clients/responseMetadata.test.ts +0 -123
  465. package/tests/unit/clients/withRetry.test.ts +0 -319
  466. package/tests/unit/commands/agents.test.ts +0 -111
  467. package/tests/unit/commands/github-credentials.test.ts +0 -210
  468. package/tests/unit/commands/misc.test.ts +0 -85
  469. package/tests/unit/commands/remote.test.ts +0 -79
  470. package/tests/unit/commands/sandbox.test.ts +0 -350
  471. package/tests/unit/hashes.test.ts +0 -23
  472. package/tests/unit/input-queue.test.ts +0 -80
  473. package/tests/unit/login.test.ts +0 -218
  474. package/tests/unit/modules/moduleLoading.test.ts +0 -305
  475. package/tests/unit/plugins/pluginLoading.test.ts +0 -97
  476. package/tests/unit/services/AgentSyncKnowhowWeb.test.ts +0 -38
  477. package/tests/unit/services/KnowhowClient.test.ts +0 -84
  478. package/tests/unit/services/LazyToolsService.test.ts +0 -53
  479. package/tests/unit/services/Mcp.test.ts +0 -56
  480. package/tests/unit/services/MinimalToolsService.test.ts +0 -424
  481. package/tests/unit/services/RuntimeReloadService.test.ts +0 -29
  482. package/tests/unit/services/SessionManager.test.ts +0 -43
  483. package/tests/unit/services/SyncedAgentWatcher.test.ts +0 -89
  484. package/tests/unit/services/SyncerService.test.ts +0 -45
  485. package/tests/unit/tunnel.test.ts +0 -51
  486. package/tests/unit/util/Trace.test.ts +0 -119
  487. package/tests/unit/utils/http.test.ts +0 -43
  488. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +0 -1
  489. package/ts_build/tests/XmlToolCallProcessor.test.js +0 -376
  490. package/ts_build/tests/XmlToolCallProcessor.test.js.map +0 -1
  491. package/ts_build/tests/agents/interrupt.test.d.ts +0 -14
  492. package/ts_build/tests/agents/interrupt.test.js +0 -136
  493. package/ts_build/tests/agents/interrupt.test.js.map +0 -1
  494. package/ts_build/tests/agents/observe-base.test.d.ts +0 -1
  495. package/ts_build/tests/agents/observe-base.test.js +0 -149
  496. package/ts_build/tests/agents/observe-base.test.js.map +0 -1
  497. package/ts_build/tests/agents/tools/connectAgent.test.d.ts +0 -1
  498. package/ts_build/tests/agents/tools/connectAgent.test.js +0 -142
  499. package/ts_build/tests/agents/tools/connectAgent.test.js.map +0 -1
  500. package/ts_build/tests/agents/tools/observe.test.d.ts +0 -1
  501. package/ts_build/tests/agents/tools/observe.test.js +0 -148
  502. package/ts_build/tests/agents/tools/observe.test.js.map +0 -1
  503. package/ts_build/tests/agents/tools/readFile.test.d.ts +0 -1
  504. package/ts_build/tests/agents/tools/readFile.test.js +0 -90
  505. package/ts_build/tests/agents/tools/readFile.test.js.map +0 -1
  506. package/ts_build/tests/agents/tools/replyToParent.test.d.ts +0 -1
  507. package/ts_build/tests/agents/tools/replyToParent.test.js +0 -116
  508. package/ts_build/tests/agents/tools/replyToParent.test.js.map +0 -1
  509. package/ts_build/tests/agents/tools/sendAgentMessage.test.d.ts +0 -1
  510. package/ts_build/tests/agents/tools/sendAgentMessage.test.js +0 -112
  511. package/ts_build/tests/agents/tools/sendAgentMessage.test.js.map +0 -1
  512. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.d.ts +0 -1
  513. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js +0 -147
  514. package/ts_build/tests/agents/tools/waitForAgentCompleted.test.js.map +0 -1
  515. package/ts_build/tests/chat/detach-attach-rendering.test.d.ts +0 -1
  516. package/ts_build/tests/chat/detach-attach-rendering.test.js +0 -168
  517. package/ts_build/tests/chat/detach-attach-rendering.test.js.map +0 -1
  518. package/ts_build/tests/clients/AIClient.test.d.ts +0 -1
  519. package/ts_build/tests/clients/AIClient.test.js +0 -483
  520. package/ts_build/tests/clients/AIClient.test.js.map +0 -1
  521. package/ts_build/tests/clients/anthropic.test.d.ts +0 -1
  522. package/ts_build/tests/clients/anthropic.test.js +0 -159
  523. package/ts_build/tests/clients/anthropic.test.js.map +0 -1
  524. package/ts_build/tests/clients/contextLimits.test.d.ts +0 -1
  525. package/ts_build/tests/clients/contextLimits.test.js +0 -69
  526. package/ts_build/tests/clients/contextLimits.test.js.map +0 -1
  527. package/ts_build/tests/clients/fireworks.test.d.ts +0 -1
  528. package/ts_build/tests/clients/fireworks.test.js +0 -65
  529. package/ts_build/tests/clients/fireworks.test.js.map +0 -1
  530. package/ts_build/tests/clients/openai.images.test.d.ts +0 -1
  531. package/ts_build/tests/clients/openai.images.test.js +0 -94
  532. package/ts_build/tests/clients/openai.images.test.js.map +0 -1
  533. package/ts_build/tests/clients/pricing.test.d.ts +0 -1
  534. package/ts_build/tests/clients/pricing.test.js +0 -124
  535. package/ts_build/tests/clients/pricing.test.js.map +0 -1
  536. package/ts_build/tests/clients/reasoningEffort.test.d.ts +0 -1
  537. package/ts_build/tests/clients/reasoningEffort.test.js +0 -116
  538. package/ts_build/tests/clients/reasoningEffort.test.js.map +0 -1
  539. package/ts_build/tests/compressor/bigstring.test.d.ts +0 -1
  540. package/ts_build/tests/compressor/bigstring.test.js +0 -275
  541. package/ts_build/tests/compressor/bigstring.test.js.map +0 -1
  542. package/ts_build/tests/compressor/toolResponseCache.test.d.ts +0 -1
  543. package/ts_build/tests/compressor/toolResponseCache.test.js +0 -250
  544. package/ts_build/tests/compressor/toolResponseCache.test.js.map +0 -1
  545. package/ts_build/tests/compressor/usageBase64.test.d.ts +0 -1
  546. package/ts_build/tests/compressor/usageBase64.test.js +0 -109
  547. package/ts_build/tests/compressor/usageBase64.test.js.map +0 -1
  548. package/ts_build/tests/manual/agent-events/run-test.d.ts +0 -2
  549. package/ts_build/tests/manual/agent-events/run-test.js +0 -148
  550. package/ts_build/tests/manual/agent-events/run-test.js.map +0 -1
  551. package/ts_build/tests/manual/browser-login/test_browser_login_basic.d.ts +0 -2
  552. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js +0 -118
  553. package/ts_build/tests/manual/browser-login/test_browser_login_basic.js.map +0 -1
  554. package/ts_build/tests/manual/browser-login/test_cli_integration.d.ts +0 -2
  555. package/ts_build/tests/manual/browser-login/test_cli_integration.js +0 -163
  556. package/ts_build/tests/manual/browser-login/test_cli_integration.js.map +0 -1
  557. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.d.ts +0 -2
  558. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js +0 -169
  559. package/ts_build/tests/manual/browser-login/test_cross_platform_browser.js.map +0 -1
  560. package/ts_build/tests/manual/browser-login/test_error_scenarios.d.ts +0 -2
  561. package/ts_build/tests/manual/browser-login/test_error_scenarios.js +0 -207
  562. package/ts_build/tests/manual/browser-login/test_error_scenarios.js.map +0 -1
  563. package/ts_build/tests/manual/clients/completions.test.d.ts +0 -1
  564. package/ts_build/tests/manual/clients/completions.test.js +0 -151
  565. package/ts_build/tests/manual/clients/completions.test.js.map +0 -1
  566. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -0
  567. package/ts_build/tests/manual/file-edits/figma.test.js +0 -2
  568. package/ts_build/tests/manual/file-edits/figma.test.js.map +0 -1
  569. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.d.ts +0 -1
  570. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js +0 -110
  571. package/ts_build/tests/manual/file-edits/fileblocks/readwrite.test.js.map +0 -1
  572. package/ts_build/tests/manual/file-edits/patching.test.d.ts +0 -1
  573. package/ts_build/tests/manual/file-edits/patching.test.js +0 -129
  574. package/ts_build/tests/manual/file-edits/patching.test.js.map +0 -1
  575. package/ts_build/tests/manual/modalities/google.modalities.test.d.ts +0 -1
  576. package/ts_build/tests/manual/modalities/google.modalities.test.js +0 -262
  577. package/ts_build/tests/manual/modalities/google.modalities.test.js.map +0 -1
  578. package/ts_build/tests/manual/modalities/openai.modalities.test.d.ts +0 -1
  579. package/ts_build/tests/manual/modalities/openai.modalities.test.js +0 -262
  580. package/ts_build/tests/manual/modalities/openai.modalities.test.js.map +0 -1
  581. package/ts_build/tests/manual/modalities/streaming.test.d.ts +0 -1
  582. package/ts_build/tests/manual/modalities/streaming.test.js +0 -216
  583. package/ts_build/tests/manual/modalities/streaming.test.js.map +0 -1
  584. package/ts_build/tests/manual/modalities/xai.modalities.test.d.ts +0 -1
  585. package/ts_build/tests/manual/modalities/xai.modalities.test.js +0 -219
  586. package/ts_build/tests/manual/modalities/xai.modalities.test.js.map +0 -1
  587. package/ts_build/tests/manual/test-concurrent-ask.d.ts +0 -1
  588. package/ts_build/tests/manual/test-concurrent-ask.js +0 -22
  589. package/ts_build/tests/manual/test-concurrent-ask.js.map +0 -1
  590. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +0 -1
  591. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +0 -124
  592. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +0 -1
  593. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +0 -2
  594. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +0 -114
  595. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +0 -1
  596. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +0 -1
  597. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +0 -84
  598. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +0 -1
  599. package/ts_build/tests/manual/ycmd/simple_test.d.ts +0 -2
  600. package/ts_build/tests/manual/ycmd/simple_test.js +0 -92
  601. package/ts_build/tests/manual/ycmd/simple_test.js.map +0 -1
  602. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +0 -14
  603. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +0 -20
  604. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +0 -1
  605. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +0 -2
  606. package/ts_build/tests/manual/ycmd/test_advanced_features.js +0 -306
  607. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +0 -1
  608. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +0 -3
  609. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +0 -271
  610. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +0 -1
  611. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +0 -2
  612. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +0 -196
  613. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +0 -1
  614. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +0 -1
  615. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +0 -184
  616. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +0 -1
  617. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +0 -2
  618. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +0 -116
  619. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +0 -1
  620. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +0 -1
  621. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +0 -114
  622. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +0 -1
  623. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +0 -1
  624. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +0 -129
  625. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +0 -1
  626. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +0 -2
  627. package/ts_build/tests/manual/ycmd/test_discover_commands.js +0 -252
  628. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +0 -1
  629. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +0 -2
  630. package/ts_build/tests/manual/ycmd/test_endpoints.js +0 -130
  631. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +0 -1
  632. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +0 -2
  633. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +0 -231
  634. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +0 -1
  635. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +0 -2
  636. package/ts_build/tests/manual/ycmd/test_final_validation.js +0 -170
  637. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +0 -1
  638. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +0 -2
  639. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +0 -37
  640. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +0 -1
  641. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +0 -1
  642. package/ts_build/tests/manual/ycmd/test_server_manager.js +0 -38
  643. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +0 -1
  644. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +0 -2
  645. package/ts_build/tests/manual/ycmd/test_simple_debug.js +0 -109
  646. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +0 -1
  647. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +0 -1
  648. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +0 -138
  649. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +0 -1
  650. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +0 -1
  651. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +0 -76
  652. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +0 -1
  653. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +0 -1
  654. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +0 -115
  655. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +0 -1
  656. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +0 -1
  657. package/ts_build/tests/manual/ycmd/test_workspace_config.js +0 -99
  658. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +0 -1
  659. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +0 -2
  660. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +0 -140
  661. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +0 -1
  662. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +0 -1
  663. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +0 -93
  664. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +0 -1
  665. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +0 -2
  666. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +0 -159
  667. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +0 -1
  668. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +0 -15
  669. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +0 -68
  670. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +0 -1
  671. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +0 -2
  672. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +0 -205
  673. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +0 -1
  674. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +0 -3
  675. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +0 -119
  676. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +0 -1
  677. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +0 -2
  678. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +0 -36
  679. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +0 -1
  680. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +0 -2
  681. package/ts_build/tests/manual/ycmd/working_simple_test.js +0 -144
  682. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +0 -1
  683. package/ts_build/tests/patching/corrupted.test.d.ts +0 -1
  684. package/ts_build/tests/patching/corrupted.test.js +0 -53
  685. package/ts_build/tests/patching/corrupted.test.js.map +0 -1
  686. package/ts_build/tests/patching/imports.test.d.ts +0 -1
  687. package/ts_build/tests/patching/imports.test.js +0 -71
  688. package/ts_build/tests/patching/imports.test.js.map +0 -1
  689. package/ts_build/tests/patching/patchFileOutput.test.d.ts +0 -1
  690. package/ts_build/tests/patching/patchFileOutput.test.js +0 -269
  691. package/ts_build/tests/patching/patchFileOutput.test.js.map +0 -1
  692. package/ts_build/tests/patching/regression-2026.test.d.ts +0 -1
  693. package/ts_build/tests/patching/regression-2026.test.js +0 -528
  694. package/ts_build/tests/patching/regression-2026.test.js.map +0 -1
  695. package/ts_build/tests/patching/transcriptMangleRegression.test.d.ts +0 -1
  696. package/ts_build/tests/patching/transcriptMangleRegression.test.js +0 -104
  697. package/ts_build/tests/patching/transcriptMangleRegression.test.js.map +0 -1
  698. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.d.ts +0 -1
  699. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +0 -294
  700. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +0 -1
  701. package/ts_build/tests/plugins/language/languagePlugin-integration.test.d.ts +0 -1
  702. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js +0 -343
  703. package/ts_build/tests/plugins/language/languagePlugin-integration.test.js.map +0 -1
  704. package/ts_build/tests/plugins/language/languagePlugin.test.d.ts +0 -1
  705. package/ts_build/tests/plugins/language/languagePlugin.test.js +0 -315
  706. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +0 -1
  707. package/ts_build/tests/processes/managedProcessShim.test.d.ts +0 -1
  708. package/ts_build/tests/processes/managedProcessShim.test.js +0 -92
  709. package/ts_build/tests/processes/managedProcessShim.test.js.map +0 -1
  710. package/ts_build/tests/processors/Base64ImageDetector.test.d.ts +0 -1
  711. package/ts_build/tests/processors/Base64ImageDetector.test.js +0 -792
  712. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +0 -1
  713. package/ts_build/tests/processors/CustomVariables.test.d.ts +0 -1
  714. package/ts_build/tests/processors/CustomVariables.test.js +0 -764
  715. package/ts_build/tests/processors/CustomVariables.test.js.map +0 -1
  716. package/ts_build/tests/processors/CustomVariablesBenchmark.test.d.ts +0 -1
  717. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js +0 -179
  718. package/ts_build/tests/processors/CustomVariablesBenchmark.test.js.map +0 -1
  719. package/ts_build/tests/processors/HarmonyToolProcessor.test.d.ts +0 -1
  720. package/ts_build/tests/processors/HarmonyToolProcessor.test.js +0 -382
  721. package/ts_build/tests/processors/HarmonyToolProcessor.test.js.map +0 -1
  722. package/ts_build/tests/processors/TokenCompressor.test.d.ts +0 -1
  723. package/ts_build/tests/processors/TokenCompressor.test.js +0 -473
  724. package/ts_build/tests/processors/TokenCompressor.test.js.map +0 -1
  725. package/ts_build/tests/processors/ToolResponseCache.test.d.ts +0 -1
  726. package/ts_build/tests/processors/ToolResponseCache.test.js +0 -657
  727. package/ts_build/tests/processors/ToolResponseCache.test.js.map +0 -1
  728. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.d.ts +0 -1
  729. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js +0 -57
  730. package/ts_build/tests/processors/tools/boundedRetrievalTools.test.js.map +0 -1
  731. package/ts_build/tests/processors/tools/grepToolResponse.test.d.ts +0 -1
  732. package/ts_build/tests/processors/tools/grepToolResponse.test.js +0 -77
  733. package/ts_build/tests/processors/tools/grepToolResponse.test.js.map +0 -1
  734. package/ts_build/tests/services/ConversionService.test.d.ts +0 -1
  735. package/ts_build/tests/services/ConversionService.test.js +0 -154
  736. package/ts_build/tests/services/ConversionService.test.js.map +0 -1
  737. package/ts_build/tests/services/DockerService.test.d.ts +0 -1
  738. package/ts_build/tests/services/DockerService.test.js +0 -22
  739. package/ts_build/tests/services/DockerService.test.js.map +0 -1
  740. package/ts_build/tests/services/Tools.test.d.ts +0 -1
  741. package/ts_build/tests/services/Tools.test.js +0 -1365
  742. package/ts_build/tests/services/Tools.test.js.map +0 -1
  743. package/ts_build/tests/services/ToolsService.setFunction.test.d.ts +0 -1
  744. package/ts_build/tests/services/ToolsService.setFunction.test.js +0 -51
  745. package/ts_build/tests/services/ToolsService.setFunction.test.js.map +0 -1
  746. package/ts_build/tests/services/WorkerReloadConfig.test.d.ts +0 -1
  747. package/ts_build/tests/services/WorkerReloadConfig.test.js +0 -86
  748. package/ts_build/tests/services/WorkerReloadConfig.test.js.map +0 -1
  749. package/ts_build/tests/test.spec.d.ts +0 -1
  750. package/ts_build/tests/test.spec.js +0 -139
  751. package/ts_build/tests/test.spec.js.map +0 -1
  752. package/ts_build/tests/unit/InputQueueManager.test.d.ts +0 -1
  753. package/ts_build/tests/unit/InputQueueManager.test.js +0 -104
  754. package/ts_build/tests/unit/InputQueueManager.test.js.map +0 -1
  755. package/ts_build/tests/unit/McpWebsocketTransport.test.d.ts +0 -1
  756. package/ts_build/tests/unit/McpWebsocketTransport.test.js +0 -47
  757. package/ts_build/tests/unit/McpWebsocketTransport.test.js.map +0 -1
  758. package/ts_build/tests/unit/agents/historyRollback.test.d.ts +0 -1
  759. package/ts_build/tests/unit/agents/historyRollback.test.js +0 -42
  760. package/ts_build/tests/unit/agents/historyRollback.test.js.map +0 -1
  761. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.d.ts +0 -1
  762. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js +0 -67
  763. package/ts_build/tests/unit/agents/tools/loadImageAsBase64.test.js.map +0 -1
  764. package/ts_build/tests/unit/auth/jwtStore.test.d.ts +0 -1
  765. package/ts_build/tests/unit/auth/jwtStore.test.js +0 -46
  766. package/ts_build/tests/unit/auth/jwtStore.test.js.map +0 -1
  767. package/ts_build/tests/unit/auth/keyAuth.test.d.ts +0 -1
  768. package/ts_build/tests/unit/auth/keyAuth.test.js +0 -118
  769. package/ts_build/tests/unit/auth/keyAuth.test.js.map +0 -1
  770. package/ts_build/tests/unit/auth/keyManager.test.d.ts +0 -1
  771. package/ts_build/tests/unit/auth/keyManager.test.js +0 -96
  772. package/ts_build/tests/unit/auth/keyManager.test.js.map +0 -1
  773. package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +0 -1
  774. package/ts_build/tests/unit/auth/registerIdentity.test.js +0 -92
  775. package/ts_build/tests/unit/auth/registerIdentity.test.js.map +0 -1
  776. package/ts_build/tests/unit/chat/ToolCommandModule.test.d.ts +0 -1
  777. package/ts_build/tests/unit/chat/ToolCommandModule.test.js +0 -61
  778. package/ts_build/tests/unit/chat/ToolCommandModule.test.js.map +0 -1
  779. package/ts_build/tests/unit/chat/historyCommandArgs.test.d.ts +0 -1
  780. package/ts_build/tests/unit/chat/historyCommandArgs.test.js +0 -29
  781. package/ts_build/tests/unit/chat/historyCommandArgs.test.js.map +0 -1
  782. package/ts_build/tests/unit/clients/AIClient.test.d.ts +0 -1
  783. package/ts_build/tests/unit/clients/AIClient.test.js +0 -342
  784. package/ts_build/tests/unit/clients/AIClient.test.js.map +0 -1
  785. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.d.ts +0 -1
  786. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js +0 -77
  787. package/ts_build/tests/unit/clients/anthropic.responseMetadata.test.js.map +0 -1
  788. package/ts_build/tests/unit/clients/attribution.test.d.ts +0 -1
  789. package/ts_build/tests/unit/clients/attribution.test.js +0 -153
  790. package/ts_build/tests/unit/clients/attribution.test.js.map +0 -1
  791. package/ts_build/tests/unit/clients/http.responseMetadata.test.d.ts +0 -1
  792. package/ts_build/tests/unit/clients/http.responseMetadata.test.js +0 -77
  793. package/ts_build/tests/unit/clients/http.responseMetadata.test.js.map +0 -1
  794. package/ts_build/tests/unit/clients/openai.responseMetadata.test.d.ts +0 -1
  795. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js +0 -86
  796. package/ts_build/tests/unit/clients/openai.responseMetadata.test.js.map +0 -1
  797. package/ts_build/tests/unit/clients/responseMetadata.test.d.ts +0 -1
  798. package/ts_build/tests/unit/clients/responseMetadata.test.js +0 -96
  799. package/ts_build/tests/unit/clients/responseMetadata.test.js.map +0 -1
  800. package/ts_build/tests/unit/clients/withRetry.test.d.ts +0 -1
  801. package/ts_build/tests/unit/clients/withRetry.test.js +0 -225
  802. package/ts_build/tests/unit/clients/withRetry.test.js.map +0 -1
  803. package/ts_build/tests/unit/commands/agents.test.d.ts +0 -1
  804. package/ts_build/tests/unit/commands/agents.test.js +0 -119
  805. package/ts_build/tests/unit/commands/agents.test.js.map +0 -1
  806. package/ts_build/tests/unit/commands/github-credentials.test.d.ts +0 -1
  807. package/ts_build/tests/unit/commands/github-credentials.test.js +0 -145
  808. package/ts_build/tests/unit/commands/github-credentials.test.js.map +0 -1
  809. package/ts_build/tests/unit/commands/misc.test.d.ts +0 -1
  810. package/ts_build/tests/unit/commands/misc.test.js +0 -70
  811. package/ts_build/tests/unit/commands/misc.test.js.map +0 -1
  812. package/ts_build/tests/unit/commands/remote.test.d.ts +0 -1
  813. package/ts_build/tests/unit/commands/remote.test.js +0 -70
  814. package/ts_build/tests/unit/commands/remote.test.js.map +0 -1
  815. package/ts_build/tests/unit/commands/sandbox.test.d.ts +0 -1
  816. package/ts_build/tests/unit/commands/sandbox.test.js +0 -258
  817. package/ts_build/tests/unit/commands/sandbox.test.js.map +0 -1
  818. package/ts_build/tests/unit/hashes.test.d.ts +0 -1
  819. package/ts_build/tests/unit/hashes.test.js +0 -25
  820. package/ts_build/tests/unit/hashes.test.js.map +0 -1
  821. package/ts_build/tests/unit/input-queue.test.d.ts +0 -1
  822. package/ts_build/tests/unit/input-queue.test.js +0 -32
  823. package/ts_build/tests/unit/input-queue.test.js.map +0 -1
  824. package/ts_build/tests/unit/login.test.d.ts +0 -1
  825. package/ts_build/tests/unit/login.test.js +0 -166
  826. package/ts_build/tests/unit/login.test.js.map +0 -1
  827. package/ts_build/tests/unit/modules/moduleLoading.test.d.ts +0 -1
  828. package/ts_build/tests/unit/modules/moduleLoading.test.js +0 -272
  829. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +0 -1
  830. package/ts_build/tests/unit/plugins/pluginLoading.test.d.ts +0 -1
  831. package/ts_build/tests/unit/plugins/pluginLoading.test.js +0 -117
  832. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +0 -1
  833. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.d.ts +0 -1
  834. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js +0 -32
  835. package/ts_build/tests/unit/services/AgentSyncKnowhowWeb.test.js.map +0 -1
  836. package/ts_build/tests/unit/services/KnowhowClient.test.d.ts +0 -1
  837. package/ts_build/tests/unit/services/KnowhowClient.test.js +0 -69
  838. package/ts_build/tests/unit/services/KnowhowClient.test.js.map +0 -1
  839. package/ts_build/tests/unit/services/LazyToolsService.test.d.ts +0 -1
  840. package/ts_build/tests/unit/services/LazyToolsService.test.js +0 -47
  841. package/ts_build/tests/unit/services/LazyToolsService.test.js.map +0 -1
  842. package/ts_build/tests/unit/services/Mcp.test.d.ts +0 -1
  843. package/ts_build/tests/unit/services/Mcp.test.js +0 -45
  844. package/ts_build/tests/unit/services/Mcp.test.js.map +0 -1
  845. package/ts_build/tests/unit/services/MinimalToolsService.test.d.ts +0 -1
  846. package/ts_build/tests/unit/services/MinimalToolsService.test.js +0 -320
  847. package/ts_build/tests/unit/services/MinimalToolsService.test.js.map +0 -1
  848. package/ts_build/tests/unit/services/RuntimeReloadService.test.d.ts +0 -1
  849. package/ts_build/tests/unit/services/RuntimeReloadService.test.js +0 -26
  850. package/ts_build/tests/unit/services/RuntimeReloadService.test.js.map +0 -1
  851. package/ts_build/tests/unit/services/SessionManager.test.d.ts +0 -1
  852. package/ts_build/tests/unit/services/SessionManager.test.js +0 -72
  853. package/ts_build/tests/unit/services/SessionManager.test.js.map +0 -1
  854. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.d.ts +0 -1
  855. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js +0 -78
  856. package/ts_build/tests/unit/services/SyncedAgentWatcher.test.js.map +0 -1
  857. package/ts_build/tests/unit/services/SyncerService.test.d.ts +0 -1
  858. package/ts_build/tests/unit/services/SyncerService.test.js +0 -40
  859. package/ts_build/tests/unit/services/SyncerService.test.js.map +0 -1
  860. package/ts_build/tests/unit/tunnel.test.d.ts +0 -1
  861. package/ts_build/tests/unit/tunnel.test.js +0 -47
  862. package/ts_build/tests/unit/tunnel.test.js.map +0 -1
  863. package/ts_build/tests/unit/util/Trace.test.d.ts +0 -1
  864. package/ts_build/tests/unit/util/Trace.test.js +0 -107
  865. package/ts_build/tests/unit/util/Trace.test.js.map +0 -1
  866. package/ts_build/tests/unit/utils/http.test.d.ts +0 -1
  867. package/ts_build/tests/unit/utils/http.test.js +0 -69
  868. package/ts_build/tests/unit/utils/http.test.js.map +0 -1
  869. package/tsconfig.json +0 -34
  870. 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
- });