@code0123/opencode-android-arm64 1.1.55 → 1.1.56

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 (359) hide show
  1. package/bin/opencode +3 -1
  2. package/package.json +1 -77
  3. package/runtime/highlights-eq9cgrbb.scm +604 -0
  4. package/runtime/highlights-ghv9g403.scm +205 -0
  5. package/runtime/highlights-hk7bwhj4.scm +284 -0
  6. package/runtime/highlights-r812a2qc.scm +150 -0
  7. package/runtime/highlights-x6tmsnaa.scm +115 -0
  8. package/runtime/index.js +287124 -0
  9. package/runtime/injections-73j83es3.scm +27 -0
  10. package/runtime/parser.worker.js +4081 -0
  11. package/runtime/tree-sitter-3jzf13jk.wasm +0 -0
  12. package/runtime/tree-sitter-bash-hq5s6fxb.wasm +0 -0
  13. package/runtime/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
  14. package/runtime/tree-sitter-markdown-411r6y9b.wasm +0 -0
  15. package/runtime/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
  16. package/runtime/tree-sitter-typescript-zxjzwt75.wasm +0 -0
  17. package/runtime/tree-sitter-zig-e78zbjpm.wasm +0 -0
  18. package/runtime/worker.js +208338 -0
  19. package/parsers-config.ts +0 -253
  20. package/src/acp/README.md +0 -164
  21. package/src/acp/agent.ts +0 -1676
  22. package/src/acp/session.ts +0 -117
  23. package/src/acp/types.ts +0 -23
  24. package/src/agent/agent.ts +0 -338
  25. package/src/agent/generate.txt +0 -75
  26. package/src/agent/prompt/compaction.txt +0 -12
  27. package/src/agent/prompt/explore.txt +0 -18
  28. package/src/agent/prompt/summary.txt +0 -11
  29. package/src/agent/prompt/title.txt +0 -44
  30. package/src/auth/index.ts +0 -70
  31. package/src/bun/index.ts +0 -137
  32. package/src/bun/registry.ts +0 -48
  33. package/src/bus/bus-event.ts +0 -43
  34. package/src/bus/global.ts +0 -10
  35. package/src/bus/index.ts +0 -105
  36. package/src/cli/bootstrap.ts +0 -17
  37. package/src/cli/cmd/acp.ts +0 -70
  38. package/src/cli/cmd/agent.ts +0 -257
  39. package/src/cli/cmd/auth.ts +0 -400
  40. package/src/cli/cmd/cmd.ts +0 -7
  41. package/src/cli/cmd/debug/agent.ts +0 -167
  42. package/src/cli/cmd/debug/config.ts +0 -16
  43. package/src/cli/cmd/debug/file.ts +0 -97
  44. package/src/cli/cmd/debug/index.ts +0 -48
  45. package/src/cli/cmd/debug/lsp.ts +0 -52
  46. package/src/cli/cmd/debug/ripgrep.ts +0 -87
  47. package/src/cli/cmd/debug/scrap.ts +0 -16
  48. package/src/cli/cmd/debug/skill.ts +0 -16
  49. package/src/cli/cmd/debug/snapshot.ts +0 -52
  50. package/src/cli/cmd/export.ts +0 -88
  51. package/src/cli/cmd/generate.ts +0 -38
  52. package/src/cli/cmd/github.ts +0 -1540
  53. package/src/cli/cmd/import.ts +0 -147
  54. package/src/cli/cmd/mcp.ts +0 -755
  55. package/src/cli/cmd/models.ts +0 -77
  56. package/src/cli/cmd/pr.ts +0 -112
  57. package/src/cli/cmd/run.ts +0 -598
  58. package/src/cli/cmd/serve.ts +0 -20
  59. package/src/cli/cmd/session.ts +0 -135
  60. package/src/cli/cmd/stats.ts +0 -426
  61. package/src/cli/cmd/tui/app.tsx +0 -801
  62. package/src/cli/cmd/tui/attach.ts +0 -52
  63. package/src/cli/cmd/tui/component/border.tsx +0 -21
  64. package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
  65. package/src/cli/cmd/tui/component/dialog-command.tsx +0 -148
  66. package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
  67. package/src/cli/cmd/tui/component/dialog-model.tsx +0 -234
  68. package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -266
  69. package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -108
  70. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
  71. package/src/cli/cmd/tui/component/dialog-skill.tsx +0 -36
  72. package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
  73. package/src/cli/cmd/tui/component/dialog-status.tsx +0 -177
  74. package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
  75. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
  76. package/src/cli/cmd/tui/component/logo.tsx +0 -85
  77. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -666
  78. package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -89
  79. package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
  80. package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1132
  81. package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
  82. package/src/cli/cmd/tui/component/spinner.tsx +0 -24
  83. package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
  84. package/src/cli/cmd/tui/component/tips.tsx +0 -153
  85. package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
  86. package/src/cli/cmd/tui/context/args.tsx +0 -15
  87. package/src/cli/cmd/tui/context/directory.ts +0 -13
  88. package/src/cli/cmd/tui/context/exit.tsx +0 -52
  89. package/src/cli/cmd/tui/context/helper.tsx +0 -25
  90. package/src/cli/cmd/tui/context/keybind.tsx +0 -100
  91. package/src/cli/cmd/tui/context/kv.tsx +0 -52
  92. package/src/cli/cmd/tui/context/local.tsx +0 -409
  93. package/src/cli/cmd/tui/context/prompt.tsx +0 -18
  94. package/src/cli/cmd/tui/context/route.tsx +0 -46
  95. package/src/cli/cmd/tui/context/sdk.tsx +0 -101
  96. package/src/cli/cmd/tui/context/sync.tsx +0 -470
  97. package/src/cli/cmd/tui/context/theme/aura.json +0 -69
  98. package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
  99. package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
  100. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -233
  101. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
  102. package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
  103. package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
  104. package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
  105. package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
  106. package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
  107. package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
  108. package/src/cli/cmd/tui/context/theme/github.json +0 -233
  109. package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -242
  110. package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
  111. package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -237
  112. package/src/cli/cmd/tui/context/theme/material.json +0 -235
  113. package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
  114. package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
  115. package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
  116. package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
  117. package/src/cli/cmd/tui/context/theme/nord.json +0 -223
  118. package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
  119. package/src/cli/cmd/tui/context/theme/opencode.json +0 -245
  120. package/src/cli/cmd/tui/context/theme/orng.json +0 -249
  121. package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
  122. package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
  123. package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
  124. package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
  125. package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
  126. package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
  127. package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
  128. package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
  129. package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
  130. package/src/cli/cmd/tui/context/theme.tsx +0 -1152
  131. package/src/cli/cmd/tui/event.ts +0 -48
  132. package/src/cli/cmd/tui/routes/home.tsx +0 -140
  133. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -64
  134. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -109
  135. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -26
  136. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
  137. package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
  138. package/src/cli/cmd/tui/routes/session/header.tsx +0 -142
  139. package/src/cli/cmd/tui/routes/session/index.tsx +0 -2126
  140. package/src/cli/cmd/tui/routes/session/permission.tsx +0 -508
  141. package/src/cli/cmd/tui/routes/session/question.tsx +0 -466
  142. package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -313
  143. package/src/cli/cmd/tui/thread.ts +0 -175
  144. package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -68
  145. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -93
  146. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -215
  147. package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -49
  148. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -88
  149. package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -399
  150. package/src/cli/cmd/tui/ui/dialog.tsx +0 -167
  151. package/src/cli/cmd/tui/ui/link.tsx +0 -28
  152. package/src/cli/cmd/tui/ui/spinner.ts +0 -368
  153. package/src/cli/cmd/tui/ui/toast.tsx +0 -100
  154. package/src/cli/cmd/tui/util/clipboard.ts +0 -159
  155. package/src/cli/cmd/tui/util/editor.ts +0 -32
  156. package/src/cli/cmd/tui/util/signal.ts +0 -7
  157. package/src/cli/cmd/tui/util/terminal.ts +0 -114
  158. package/src/cli/cmd/tui/util/transcript.ts +0 -98
  159. package/src/cli/cmd/tui/worker.ts +0 -152
  160. package/src/cli/cmd/uninstall.ts +0 -357
  161. package/src/cli/cmd/upgrade.ts +0 -73
  162. package/src/cli/cmd/web.ts +0 -81
  163. package/src/cli/error.ts +0 -57
  164. package/src/cli/logo.ts +0 -6
  165. package/src/cli/network.ts +0 -60
  166. package/src/cli/ui.ts +0 -113
  167. package/src/cli/upgrade.ts +0 -25
  168. package/src/command/index.ts +0 -150
  169. package/src/command/template/initialize.txt +0 -10
  170. package/src/command/template/review.txt +0 -99
  171. package/src/config/config.ts +0 -1477
  172. package/src/config/markdown.ts +0 -98
  173. package/src/env/index.ts +0 -28
  174. package/src/file/ignore.ts +0 -83
  175. package/src/file/index.ts +0 -583
  176. package/src/file/ripgrep.ts +0 -384
  177. package/src/file/time.ts +0 -69
  178. package/src/file/watcher.ts +0 -148
  179. package/src/flag/flag.ts +0 -93
  180. package/src/format/formatter.ts +0 -366
  181. package/src/format/index.ts +0 -137
  182. package/src/global/index.ts +0 -55
  183. package/src/id/id.ts +0 -83
  184. package/src/ide/index.ts +0 -76
  185. package/src/index.ts +0 -159
  186. package/src/installation/index.ts +0 -246
  187. package/src/lsp/client.ts +0 -252
  188. package/src/lsp/index.ts +0 -485
  189. package/src/lsp/language.ts +0 -119
  190. package/src/lsp/server.ts +0 -2046
  191. package/src/mcp/auth.ts +0 -132
  192. package/src/mcp/index.ts +0 -934
  193. package/src/mcp/oauth-callback.ts +0 -200
  194. package/src/mcp/oauth-provider.ts +0 -154
  195. package/src/patch/index.ts +0 -680
  196. package/src/permission/arity.ts +0 -163
  197. package/src/permission/index.ts +0 -210
  198. package/src/permission/next.ts +0 -280
  199. package/src/plugin/codex.ts +0 -624
  200. package/src/plugin/copilot.ts +0 -327
  201. package/src/plugin/index.ts +0 -138
  202. package/src/project/bootstrap.ts +0 -35
  203. package/src/project/instance.ts +0 -114
  204. package/src/project/project.ts +0 -371
  205. package/src/project/state.ts +0 -70
  206. package/src/project/vcs.ts +0 -76
  207. package/src/provider/auth.ts +0 -147
  208. package/src/provider/models-snapshot.ts +0 -38414
  209. package/src/provider/models.ts +0 -133
  210. package/src/provider/provider.ts +0 -1262
  211. package/src/provider/sdk/copilot/README.md +0 -5
  212. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +0 -164
  213. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +0 -15
  214. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +0 -17
  215. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +0 -64
  216. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +0 -780
  217. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +0 -28
  218. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +0 -44
  219. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +0 -87
  220. package/src/provider/sdk/copilot/copilot-provider.ts +0 -100
  221. package/src/provider/sdk/copilot/index.ts +0 -2
  222. package/src/provider/sdk/copilot/openai-compatible-error.ts +0 -27
  223. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +0 -303
  224. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +0 -22
  225. package/src/provider/sdk/copilot/responses/openai-config.ts +0 -18
  226. package/src/provider/sdk/copilot/responses/openai-error.ts +0 -22
  227. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +0 -207
  228. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +0 -1732
  229. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +0 -177
  230. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +0 -1
  231. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +0 -88
  232. package/src/provider/sdk/copilot/responses/tool/file-search.ts +0 -128
  233. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +0 -115
  234. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +0 -65
  235. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +0 -104
  236. package/src/provider/sdk/copilot/responses/tool/web-search.ts +0 -103
  237. package/src/provider/transform.ts +0 -828
  238. package/src/pty/index.ts +0 -250
  239. package/src/question/index.ts +0 -171
  240. package/src/scheduler/index.ts +0 -61
  241. package/src/server/error.ts +0 -36
  242. package/src/server/event.ts +0 -7
  243. package/src/server/mdns.ts +0 -60
  244. package/src/server/routes/config.ts +0 -92
  245. package/src/server/routes/experimental.ts +0 -208
  246. package/src/server/routes/file.ts +0 -197
  247. package/src/server/routes/global.ts +0 -183
  248. package/src/server/routes/mcp.ts +0 -225
  249. package/src/server/routes/permission.ts +0 -68
  250. package/src/server/routes/project.ts +0 -82
  251. package/src/server/routes/provider.ts +0 -165
  252. package/src/server/routes/pty.ts +0 -169
  253. package/src/server/routes/question.ts +0 -98
  254. package/src/server/routes/session.ts +0 -939
  255. package/src/server/routes/tui.ts +0 -379
  256. package/src/server/server.ts +0 -613
  257. package/src/session/compaction.ts +0 -226
  258. package/src/session/index.ts +0 -517
  259. package/src/session/instruction.ts +0 -197
  260. package/src/session/llm.ts +0 -289
  261. package/src/session/message-v2.ts +0 -802
  262. package/src/session/message.ts +0 -189
  263. package/src/session/processor.ts +0 -407
  264. package/src/session/prompt/anthropic-20250930.txt +0 -166
  265. package/src/session/prompt/anthropic.txt +0 -105
  266. package/src/session/prompt/beast.txt +0 -147
  267. package/src/session/prompt/build-switch.txt +0 -5
  268. package/src/session/prompt/codex_header.txt +0 -79
  269. package/src/session/prompt/copilot-gpt-5.txt +0 -143
  270. package/src/session/prompt/gemini.txt +0 -155
  271. package/src/session/prompt/max-steps.txt +0 -16
  272. package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
  273. package/src/session/prompt/plan.txt +0 -26
  274. package/src/session/prompt/qwen.txt +0 -109
  275. package/src/session/prompt/trinity.txt +0 -97
  276. package/src/session/prompt.ts +0 -1866
  277. package/src/session/retry.ts +0 -97
  278. package/src/session/revert.ts +0 -121
  279. package/src/session/status.ts +0 -76
  280. package/src/session/summary.ts +0 -217
  281. package/src/session/system.ts +0 -54
  282. package/src/session/todo.ts +0 -37
  283. package/src/share/share-next.ts +0 -200
  284. package/src/share/share.ts +0 -92
  285. package/src/shell/shell.ts +0 -67
  286. package/src/skill/discovery.ts +0 -97
  287. package/src/skill/index.ts +0 -1
  288. package/src/skill/skill.ts +0 -188
  289. package/src/snapshot/index.ts +0 -255
  290. package/src/storage/storage.ts +0 -227
  291. package/src/tool/apply_patch.ts +0 -281
  292. package/src/tool/apply_patch.txt +0 -33
  293. package/src/tool/bash.ts +0 -269
  294. package/src/tool/bash.txt +0 -115
  295. package/src/tool/batch.ts +0 -175
  296. package/src/tool/batch.txt +0 -24
  297. package/src/tool/codesearch.ts +0 -132
  298. package/src/tool/codesearch.txt +0 -12
  299. package/src/tool/edit.ts +0 -655
  300. package/src/tool/edit.txt +0 -10
  301. package/src/tool/external-directory.ts +0 -32
  302. package/src/tool/glob.ts +0 -78
  303. package/src/tool/glob.txt +0 -6
  304. package/src/tool/grep.ts +0 -147
  305. package/src/tool/grep.txt +0 -8
  306. package/src/tool/invalid.ts +0 -17
  307. package/src/tool/ls.ts +0 -121
  308. package/src/tool/ls.txt +0 -1
  309. package/src/tool/lsp.ts +0 -96
  310. package/src/tool/lsp.txt +0 -19
  311. package/src/tool/multiedit.ts +0 -46
  312. package/src/tool/multiedit.txt +0 -41
  313. package/src/tool/plan-enter.txt +0 -14
  314. package/src/tool/plan-exit.txt +0 -13
  315. package/src/tool/plan.ts +0 -130
  316. package/src/tool/question.ts +0 -33
  317. package/src/tool/question.txt +0 -10
  318. package/src/tool/read.ts +0 -211
  319. package/src/tool/read.txt +0 -12
  320. package/src/tool/registry.ts +0 -160
  321. package/src/tool/skill.ts +0 -123
  322. package/src/tool/task.ts +0 -165
  323. package/src/tool/task.txt +0 -60
  324. package/src/tool/todo.ts +0 -53
  325. package/src/tool/todoread.txt +0 -14
  326. package/src/tool/todowrite.txt +0 -167
  327. package/src/tool/tool.ts +0 -89
  328. package/src/tool/truncation.ts +0 -106
  329. package/src/tool/webfetch.ts +0 -186
  330. package/src/tool/webfetch.txt +0 -13
  331. package/src/tool/websearch.ts +0 -150
  332. package/src/tool/websearch.txt +0 -14
  333. package/src/tool/write.ts +0 -85
  334. package/src/tool/write.txt +0 -8
  335. package/src/util/abort.ts +0 -35
  336. package/src/util/archive.ts +0 -16
  337. package/src/util/color.ts +0 -19
  338. package/src/util/context.ts +0 -25
  339. package/src/util/defer.ts +0 -12
  340. package/src/util/eventloop.ts +0 -20
  341. package/src/util/filesystem.ts +0 -93
  342. package/src/util/fn.ts +0 -11
  343. package/src/util/format.ts +0 -20
  344. package/src/util/iife.ts +0 -3
  345. package/src/util/keybind.ts +0 -103
  346. package/src/util/lazy.ts +0 -18
  347. package/src/util/locale.ts +0 -81
  348. package/src/util/lock.ts +0 -98
  349. package/src/util/log.ts +0 -180
  350. package/src/util/proxied.ts +0 -3
  351. package/src/util/queue.ts +0 -32
  352. package/src/util/rpc.ts +0 -66
  353. package/src/util/scrap.ts +0 -10
  354. package/src/util/signal.ts +0 -12
  355. package/src/util/timeout.ts +0 -14
  356. package/src/util/token.ts +0 -7
  357. package/src/util/wildcard.ts +0 -56
  358. package/src/worktree/index.ts +0 -574
  359. package/tsconfig.json +0 -10
