@tyvm/knowhow 0.0.159 → 0.0.161

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