@kenkaiiii/ggcoder 5.49.4 → 5.49.6

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 (991) hide show
  1. package/dist/app-sidecar.js +3 -1
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +4 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +1 -0
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/lsp/edit-telemetry.d.ts +27 -0
  10. package/dist/core/lsp/edit-telemetry.d.ts.map +1 -0
  11. package/dist/core/lsp/edit-telemetry.js +50 -0
  12. package/dist/core/lsp/edit-telemetry.js.map +1 -0
  13. package/dist/core/lsp/manager.d.ts +24 -1
  14. package/dist/core/lsp/manager.d.ts.map +1 -1
  15. package/dist/core/lsp/manager.js +53 -2
  16. package/dist/core/lsp/manager.js.map +1 -1
  17. package/dist/core/mcp/content.d.ts +5 -0
  18. package/dist/core/mcp/content.d.ts.map +1 -1
  19. package/dist/core/mcp/content.js +20 -2
  20. package/dist/core/mcp/content.js.map +1 -1
  21. package/dist/core/sandbox.d.ts +17 -1
  22. package/dist/core/sandbox.d.ts.map +1 -1
  23. package/dist/core/sandbox.js +74 -8
  24. package/dist/core/sandbox.js.map +1 -1
  25. package/dist/core/settings-manager.d.ts +3 -2
  26. package/dist/core/settings-manager.d.ts.map +1 -1
  27. package/dist/core/settings-manager.js +10 -0
  28. package/dist/core/settings-manager.js.map +1 -1
  29. package/dist/tools/edit.d.ts +2 -1
  30. package/dist/tools/edit.d.ts.map +1 -1
  31. package/dist/tools/edit.js +21 -5
  32. package/dist/tools/edit.js.map +1 -1
  33. package/dist/tools/index.d.ts.map +1 -1
  34. package/dist/tools/index.js +1 -1
  35. package/dist/tools/index.js.map +1 -1
  36. package/dist/tools/web-fetch.d.ts.map +1 -1
  37. package/dist/tools/web-fetch.js +28 -4
  38. package/dist/tools/web-fetch.js.map +1 -1
  39. package/dist/tools/write.d.ts +1 -1
  40. package/dist/tools/write.d.ts.map +1 -1
  41. package/dist/tools/write.js +1 -1
  42. package/dist/tools/write.js.map +1 -1
  43. package/dist/ui/utils/text-utils.d.ts +0 -6
  44. package/dist/ui/utils/text-utils.d.ts.map +1 -1
  45. package/dist/ui/utils/text-utils.js +8 -3
  46. package/dist/ui/utils/text-utils.js.map +1 -1
  47. package/dist/utils/text.d.ts +41 -0
  48. package/dist/utils/text.d.ts.map +1 -1
  49. package/dist/utils/text.js +46 -0
  50. package/dist/utils/text.js.map +1 -1
  51. package/package.json +6 -10
  52. package/dist/app-sidecar-auth-broadcast.test.d.ts +0 -2
  53. package/dist/app-sidecar-auth-broadcast.test.d.ts.map +0 -1
  54. package/dist/app-sidecar-auth-broadcast.test.js +0 -383
  55. package/dist/app-sidecar-auth-broadcast.test.js.map +0 -1
  56. package/dist/app-sidecar-sessions.test.d.ts +0 -2
  57. package/dist/app-sidecar-sessions.test.d.ts.map +0 -1
  58. package/dist/app-sidecar-sessions.test.js +0 -178
  59. package/dist/app-sidecar-sessions.test.js.map +0 -1
  60. package/dist/chat-agents/general.test.d.ts +0 -2
  61. package/dist/chat-agents/general.test.d.ts.map +0 -1
  62. package/dist/chat-agents/general.test.js +0 -53
  63. package/dist/chat-agents/general.test.js.map +0 -1
  64. package/dist/chat-agents/jiwa.test.d.ts +0 -2
  65. package/dist/chat-agents/jiwa.test.d.ts.map +0 -1
  66. package/dist/chat-agents/jiwa.test.js +0 -66
  67. package/dist/chat-agents/jiwa.test.js.map +0 -1
  68. package/dist/chat-agents/memory.test.d.ts +0 -2
  69. package/dist/chat-agents/memory.test.d.ts.map +0 -1
  70. package/dist/chat-agents/memory.test.js +0 -165
  71. package/dist/chat-agents/memory.test.js.map +0 -1
  72. package/dist/chat-agents/specialists.test.d.ts +0 -2
  73. package/dist/chat-agents/specialists.test.d.ts.map +0 -1
  74. package/dist/chat-agents/specialists.test.js +0 -98
  75. package/dist/chat-agents/specialists.test.js.map +0 -1
  76. package/dist/cli/command-routing.test.d.ts +0 -2
  77. package/dist/cli/command-routing.test.d.ts.map +0 -1
  78. package/dist/cli/command-routing.test.js +0 -60
  79. package/dist/cli/command-routing.test.js.map +0 -1
  80. package/dist/config.test.d.ts +0 -2
  81. package/dist/config.test.d.ts.map +0 -1
  82. package/dist/config.test.js +0 -148
  83. package/dist/config.test.js.map +0 -1
  84. package/dist/core/agent-mcp-passthrough.test.d.ts +0 -2
  85. package/dist/core/agent-mcp-passthrough.test.d.ts.map +0 -1
  86. package/dist/core/agent-mcp-passthrough.test.js +0 -61
  87. package/dist/core/agent-mcp-passthrough.test.js.map +0 -1
  88. package/dist/core/agent-notifications.test.d.ts +0 -2
  89. package/dist/core/agent-notifications.test.d.ts.map +0 -1
  90. package/dist/core/agent-notifications.test.js +0 -97
  91. package/dist/core/agent-notifications.test.js.map +0 -1
  92. package/dist/core/agent-session-add-dir.test.d.ts +0 -2
  93. package/dist/core/agent-session-add-dir.test.d.ts.map +0 -1
  94. package/dist/core/agent-session-add-dir.test.js +0 -110
  95. package/dist/core/agent-session-add-dir.test.js.map +0 -1
  96. package/dist/core/agent-session-checkpoint-flush.test.d.ts +0 -2
  97. package/dist/core/agent-session-checkpoint-flush.test.d.ts.map +0 -1
  98. package/dist/core/agent-session-checkpoint-flush.test.js +0 -201
  99. package/dist/core/agent-session-checkpoint-flush.test.js.map +0 -1
  100. package/dist/core/agent-session-compaction.test.d.ts +0 -2
  101. package/dist/core/agent-session-compaction.test.d.ts.map +0 -1
  102. package/dist/core/agent-session-compaction.test.js +0 -1157
  103. package/dist/core/agent-session-compaction.test.js.map +0 -1
  104. package/dist/core/agent-session-crash-durability.test.d.ts +0 -2
  105. package/dist/core/agent-session-crash-durability.test.d.ts.map +0 -1
  106. package/dist/core/agent-session-crash-durability.test.js +0 -102
  107. package/dist/core/agent-session-crash-durability.test.js.map +0 -1
  108. package/dist/core/agent-session-marker-anchors.test.d.ts +0 -2
  109. package/dist/core/agent-session-marker-anchors.test.d.ts.map +0 -1
  110. package/dist/core/agent-session-marker-anchors.test.js +0 -326
  111. package/dist/core/agent-session-marker-anchors.test.js.map +0 -1
  112. package/dist/core/agent-session-memory-tail.test.d.ts +0 -2
  113. package/dist/core/agent-session-memory-tail.test.d.ts.map +0 -1
  114. package/dist/core/agent-session-memory-tail.test.js +0 -119
  115. package/dist/core/agent-session-memory-tail.test.js.map +0 -1
  116. package/dist/core/agent-session-model-switch.test.d.ts +0 -2
  117. package/dist/core/agent-session-model-switch.test.d.ts.map +0 -1
  118. package/dist/core/agent-session-model-switch.test.js +0 -161
  119. package/dist/core/agent-session-model-switch.test.js.map +0 -1
  120. package/dist/core/agent-session-notifications.test.d.ts +0 -2
  121. package/dist/core/agent-session-notifications.test.d.ts.map +0 -1
  122. package/dist/core/agent-session-notifications.test.js +0 -114
  123. package/dist/core/agent-session-notifications.test.js.map +0 -1
  124. package/dist/core/agent-session-pre-init-arming.test.d.ts +0 -2
  125. package/dist/core/agent-session-pre-init-arming.test.d.ts.map +0 -1
  126. package/dist/core/agent-session-pre-init-arming.test.js +0 -60
  127. package/dist/core/agent-session-pre-init-arming.test.js.map +0 -1
  128. package/dist/core/agent-session-process-gate.test.d.ts +0 -2
  129. package/dist/core/agent-session-process-gate.test.d.ts.map +0 -1
  130. package/dist/core/agent-session-process-gate.test.js +0 -98
  131. package/dist/core/agent-session-process-gate.test.js.map +0 -1
  132. package/dist/core/agent-session-queue.test.d.ts +0 -2
  133. package/dist/core/agent-session-queue.test.d.ts.map +0 -1
  134. package/dist/core/agent-session-queue.test.js +0 -184
  135. package/dist/core/agent-session-queue.test.js.map +0 -1
  136. package/dist/core/agent-session-review-coverage.test.d.ts +0 -2
  137. package/dist/core/agent-session-review-coverage.test.d.ts.map +0 -1
  138. package/dist/core/agent-session-review-coverage.test.js +0 -191
  139. package/dist/core/agent-session-review-coverage.test.js.map +0 -1
  140. package/dist/core/agent-session-slash-restore.test.d.ts +0 -2
  141. package/dist/core/agent-session-slash-restore.test.d.ts.map +0 -1
  142. package/dist/core/agent-session-slash-restore.test.js +0 -121
  143. package/dist/core/agent-session-slash-restore.test.js.map +0 -1
  144. package/dist/core/agent-session-subagent-policy.test.d.ts +0 -2
  145. package/dist/core/agent-session-subagent-policy.test.d.ts.map +0 -1
  146. package/dist/core/agent-session-subagent-policy.test.js +0 -40
  147. package/dist/core/agent-session-subagent-policy.test.js.map +0 -1
  148. package/dist/core/agent-session-tool-result-policy.test.d.ts +0 -2
  149. package/dist/core/agent-session-tool-result-policy.test.d.ts.map +0 -1
  150. package/dist/core/agent-session-tool-result-policy.test.js +0 -25
  151. package/dist/core/agent-session-tool-result-policy.test.js.map +0 -1
  152. package/dist/core/agent-session-tool-tiers.test.d.ts +0 -2
  153. package/dist/core/agent-session-tool-tiers.test.d.ts.map +0 -1
  154. package/dist/core/agent-session-tool-tiers.test.js +0 -138
  155. package/dist/core/agent-session-tool-tiers.test.js.map +0 -1
  156. package/dist/core/agent-session-verification-flow.test.d.ts +0 -2
  157. package/dist/core/agent-session-verification-flow.test.d.ts.map +0 -1
  158. package/dist/core/agent-session-verification-flow.test.js +0 -125
  159. package/dist/core/agent-session-verification-flow.test.js.map +0 -1
  160. package/dist/core/agent-session-verification-gate.test.d.ts +0 -2
  161. package/dist/core/agent-session-verification-gate.test.d.ts.map +0 -1
  162. package/dist/core/agent-session-verification-gate.test.js +0 -137
  163. package/dist/core/agent-session-verification-gate.test.js.map +0 -1
  164. package/dist/core/agent-tools-allowlist.test.d.ts +0 -2
  165. package/dist/core/agent-tools-allowlist.test.d.ts.map +0 -1
  166. package/dist/core/agent-tools-allowlist.test.js +0 -74
  167. package/dist/core/agent-tools-allowlist.test.js.map +0 -1
  168. package/dist/core/agents.test.d.ts +0 -2
  169. package/dist/core/agents.test.d.ts.map +0 -1
  170. package/dist/core/agents.test.js +0 -147
  171. package/dist/core/agents.test.js.map +0 -1
  172. package/dist/core/auto-update.test.d.ts +0 -2
  173. package/dist/core/auto-update.test.d.ts.map +0 -1
  174. package/dist/core/auto-update.test.js +0 -204
  175. package/dist/core/auto-update.test.js.map +0 -1
  176. package/dist/core/autopilot-cycle.test.d.ts +0 -2
  177. package/dist/core/autopilot-cycle.test.d.ts.map +0 -1
  178. package/dist/core/autopilot-cycle.test.js +0 -375
  179. package/dist/core/autopilot-cycle.test.js.map +0 -1
  180. package/dist/core/autopilot-gate.test.d.ts +0 -2
  181. package/dist/core/autopilot-gate.test.d.ts.map +0 -1
  182. package/dist/core/autopilot-gate.test.js +0 -298
  183. package/dist/core/autopilot-gate.test.js.map +0 -1
  184. package/dist/core/autopilot-verdict.test.d.ts +0 -2
  185. package/dist/core/autopilot-verdict.test.d.ts.map +0 -1
  186. package/dist/core/autopilot-verdict.test.js +0 -153
  187. package/dist/core/autopilot-verdict.test.js.map +0 -1
  188. package/dist/core/checkpoint-store.test.d.ts +0 -2
  189. package/dist/core/checkpoint-store.test.d.ts.map +0 -1
  190. package/dist/core/checkpoint-store.test.js +0 -111
  191. package/dist/core/checkpoint-store.test.js.map +0 -1
  192. package/dist/core/code-retrieval-chunkers.test.d.ts +0 -2
  193. package/dist/core/code-retrieval-chunkers.test.d.ts.map +0 -1
  194. package/dist/core/code-retrieval-chunkers.test.js +0 -203
  195. package/dist/core/code-retrieval-chunkers.test.js.map +0 -1
  196. package/dist/core/compaction/active-context.test.d.ts +0 -2
  197. package/dist/core/compaction/active-context.test.d.ts.map +0 -1
  198. package/dist/core/compaction/active-context.test.js +0 -57
  199. package/dist/core/compaction/active-context.test.js.map +0 -1
  200. package/dist/core/compaction/compactor.test.d.ts +0 -2
  201. package/dist/core/compaction/compactor.test.d.ts.map +0 -1
  202. package/dist/core/compaction/compactor.test.js +0 -1072
  203. package/dist/core/compaction/compactor.test.js.map +0 -1
  204. package/dist/core/compaction/policy.test.d.ts +0 -2
  205. package/dist/core/compaction/policy.test.d.ts.map +0 -1
  206. package/dist/core/compaction/policy.test.js +0 -35
  207. package/dist/core/compaction/policy.test.js.map +0 -1
  208. package/dist/core/compaction/query-aware-selector.test.d.ts +0 -2
  209. package/dist/core/compaction/query-aware-selector.test.d.ts.map +0 -1
  210. package/dist/core/compaction/query-aware-selector.test.js +0 -96
  211. package/dist/core/compaction/query-aware-selector.test.js.map +0 -1
  212. package/dist/core/compaction/token-estimator.test.d.ts +0 -2
  213. package/dist/core/compaction/token-estimator.test.d.ts.map +0 -1
  214. package/dist/core/compaction/token-estimator.test.js +0 -283
  215. package/dist/core/compaction/token-estimator.test.js.map +0 -1
  216. package/dist/core/compaction/tool-result-pruner.test.d.ts +0 -2
  217. package/dist/core/compaction/tool-result-pruner.test.d.ts.map +0 -1
  218. package/dist/core/compaction/tool-result-pruner.test.js +0 -320
  219. package/dist/core/compaction/tool-result-pruner.test.js.map +0 -1
  220. package/dist/core/context-limits.test.d.ts +0 -2
  221. package/dist/core/context-limits.test.d.ts.map +0 -1
  222. package/dist/core/context-limits.test.js +0 -55
  223. package/dist/core/context-limits.test.js.map +0 -1
  224. package/dist/core/continue-replay-inventory.test.d.ts +0 -2
  225. package/dist/core/continue-replay-inventory.test.d.ts.map +0 -1
  226. package/dist/core/continue-replay-inventory.test.js +0 -42
  227. package/dist/core/continue-replay-inventory.test.js.map +0 -1
  228. package/dist/core/encode-cwd.test.d.ts +0 -2
  229. package/dist/core/encode-cwd.test.d.ts.map +0 -1
  230. package/dist/core/encode-cwd.test.js +0 -80
  231. package/dist/core/encode-cwd.test.js.map +0 -1
  232. package/dist/core/event-bus.test.d.ts +0 -2
  233. package/dist/core/event-bus.test.d.ts.map +0 -1
  234. package/dist/core/event-bus.test.js +0 -33
  235. package/dist/core/event-bus.test.js.map +0 -1
  236. package/dist/core/extensions/plugin-bundles.test.d.ts +0 -2
  237. package/dist/core/extensions/plugin-bundles.test.d.ts.map +0 -1
  238. package/dist/core/extensions/plugin-bundles.test.js +0 -110
  239. package/dist/core/extensions/plugin-bundles.test.js.map +0 -1
  240. package/dist/core/foreign-session-import.test.d.ts +0 -2
  241. package/dist/core/foreign-session-import.test.d.ts.map +0 -1
  242. package/dist/core/foreign-session-import.test.js +0 -220
  243. package/dist/core/foreign-session-import.test.js.map +0 -1
  244. package/dist/core/hashline-edit-benchmark.test.d.ts +0 -2
  245. package/dist/core/hashline-edit-benchmark.test.d.ts.map +0 -1
  246. package/dist/core/hashline-edit-benchmark.test.js +0 -190
  247. package/dist/core/hashline-edit-benchmark.test.js.map +0 -1
  248. package/dist/core/ideal-review.test.d.ts +0 -2
  249. package/dist/core/ideal-review.test.d.ts.map +0 -1
  250. package/dist/core/ideal-review.test.js +0 -242
  251. package/dist/core/ideal-review.test.js.map +0 -1
  252. package/dist/core/input-normalization.test.d.ts +0 -2
  253. package/dist/core/input-normalization.test.d.ts.map +0 -1
  254. package/dist/core/input-normalization.test.js +0 -75
  255. package/dist/core/input-normalization.test.js.map +0 -1
  256. package/dist/core/json-mode-flag-parity.test.d.ts +0 -2
  257. package/dist/core/json-mode-flag-parity.test.d.ts.map +0 -1
  258. package/dist/core/json-mode-flag-parity.test.js +0 -66
  259. package/dist/core/json-mode-flag-parity.test.js.map +0 -1
  260. package/dist/core/ken-context.test.d.ts +0 -2
  261. package/dist/core/ken-context.test.d.ts.map +0 -1
  262. package/dist/core/ken-context.test.js +0 -342
  263. package/dist/core/ken-context.test.js.map +0 -1
  264. package/dist/core/ken-model.test.d.ts +0 -2
  265. package/dist/core/ken-model.test.d.ts.map +0 -1
  266. package/dist/core/ken-model.test.js +0 -51
  267. package/dist/core/ken-model.test.js.map +0 -1
  268. package/dist/core/ken-prompt.test.d.ts +0 -2
  269. package/dist/core/ken-prompt.test.d.ts.map +0 -1
  270. package/dist/core/ken-prompt.test.js +0 -191
  271. package/dist/core/ken-prompt.test.js.map +0 -1
  272. package/dist/core/language-detector.test.d.ts +0 -2
  273. package/dist/core/language-detector.test.d.ts.map +0 -1
  274. package/dist/core/language-detector.test.js +0 -109
  275. package/dist/core/language-detector.test.js.map +0 -1
  276. package/dist/core/local-endpoint-store.test.d.ts +0 -2
  277. package/dist/core/local-endpoint-store.test.d.ts.map +0 -1
  278. package/dist/core/local-endpoint-store.test.js +0 -123
  279. package/dist/core/local-endpoint-store.test.js.map +0 -1
  280. package/dist/core/loop-breaker.test.d.ts +0 -2
  281. package/dist/core/loop-breaker.test.d.ts.map +0 -1
  282. package/dist/core/loop-breaker.test.js +0 -238
  283. package/dist/core/loop-breaker.test.js.map +0 -1
  284. package/dist/core/lsp/client-navigation.test.d.ts +0 -2
  285. package/dist/core/lsp/client-navigation.test.d.ts.map +0 -1
  286. package/dist/core/lsp/client-navigation.test.js +0 -135
  287. package/dist/core/lsp/client-navigation.test.js.map +0 -1
  288. package/dist/core/lsp/format.test.d.ts +0 -2
  289. package/dist/core/lsp/format.test.d.ts.map +0 -1
  290. package/dist/core/lsp/format.test.js +0 -56
  291. package/dist/core/lsp/format.test.js.map +0 -1
  292. package/dist/core/lsp/integration.test.d.ts +0 -2
  293. package/dist/core/lsp/integration.test.d.ts.map +0 -1
  294. package/dist/core/lsp/integration.test.js +0 -60
  295. package/dist/core/lsp/integration.test.js.map +0 -1
  296. package/dist/core/lsp/jsonrpc.test.d.ts +0 -2
  297. package/dist/core/lsp/jsonrpc.test.d.ts.map +0 -1
  298. package/dist/core/lsp/jsonrpc.test.js +0 -127
  299. package/dist/core/lsp/jsonrpc.test.js.map +0 -1
  300. package/dist/core/lsp/manager-navigation.test.d.ts +0 -2
  301. package/dist/core/lsp/manager-navigation.test.d.ts.map +0 -1
  302. package/dist/core/lsp/manager-navigation.test.js +0 -121
  303. package/dist/core/lsp/manager-navigation.test.js.map +0 -1
  304. package/dist/core/lsp/manager.test.d.ts +0 -2
  305. package/dist/core/lsp/manager.test.d.ts.map +0 -1
  306. package/dist/core/lsp/manager.test.js +0 -220
  307. package/dist/core/lsp/manager.test.js.map +0 -1
  308. package/dist/core/lsp/pool.test.d.ts +0 -2
  309. package/dist/core/lsp/pool.test.d.ts.map +0 -1
  310. package/dist/core/lsp/pool.test.js +0 -286
  311. package/dist/core/lsp/pool.test.js.map +0 -1
  312. package/dist/core/lsp/servers.test.d.ts +0 -2
  313. package/dist/core/lsp/servers.test.d.ts.map +0 -1
  314. package/dist/core/lsp/servers.test.js +0 -67
  315. package/dist/core/lsp/servers.test.js.map +0 -1
  316. package/dist/core/lsp/uri.test.d.ts +0 -2
  317. package/dist/core/lsp/uri.test.d.ts.map +0 -1
  318. package/dist/core/lsp/uri.test.js +0 -56
  319. package/dist/core/lsp/uri.test.js.map +0 -1
  320. package/dist/core/lsp/windows.test.d.ts +0 -2
  321. package/dist/core/lsp/windows.test.d.ts.map +0 -1
  322. package/dist/core/lsp/windows.test.js +0 -239
  323. package/dist/core/lsp/windows.test.js.map +0 -1
  324. package/dist/core/mcp/catalog-cache.test.d.ts +0 -2
  325. package/dist/core/mcp/catalog-cache.test.d.ts.map +0 -1
  326. package/dist/core/mcp/catalog-cache.test.js +0 -99
  327. package/dist/core/mcp/catalog-cache.test.js.map +0 -1
  328. package/dist/core/mcp/client-session-recovery.test.d.ts +0 -2
  329. package/dist/core/mcp/client-session-recovery.test.d.ts.map +0 -1
  330. package/dist/core/mcp/client-session-recovery.test.js +0 -231
  331. package/dist/core/mcp/client-session-recovery.test.js.map +0 -1
  332. package/dist/core/mcp/content.test.d.ts +0 -2
  333. package/dist/core/mcp/content.test.d.ts.map +0 -1
  334. package/dist/core/mcp/content.test.js +0 -135
  335. package/dist/core/mcp/content.test.js.map +0 -1
  336. package/dist/core/mcp/defaults.test.d.ts +0 -2
  337. package/dist/core/mcp/defaults.test.d.ts.map +0 -1
  338. package/dist/core/mcp/defaults.test.js +0 -60
  339. package/dist/core/mcp/defaults.test.js.map +0 -1
  340. package/dist/core/mcp/elicitation.test.d.ts +0 -2
  341. package/dist/core/mcp/elicitation.test.d.ts.map +0 -1
  342. package/dist/core/mcp/elicitation.test.js +0 -158
  343. package/dist/core/mcp/elicitation.test.js.map +0 -1
  344. package/dist/core/mcp/legacy-negotiation.test.d.ts +0 -2
  345. package/dist/core/mcp/legacy-negotiation.test.d.ts.map +0 -1
  346. package/dist/core/mcp/legacy-negotiation.test.js +0 -80
  347. package/dist/core/mcp/legacy-negotiation.test.js.map +0 -1
  348. package/dist/core/mcp/loopback.test.d.ts +0 -2
  349. package/dist/core/mcp/loopback.test.d.ts.map +0 -1
  350. package/dist/core/mcp/loopback.test.js +0 -87
  351. package/dist/core/mcp/loopback.test.js.map +0 -1
  352. package/dist/core/mcp/oauth-store.test.d.ts +0 -2
  353. package/dist/core/mcp/oauth-store.test.d.ts.map +0 -1
  354. package/dist/core/mcp/oauth-store.test.js +0 -94
  355. package/dist/core/mcp/oauth-store.test.js.map +0 -1
  356. package/dist/core/mcp/parse-add-command.test.d.ts +0 -2
  357. package/dist/core/mcp/parse-add-command.test.d.ts.map +0 -1
  358. package/dist/core/mcp/parse-add-command.test.js +0 -81
  359. package/dist/core/mcp/parse-add-command.test.js.map +0 -1
  360. package/dist/core/mcp/resolve-stdio.test.d.ts +0 -2
  361. package/dist/core/mcp/resolve-stdio.test.d.ts.map +0 -1
  362. package/dist/core/mcp/resolve-stdio.test.js +0 -239
  363. package/dist/core/mcp/resolve-stdio.test.js.map +0 -1
  364. package/dist/core/mcp/session-elicitation-wiring.test.d.ts +0 -2
  365. package/dist/core/mcp/session-elicitation-wiring.test.d.ts.map +0 -1
  366. package/dist/core/mcp/session-elicitation-wiring.test.js +0 -138
  367. package/dist/core/mcp/session-elicitation-wiring.test.js.map +0 -1
  368. package/dist/core/mcp/shared-pool.test.d.ts +0 -2
  369. package/dist/core/mcp/shared-pool.test.d.ts.map +0 -1
  370. package/dist/core/mcp/shared-pool.test.js +0 -425
  371. package/dist/core/mcp/shared-pool.test.js.map +0 -1
  372. package/dist/core/mcp/store.test.d.ts +0 -2
  373. package/dist/core/mcp/store.test.d.ts.map +0 -1
  374. package/dist/core/mcp/store.test.js +0 -110
  375. package/dist/core/mcp/store.test.js.map +0 -1
  376. package/dist/core/mcp/when-connected.test.d.ts +0 -2
  377. package/dist/core/mcp/when-connected.test.d.ts.map +0 -1
  378. package/dist/core/mcp/when-connected.test.js +0 -46
  379. package/dist/core/mcp/when-connected.test.js.map +0 -1
  380. package/dist/core/message-images.test.d.ts +0 -2
  381. package/dist/core/message-images.test.d.ts.map +0 -1
  382. package/dist/core/message-images.test.js +0 -62
  383. package/dist/core/message-images.test.js.map +0 -1
  384. package/dist/core/network-guard.test.d.ts +0 -2
  385. package/dist/core/network-guard.test.d.ts.map +0 -1
  386. package/dist/core/network-guard.test.js +0 -72
  387. package/dist/core/network-guard.test.js.map +0 -1
  388. package/dist/core/persistent-shell.test.d.ts +0 -2
  389. package/dist/core/persistent-shell.test.d.ts.map +0 -1
  390. package/dist/core/persistent-shell.test.js +0 -84
  391. package/dist/core/persistent-shell.test.js.map +0 -1
  392. package/dist/core/process-gate.test.d.ts +0 -2
  393. package/dist/core/process-gate.test.d.ts.map +0 -1
  394. package/dist/core/process-gate.test.js +0 -87
  395. package/dist/core/process-gate.test.js.map +0 -1
  396. package/dist/core/process-manager-dev-server-repro.test.d.ts +0 -2
  397. package/dist/core/process-manager-dev-server-repro.test.d.ts.map +0 -1
  398. package/dist/core/process-manager-dev-server-repro.test.js +0 -225
  399. package/dist/core/process-manager-dev-server-repro.test.js.map +0 -1
  400. package/dist/core/process-manager-notifications.test.d.ts +0 -2
  401. package/dist/core/process-manager-notifications.test.d.ts.map +0 -1
  402. package/dist/core/process-manager-notifications.test.js +0 -245
  403. package/dist/core/process-manager-notifications.test.js.map +0 -1
  404. package/dist/core/process-manager-wake.test.d.ts +0 -2
  405. package/dist/core/process-manager-wake.test.d.ts.map +0 -1
  406. package/dist/core/process-manager-wake.test.js +0 -100
  407. package/dist/core/process-manager-wake.test.js.map +0 -1
  408. package/dist/core/progress/engine.test.d.ts +0 -2
  409. package/dist/core/progress/engine.test.d.ts.map +0 -1
  410. package/dist/core/progress/engine.test.js +0 -136
  411. package/dist/core/progress/engine.test.js.map +0 -1
  412. package/dist/core/progress/git-xp.test.d.ts +0 -2
  413. package/dist/core/progress/git-xp.test.d.ts.map +0 -1
  414. package/dist/core/progress/git-xp.test.js +0 -88
  415. package/dist/core/progress/git-xp.test.js.map +0 -1
  416. package/dist/core/progress/ranks.test.d.ts +0 -2
  417. package/dist/core/progress/ranks.test.d.ts.map +0 -1
  418. package/dist/core/progress/ranks.test.js +0 -100
  419. package/dist/core/progress/ranks.test.js.map +0 -1
  420. package/dist/core/progress/rebuild.test.d.ts +0 -2
  421. package/dist/core/progress/rebuild.test.d.ts.map +0 -1
  422. package/dist/core/progress/rebuild.test.js +0 -103
  423. package/dist/core/progress/rebuild.test.js.map +0 -1
  424. package/dist/core/progress/store.test.d.ts +0 -2
  425. package/dist/core/progress/store.test.d.ts.map +0 -1
  426. package/dist/core/progress/store.test.js +0 -108
  427. package/dist/core/progress/store.test.js.map +0 -1
  428. package/dist/core/project-discovery.test.d.ts +0 -2
  429. package/dist/core/project-discovery.test.d.ts.map +0 -1
  430. package/dist/core/project-discovery.test.js +0 -519
  431. package/dist/core/project-discovery.test.js.map +0 -1
  432. package/dist/core/prompt-commands.test.d.ts +0 -2
  433. package/dist/core/prompt-commands.test.d.ts.map +0 -1
  434. package/dist/core/prompt-commands.test.js +0 -180
  435. package/dist/core/prompt-commands.test.js.map +0 -1
  436. package/dist/core/provider-cache.e2e.test.d.ts +0 -2
  437. package/dist/core/provider-cache.e2e.test.d.ts.map +0 -1
  438. package/dist/core/provider-cache.e2e.test.js +0 -125
  439. package/dist/core/provider-cache.e2e.test.js.map +0 -1
  440. package/dist/core/radio.test.d.ts +0 -2
  441. package/dist/core/radio.test.d.ts.map +0 -1
  442. package/dist/core/radio.test.js +0 -117
  443. package/dist/core/radio.test.js.map +0 -1
  444. package/dist/core/regrounding.test.d.ts +0 -2
  445. package/dist/core/regrounding.test.d.ts.map +0 -1
  446. package/dist/core/regrounding.test.js +0 -38
  447. package/dist/core/regrounding.test.js.map +0 -1
  448. package/dist/core/resolve-start.test.d.ts +0 -2
  449. package/dist/core/resolve-start.test.d.ts.map +0 -1
  450. package/dist/core/resolve-start.test.js +0 -68
  451. package/dist/core/resolve-start.test.js.map +0 -1
  452. package/dist/core/run-claim.test.d.ts +0 -2
  453. package/dist/core/run-claim.test.d.ts.map +0 -1
  454. package/dist/core/run-claim.test.js +0 -107
  455. package/dist/core/run-claim.test.js.map +0 -1
  456. package/dist/core/run-journal.test.d.ts +0 -2
  457. package/dist/core/run-journal.test.d.ts.map +0 -1
  458. package/dist/core/run-journal.test.js +0 -195
  459. package/dist/core/run-journal.test.js.map +0 -1
  460. package/dist/core/run-lifecycle.test.d.ts +0 -2
  461. package/dist/core/run-lifecycle.test.d.ts.map +0 -1
  462. package/dist/core/run-lifecycle.test.js +0 -64
  463. package/dist/core/run-lifecycle.test.js.map +0 -1
  464. package/dist/core/sandbox-feedback.test.d.ts +0 -2
  465. package/dist/core/sandbox-feedback.test.d.ts.map +0 -1
  466. package/dist/core/sandbox-feedback.test.js +0 -32
  467. package/dist/core/sandbox-feedback.test.js.map +0 -1
  468. package/dist/core/sandbox.test.d.ts +0 -2
  469. package/dist/core/sandbox.test.d.ts.map +0 -1
  470. package/dist/core/sandbox.test.js +0 -221
  471. package/dist/core/sandbox.test.js.map +0 -1
  472. package/dist/core/semantic-search-benchmark.test.d.ts +0 -2
  473. package/dist/core/semantic-search-benchmark.test.d.ts.map +0 -1
  474. package/dist/core/semantic-search-benchmark.test.js +0 -89
  475. package/dist/core/semantic-search-benchmark.test.js.map +0 -1
  476. package/dist/core/session-compaction.test.d.ts +0 -2
  477. package/dist/core/session-compaction.test.d.ts.map +0 -1
  478. package/dist/core/session-compaction.test.js +0 -92
  479. package/dist/core/session-compaction.test.js.map +0 -1
  480. package/dist/core/session-export.test.d.ts +0 -2
  481. package/dist/core/session-export.test.d.ts.map +0 -1
  482. package/dist/core/session-export.test.js +0 -353
  483. package/dist/core/session-export.test.js.map +0 -1
  484. package/dist/core/session-history.test.d.ts +0 -2
  485. package/dist/core/session-history.test.d.ts.map +0 -1
  486. package/dist/core/session-history.test.js +0 -272
  487. package/dist/core/session-history.test.js.map +0 -1
  488. package/dist/core/session-injections.test.d.ts +0 -2
  489. package/dist/core/session-injections.test.d.ts.map +0 -1
  490. package/dist/core/session-injections.test.js +0 -117
  491. package/dist/core/session-injections.test.js.map +0 -1
  492. package/dist/core/session-manager.test.d.ts +0 -2
  493. package/dist/core/session-manager.test.d.ts.map +0 -1
  494. package/dist/core/session-manager.test.js +0 -571
  495. package/dist/core/session-manager.test.js.map +0 -1
  496. package/dist/core/session-notification-visibility.test.d.ts +0 -2
  497. package/dist/core/session-notification-visibility.test.d.ts.map +0 -1
  498. package/dist/core/session-notification-visibility.test.js +0 -113
  499. package/dist/core/session-notification-visibility.test.js.map +0 -1
  500. package/dist/core/session-reconstructability.test.d.ts +0 -2
  501. package/dist/core/session-reconstructability.test.d.ts.map +0 -1
  502. package/dist/core/session-reconstructability.test.js +0 -105
  503. package/dist/core/session-reconstructability.test.js.map +0 -1
  504. package/dist/core/session-restore-display.test.d.ts +0 -2
  505. package/dist/core/session-restore-display.test.d.ts.map +0 -1
  506. package/dist/core/session-restore-display.test.js +0 -103
  507. package/dist/core/session-restore-display.test.js.map +0 -1
  508. package/dist/core/session-storage-fd-leak.test.d.ts +0 -2
  509. package/dist/core/session-storage-fd-leak.test.d.ts.map +0 -1
  510. package/dist/core/session-storage-fd-leak.test.js +0 -116
  511. package/dist/core/session-storage-fd-leak.test.js.map +0 -1
  512. package/dist/core/session-storage.test.d.ts +0 -2
  513. package/dist/core/session-storage.test.d.ts.map +0 -1
  514. package/dist/core/session-storage.test.js +0 -277
  515. package/dist/core/session-storage.test.js.map +0 -1
  516. package/dist/core/setup-history.test.d.ts +0 -2
  517. package/dist/core/setup-history.test.d.ts.map +0 -1
  518. package/dist/core/setup-history.test.js +0 -59
  519. package/dist/core/setup-history.test.js.map +0 -1
  520. package/dist/core/shell.test.d.ts +0 -2
  521. package/dist/core/shell.test.d.ts.map +0 -1
  522. package/dist/core/shell.test.js +0 -87
  523. package/dist/core/shell.test.js.map +0 -1
  524. package/dist/core/shutdown.test.d.ts +0 -2
  525. package/dist/core/shutdown.test.d.ts.map +0 -1
  526. package/dist/core/shutdown.test.js +0 -160
  527. package/dist/core/shutdown.test.js.map +0 -1
  528. package/dist/core/sidecar-error-reporter.test.d.ts +0 -2
  529. package/dist/core/sidecar-error-reporter.test.d.ts.map +0 -1
  530. package/dist/core/sidecar-error-reporter.test.js +0 -61
  531. package/dist/core/sidecar-error-reporter.test.js.map +0 -1
  532. package/dist/core/skills-routing.test.d.ts +0 -2
  533. package/dist/core/skills-routing.test.d.ts.map +0 -1
  534. package/dist/core/skills-routing.test.js +0 -310
  535. package/dist/core/skills-routing.test.js.map +0 -1
  536. package/dist/core/slash-commands.test.d.ts +0 -2
  537. package/dist/core/slash-commands.test.d.ts.map +0 -1
  538. package/dist/core/slash-commands.test.js +0 -59
  539. package/dist/core/slash-commands.test.js.map +0 -1
  540. package/dist/core/source-maps.test.d.ts +0 -2
  541. package/dist/core/source-maps.test.d.ts.map +0 -1
  542. package/dist/core/source-maps.test.js +0 -175
  543. package/dist/core/source-maps.test.js.map +0 -1
  544. package/dist/core/speed-benchmark.test.d.ts +0 -2
  545. package/dist/core/speed-benchmark.test.d.ts.map +0 -1
  546. package/dist/core/speed-benchmark.test.js +0 -102
  547. package/dist/core/speed-benchmark.test.js.map +0 -1
  548. package/dist/core/subagent-manager.test.d.ts +0 -2
  549. package/dist/core/subagent-manager.test.d.ts.map +0 -1
  550. package/dist/core/subagent-manager.test.js +0 -536
  551. package/dist/core/subagent-manager.test.js.map +0 -1
  552. package/dist/core/subagent-store.test.d.ts +0 -2
  553. package/dist/core/subagent-store.test.d.ts.map +0 -1
  554. package/dist/core/subagent-store.test.js +0 -106
  555. package/dist/core/subagent-store.test.js.map +0 -1
  556. package/dist/core/subagent-turn-record.test.d.ts +0 -2
  557. package/dist/core/subagent-turn-record.test.d.ts.map +0 -1
  558. package/dist/core/subagent-turn-record.test.js +0 -70
  559. package/dist/core/subagent-turn-record.test.js.map +0 -1
  560. package/dist/core/verification-evidence.test.d.ts +0 -2
  561. package/dist/core/verification-evidence.test.d.ts.map +0 -1
  562. package/dist/core/verification-evidence.test.js +0 -103
  563. package/dist/core/verification-evidence.test.js.map +0 -1
  564. package/dist/core/verification-gate.test.d.ts +0 -2
  565. package/dist/core/verification-gate.test.d.ts.map +0 -1
  566. package/dist/core/verification-gate.test.js +0 -138
  567. package/dist/core/verification-gate.test.js.map +0 -1
  568. package/dist/core/verify-commands.test.d.ts +0 -2
  569. package/dist/core/verify-commands.test.d.ts.map +0 -1
  570. package/dist/core/verify-commands.test.js +0 -81
  571. package/dist/core/verify-commands.test.js.map +0 -1
  572. package/dist/core/workspace-guard.test.d.ts +0 -2
  573. package/dist/core/workspace-guard.test.d.ts.map +0 -1
  574. package/dist/core/workspace-guard.test.js +0 -107
  575. package/dist/core/workspace-guard.test.js.map +0 -1
  576. package/dist/hf-pull.test.d.ts +0 -2
  577. package/dist/hf-pull.test.d.ts.map +0 -1
  578. package/dist/hf-pull.test.js +0 -112
  579. package/dist/hf-pull.test.js.map +0 -1
  580. package/dist/modes/acp-mode.test.d.ts +0 -2
  581. package/dist/modes/acp-mode.test.d.ts.map +0 -1
  582. package/dist/modes/acp-mode.test.js +0 -1067
  583. package/dist/modes/acp-mode.test.js.map +0 -1
  584. package/dist/modes/json-mode.test.d.ts +0 -2
  585. package/dist/modes/json-mode.test.d.ts.map +0 -1
  586. package/dist/modes/json-mode.test.js +0 -84
  587. package/dist/modes/json-mode.test.js.map +0 -1
  588. package/dist/modes/subagent-worker-mode.test.d.ts +0 -2
  589. package/dist/modes/subagent-worker-mode.test.d.ts.map +0 -1
  590. package/dist/modes/subagent-worker-mode.test.js +0 -52
  591. package/dist/modes/subagent-worker-mode.test.js.map +0 -1
  592. package/dist/session.test.d.ts +0 -2
  593. package/dist/session.test.d.ts.map +0 -1
  594. package/dist/session.test.js +0 -35
  595. package/dist/session.test.js.map +0 -1
  596. package/dist/system-prompt.test.d.ts +0 -2
  597. package/dist/system-prompt.test.d.ts.map +0 -1
  598. package/dist/system-prompt.test.js +0 -684
  599. package/dist/system-prompt.test.js.map +0 -1
  600. package/dist/system-prompt.tiering.test.d.ts +0 -2
  601. package/dist/system-prompt.tiering.test.d.ts.map +0 -1
  602. package/dist/system-prompt.tiering.test.js +0 -112
  603. package/dist/system-prompt.tiering.test.js.map +0 -1
  604. package/dist/tools/bash.test.d.ts +0 -2
  605. package/dist/tools/bash.test.d.ts.map +0 -1
  606. package/dist/tools/bash.test.js +0 -248
  607. package/dist/tools/bash.test.js.map +0 -1
  608. package/dist/tools/checkpoint-hook.test.d.ts +0 -2
  609. package/dist/tools/checkpoint-hook.test.d.ts.map +0 -1
  610. package/dist/tools/checkpoint-hook.test.js +0 -65
  611. package/dist/tools/checkpoint-hook.test.js.map +0 -1
  612. package/dist/tools/code-nav.test.d.ts +0 -2
  613. package/dist/tools/code-nav.test.d.ts.map +0 -1
  614. package/dist/tools/code-nav.test.js +0 -136
  615. package/dist/tools/code-nav.test.js.map +0 -1
  616. package/dist/tools/code-skeleton.test.d.ts +0 -2
  617. package/dist/tools/code-skeleton.test.d.ts.map +0 -1
  618. package/dist/tools/code-skeleton.test.js +0 -115
  619. package/dist/tools/code-skeleton.test.js.map +0 -1
  620. package/dist/tools/compress-integration.test.d.ts +0 -2
  621. package/dist/tools/compress-integration.test.d.ts.map +0 -1
  622. package/dist/tools/compress-integration.test.js +0 -59
  623. package/dist/tools/compress-integration.test.js.map +0 -1
  624. package/dist/tools/compress.test.d.ts +0 -2
  625. package/dist/tools/compress.test.d.ts.map +0 -1
  626. package/dist/tools/compress.test.js +0 -60
  627. package/dist/tools/compress.test.js.map +0 -1
  628. package/dist/tools/edit-diff.test.d.ts +0 -2
  629. package/dist/tools/edit-diff.test.d.ts.map +0 -1
  630. package/dist/tools/edit-diff.test.js +0 -329
  631. package/dist/tools/edit-diff.test.js.map +0 -1
  632. package/dist/tools/edit-robustness.test.d.ts +0 -2
  633. package/dist/tools/edit-robustness.test.d.ts.map +0 -1
  634. package/dist/tools/edit-robustness.test.js +0 -417
  635. package/dist/tools/edit-robustness.test.js.map +0 -1
  636. package/dist/tools/edit.test.d.ts +0 -2
  637. package/dist/tools/edit.test.d.ts.map +0 -1
  638. package/dist/tools/edit.test.js +0 -984
  639. package/dist/tools/edit.test.js.map +0 -1
  640. package/dist/tools/exit-plan.test.d.ts +0 -2
  641. package/dist/tools/exit-plan.test.d.ts.map +0 -1
  642. package/dist/tools/exit-plan.test.js +0 -72
  643. package/dist/tools/exit-plan.test.js.map +0 -1
  644. package/dist/tools/generate-image.test.d.ts +0 -2
  645. package/dist/tools/generate-image.test.d.ts.map +0 -1
  646. package/dist/tools/generate-image.test.js +0 -240
  647. package/dist/tools/generate-image.test.js.map +0 -1
  648. package/dist/tools/grep-parity.test.d.ts +0 -2
  649. package/dist/tools/grep-parity.test.d.ts.map +0 -1
  650. package/dist/tools/grep-parity.test.js +0 -92
  651. package/dist/tools/grep-parity.test.js.map +0 -1
  652. package/dist/tools/grep-recall.test.d.ts +0 -2
  653. package/dist/tools/grep-recall.test.d.ts.map +0 -1
  654. package/dist/tools/grep-recall.test.js +0 -114
  655. package/dist/tools/grep-recall.test.js.map +0 -1
  656. package/dist/tools/grep-spawn.test.d.ts +0 -2
  657. package/dist/tools/grep-spawn.test.d.ts.map +0 -1
  658. package/dist/tools/grep-spawn.test.js +0 -66
  659. package/dist/tools/grep-spawn.test.js.map +0 -1
  660. package/dist/tools/grep.test.d.ts +0 -2
  661. package/dist/tools/grep.test.d.ts.map +0 -1
  662. package/dist/tools/grep.test.js +0 -82
  663. package/dist/tools/grep.test.js.map +0 -1
  664. package/dist/tools/html-extract.test.d.ts +0 -2
  665. package/dist/tools/html-extract.test.d.ts.map +0 -1
  666. package/dist/tools/html-extract.test.js +0 -60
  667. package/dist/tools/html-extract.test.js.map +0 -1
  668. package/dist/tools/index.test.d.ts +0 -2
  669. package/dist/tools/index.test.d.ts.map +0 -1
  670. package/dist/tools/index.test.js +0 -55
  671. package/dist/tools/index.test.js.map +0 -1
  672. package/dist/tools/overflow.test.d.ts +0 -2
  673. package/dist/tools/overflow.test.d.ts.map +0 -1
  674. package/dist/tools/overflow.test.js +0 -59
  675. package/dist/tools/overflow.test.js.map +0 -1
  676. package/dist/tools/path-utils.test.d.ts +0 -2
  677. package/dist/tools/path-utils.test.d.ts.map +0 -1
  678. package/dist/tools/path-utils.test.js +0 -110
  679. package/dist/tools/path-utils.test.js.map +0 -1
  680. package/dist/tools/pdf-extract.test.d.ts +0 -2
  681. package/dist/tools/pdf-extract.test.d.ts.map +0 -1
  682. package/dist/tools/pdf-extract.test.js +0 -15
  683. package/dist/tools/pdf-extract.test.js.map +0 -1
  684. package/dist/tools/plan-mode.test.d.ts +0 -2
  685. package/dist/tools/plan-mode.test.d.ts.map +0 -1
  686. package/dist/tools/plan-mode.test.js +0 -91
  687. package/dist/tools/plan-mode.test.js.map +0 -1
  688. package/dist/tools/read-only-bash.test.d.ts +0 -2
  689. package/dist/tools/read-only-bash.test.d.ts.map +0 -1
  690. package/dist/tools/read-only-bash.test.js +0 -96
  691. package/dist/tools/read-only-bash.test.js.map +0 -1
  692. package/dist/tools/read.test.d.ts +0 -2
  693. package/dist/tools/read.test.d.ts.map +0 -1
  694. package/dist/tools/read.test.js +0 -146
  695. package/dist/tools/read.test.js.map +0 -1
  696. package/dist/tools/screenshot.test.d.ts +0 -2
  697. package/dist/tools/screenshot.test.d.ts.map +0 -1
  698. package/dist/tools/screenshot.test.js +0 -145
  699. package/dist/tools/screenshot.test.js.map +0 -1
  700. package/dist/tools/search-code.test.d.ts +0 -2
  701. package/dist/tools/search-code.test.d.ts.map +0 -1
  702. package/dist/tools/search-code.test.js +0 -83
  703. package/dist/tools/search-code.test.js.map +0 -1
  704. package/dist/tools/source-path.test.d.ts +0 -2
  705. package/dist/tools/source-path.test.d.ts.map +0 -1
  706. package/dist/tools/source-path.test.js +0 -80
  707. package/dist/tools/source-path.test.js.map +0 -1
  708. package/dist/tools/subagent-control.test.d.ts +0 -2
  709. package/dist/tools/subagent-control.test.d.ts.map +0 -1
  710. package/dist/tools/subagent-control.test.js +0 -73
  711. package/dist/tools/subagent-control.test.js.map +0 -1
  712. package/dist/tools/subagent-shared.test.d.ts +0 -2
  713. package/dist/tools/subagent-shared.test.d.ts.map +0 -1
  714. package/dist/tools/subagent-shared.test.js +0 -83
  715. package/dist/tools/subagent-shared.test.js.map +0 -1
  716. package/dist/tools/subagent.test.d.ts +0 -2
  717. package/dist/tools/subagent.test.d.ts.map +0 -1
  718. package/dist/tools/subagent.test.js +0 -180
  719. package/dist/tools/subagent.test.js.map +0 -1
  720. package/dist/tools/task-send.test.d.ts +0 -2
  721. package/dist/tools/task-send.test.d.ts.map +0 -1
  722. package/dist/tools/task-send.test.js +0 -104
  723. package/dist/tools/task-send.test.js.map +0 -1
  724. package/dist/tools/tool-catalog.test.d.ts +0 -2
  725. package/dist/tools/tool-catalog.test.d.ts.map +0 -1
  726. package/dist/tools/tool-catalog.test.js +0 -124
  727. package/dist/tools/tool-catalog.test.js.map +0 -1
  728. package/dist/tools/tool-search.test.d.ts +0 -2
  729. package/dist/tools/tool-search.test.d.ts.map +0 -1
  730. package/dist/tools/tool-search.test.js +0 -127
  731. package/dist/tools/tool-search.test.js.map +0 -1
  732. package/dist/tools/tool-tiers.test.d.ts +0 -2
  733. package/dist/tools/tool-tiers.test.d.ts.map +0 -1
  734. package/dist/tools/tool-tiers.test.js +0 -48
  735. package/dist/tools/tool-tiers.test.js.map +0 -1
  736. package/dist/tools/truncate-utils.test.d.ts +0 -2
  737. package/dist/tools/truncate-utils.test.d.ts.map +0 -1
  738. package/dist/tools/truncate-utils.test.js +0 -93
  739. package/dist/tools/truncate-utils.test.js.map +0 -1
  740. package/dist/tools/truncate.test.d.ts +0 -2
  741. package/dist/tools/truncate.test.d.ts.map +0 -1
  742. package/dist/tools/truncate.test.js +0 -100
  743. package/dist/tools/truncate.test.js.map +0 -1
  744. package/dist/tools/web-fetch.test.d.ts +0 -2
  745. package/dist/tools/web-fetch.test.d.ts.map +0 -1
  746. package/dist/tools/web-fetch.test.js +0 -676
  747. package/dist/tools/web-fetch.test.js.map +0 -1
  748. package/dist/tools/web-search.test.d.ts +0 -2
  749. package/dist/tools/web-search.test.d.ts.map +0 -1
  750. package/dist/tools/web-search.test.js +0 -333
  751. package/dist/tools/web-search.test.js.map +0 -1
  752. package/dist/tools/write.test.d.ts +0 -2
  753. package/dist/tools/write.test.d.ts.map +0 -1
  754. package/dist/tools/write.test.js +0 -176
  755. package/dist/tools/write.test.js.map +0 -1
  756. package/dist/ui/anchor-pad-reclaim.test.d.ts +0 -2
  757. package/dist/ui/anchor-pad-reclaim.test.d.ts.map +0 -1
  758. package/dist/ui/anchor-pad-reclaim.test.js +0 -146
  759. package/dist/ui/anchor-pad-reclaim.test.js.map +0 -1
  760. package/dist/ui/app-items.test.d.ts +0 -2
  761. package/dist/ui/app-items.test.d.ts.map +0 -1
  762. package/dist/ui/app-items.test.js +0 -54
  763. package/dist/ui/app-items.test.js.map +0 -1
  764. package/dist/ui/app-state-persistence.test.d.ts +0 -2
  765. package/dist/ui/app-state-persistence.test.d.ts.map +0 -1
  766. package/dist/ui/app-state-persistence.test.js +0 -71
  767. package/dist/ui/app-state-persistence.test.js.map +0 -1
  768. package/dist/ui/assistant-stream-flush-parity.test.d.ts +0 -2
  769. package/dist/ui/assistant-stream-flush-parity.test.d.ts.map +0 -1
  770. package/dist/ui/assistant-stream-flush-parity.test.js +0 -85
  771. package/dist/ui/assistant-stream-flush-parity.test.js.map +0 -1
  772. package/dist/ui/atomic-flush-regression.test.d.ts +0 -2
  773. package/dist/ui/atomic-flush-regression.test.d.ts.map +0 -1
  774. package/dist/ui/atomic-flush-regression.test.js +0 -218
  775. package/dist/ui/atomic-flush-regression.test.js.map +0 -1
  776. package/dist/ui/chat-layout-pinning.test.d.ts +0 -2
  777. package/dist/ui/chat-layout-pinning.test.d.ts.map +0 -1
  778. package/dist/ui/chat-layout-pinning.test.js +0 -525
  779. package/dist/ui/chat-layout-pinning.test.js.map +0 -1
  780. package/dist/ui/components/ActivityIndicator.test.d.ts +0 -2
  781. package/dist/ui/components/ActivityIndicator.test.d.ts.map +0 -1
  782. package/dist/ui/components/ActivityIndicator.test.js +0 -40
  783. package/dist/ui/components/ActivityIndicator.test.js.map +0 -1
  784. package/dist/ui/components/AssistantMessage.test.d.ts +0 -2
  785. package/dist/ui/components/AssistantMessage.test.d.ts.map +0 -1
  786. package/dist/ui/components/AssistantMessage.test.js +0 -418
  787. package/dist/ui/components/AssistantMessage.test.js.map +0 -1
  788. package/dist/ui/components/Footer.test.d.ts +0 -2
  789. package/dist/ui/components/Footer.test.d.ts.map +0 -1
  790. package/dist/ui/components/Footer.test.js +0 -16
  791. package/dist/ui/components/Footer.test.js.map +0 -1
  792. package/dist/ui/components/InputArea.test.d.ts +0 -2
  793. package/dist/ui/components/InputArea.test.d.ts.map +0 -1
  794. package/dist/ui/components/InputArea.test.js +0 -95
  795. package/dist/ui/components/InputArea.test.js.map +0 -1
  796. package/dist/ui/components/PlanOverlay.test.d.ts +0 -2
  797. package/dist/ui/components/PlanOverlay.test.d.ts.map +0 -1
  798. package/dist/ui/components/PlanOverlay.test.js +0 -24
  799. package/dist/ui/components/PlanOverlay.test.js.map +0 -1
  800. package/dist/ui/components/StreamingArea.test.d.ts +0 -2
  801. package/dist/ui/components/StreamingArea.test.d.ts.map +0 -1
  802. package/dist/ui/components/StreamingArea.test.js +0 -18
  803. package/dist/ui/components/StreamingArea.test.js.map +0 -1
  804. package/dist/ui/components/UserMessage.test.d.ts +0 -2
  805. package/dist/ui/components/UserMessage.test.d.ts.map +0 -1
  806. package/dist/ui/components/UserMessage.test.js +0 -39
  807. package/dist/ui/components/UserMessage.test.js.map +0 -1
  808. package/dist/ui/components/themed-output.test.d.ts +0 -2
  809. package/dist/ui/components/themed-output.test.d.ts.map +0 -1
  810. package/dist/ui/components/themed-output.test.js +0 -111
  811. package/dist/ui/components/themed-output.test.js.map +0 -1
  812. package/dist/ui/footer-jump-regression.test.d.ts +0 -2
  813. package/dist/ui/footer-jump-regression.test.d.ts.map +0 -1
  814. package/dist/ui/footer-jump-regression.test.js +0 -224
  815. package/dist/ui/footer-jump-regression.test.js.map +0 -1
  816. package/dist/ui/footer-status-layout.test.d.ts +0 -2
  817. package/dist/ui/footer-status-layout.test.d.ts.map +0 -1
  818. package/dist/ui/footer-status-layout.test.js +0 -71
  819. package/dist/ui/footer-status-layout.test.js.map +0 -1
  820. package/dist/ui/frame-clip-regression.test.d.ts +0 -2
  821. package/dist/ui/frame-clip-regression.test.d.ts.map +0 -1
  822. package/dist/ui/frame-clip-regression.test.js +0 -215
  823. package/dist/ui/frame-clip-regression.test.js.map +0 -1
  824. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +0 -2
  825. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +0 -1
  826. package/dist/ui/hooks/stall-retry-duplicate.test.js +0 -94
  827. package/dist/ui/hooks/stall-retry-duplicate.test.js.map +0 -1
  828. package/dist/ui/hooks/useAgentLoop.test.d.ts +0 -2
  829. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +0 -1
  830. package/dist/ui/hooks/useAgentLoop.test.js +0 -66
  831. package/dist/ui/hooks/useAgentLoop.test.js.map +0 -1
  832. package/dist/ui/hooks/useContextCompaction.test.d.ts +0 -2
  833. package/dist/ui/hooks/useContextCompaction.test.d.ts.map +0 -1
  834. package/dist/ui/hooks/useContextCompaction.test.js +0 -135
  835. package/dist/ui/hooks/useContextCompaction.test.js.map +0 -1
  836. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts +0 -2
  837. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.d.ts.map +0 -1
  838. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js +0 -81
  839. package/dist/ui/hooks/useTranscriptHistory.sessionstore.test.js.map +0 -1
  840. package/dist/ui/hooks/useTranscriptHistory.test.d.ts +0 -2
  841. package/dist/ui/hooks/useTranscriptHistory.test.d.ts.map +0 -1
  842. package/dist/ui/hooks/useTranscriptHistory.test.js +0 -61
  843. package/dist/ui/hooks/useTranscriptHistory.test.js.map +0 -1
  844. package/dist/ui/hooks/useTranscriptScroll.test.d.ts +0 -2
  845. package/dist/ui/hooks/useTranscriptScroll.test.d.ts.map +0 -1
  846. package/dist/ui/hooks/useTranscriptScroll.test.js +0 -119
  847. package/dist/ui/hooks/useTranscriptScroll.test.js.map +0 -1
  848. package/dist/ui/live-area-clamp.test.d.ts +0 -2
  849. package/dist/ui/live-area-clamp.test.d.ts.map +0 -1
  850. package/dist/ui/live-area-clamp.test.js +0 -125
  851. package/dist/ui/live-area-clamp.test.js.map +0 -1
  852. package/dist/ui/live-area-height.test.d.ts +0 -2
  853. package/dist/ui/live-area-height.test.d.ts.map +0 -1
  854. package/dist/ui/live-area-height.test.js +0 -76
  855. package/dist/ui/live-area-height.test.js.map +0 -1
  856. package/dist/ui/live-frame-height.test.d.ts +0 -2
  857. package/dist/ui/live-frame-height.test.d.ts.map +0 -1
  858. package/dist/ui/live-frame-height.test.js +0 -116
  859. package/dist/ui/live-frame-height.test.js.map +0 -1
  860. package/dist/ui/live-item-flush.test.d.ts +0 -2
  861. package/dist/ui/live-item-flush.test.d.ts.map +0 -1
  862. package/dist/ui/live-item-flush.test.js +0 -437
  863. package/dist/ui/live-item-flush.test.js.map +0 -1
  864. package/dist/ui/long-prompt-regression-harness.test.d.ts +0 -2
  865. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +0 -1
  866. package/dist/ui/long-prompt-regression-harness.test.js +0 -195
  867. package/dist/ui/long-prompt-regression-harness.test.js.map +0 -1
  868. package/dist/ui/plan-overlay.test.d.ts +0 -2
  869. package/dist/ui/plan-overlay.test.d.ts.map +0 -1
  870. package/dist/ui/plan-overlay.test.js +0 -305
  871. package/dist/ui/plan-overlay.test.js.map +0 -1
  872. package/dist/ui/queued-message.test.d.ts +0 -2
  873. package/dist/ui/queued-message.test.d.ts.map +0 -1
  874. package/dist/ui/queued-message.test.js +0 -172
  875. package/dist/ui/queued-message.test.js.map +0 -1
  876. package/dist/ui/render.test.d.ts +0 -2
  877. package/dist/ui/render.test.d.ts.map +0 -1
  878. package/dist/ui/render.test.js +0 -42
  879. package/dist/ui/render.test.js.map +0 -1
  880. package/dist/ui/scroll-stabilization.test.d.ts +0 -2
  881. package/dist/ui/scroll-stabilization.test.d.ts.map +0 -1
  882. package/dist/ui/scroll-stabilization.test.js +0 -64
  883. package/dist/ui/scroll-stabilization.test.js.map +0 -1
  884. package/dist/ui/slash-command-images.test.d.ts +0 -2
  885. package/dist/ui/slash-command-images.test.d.ts.map +0 -1
  886. package/dist/ui/slash-command-images.test.js +0 -110
  887. package/dist/ui/slash-command-images.test.js.map +0 -1
  888. package/dist/ui/startup-banner-order.test.d.ts +0 -2
  889. package/dist/ui/startup-banner-order.test.d.ts.map +0 -1
  890. package/dist/ui/startup-banner-order.test.js +0 -105
  891. package/dist/ui/startup-banner-order.test.js.map +0 -1
  892. package/dist/ui/stores/transcript-scroll-store.test.d.ts +0 -2
  893. package/dist/ui/stores/transcript-scroll-store.test.d.ts.map +0 -1
  894. package/dist/ui/stores/transcript-scroll-store.test.js +0 -73
  895. package/dist/ui/stores/transcript-scroll-store.test.js.map +0 -1
  896. package/dist/ui/streaming-flush-bounce.test.d.ts +0 -2
  897. package/dist/ui/streaming-flush-bounce.test.d.ts.map +0 -1
  898. package/dist/ui/streaming-flush-bounce.test.js +0 -177
  899. package/dist/ui/streaming-flush-bounce.test.js.map +0 -1
  900. package/dist/ui/submit-boundary-gap.test.d.ts +0 -2
  901. package/dist/ui/submit-boundary-gap.test.d.ts.map +0 -1
  902. package/dist/ui/submit-boundary-gap.test.js +0 -180
  903. package/dist/ui/submit-boundary-gap.test.js.map +0 -1
  904. package/dist/ui/terminal-history-repaint.test.d.ts +0 -2
  905. package/dist/ui/terminal-history-repaint.test.d.ts.map +0 -1
  906. package/dist/ui/terminal-history-repaint.test.js +0 -73
  907. package/dist/ui/terminal-history-repaint.test.js.map +0 -1
  908. package/dist/ui/terminal-history-retry-dedup.test.d.ts +0 -2
  909. package/dist/ui/terminal-history-retry-dedup.test.d.ts.map +0 -1
  910. package/dist/ui/terminal-history-retry-dedup.test.js +0 -61
  911. package/dist/ui/terminal-history-retry-dedup.test.js.map +0 -1
  912. package/dist/ui/terminal-history.test.d.ts +0 -2
  913. package/dist/ui/terminal-history.test.d.ts.map +0 -1
  914. package/dist/ui/terminal-history.test.js +0 -557
  915. package/dist/ui/terminal-history.test.js.map +0 -1
  916. package/dist/ui/thinking-level-cycle.test.d.ts +0 -2
  917. package/dist/ui/thinking-level-cycle.test.d.ts.map +0 -1
  918. package/dist/ui/thinking-level-cycle.test.js +0 -45
  919. package/dist/ui/thinking-level-cycle.test.js.map +0 -1
  920. package/dist/ui/tool-group-summary.test.d.ts +0 -2
  921. package/dist/ui/tool-group-summary.test.d.ts.map +0 -1
  922. package/dist/ui/tool-group-summary.test.js +0 -79
  923. package/dist/ui/tool-group-summary.test.js.map +0 -1
  924. package/dist/ui/transcript/spacing.test.d.ts +0 -2
  925. package/dist/ui/transcript/spacing.test.d.ts.map +0 -1
  926. package/dist/ui/transcript/spacing.test.js +0 -187
  927. package/dist/ui/transcript/spacing.test.js.map +0 -1
  928. package/dist/ui/transcript/transcript-lines.test.d.ts +0 -2
  929. package/dist/ui/transcript/transcript-lines.test.d.ts.map +0 -1
  930. package/dist/ui/transcript/transcript-lines.test.js +0 -76
  931. package/dist/ui/transcript/transcript-lines.test.js.map +0 -1
  932. package/dist/ui/transcript-viewport-pinning.test.d.ts +0 -2
  933. package/dist/ui/transcript-viewport-pinning.test.d.ts.map +0 -1
  934. package/dist/ui/transcript-viewport-pinning.test.js +0 -148
  935. package/dist/ui/transcript-viewport-pinning.test.js.map +0 -1
  936. package/dist/ui/tui-history-parity.test.d.ts +0 -2
  937. package/dist/ui/tui-history-parity.test.d.ts.map +0 -1
  938. package/dist/ui/tui-history-parity.test.js +0 -369
  939. package/dist/ui/tui-history-parity.test.js.map +0 -1
  940. package/dist/ui/tui-simulation.test.d.ts +0 -2
  941. package/dist/ui/tui-simulation.test.d.ts.map +0 -1
  942. package/dist/ui/tui-simulation.test.js +0 -145
  943. package/dist/ui/tui-simulation.test.js.map +0 -1
  944. package/dist/ui/tui-terminal-recorder.test.d.ts +0 -2
  945. package/dist/ui/tui-terminal-recorder.test.d.ts.map +0 -1
  946. package/dist/ui/tui-terminal-recorder.test.js +0 -134
  947. package/dist/ui/tui-terminal-recorder.test.js.map +0 -1
  948. package/dist/ui/utils/assistant-stream-split.test.d.ts +0 -2
  949. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +0 -1
  950. package/dist/ui/utils/assistant-stream-split.test.js +0 -74
  951. package/dist/ui/utils/assistant-stream-split.test.js.map +0 -1
  952. package/dist/ui/utils/markdown-renderer.test.d.ts +0 -2
  953. package/dist/ui/utils/markdown-renderer.test.d.ts.map +0 -1
  954. package/dist/ui/utils/markdown-renderer.test.js +0 -63
  955. package/dist/ui/utils/markdown-renderer.test.js.map +0 -1
  956. package/dist/ui/utils/table-text.test.d.ts +0 -2
  957. package/dist/ui/utils/table-text.test.d.ts.map +0 -1
  958. package/dist/ui/utils/table-text.test.js +0 -202
  959. package/dist/ui/utils/table-text.test.js.map +0 -1
  960. package/dist/ui/utils/terminal-graphics.test.d.ts +0 -2
  961. package/dist/ui/utils/terminal-graphics.test.d.ts.map +0 -1
  962. package/dist/ui/utils/terminal-graphics.test.js +0 -100
  963. package/dist/ui/utils/terminal-graphics.test.js.map +0 -1
  964. package/dist/ui/utils/terminal-input.test.d.ts +0 -2
  965. package/dist/ui/utils/terminal-input.test.d.ts.map +0 -1
  966. package/dist/ui/utils/terminal-input.test.js +0 -15
  967. package/dist/ui/utils/terminal-input.test.js.map +0 -1
  968. package/dist/utils/git.test.d.ts +0 -2
  969. package/dist/utils/git.test.d.ts.map +0 -1
  970. package/dist/utils/git.test.js +0 -36
  971. package/dist/utils/git.test.js.map +0 -1
  972. package/dist/utils/github.test.d.ts +0 -2
  973. package/dist/utils/github.test.d.ts.map +0 -1
  974. package/dist/utils/github.test.js +0 -23
  975. package/dist/utils/github.test.js.map +0 -1
  976. package/dist/utils/http-body.test.d.ts +0 -2
  977. package/dist/utils/http-body.test.d.ts.map +0 -1
  978. package/dist/utils/http-body.test.js +0 -68
  979. package/dist/utils/http-body.test.js.map +0 -1
  980. package/dist/utils/image.test.d.ts +0 -2
  981. package/dist/utils/image.test.d.ts.map +0 -1
  982. package/dist/utils/image.test.js +0 -139
  983. package/dist/utils/image.test.js.map +0 -1
  984. package/dist/utils/plan-steps.test.d.ts +0 -2
  985. package/dist/utils/plan-steps.test.d.ts.map +0 -1
  986. package/dist/utils/plan-steps.test.js +0 -159
  987. package/dist/utils/plan-steps.test.js.map +0 -1
  988. package/dist/utils/process.test.d.ts +0 -2
  989. package/dist/utils/process.test.d.ts.map +0 -1
  990. package/dist/utils/process.test.js +0 -42
  991. package/dist/utils/process.test.js.map +0 -1