@@ -1,186 +0,0 @@
1
- import z from "zod"
2
- import { Tool } from "./tool"
3
- import TurndownService from "turndown"
4
- import DESCRIPTION from "./webfetch.txt"
5
- import { abortAfterAny } from "../util/abort"
6
-
7
- const MAX_RESPONSE_SIZE = 5 * 1024 * 1024 // 5MB
8
- const DEFAULT_TIMEOUT = 30 * 1000 // 30 seconds
9
- const MAX_TIMEOUT = 120 * 1000 // 2 minutes
10
-
11
- export const WebFetchTool = Tool.define("webfetch", {
12
- description: DESCRIPTION,
13
- parameters: z.object({
14
- url: z.string().describe("The URL to fetch content from"),
15
- format: z
16
- .enum(["text", "markdown", "html"])
17
- .default("markdown")
18
- .describe("The format to return the content in (text, markdown, or html). Defaults to markdown."),
19
- timeout: z.number().describe("Optional timeout in seconds (max 120)").optional(),
20
- }),
21
- async execute(params, ctx) {
22
- // Validate URL
23
- if (!params.url.startsWith("http://") && !params.url.startsWith("https://")) {
24
- throw new Error("URL must start with http:// or https://")
25
- }
26
-
27
- await ctx.ask({
28
- permission: "webfetch",
29
- patterns: [params.url],
30
- always: ["*"],
31
- metadata: {
32
- url: params.url,
33
- format: params.format,
34
- timeout: params.timeout,
35
- },
36
- })
37
-
38
- const timeout = Math.min((params.timeout ?? DEFAULT_TIMEOUT / 1000) * 1000, MAX_TIMEOUT)
39
-
40
- const { signal, clearTimeout } = abortAfterAny(timeout, ctx.abort)
41
-
42
- // Build Accept header based on requested format with q parameters for fallbacks
43
- let acceptHeader = "*/*"
44
- switch (params.format) {
45
- case "markdown":
46
- acceptHeader = "text/markdown;q=1.0, text/x-markdown;q=0.9, text/plain;q=0.8, text/html;q=0.7, */*;q=0.1"
47
- break
48
- case "text":
49
- acceptHeader = "text/plain;q=1.0, text/markdown;q=0.9, text/html;q=0.8, */*;q=0.1"
50
- break
51
- case "html":
52
- acceptHeader = "text/html;q=1.0, application/xhtml+xml;q=0.9, text/plain;q=0.8, text/markdown;q=0.7, */*;q=0.1"
53
- break
54
- default:
55
- acceptHeader =
56
- "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"
57
- }
58
- const headers = {
59
- "User-Agent":
60
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
61
- Accept: acceptHeader,
62
- "Accept-Language": "en-US,en;q=0.9",
63
- }
64
-
65
- const initial = await fetch(params.url, { signal, headers })
66
-
67
- // Retry with honest UA if blocked by Cloudflare bot detection (TLS fingerprint mismatch)
68
- const response =
69
- initial.status === 403 && initial.headers.get("cf-mitigated") === "challenge"
70
- ? await fetch(params.url, { signal, headers: { ...headers, "User-Agent": "opencode" } })
71
- : initial
72
-
73
- clearTimeout()
74
-
75
- if (!response.ok) {
76
- throw new Error(`Request failed with status code: ${response.status}`)
77
- }
78
-
79
- // Check content length
80
- const contentLength = response.headers.get("content-length")
81
- if (contentLength && parseInt(contentLength) > MAX_RESPONSE_SIZE) {
82
- throw new Error("Response too large (exceeds 5MB limit)")
83
- }
84
-
85
- const arrayBuffer = await response.arrayBuffer()
86
- if (arrayBuffer.byteLength > MAX_RESPONSE_SIZE) {
87
- throw new Error("Response too large (exceeds 5MB limit)")
88
- }
89
-
90
- const content = new TextDecoder().decode(arrayBuffer)
91
- const contentType = response.headers.get("content-type") || ""
92
-
93
- const title = `${params.url} (${contentType})`
94
-
95
- // Handle content based on requested format and actual content type
96
- switch (params.format) {
97
- case "markdown":
98
- if (contentType.includes("text/html")) {
99
- const markdown = convertHTMLToMarkdown(content)
100
- return {
101
- output: markdown,
102
- title,
103
- metadata: {},
104
- }
105
- }
106
- return {
107
- output: content,
108
- title,
109
- metadata: {},
110
- }
111
-
112
- case "text":
113
- if (contentType.includes("text/html")) {
114
- const text = await extractTextFromHTML(content)
115
- return {
116
- output: text,
117
- title,
118
- metadata: {},
119
- }
120
- }
121
- return {
122
- output: content,
123
- title,
124
- metadata: {},
125
- }
126
-
127
- case "html":
128
- return {
129
- output: content,
130
- title,
131
- metadata: {},
132
- }
133
-
134
- default:
135
- return {
136
- output: content,
137
- title,
138
- metadata: {},
139
- }
140
- }
141
- },
142
- })
143
-
144
- async function extractTextFromHTML(html: string) {
145
- let text = ""
146
- let skipContent = false
147
-
148
- const rewriter = new HTMLRewriter()
149
- .on("script, style, noscript, iframe, object, embed", {
150
- element() {
151
- skipContent = true
152
- },
153
- text() {
154
- // Skip text content inside these elements
155
- },
156
- })
157
- .on("*", {
158
- element(element) {
159
- // Reset skip flag when entering other elements
160
- if (!["script", "style", "noscript", "iframe", "object", "embed"].includes(element.tagName)) {
161
- skipContent = false
162
- }
163
- },
164
- text(input) {
165
- if (!skipContent) {
166
- text += input.text
167
- }
168
- },
169
- })
170
- .transform(new Response(html))
171
-
172
- await rewriter.text()
173
- return text.trim()
174
- }
175
-
176
- function convertHTMLToMarkdown(html: string): string {
177
- const turndownService = new TurndownService({
178
- headingStyle: "atx",
179
- hr: "---",
180
- bulletListMarker: "-",
181
- codeBlockStyle: "fenced",
182
- emDelimiter: "*",
183
- })
184
- turndownService.remove(["script", "style", "meta", "link"])
185
- return turndownService.turndown(html)
186
- }
@@ -1,13 +0,0 @@
1
- - Fetches content from a specified URL
2
- - Takes a URL and optional format as input
3
- - Fetches the URL content, converts to requested format (markdown by default)
4
- - Returns the content in the specified format
5
- - Use this tool when you need to retrieve and analyze web content
6
-
7
- Usage notes:
8
- - IMPORTANT: if another tool is present that offers better web fetching capabilities, is more targeted to the task, or has fewer restrictions, prefer using that tool instead of this one.
9
- - The URL must be a fully-formed valid URL
10
- - HTTP URLs will be automatically upgraded to HTTPS
11
- - Format options: "markdown" (default), "text", or "html"
12
- - This tool is read-only and does not modify any files
13
- - Results may be summarized if the content is very large
@@ -1,150 +0,0 @@
1
- import z from "zod"
2
- import { Tool } from "./tool"
3
- import DESCRIPTION from "./websearch.txt"
4
- import { abortAfterAny } from "../util/abort"
5
-
6
- const API_CONFIG = {
7
- BASE_URL: "https://mcp.exa.ai",
8
- ENDPOINTS: {
9
- SEARCH: "/mcp",
10
- },
11
- DEFAULT_NUM_RESULTS: 8,
12
- } as const
13
-
14
- interface McpSearchRequest {
15
- jsonrpc: string
16
- id: number
17
- method: string
18
- params: {
19
- name: string
20
- arguments: {
21
- query: string
22
- numResults?: number
23
- livecrawl?: "fallback" | "preferred"
24
- type?: "auto" | "fast" | "deep"
25
- contextMaxCharacters?: number
26
- }
27
- }
28
- }
29
-
30
- interface McpSearchResponse {
31
- jsonrpc: string
32
- result: {
33
- content: Array<{
34
- type: string
35
- text: string
36
- }>
37
- }
38
- }
39
-
40
- export const WebSearchTool = Tool.define("websearch", async () => {
41
- return {
42
- get description() {
43
- return DESCRIPTION.replace("{{date}}", new Date().toISOString().slice(0, 10))
44
- },
45
- parameters: z.object({
46
- query: z.string().describe("Websearch query"),
47
- numResults: z.number().optional().describe("Number of search results to return (default: 8)"),
48
- livecrawl: z
49
- .enum(["fallback", "preferred"])
50
- .optional()
51
- .describe(
52
- "Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')",
53
- ),
54
- type: z
55
- .enum(["auto", "fast", "deep"])
56
- .optional()
57
- .describe(
58
- "Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search",
59
- ),
60
- contextMaxCharacters: z
61
- .number()
62
- .optional()
63
- .describe("Maximum characters for context string optimized for LLMs (default: 10000)"),
64
- }),
65
- async execute(params, ctx) {
66
- await ctx.ask({
67
- permission: "websearch",
68
- patterns: [params.query],
69
- always: ["*"],
70
- metadata: {
71
- query: params.query,
72
- numResults: params.numResults,
73
- livecrawl: params.livecrawl,
74
- type: params.type,
75
- contextMaxCharacters: params.contextMaxCharacters,
76
- },
77
- })
78
-
79
- const searchRequest: McpSearchRequest = {
80
- jsonrpc: "2.0",
81
- id: 1,
82
- method: "tools/call",
83
- params: {
84
- name: "web_search_exa",
85
- arguments: {
86
- query: params.query,
87
- type: params.type || "auto",
88
- numResults: params.numResults || API_CONFIG.DEFAULT_NUM_RESULTS,
89
- livecrawl: params.livecrawl || "fallback",
90
- contextMaxCharacters: params.contextMaxCharacters,
91
- },
92
- },
93
- }
94
-
95
- const { signal, clearTimeout } = abortAfterAny(25000, ctx.abort)
96
-
97
- try {
98
- const headers: Record<string, string> = {
99
- accept: "application/json, text/event-stream",
100
- "content-type": "application/json",
101
- }
102
-
103
- const response = await fetch(`${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.SEARCH}`, {
104
- method: "POST",
105
- headers,
106
- body: JSON.stringify(searchRequest),
107
- signal,
108
- })
109
-
110
- clearTimeout()
111
-
112
- if (!response.ok) {
113
- const errorText = await response.text()
114
- throw new Error(`Search error (${response.status}): ${errorText}`)
115
- }
116
-
117
- const responseText = await response.text()
118
-
119
- // Parse SSE response
120
- const lines = responseText.split("\n")
121
- for (const line of lines) {
122
- if (line.startsWith("data: ")) {
123
- const data: McpSearchResponse = JSON.parse(line.substring(6))
124
- if (data.result && data.result.content && data.result.content.length > 0) {
125
- return {
126
- output: data.result.content[0].text,
127
- title: `Web search: ${params.query}`,
128
- metadata: {},
129
- }
130
- }
131
- }
132
- }
133
-
134
- return {
135
- output: "No search results found. Please try a different query.",
136
- title: `Web search: ${params.query}`,
137
- metadata: {},
138
- }
139
- } catch (error) {
140
- clearTimeout()
141
-
142
- if (error instanceof Error && error.name === "AbortError") {
143
- throw new Error("Search request timed out")
144
- }
145
-
146
- throw error
147
- }
148
- },
149
- }
150
- })
@@ -1,14 +0,0 @@
1
- - Search the web using Exa AI - performs real-time web searches and can scrape content from specific URLs
2
- - Provides up-to-date information for current events and recent data
3
- - Supports configurable result counts and returns the content from the most relevant websites
4
- - Use this tool for accessing information beyond knowledge cutoff
5
- - Searches are performed automatically within a single API call
6
-
7
- Usage notes:
8
- - Supports live crawling modes: 'fallback' (backup if cached unavailable) or 'preferred' (prioritize live crawling)
9
- - Search types: 'auto' (balanced), 'fast' (quick results), 'deep' (comprehensive search)
10
- - Configurable context length for optimal LLM integration
11
- - Domain filtering and advanced search options available
12
-
13
- Today's date is {{date}}. You MUST use this year when searching for recent information or current events
14
- - Example: If today is 2025-07-15 and the user asks for "latest AI news", search for "AI news 2025", NOT "AI news 2024"
package/src/tool/write.ts DELETED
@@ -1,85 +0,0 @@
1
- import z from "zod"
2
- import * as path from "path"
3
- import { Tool } from "./tool"
4
- import { LSP } from "../lsp"
5
- import { createTwoFilesPatch } from "diff"
6
- import DESCRIPTION from "./write.txt"
7
- import { Bus } from "../bus"
8
- import { File } from "../file"
9
- import { FileWatcher } from "../file/watcher"
10
- import { FileTime } from "../file/time"
11
- import { Filesystem } from "../util/filesystem"
12
- import { Instance } from "../project/instance"
13
- import { trimDiff } from "./edit"
14
- import { assertExternalDirectory } from "./external-directory"
15
-
16
- const MAX_DIAGNOSTICS_PER_FILE = 20
17
- const MAX_PROJECT_DIAGNOSTICS_FILES = 5
18
-
19
- export const WriteTool = Tool.define("write", {
20
- description: DESCRIPTION,
21
- parameters: z.object({
22
- content: z.string().describe("The content to write to the file"),
23
- filePath: z.string().describe("The absolute path to the file to write (must be absolute, not relative)"),
24
- }),
25
- async execute(params, ctx) {
26
- const filepath = path.isAbsolute(params.filePath) ? params.filePath : path.join(Instance.directory, params.filePath)
27
- await assertExternalDirectory(ctx, filepath)
28
-
29
- const file = Bun.file(filepath)
30
- const exists = await file.exists()
31
- const contentOld = exists ? await file.text() : ""
32
- if (exists) await FileTime.assert(ctx.sessionID, filepath)
33
-
34
- const diff = trimDiff(createTwoFilesPatch(filepath, filepath, contentOld, params.content))
35
- await ctx.ask({
36
- permission: "edit",
37
- patterns: [path.relative(Instance.worktree, filepath)],
38
- always: ["*"],
39
- metadata: {
40
- filepath,
41
- diff,
42
- },
43
- })
44
-
45
- await Bun.write(filepath, params.content)
46
- await Bus.publish(File.Event.Edited, {
47
- file: filepath,
48
- })
49
- await Bus.publish(FileWatcher.Event.Updated, {
50
- file: filepath,
51
- event: exists ? "change" : "add",
52
- })
53
- FileTime.read(ctx.sessionID, filepath)
54
-
55
- let output = "Wrote file successfully."
56
- await LSP.touchFile(filepath, true)
57
- const diagnostics = await LSP.diagnostics()
58
- const normalizedFilepath = Filesystem.normalizePath(filepath)
59
- let projectDiagnosticsCount = 0
60
- for (const [file, issues] of Object.entries(diagnostics)) {
61
- const errors = issues.filter((item) => item.severity === 1)
62
- if (errors.length === 0) continue
63
- const limited = errors.slice(0, MAX_DIAGNOSTICS_PER_FILE)
64
- const suffix =
65
- errors.length > MAX_DIAGNOSTICS_PER_FILE ? `\n... and ${errors.length - MAX_DIAGNOSTICS_PER_FILE} more` : ""
66
- if (file === normalizedFilepath) {
67
- output += `\n\nLSP errors detected in this file, please fix:\n<diagnostics file="${filepath}">\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</diagnostics>`
68
- continue
69
- }
70
- if (projectDiagnosticsCount >= MAX_PROJECT_DIAGNOSTICS_FILES) continue
71
- projectDiagnosticsCount++
72
- output += `\n\nLSP errors detected in other files:\n<diagnostics file="${file}">\n${limited.map(LSP.Diagnostic.pretty).join("\n")}${suffix}\n</diagnostics>`
73
- }
74
-
75
- return {
76
- title: path.relative(Instance.worktree, filepath),
77
- metadata: {
78
- diagnostics,
79
- filepath,
80
- exists: exists,
81
- },
82
- output,
83
- }
84
- },
85
- })
@@ -1,8 +0,0 @@
1
- Writes a file to the local filesystem.
2
-
3
- Usage:
4
- - This tool will overwrite the existing file if there is one at the provided path.
5
- - If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.
6
- - ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.
7
- - NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.
8
- - Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.
package/src/util/abort.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * Creates an AbortController that automatically aborts after a timeout.
3
- *
4
- * Uses bind() instead of arrow functions to avoid capturing the surrounding
5
- * scope in closures. Arrow functions like `() => controller.abort()` capture
6
- * request bodies and other large objects, preventing GC for the timer lifetime.
7
- *
8
- * @param ms Timeout in milliseconds
9
- * @returns Object with controller, signal, and clearTimeout function
10
- */
11
- export function abortAfter(ms: number) {
12
- const controller = new AbortController()
13
- const id = setTimeout(controller.abort.bind(controller), ms)
14
- return {
15
- controller,
16
- signal: controller.signal,
17
- clearTimeout: () => globalThis.clearTimeout(id),
18
- }
19
- }
20
-
21
- /**
22
- * Combines multiple AbortSignals with a timeout.
23
- *
24
- * @param ms Timeout in milliseconds
25
- * @param signals Additional signals to combine
26
- * @returns Combined signal that aborts on timeout or when any input signal aborts
27
- */
28
- export function abortAfterAny(ms: number, ...signals: AbortSignal[]) {
29
- const timeout = abortAfter(ms)
30
- const signal = AbortSignal.any([timeout.signal, ...signals])
31
- return {
32
- signal,
33
- clearTimeout: timeout.clearTimeout,
34
- }
35
- }
@@ -1,16 +0,0 @@
1
- import { $ } from "bun"
2
- import path from "path"
3
-
4
- export namespace Archive {
5
- export async function extractZip(zipPath: string, destDir: string) {
6
- if (process.platform === "win32") {
7
- const winZipPath = path.resolve(zipPath)
8
- const winDestDir = path.resolve(destDir)
9
- // $global:ProgressPreference suppresses PowerShell's blue progress bar popup
10
- const cmd = `$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '${winZipPath}' -DestinationPath '${winDestDir}' -Force`
11
- await $`powershell -NoProfile -NonInteractive -Command ${cmd}`.quiet()
12
- } else {
13
- await $`unzip -o -q ${zipPath} -d ${destDir}`.quiet()
14
- }
15
- }
16
- }
package/src/util/color.ts DELETED
@@ -1,19 +0,0 @@
1
- export namespace Color {
2
- export function isValidHex(hex?: string): hex is string {
3
- if (!hex) return false
4
- return /^#[0-9a-fA-F]{6}$/.test(hex)
5
- }
6
-
7
- export function hexToRgb(hex: string): { r: number; g: number; b: number } {
8
- const r = parseInt(hex.slice(1, 3), 16)
9
- const g = parseInt(hex.slice(3, 5), 16)
10
- const b = parseInt(hex.slice(5, 7), 16)
11
- return { r, g, b }
12
- }
13
-
14
- export function hexToAnsiBold(hex?: string): string | undefined {
15
- if (!isValidHex(hex)) return undefined
16
- const { r, g, b } = hexToRgb(hex)
17
- return `\x1b[38;2;${r};${g};${b}m\x1b[1m`
18
- }
19
- }
@@ -1,25 +0,0 @@
1
- import { AsyncLocalStorage } from "async_hooks"
2
-
3
- export namespace Context {
4
- export class NotFound extends Error {
5
- constructor(public override readonly name: string) {
6
- super(`No context found for ${name}`)
7
- }
8
- }
9
-
10
- export function create<T>(name: string) {
11
- const storage = new AsyncLocalStorage<T>()
12
- return {
13
- use() {
14
- const result = storage.getStore()
15
- if (!result) {
16
- throw new NotFound(name)
17
- }
18
- return result
19
- },
20
- provide<R>(value: T, fn: () => R) {
21
- return storage.run(value, fn)
22
- },
23
- }
24
- }
25
- }
package/src/util/defer.ts DELETED
@@ -1,12 +0,0 @@
1
- export function defer<T extends () => void | Promise<void>>(
2
- fn: T,
3
- ): T extends () => Promise<void> ? { [Symbol.asyncDispose]: () => Promise<void> } : { [Symbol.dispose]: () => void } {
4
- return {
5
- [Symbol.dispose]() {
6
- fn()
7
- },
8
- [Symbol.asyncDispose]() {
9
- return Promise.resolve(fn())
10
- },
11
- } as any
12
- }
@@ -1,20 +0,0 @@
1
- import { Log } from "./log"
2
-
3
- export namespace EventLoop {
4
- export async function wait() {
5
- return new Promise<void>((resolve) => {
6
- const check = () => {
7
- const active = [...(process as any)._getActiveHandles(), ...(process as any)._getActiveRequests()]
8
- Log.Default.info("eventloop", {
9
- active,
10
- })
11
- if ((process as any)._getActiveHandles().length === 0 && (process as any)._getActiveRequests().length === 0) {
12
- resolve()
13
- } else {
14
- setImmediate(check)
15
- }
16
- }
17
- check()
18
- })
19
- }
20
- }
@@ -1,93 +0,0 @@
1
- import { realpathSync } from "fs"
2
- import { dirname, join, relative } from "path"
3
-
4
- export namespace Filesystem {
5
- export const exists = (p: string) =>
6
- Bun.file(p)
7
- .stat()
8
- .then(() => true)
9
- .catch(() => false)
10
-
11
- export const isDir = (p: string) =>
12
- Bun.file(p)
13
- .stat()
14
- .then((s) => s.isDirectory())
15
- .catch(() => false)
16
- /**
17
- * On Windows, normalize a path to its canonical casing using the filesystem.
18
- * This is needed because Windows paths are case-insensitive but LSP servers
19
- * may return paths with different casing than what we send them.
20
- */
21
- export function normalizePath(p: string): string {
22
- if (process.platform !== "win32") return p
23
- try {
24
- return realpathSync.native(p)
25
- } catch {
26
- return p
27
- }
28
- }
29
- export function overlaps(a: string, b: string) {
30
- const relA = relative(a, b)
31
- const relB = relative(b, a)
32
- return !relA || !relA.startsWith("..") || !relB || !relB.startsWith("..")
33
- }
34
-
35
- export function contains(parent: string, child: string) {
36
- return !relative(parent, child).startsWith("..")
37
- }
38
-
39
- export async function findUp(target: string, start: string, stop?: string) {
40
- let current = start
41
- const result = []
42
- while (true) {
43
- const search = join(current, target)
44
- if (await exists(search)) result.push(search)
45
- if (stop === current) break
46
- const parent = dirname(current)
47
- if (parent === current) break
48
- current = parent
49
- }
50
- return result
51
- }
52
-
53
- export async function* up(options: { targets: string[]; start: string; stop?: string }) {
54
- const { targets, start, stop } = options
55
- let current = start
56
- while (true) {
57
- for (const target of targets) {
58
- const search = join(current, target)
59
- if (await exists(search)) yield search
60
- }
61
- if (stop === current) break
62
- const parent = dirname(current)
63
- if (parent === current) break
64
- current = parent
65
- }
66
- }
67
-
68
- export async function globUp(pattern: string, start: string, stop?: string) {
69
- let current = start
70
- const result = []
71
- while (true) {
72
- try {
73
- const glob = new Bun.Glob(pattern)
74
- for await (const match of glob.scan({
75
- cwd: current,
76
- absolute: true,
77
- onlyFiles: true,
78
- followSymlinks: true,
79
- dot: true,
80
- })) {
81
- result.push(match)
82
- }
83
- } catch {
84
- // Skip invalid glob patterns
85
- }
86
- if (stop === current) break
87
- const parent = dirname(current)
88
- if (parent === current) break
89
- current = parent
90
- }
91
- return result
92
- }
93
- }