@@ -1,676 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from "vitest";
2
- import { buildLlmsCandidates, createWebFetchTool, htmlToCleanText } from "./web-fetch.js";
3
- const originalFetch = globalThis.fetch;
4
- function context() {
5
- return { signal: new AbortController().signal, toolCallId: "test" };
6
- }
7
- afterEach(() => {
8
- globalThis.fetch = originalFetch;
9
- vi.restoreAllMocks();
10
- });
11
- describe("htmlToCleanText", () => {
12
- it("removes common ad, cookie, nav, and subscription boilerplate", () => {
13
- const html = `
14
- <html>
15
- <head><style>.ad { display: block; }</style><script>alert("track")</script></head>
16
- <body>
17
- <header>Site navigation</header>
18
- <nav>Products Docs Pricing</nav>
19
- <div class="cookie-banner">Accept all cookies</div>
20
- <main>
21
- <article>
22
- <h1>Useful documentation</h1>
23
- <p>This is the content the agent should read.</p>
24
- <div class="advertisement">Sponsored: buy this now</div>
25
- <p>Second useful paragraph &amp; details.</p>
26
- </article>
27
- <aside class="newsletter-signup">Subscribe to our newsletter</aside>
28
- </main>
29
- <footer>Legal links</footer>
30
- </body>
31
- </html>
32
- `;
33
- const result = htmlToCleanText(html);
34
- expect(result).toContain("Useful documentation");
35
- expect(result).toContain("This is the content the agent should read.");
36
- expect(result).toContain("Second useful paragraph & details.");
37
- expect(result).not.toContain("Site navigation");
38
- expect(result).not.toContain("Products Docs Pricing");
39
- expect(result).not.toContain("Accept all cookies");
40
- expect(result).not.toContain("Sponsored");
41
- expect(result).not.toContain("Subscribe to our newsletter");
42
- expect(result).not.toContain("Legal links");
43
- });
44
- it("removes accessibility skip-link boilerplate", () => {
45
- const result = htmlToCleanText(`
46
- <a href="#content">Skip to main content</a>
47
- <a href="#search">Skip to search</a>
48
- <main><h1>Fetch API</h1><p>Useful page body.</p></main>
49
- `);
50
- expect(result).toContain("Fetch API");
51
- expect(result).toContain("Useful page body.");
52
- expect(result).not.toContain("Skip to main content");
53
- expect(result).not.toContain("Skip to search");
54
- });
55
- });
56
- describe("buildLlmsCandidates", () => {
57
- it("includes origin, docs subpath, and page markdown candidates", () => {
58
- const candidates = buildLlmsCandidates("https://example.com/docs/guide/page.html?x=1", 10000);
59
- const urls = candidates.map((candidate) => candidate.url);
60
- expect(urls).toContain("https://example.com/llms.txt");
61
- expect(urls).toContain("https://example.com/docs/llms.txt");
62
- expect(urls).toContain("https://example.com/docs/guide/page.html.md?x=1");
63
- });
64
- });
65
- describe("createWebFetchTool", () => {
66
- it("returns sanitized HTML content from fetched pages", async () => {
67
- const html = `
68
- <html>
69
- <body>
70
- <nav>Skip Main navigation</nav>
71
- <article>
72
- <h1>API Reference</h1>
73
- <p>Use this endpoint to create a session.</p>
74
- <div id="ad-container">Advertisement: cloud hosting sale</div>
75
- </article>
76
- <footer>Terms Privacy</footer>
77
- </body>
78
- </html>
79
- `;
80
- globalThis.fetch = vi.fn(async () => new Response(html, {
81
- status: 200,
82
- headers: { "content-type": "text/html; charset=utf-8" },
83
- }));
84
- const result = await createWebFetchTool().execute({ url: "https://example.com/docs" }, context());
85
- expect(result).toContain("API Reference");
86
- expect(result).toContain("Use this endpoint to create a session.");
87
- expect(result).not.toContain("Skip Main navigation");
88
- expect(result).not.toContain("Advertisement");
89
- expect(result).not.toContain("Terms Privacy");
90
- });
91
- it("returns markdown with a heading and fenced code by default", async () => {
92
- const html = `
93
- <html><head><title>Guide</title></head>
94
- <body>
95
- <article>
96
- <h1>Setup Guide</h1>
97
- <p>This is a sufficiently long introductory paragraph so the
98
- Readability extractor treats the page as a genuine article and emits
99
- structured markdown for the agent to consume in tests.</p>
100
- <pre><code>npm install thing</code></pre>
101
- <p>Another descriptive paragraph that adds enough body length to clear
102
- the minimum article-length threshold comfortably during extraction.</p>
103
- </article>
104
- </body></html>
105
- `;
106
- globalThis.fetch = vi.fn(async () => new Response(html, { status: 200, headers: { "content-type": "text/html" } }));
107
- const result = await createWebFetchTool().execute({ url: "https://example.com/guide", format: "markdown" }, context());
108
- expect(result).toContain("# Guide");
109
- expect(result).toContain("Setup Guide");
110
- expect(result).toContain("```");
111
- expect(result).toContain("npm install thing");
112
- });
113
- it("falls back to clean text when the extractor is unavailable", async () => {
114
- const html = `<html><body><article><h1>Fallback</h1><p>Body content for fallback.</p></article></body></html>`;
115
- globalThis.fetch = vi.fn(async () => new Response(html, { status: 200, headers: { "content-type": "text/html" } }));
116
- // Force the markdown extractor to throw so the tool degrades to text.
117
- const extract = await import("./html-extract.js");
118
- const spy = vi
119
- .spyOn(extract, "extractToMarkdown")
120
- .mockRejectedValue(new extract.ExtractorUnavailable("stubbed missing"));
121
- const result = await createWebFetchTool().execute({ url: "https://example.com/page", format: "markdown" }, context());
122
- expect(spy).toHaveBeenCalled();
123
- expect(result).toContain("Fallback");
124
- expect(result).toContain("Body content for fallback.");
125
- spy.mockRestore();
126
- });
127
- it("follows a safe same-host redirect and returns the final content", async () => {
128
- const finalHtml = `<html><body><article><h1>Final Page</h1><p>Redirect target body.</p></article></body></html>`;
129
- globalThis.fetch = vi
130
- .fn()
131
- .mockResolvedValueOnce(new Response(null, {
132
- status: 301,
133
- headers: { location: "https://example.com/final/" },
134
- }))
135
- .mockResolvedValueOnce(new Response(finalHtml, {
136
- status: 200,
137
- headers: { "content-type": "text/html" },
138
- }));
139
- const result = await createWebFetchTool().execute({ url: "https://example.com/redirect", format: "text" }, context());
140
- expect(result).toContain("Final Page");
141
- expect(result).toContain("Redirect target body.");
142
- expect(result).not.toContain("Redirects are not followed");
143
- });
144
- it("blocks redirects to private/internal URLs", async () => {
145
- globalThis.fetch = vi.fn(async () => new Response(null, {
146
- status: 302,
147
- headers: { location: "http://127.0.0.1:3000/secret" },
148
- }));
149
- const result = await createWebFetchTool().execute({ url: "https://example.com/redirect" }, context());
150
- expect(result).toContain("Redirect blocked");
151
- expect(globalThis.fetch).toHaveBeenCalledWith("https://example.com/redirect", expect.objectContaining({ redirect: "manual" }));
152
- });
153
- it("stops after too many redirects", async () => {
154
- let hop = 0;
155
- globalThis.fetch = vi.fn(async () => new Response(null, {
156
- status: 302,
157
- headers: { location: `https://example.com/hop${hop++}` },
158
- }));
159
- const result = await createWebFetchTool().execute({ url: "https://example.com/loop" }, context());
160
- expect(result).toContain("too many redirects");
161
- });
162
- it("blocks private/internal URLs before fetching", async () => {
163
- const fetchMock = vi.fn();
164
- globalThis.fetch = fetchMock;
165
- const result = await createWebFetchTool().execute({ url: "http://127.0.0.1:3000/secret" }, context());
166
- expect(result).toContain("URL blocked");
167
- expect(fetchMock).not.toHaveBeenCalled();
168
- });
169
- it("fetches multiple URLs into ordered sections, reporting per-URL failures", async () => {
170
- globalThis.fetch = vi.fn(async (input) => {
171
- const url = String(input);
172
- if (url.includes("page-a")) {
173
- return new Response(`<html><body><article><h1>Alpha</h1><p>Alpha body.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
174
- }
175
- return new Response("not found", { status: 404, statusText: "Not Found" });
176
- });
177
- const result = (await createWebFetchTool().execute({
178
- urls: ["https://example.com/page-a", "https://example.com/page-b"],
179
- format: "text",
180
- }, context()));
181
- const idxA = result.indexOf("## https://example.com/page-a");
182
- const idxB = result.indexOf("## https://example.com/page-b");
183
- expect(idxA).toBeGreaterThanOrEqual(0);
184
- expect(idxB).toBeGreaterThan(idxA);
185
- expect(result).toContain("Alpha");
186
- expect(result).toContain("HTTP 404");
187
- });
188
- it("reports a blocked private URL only within its own section", async () => {
189
- globalThis.fetch = vi.fn(async () => new Response(`<html><body><article><h1>Public</h1><p>Public body text.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } }));
190
- const result = await createWebFetchTool().execute({
191
- urls: ["https://example.com/public", "http://127.0.0.1/secret"],
192
- format: "text",
193
- }, context());
194
- expect(result).toContain("## http://127.0.0.1/secret");
195
- expect(result).toContain("URL blocked");
196
- expect(result).toContain("Public");
197
- });
198
- it("extracts text from a PDF response", async () => {
199
- const { readFile } = await import("node:fs/promises");
200
- const { fileURLToPath } = await import("node:url");
201
- const fixturePath = fileURLToPath(new URL("./__fixtures__/sample.pdf", import.meta.url));
202
- const bytes = await readFile(fixturePath);
203
- globalThis.fetch = vi.fn(async () => new Response(bytes, {
204
- status: 200,
205
- headers: { "content-type": "application/pdf" },
206
- }));
207
- const result = await createWebFetchTool().execute({ url: "https://example.com/file.pdf" }, context());
208
- expect(result).toContain("[PDF");
209
- expect(result).toContain("Hello PDF World");
210
- });
211
- it("keeps the existing 25 MB allowance for PDF responses", async () => {
212
- const { readFile } = await import("node:fs/promises");
213
- const { fileURLToPath } = await import("node:url");
214
- const fixturePath = fileURLToPath(new URL("./__fixtures__/sample.pdf", import.meta.url));
215
- const bytes = await readFile(fixturePath);
216
- globalThis.fetch = vi.fn(async () => new Response(bytes, {
217
- status: 200,
218
- headers: {
219
- "content-type": "application/pdf",
220
- "content-length": String(6 * 1024 * 1024),
221
- },
222
- }));
223
- const result = await createWebFetchTool().execute({ url: "https://example.com/file.pdf" }, context());
224
- expect(result).toContain("Hello PDF World");
225
- expect(result).not.toContain("response too large");
226
- });
227
- it("prefers a site's llms.txt for doc-ish pages and skips scraping the page", async () => {
228
- const fetchMock = vi.fn(async (input) => {
229
- const url = String(input);
230
- if (url.endsWith("/llms.txt")) {
231
- return new Response("# Docs Index\n\n" + "This is the curated llms.txt content. ".repeat(10), { status: 200, headers: { "content-type": "text/plain" } });
232
- }
233
- return new Response("<html><body>page</body></html>", {
234
- status: 200,
235
- headers: { "content-type": "text/html" },
236
- });
237
- });
238
- globalThis.fetch = fetchMock;
239
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api" }, context());
240
- expect(result).toContain("[llms.txt for docs.example.com]");
241
- expect(result).toContain("curated llms.txt content");
242
- expect(fetchMock.mock.calls.map(([input]) => String(input))).not.toContain("https://docs.example.com/reference/api");
243
- });
244
- it("follows safe redirects while probing llms resources", async () => {
245
- const fetchMock = vi.fn(async (input) => {
246
- const url = String(input);
247
- if (url === "https://docs.example.com/llms.txt") {
248
- return new Response(null, {
249
- status: 301,
250
- headers: { location: "https://platform.example.com/docs/llms.txt" },
251
- });
252
- }
253
- if (url === "https://platform.example.com/docs/llms.txt") {
254
- return new Response("# Redirected Docs\n\n" + "Redirected llms content. ".repeat(10), {
255
- status: 200,
256
- headers: { "content-type": "text/plain" },
257
- });
258
- }
259
- return new Response("not found", { status: 404 });
260
- });
261
- globalThis.fetch = fetchMock;
262
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api" }, context());
263
- expect(result).toContain("[llms.txt for docs.example.com]");
264
- expect(result).toContain("Source: https://platform.example.com/docs/llms.txt");
265
- expect(result).toContain("Redirected llms content");
266
- });
267
- it("prefers docs-subpath llms.txt when origin llms.txt is absent", async () => {
268
- const fetchMock = vi.fn(async (input) => {
269
- const url = String(input);
270
- if (url === "https://example.com/llms.txt") {
271
- return new Response("not found", { status: 404 });
272
- }
273
- if (url === "https://example.com/docs/llms.txt") {
274
- return new Response("# Docs Root\n\n" + "Subpath llms content. ".repeat(10), {
275
- status: 200,
276
- headers: { "content-type": "text/plain" },
277
- });
278
- }
279
- return new Response("not found", { status: 404 });
280
- });
281
- globalThis.fetch = fetchMock;
282
- const result = await createWebFetchTool().execute({ url: "https://example.com/docs/guide/intro" }, context());
283
- expect(result).toContain("[llms.txt for example.com]");
284
- expect(result).toContain("Source: https://example.com/docs/llms.txt");
285
- expect(result).toContain("Subpath llms content");
286
- });
287
- it("accepts markdown-looking llms body with octet-stream content type", async () => {
288
- globalThis.fetch = vi.fn(async () => new Response("# Docs Index\n\n" + "- [Guide](./guide)\n- [API](./api)\n".repeat(8), {
289
- status: 200,
290
- headers: { "content-type": "application/octet-stream" },
291
- }));
292
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/api" }, context());
293
- expect(result).toContain("[llms.txt for docs.example.com]");
294
- expect(result).toContain("Docs Index");
295
- });
296
- it("rejects HTML error pages served with status 200", async () => {
297
- const fetchMock = vi.fn(async (input) => {
298
- const url = String(input);
299
- if (url.includes("llms") || url.endsWith(".md")) {
300
- return new Response("<!doctype html><html><head><title>404 Not Found</title></head><body>Missing</body></html>", {
301
- status: 200,
302
- headers: { "content-type": "text/html" },
303
- });
304
- }
305
- return new Response(`<html><body><article><h1>Real Docs</h1><p>Scraped fallback content.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
306
- });
307
- globalThis.fetch = fetchMock;
308
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/guide/page", format: "text" }, context());
309
- expect(result).toContain("Real Docs");
310
- expect(result).not.toContain("404 Not Found");
311
- });
312
- it("tries page URL .md when llms variants are absent", async () => {
313
- const fetchMock = vi.fn(async (input) => {
314
- const url = String(input);
315
- if (url.endsWith("/reference/page.html.md")) {
316
- return new Response("# Page Markdown\n\n" + "Specific markdown source. ".repeat(10), {
317
- status: 200,
318
- headers: { "content-type": "" },
319
- });
320
- }
321
- if (url.includes("llms"))
322
- return new Response("not found", { status: 404 });
323
- return new Response("page", { status: 200 });
324
- });
325
- globalThis.fetch = fetchMock;
326
- const result = await createWebFetchTool().execute({ url: "https://example.com/reference/page.html" }, context());
327
- expect(result).toContain("[Markdown source for example.com/reference/page.html.md]");
328
- expect(result).toContain("Specific markdown source");
329
- });
330
- it("uses preferred docs resources for multi-URL fetch sections", async () => {
331
- const fetchMock = vi.fn(async (input) => {
332
- const url = String(input);
333
- if (url === "https://docs.a.com/llms.txt") {
334
- return new Response("# A Docs\n\n" + "A llms content. ".repeat(10), {
335
- status: 200,
336
- headers: { "content-type": "text/plain" },
337
- });
338
- }
339
- if (url === "https://docs.b.com/llms.txt") {
340
- return new Response("# B Docs\n\n" + "B llms content. ".repeat(10), {
341
- status: 200,
342
- headers: { "content-type": "text/plain" },
343
- });
344
- }
345
- return new Response("not found", { status: 404 });
346
- });
347
- globalThis.fetch = fetchMock;
348
- const result = await createWebFetchTool().execute({ urls: ["https://docs.a.com/api", "https://docs.b.com/guide"] }, context());
349
- expect(result).toContain("## https://docs.a.com/api");
350
- expect(result).toContain("A llms content");
351
- expect(result).toContain("## https://docs.b.com/guide");
352
- expect(result).toContain("B llms content");
353
- });
354
- it("falls through to scraping when llms.txt is absent", async () => {
355
- const fetchMock = vi.fn(async (input) => {
356
- const url = String(input);
357
- if (url.endsWith("/llms.txt")) {
358
- return new Response("not found", { status: 404 });
359
- }
360
- return new Response(`<html><body><article><h1>Real Docs</h1><p>Scraped body content here.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } });
361
- });
362
- globalThis.fetch = fetchMock;
363
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/guide/intro", format: "text" }, context());
364
- expect(result).toContain("Real Docs");
365
- expect(fetchMock).toHaveBeenCalledWith("https://docs.example.com/llms.txt", expect.anything());
366
- expect(fetchMock).toHaveBeenCalledWith("https://docs.example.com/guide/intro", expect.anything());
367
- });
368
- it("skips the llms.txt probe when prefer_llms_txt is false", async () => {
369
- const fetchMock = vi.fn(async () => new Response(`<html><body><article><h1>Direct</h1><p>Direct page body content.</p></article></body></html>`, { status: 200, headers: { "content-type": "text/html" } }));
370
- globalThis.fetch = fetchMock;
371
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api", prefer_llms_txt: false, format: "text" }, context());
372
- expect(result).toContain("Direct");
373
- expect(fetchMock).toHaveBeenCalledTimes(1);
374
- });
375
- it("returns bounded raw HTML for an explicit html format and sends format headers", async () => {
376
- const html = `<html><body><nav>Keep raw nav</nav><main><h1>Raw page</h1></main></body></html>`;
377
- const fetchMock = vi.fn(async (_input, _init) => new Response(html, { status: 200, headers: { "content-type": "text/html" } }));
378
- globalThis.fetch = fetchMock;
379
- const result = await createWebFetchTool().execute({ url: "https://example.com/docs", format: "html", max_length: 60 }, context());
380
- expect(result).toContain("<html>");
381
- expect(result).toContain("Keep raw nav");
382
- expect(result).toContain("[Content truncated]");
383
- expect(fetchMock).toHaveBeenCalledTimes(1);
384
- const headers = fetchMock.mock.calls[0][1]?.headers;
385
- expect(headers.Accept).toContain("text/html");
386
- expect(headers["Accept-Language"]).toBe("en-US,en;q=0.9");
387
- });
388
- it("rejects an oversized declared content length before collecting the body", async () => {
389
- let pulls = 0;
390
- let cancelled = false;
391
- const stream = new ReadableStream({
392
- pull(controller) {
393
- pulls++;
394
- controller.enqueue(new TextEncoder().encode("body"));
395
- },
396
- cancel() {
397
- cancelled = true;
398
- },
399
- });
400
- globalThis.fetch = vi.fn(async () => new Response(stream, {
401
- status: 200,
402
- headers: { "content-length": String(5 * 1024 * 1024 + 1) },
403
- }));
404
- const result = await createWebFetchTool().execute({ url: "https://example.com/large", prefer_llms_txt: false }, context());
405
- expect(result).toContain("response too large");
406
- expect(cancelled).toBe(true);
407
- expect(pulls).toBeLessThanOrEqual(1);
408
- });
409
- it("cancels a streamed response as soon as it crosses 5 MB", async () => {
410
- let cancelled = false;
411
- let emitted = 0;
412
- const chunk = new Uint8Array(1024 * 1024);
413
- const stream = new ReadableStream({
414
- pull(controller) {
415
- emitted++;
416
- controller.enqueue(chunk);
417
- if (emitted > 8)
418
- controller.close();
419
- },
420
- cancel() {
421
- cancelled = true;
422
- },
423
- });
424
- globalThis.fetch = vi.fn(async () => new Response(stream, { status: 200 }));
425
- const result = await createWebFetchTool().execute({ url: "https://example.com/stream", prefer_llms_txt: false }, context());
426
- expect(result).toContain("response too large");
427
- expect(cancelled).toBe(true);
428
- expect(emitted).toBeLessThanOrEqual(7);
429
- });
430
- it("sniffs HTML without a useful content type for text and markdown formats", async () => {
431
- const html = `<html><head><title>Sniffed</title></head><body><article><h1>Sniffed page</h1><p>Useful body.</p></article></body></html>`;
432
- globalThis.fetch = vi.fn(async () => new Response(html, { status: 200 }));
433
- const tool = createWebFetchTool();
434
- const text = await tool.execute({ url: "https://example.com/sniff-text", format: "text", prefer_llms_txt: false }, context());
435
- const markdown = await tool.execute({ url: "https://example.com/sniff-markdown", format: "markdown", prefer_llms_txt: false }, context());
436
- expect(text).toContain("Sniffed page");
437
- expect(text).not.toContain("<html>");
438
- expect(markdown).toContain("Sniffed");
439
- expect(markdown).not.toContain("<html>");
440
- });
441
- it("retries a Cloudflare challenge once with the honest user-agent", async () => {
442
- const fetchMock = vi
443
- .fn()
444
- .mockResolvedValueOnce(new Response("challenge", {
445
- status: 403,
446
- headers: { "cf-mitigated": "challenge" },
447
- }))
448
- .mockResolvedValueOnce(new Response("ok", { status: 200 }));
449
- globalThis.fetch = fetchMock;
450
- const result = await createWebFetchTool().execute({ url: "https://example.com/challenge", format: "text", prefer_llms_txt: false }, context());
451
- expect(result).toBe("ok");
452
- expect(fetchMock).toHaveBeenCalledTimes(2);
453
- const firstHeaders = fetchMock.mock.calls[0][1]?.headers;
454
- const retryHeaders = fetchMock.mock.calls[1][1]?.headers;
455
- expect(firstHeaders["User-Agent"]).toContain("Mozilla");
456
- expect(retryHeaders["User-Agent"]).toContain("ggcoder/1.0");
457
- });
458
- it("probes curated documents concurrently but preserves candidate priority", async () => {
459
- let resolveHighest;
460
- const highest = new Promise((resolve) => {
461
- resolveHighest = resolve;
462
- });
463
- const started = [];
464
- const fetchMock = vi.fn(async (input) => {
465
- const url = String(input);
466
- started.push(url);
467
- if (url === "https://docs.example.com/llms.txt")
468
- return await highest;
469
- return new Response("# Lower Priority\n\n" + "Lower priority docs. ".repeat(10), {
470
- status: 200,
471
- headers: { "content-type": "text/markdown" },
472
- });
473
- });
474
- globalThis.fetch = fetchMock;
475
- const pending = createWebFetchTool().execute({ url: "https://docs.example.com/api", format: "markdown" }, context());
476
- await vi.waitFor(() => expect(started.length).toBeGreaterThanOrEqual(3));
477
- resolveHighest(new Response("# Highest Priority\n\n" + "Highest priority docs. ".repeat(10), {
478
- status: 200,
479
- headers: { "content-type": "text/markdown" },
480
- }));
481
- const result = await pending;
482
- expect(result).toContain("Highest Priority");
483
- expect(result).not.toContain("Lower Priority");
484
- });
485
- it("bounds curated probes with a per-probe timeout signal", async () => {
486
- const originalTimeout = AbortSignal.timeout;
487
- vi.spyOn(AbortSignal, "timeout").mockImplementation((milliseconds) => milliseconds === 3_000
488
- ? AbortSignal.abort(new Error("probe timeout"))
489
- : originalTimeout(milliseconds));
490
- globalThis.fetch = vi.fn(async (input, init) => {
491
- if (String(input).includes("llms") || String(input).endsWith(".md")) {
492
- if (init?.signal?.aborted)
493
- throw init.signal.reason;
494
- return new Response("unexpected", { status: 200 });
495
- }
496
- return new Response("<html><body><main>Fallback page</main></body></html>", {
497
- status: 200,
498
- headers: { "content-type": "text/html" },
499
- });
500
- });
501
- const result = await createWebFetchTool().execute({ url: "https://docs.example.com/api", format: "text" }, context());
502
- expect(result).toContain("Fallback page");
503
- });
504
- });
505
- describe("web_fetch outline format", () => {
506
- const article = (links) => `
507
- <html><head><title>Outline Docs</title></head>
508
- <body>
509
- <nav><a href="/nav-noise">Navigation noise</a></nav>
510
- <article>
511
- <h1>Outline Docs</h1>
512
- <p>This introductory paragraph is deliberately long enough that the Readability
513
- extractor treats the page as a genuine article and emits structured markdown
514
- containing the hyperlinks that outline mode is expected to number for us.</p>
515
- <p>${links}</p>
516
- <p>Another descriptive paragraph that adds enough body length to clear the minimum
517
- article-length threshold comfortably during extraction in this unit test.</p>
518
- </article>
519
- <footer>Terms Privacy</footer>
520
- </body></html>`;
521
- function htmlResponse(body) {
522
- return new Response(body, { status: 200, headers: { "content-type": "text/html" } });
523
- }
524
- it("numbers links, resolves relative URLs, and appends a numbered index", async () => {
525
- const html = article(`See the <a href="guide/intro">Intro Guide</a>, the
526
- <a href="https://other.example.com/spec">External Spec</a>, and
527
- <a href="#section">this section</a>.`);
528
- globalThis.fetch = vi.fn(async () => htmlResponse(html));
529
- const result = (await createWebFetchTool().execute({ url: "https://docs.example.com/reference/api", format: "outline" }, context()));
530
- expect(result).toContain("Intro Guide [1]");
531
- expect(result).toContain("External Spec [2]");
532
- // Relative href resolved against the page URL; fragment-only link left as text.
533
- expect(result).toContain("[1] https://docs.example.com/reference/guide/intro");
534
- expect(result).toContain("[2] https://other.example.com/spec");
535
- expect(result).toContain("Links (fetch one with `follow`):");
536
- expect(result).not.toContain("[3]");
537
- expect(result).not.toContain("](");
538
- expect(result).not.toContain("Terms Privacy");
539
- });
540
- it("is far more compact than the markdown render of the same page", async () => {
541
- const html = article(`<a href="/a">A</a> <a href="/b">B</a>`);
542
- globalThis.fetch = vi.fn(async () => htmlResponse(html));
543
- const tool = createWebFetchTool();
544
- const outline = (await tool.execute({ url: "https://docs.example.com/page", format: "outline" }, context()));
545
- expect(outline.length).toBeLessThanOrEqual(2000 + 200);
546
- });
547
- it("caps the link index at 100 and says so", async () => {
548
- const links = Array.from({ length: 120 }, (_, i) => `<a href="/page-${i}">Link number ${i}</a>`).join(" ");
549
- globalThis.fetch = vi.fn(async () => htmlResponse(article(links)));
550
- const result = (await createWebFetchTool().execute({ url: "https://docs.example.com/many", format: "outline", max_length: 50000 }, context()));
551
- expect(result).toContain("[100] https://docs.example.com/page-99");
552
- expect(result).not.toContain("[101]");
553
- expect(result).toContain("link index truncated at 100");
554
- // Links past the cap keep their anchor text, just without a number.
555
- expect(result).toContain("Link number 119");
556
- });
557
- it("serves a repeat fetch of the same URL from the session cache", async () => {
558
- const fetchMock = vi.fn(async () => htmlResponse(article(`<a href="/a">A</a>`)));
559
- globalThis.fetch = fetchMock;
560
- const tool = createWebFetchTool();
561
- const first = await tool.execute({ url: "https://docs.example.com/cached", format: "outline" }, context());
562
- const second = await tool.execute({ url: "https://docs.example.com/cached", format: "outline" }, context());
563
- expect(second).toBe(first);
564
- expect(fetchMock).toHaveBeenCalledTimes(1);
565
- });
566
- it("caches under the post-redirect URL too", async () => {
567
- const fetchMock = vi.fn(async (input) => {
568
- if (String(input) === "https://docs.example.com/old") {
569
- return new Response(null, {
570
- status: 301,
571
- headers: { location: "https://docs.example.com/new" },
572
- });
573
- }
574
- return htmlResponse(article(`<a href="/a">A</a>`));
575
- });
576
- globalThis.fetch = fetchMock;
577
- const tool = createWebFetchTool();
578
- await tool.execute({ url: "https://docs.example.com/old", format: "outline" }, context());
579
- const callsAfterFirst = fetchMock.mock.calls.length;
580
- await tool.execute({ url: "https://docs.example.com/new", format: "outline" }, context());
581
- expect(callsAfterFirst).toBe(2);
582
- expect(fetchMock).toHaveBeenCalledTimes(2);
583
- });
584
- it("evicts least-recently-used pages so the cache stays bounded", async () => {
585
- const fetchMock = vi.fn(async () => htmlResponse(article(`<a href="/a">A</a>`)));
586
- globalThis.fetch = fetchMock;
587
- const tool = createWebFetchTool();
588
- // 33 distinct pages > the 32-entry cap, so page 0 must be evicted.
589
- for (let i = 0; i < 33; i++) {
590
- await tool.execute({ url: `https://docs.example.com/p${i}`, format: "outline" }, context());
591
- }
592
- expect(fetchMock).toHaveBeenCalledTimes(33);
593
- await tool.execute({ url: "https://docs.example.com/p32", format: "outline" }, context());
594
- expect(fetchMock).toHaveBeenCalledTimes(33); // still hot
595
- await tool.execute({ url: "https://docs.example.com/p0", format: "outline" }, context());
596
- expect(fetchMock).toHaveBeenCalledTimes(34); // evicted, refetched
597
- });
598
- it("fetches a link by number from the last outline", async () => {
599
- const fetchMock = vi.fn(async (input) => {
600
- if (String(input) === "https://docs.example.com/reference/guide/intro") {
601
- return htmlResponse(article(`<a href="/deeper">Deeper</a>`).replace("Outline Docs", "Intro Page"));
602
- }
603
- return htmlResponse(article(`<a href="guide/intro">Intro Guide</a>`));
604
- });
605
- globalThis.fetch = fetchMock;
606
- const tool = createWebFetchTool();
607
- const first = (await tool.execute({ url: "https://docs.example.com/reference/api", format: "outline" }, context()));
608
- expect(first).toContain("[1] https://docs.example.com/reference/guide/intro");
609
- const followed = (await tool.execute({ follow: 1, format: "outline" }, context()));
610
- expect(followed).toContain("Intro Page");
611
- expect(fetchMock.mock.calls.map(([input]) => String(input))).toContain("https://docs.example.com/reference/guide/intro");
612
- });
613
- it("reports an unknown link number without fetching", async () => {
614
- const fetchMock = vi.fn();
615
- globalThis.fetch = fetchMock;
616
- const result = await createWebFetchTool().execute({ follow: 7 }, context());
617
- expect(result).toContain("no numbered links available");
618
- expect(fetchMock).not.toHaveBeenCalled();
619
- });
620
- it("still blocks a followed link that points at a private/metadata address", async () => {
621
- const fetchMock = vi.fn(async () => htmlResponse(article(`<a href="http://169.254.169.254/latest/meta-data/iam/">Cloud metadata</a>`)));
622
- globalThis.fetch = fetchMock;
623
- const tool = createWebFetchTool();
624
- const page = (await tool.execute({ url: "https://docs.example.com/evil", format: "outline" }, context()));
625
- expect(page).toContain("[1] http://169.254.169.254/latest/meta-data/iam/");
626
- const fetchesBefore = fetchMock.mock.calls.length;
627
- const followed = await tool.execute({ follow: 1, format: "outline" }, context());
628
- expect(followed).toContain("URL blocked");
629
- expect(fetchMock).toHaveBeenCalledTimes(fetchesBefore);
630
- });
631
- it("applies the network allowlist to followed links", async () => {
632
- const fetchMock = vi.fn(async () => htmlResponse(article(`<a href="https://evil.example/payload">Payload</a>`)));
633
- globalThis.fetch = fetchMock;
634
- const tool = createWebFetchTool(() => ({ mode: "allowlist", allow: ["docs.example.com"] }));
635
- await tool.execute({ url: "https://docs.example.com/start", format: "outline" }, context());
636
- const fetchesBefore = fetchMock.mock.calls.length;
637
- const followed = await tool.execute({ follow: 1, format: "outline" }, context());
638
- expect(followed).toContain("network allowlist");
639
- expect(fetchMock).toHaveBeenCalledTimes(fetchesBefore);
640
- });
641
- });
642
- describe("web_fetch network allowlist", () => {
643
- const allowlist = () => ({ mode: "allowlist", allow: ["docs.example.com"] });
644
- it("is a no-op when the policy is off", async () => {
645
- globalThis.fetch = vi.fn(async () => new Response("<html><body><p>ok</p></body></html>", { status: 200 }));
646
- const result = await createWebFetchTool(() => ({ mode: "off", allow: [] })).execute({ url: "https://anything.example/page" }, context());
647
- expect(result).not.toContain("network allowlist");
648
- });
649
- it("blocks a disallowed initial URL before any request", async () => {
650
- const fetchMock = vi.fn(async () => new Response("nope", { status: 200 }));
651
- globalThis.fetch = fetchMock;
652
- const result = await createWebFetchTool(allowlist).execute({ url: "https://evil.example/page" }, context());
653
- expect(result).toContain("network allowlist");
654
- expect(result).toContain("evil.example");
655
- expect(fetchMock).not.toHaveBeenCalled();
656
- });
657
- it("blocks a disallowed redirect target", async () => {
658
- const fetchMock = vi.fn(async (input) => {
659
- const url = typeof input === "string" ? input : input.toString();
660
- if (url.startsWith("https://docs.example.com")) {
661
- return new Response(null, {
662
- status: 302,
663
- headers: { location: "https://evil.example/payload" },
664
- });
665
- }
666
- return new Response("<html><body><p>secret</p></body></html>", { status: 200 });
667
- });
668
- globalThis.fetch = fetchMock;
669
- const result = await createWebFetchTool(allowlist).execute({ url: "https://docs.example.com/start", prefer_llms_txt: false }, context());
670
- expect(result).toContain("network allowlist");
671
- expect(result).toContain("evil.example");
672
- // The first hop happened; the redirect target was never requested.
673
- expect(fetchMock).toHaveBeenCalledTimes(1);
674
- });
675
- });
676
- //# sourceMappingURL=web-fetch.test.js.map