anymous 1.0.0

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 (415) hide show
  1. package/README.md +15 -0
  2. package/bin/anymous.cjs +45 -0
  3. package/package.json +155 -0
  4. package/src/account/account.ts +473 -0
  5. package/src/account/repo.ts +171 -0
  6. package/src/account/schema.ts +99 -0
  7. package/src/account/url.ts +8 -0
  8. package/src/acp/agent.ts +95 -0
  9. package/src/acp/config-option.ts +203 -0
  10. package/src/acp/content.ts +269 -0
  11. package/src/acp/directory.ts +212 -0
  12. package/src/acp/error.ts +97 -0
  13. package/src/acp/event.ts +342 -0
  14. package/src/acp/permission.ts +254 -0
  15. package/src/acp/profile.ts +42 -0
  16. package/src/acp/service.ts +1097 -0
  17. package/src/acp/session.ts +232 -0
  18. package/src/acp/tool.ts +364 -0
  19. package/src/acp/usage.ts +239 -0
  20. package/src/agent/agent.ts +581 -0
  21. package/src/agent/generate.txt +75 -0
  22. package/src/agent/prompt/compaction.txt +9 -0
  23. package/src/agent/prompt/debug-tools.txt +41 -0
  24. package/src/agent/prompt/exe-extractor.txt +37 -0
  25. package/src/agent/prompt/explore.txt +18 -0
  26. package/src/agent/prompt/memory-dump.txt +34 -0
  27. package/src/agent/prompt/reverser-automator.txt +24 -0
  28. package/src/agent/prompt/reverser-binary.txt +25 -0
  29. package/src/agent/prompt/reverser-dynamic.txt +29 -0
  30. package/src/agent/prompt/reverser-source.txt +22 -0
  31. package/src/agent/prompt/reverser-static.txt +28 -0
  32. package/src/agent/prompt/summary.txt +11 -0
  33. package/src/agent/prompt/title.txt +44 -0
  34. package/src/agent/subagent-permissions.ts +27 -0
  35. package/src/audio.d.ts +14 -0
  36. package/src/auth/index.ts +97 -0
  37. package/src/background/job.ts +37 -0
  38. package/src/bus/global.ts +22 -0
  39. package/src/cli/bootstrap.ts +11 -0
  40. package/src/cli/cmd/account.ts +264 -0
  41. package/src/cli/cmd/acp.ts +73 -0
  42. package/src/cli/cmd/agent.ts +259 -0
  43. package/src/cli/cmd/attach.ts +148 -0
  44. package/src/cli/cmd/cmd.ts +7 -0
  45. package/src/cli/cmd/db.ts +62 -0
  46. package/src/cli/cmd/debug/agent.handler.ts +193 -0
  47. package/src/cli/cmd/debug/agent.ts +27 -0
  48. package/src/cli/cmd/debug/config.ts +14 -0
  49. package/src/cli/cmd/debug/file.ts +73 -0
  50. package/src/cli/cmd/debug/index.ts +87 -0
  51. package/src/cli/cmd/debug/lsp.ts +50 -0
  52. package/src/cli/cmd/debug/ripgrep.ts +79 -0
  53. package/src/cli/cmd/debug/scrap.ts +16 -0
  54. package/src/cli/cmd/debug/skill.ts +15 -0
  55. package/src/cli/cmd/debug/snapshot.ts +50 -0
  56. package/src/cli/cmd/debug/startup.ts +11 -0
  57. package/src/cli/cmd/debug/v2.ts +42 -0
  58. package/src/cli/cmd/export.ts +292 -0
  59. package/src/cli/cmd/generate.ts +54 -0
  60. package/src/cli/cmd/github.handler.ts +1593 -0
  61. package/src/cli/cmd/github.shared.ts +30 -0
  62. package/src/cli/cmd/github.ts +42 -0
  63. package/src/cli/cmd/import.ts +230 -0
  64. package/src/cli/cmd/mcp.ts +840 -0
  65. package/src/cli/cmd/models.ts +66 -0
  66. package/src/cli/cmd/plug.ts +230 -0
  67. package/src/cli/cmd/pr.ts +115 -0
  68. package/src/cli/cmd/prompt-display.ts +1 -0
  69. package/src/cli/cmd/providers.ts +534 -0
  70. package/src/cli/cmd/run/demo.ts +1274 -0
  71. package/src/cli/cmd/run/entry.body.ts +205 -0
  72. package/src/cli/cmd/run/footer.command.tsx +1070 -0
  73. package/src/cli/cmd/run/footer.menu.tsx +351 -0
  74. package/src/cli/cmd/run/footer.permission.tsx +472 -0
  75. package/src/cli/cmd/run/footer.prompt.tsx +1315 -0
  76. package/src/cli/cmd/run/footer.question.tsx +573 -0
  77. package/src/cli/cmd/run/footer.subagent.tsx +175 -0
  78. package/src/cli/cmd/run/footer.ts +1129 -0
  79. package/src/cli/cmd/run/footer.view.tsx +945 -0
  80. package/src/cli/cmd/run/footer.width.ts +27 -0
  81. package/src/cli/cmd/run/permission.shared.ts +256 -0
  82. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  83. package/src/cli/cmd/run/prompt.shared.ts +153 -0
  84. package/src/cli/cmd/run/question.shared.ts +340 -0
  85. package/src/cli/cmd/run/runtime.boot.ts +202 -0
  86. package/src/cli/cmd/run/runtime.lifecycle.ts +406 -0
  87. package/src/cli/cmd/run/runtime.queue.ts +349 -0
  88. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  89. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  90. package/src/cli/cmd/run/runtime.ts +814 -0
  91. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  92. package/src/cli/cmd/run/scrollback.surface.ts +431 -0
  93. package/src/cli/cmd/run/scrollback.writer.tsx +352 -0
  94. package/src/cli/cmd/run/session-data.ts +1113 -0
  95. package/src/cli/cmd/run/session-replay.ts +374 -0
  96. package/src/cli/cmd/run/session.shared.ts +196 -0
  97. package/src/cli/cmd/run/splash.ts +280 -0
  98. package/src/cli/cmd/run/stream.transport.ts +1462 -0
  99. package/src/cli/cmd/run/stream.ts +175 -0
  100. package/src/cli/cmd/run/subagent-data.ts +876 -0
  101. package/src/cli/cmd/run/theme.ts +690 -0
  102. package/src/cli/cmd/run/tool.ts +1486 -0
  103. package/src/cli/cmd/run/trace.ts +94 -0
  104. package/src/cli/cmd/run/turn-summary.ts +47 -0
  105. package/src/cli/cmd/run/types.ts +350 -0
  106. package/src/cli/cmd/run/variant.shared.ts +216 -0
  107. package/src/cli/cmd/run.ts +1011 -0
  108. package/src/cli/cmd/serve.ts +24 -0
  109. package/src/cli/cmd/session.ts +147 -0
  110. package/src/cli/cmd/stats.ts +393 -0
  111. package/src/cli/cmd/tui.ts +309 -0
  112. package/src/cli/cmd/uninstall.ts +353 -0
  113. package/src/cli/cmd/upgrade.ts +74 -0
  114. package/src/cli/cmd/web.ts +84 -0
  115. package/src/cli/effect/prompt.ts +37 -0
  116. package/src/cli/effect-cmd.ts +96 -0
  117. package/src/cli/error.ts +130 -0
  118. package/src/cli/heap.ts +45 -0
  119. package/src/cli/logo.ts +1 -0
  120. package/src/cli/network.ts +80 -0
  121. package/src/cli/tui/layer.ts +8 -0
  122. package/src/cli/tui/validate-session.ts +29 -0
  123. package/src/cli/tui/worker.ts +80 -0
  124. package/src/cli/ui.ts +132 -0
  125. package/src/cli/upgrade.ts +53 -0
  126. package/src/command/index.ts +177 -0
  127. package/src/command/template/initialize.txt +66 -0
  128. package/src/command/template/review.txt +101 -0
  129. package/src/config/agent.ts +59 -0
  130. package/src/config/command.ts +39 -0
  131. package/src/config/config.ts +681 -0
  132. package/src/config/entry-name.ts +19 -0
  133. package/src/config/managed.ts +69 -0
  134. package/src/config/markdown.ts +36 -0
  135. package/src/config/parse.ts +79 -0
  136. package/src/config/paths.ts +45 -0
  137. package/src/config/plugin.ts +79 -0
  138. package/src/config/tui-cwd.ts +5 -0
  139. package/src/config/tui-host-attention.ts +21 -0
  140. package/src/config/tui-migrate.ts +132 -0
  141. package/src/config/tui.ts +276 -0
  142. package/src/config/variable.ts +91 -0
  143. package/src/control-plane/adapters/index.ts +41 -0
  144. package/src/control-plane/adapters/worktree.ts +96 -0
  145. package/src/control-plane/dev/README.md +19 -0
  146. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  147. package/src/control-plane/types.ts +59 -0
  148. package/src/control-plane/util.ts +39 -0
  149. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  150. package/src/control-plane/workspace-context.ts +26 -0
  151. package/src/control-plane/workspace.ts +964 -0
  152. package/src/effect/app-node-builder-v1.ts +12 -0
  153. package/src/effect/app-runtime.ts +135 -0
  154. package/src/effect/bootstrap-runtime.ts +19 -0
  155. package/src/effect/bridge.ts +84 -0
  156. package/src/effect/config-service.ts +67 -0
  157. package/src/effect/instance-ref.ts +11 -0
  158. package/src/effect/instance-registry.ts +12 -0
  159. package/src/effect/instance-state.ts +69 -0
  160. package/src/effect/promise.ts +17 -0
  161. package/src/effect/run-service.ts +47 -0
  162. package/src/effect/runner.ts +217 -0
  163. package/src/effect/runtime-flags.ts +78 -0
  164. package/src/env/index.ts +41 -0
  165. package/src/event-manifest.ts +3 -0
  166. package/src/event-v2-bridge.ts +71 -0
  167. package/src/format/formatter.ts +404 -0
  168. package/src/format/index.ts +203 -0
  169. package/src/git/index.ts +348 -0
  170. package/src/id/id.ts +80 -0
  171. package/src/ide/index.ts +54 -0
  172. package/src/image/image.ts +172 -0
  173. package/src/index.ts +142 -0
  174. package/src/installation/index.ts +336 -0
  175. package/src/lsp/client.ts +650 -0
  176. package/src/lsp/diagnostic.ts +29 -0
  177. package/src/lsp/language.ts +121 -0
  178. package/src/lsp/launch.ts +21 -0
  179. package/src/lsp/lsp.ts +507 -0
  180. package/src/lsp/server.ts +1983 -0
  181. package/src/markdown.d.ts +4 -0
  182. package/src/mcp/auth.ts +163 -0
  183. package/src/mcp/browser.ts +37 -0
  184. package/src/mcp/catalog.ts +170 -0
  185. package/src/mcp/index.ts +1004 -0
  186. package/src/mcp/oauth-callback.ts +194 -0
  187. package/src/mcp/oauth-provider.ts +259 -0
  188. package/src/node.ts +4 -0
  189. package/src/patch/index.ts +686 -0
  190. package/src/permission/arity.ts +163 -0
  191. package/src/permission/evaluate.ts +1 -0
  192. package/src/permission/index.ts +229 -0
  193. package/src/plugin/azure.ts +26 -0
  194. package/src/plugin/cloudflare.ts +76 -0
  195. package/src/plugin/digitalocean.ts +325 -0
  196. package/src/plugin/github-copilot/copilot.ts +414 -0
  197. package/src/plugin/github-copilot/models.ts +258 -0
  198. package/src/plugin/index.ts +314 -0
  199. package/src/plugin/install.ts +439 -0
  200. package/src/plugin/loader.ts +237 -0
  201. package/src/plugin/meta.ts +188 -0
  202. package/src/plugin/openai/README.md +31 -0
  203. package/src/plugin/openai/codex.ts +565 -0
  204. package/src/plugin/openai/ws-pool.ts +270 -0
  205. package/src/plugin/openai/ws.ts +381 -0
  206. package/src/plugin/pty-environment.ts +24 -0
  207. package/src/plugin/shared.ts +323 -0
  208. package/src/plugin/snowflake-cortex.ts +507 -0
  209. package/src/plugin/tui/internal.ts +10 -0
  210. package/src/plugin/tui/runtime.ts +1131 -0
  211. package/src/plugin/xai.ts +626 -0
  212. package/src/project/bootstrap-service.ts +9 -0
  213. package/src/project/bootstrap.ts +58 -0
  214. package/src/project/instance-context.ts +24 -0
  215. package/src/project/instance-runtime.ts +16 -0
  216. package/src/project/instance-store.ts +213 -0
  217. package/src/project/project.ts +483 -0
  218. package/src/project/vcs.ts +423 -0
  219. package/src/provider/auth.ts +229 -0
  220. package/src/provider/error.ts +188 -0
  221. package/src/provider/model-status.ts +8 -0
  222. package/src/provider/provider.ts +2006 -0
  223. package/src/provider/transform.ts +1832 -0
  224. package/src/question/index.ts +161 -0
  225. package/src/question/schema.ts +4 -0
  226. package/src/server/auth.ts +48 -0
  227. package/src/server/event.ts +10 -0
  228. package/src/server/global-lifecycle.ts +28 -0
  229. package/src/server/init-projectors.ts +3 -0
  230. package/src/server/mdns.ts +47 -0
  231. package/src/server/projectors.ts +1 -0
  232. package/src/server/proxy-util.ts +48 -0
  233. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  234. package/src/server/routes/instance/httpapi/api.ts +97 -0
  235. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  236. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  237. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  238. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  239. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  240. package/src/server/routes/instance/httpapi/groups/experimental.ts +275 -0
  241. package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
  242. package/src/server/routes/instance/httpapi/groups/global.ts +136 -0
  243. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  244. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  245. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  246. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  247. package/src/server/routes/instance/httpapi/groups/project-copy.ts +32 -0
  248. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  249. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  250. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  251. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  252. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  253. package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
  254. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  255. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  256. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  257. package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
  258. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  259. package/src/server/routes/instance/httpapi/handlers/control.ts +43 -0
  260. package/src/server/routes/instance/httpapi/handlers/event.ts +99 -0
  261. package/src/server/routes/instance/httpapi/handlers/experimental.ts +193 -0
  262. package/src/server/routes/instance/httpapi/handlers/file.ts +139 -0
  263. package/src/server/routes/instance/httpapi/handlers/global.ts +156 -0
  264. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  265. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  266. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  267. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +83 -0
  268. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  269. package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
  270. package/src/server/routes/instance/httpapi/handlers/pty.ts +273 -0
  271. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  272. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
  273. package/src/server/routes/instance/httpapi/handlers/session.ts +442 -0
  274. package/src/server/routes/instance/httpapi/handlers/sync.ts +89 -0
  275. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  276. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  277. package/src/server/routes/instance/httpapi/lifecycle.ts +54 -0
  278. package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
  279. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  280. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  281. package/src/server/routes/instance/httpapi/middleware/error.ts +43 -0
  282. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  283. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  284. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  285. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +41 -0
  286. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  287. package/src/server/routes/instance/httpapi/public.ts +537 -0
  288. package/src/server/routes/instance/httpapi/server.ts +325 -0
  289. package/src/server/routes/instance/httpapi/websocket-tracker.ts +60 -0
  290. package/src/server/server.ts +226 -0
  291. package/src/server/shared/fence.ts +60 -0
  292. package/src/server/shared/pty-ticket.ts +15 -0
  293. package/src/server/shared/public-ui.ts +12 -0
  294. package/src/server/shared/tui-control.ts +28 -0
  295. package/src/server/shared/ui.ts +108 -0
  296. package/src/server/shared/workspace-routing.ts +38 -0
  297. package/src/server/tui-event.ts +1 -0
  298. package/src/session/compaction.ts +562 -0
  299. package/src/session/instruction.ts +237 -0
  300. package/src/session/llm/AGENTS.md +90 -0
  301. package/src/session/llm/ai-sdk.ts +288 -0
  302. package/src/session/llm/native-request.ts +196 -0
  303. package/src/session/llm/native-runtime.ts +195 -0
  304. package/src/session/llm/request.ts +226 -0
  305. package/src/session/llm.ts +404 -0
  306. package/src/session/message-error.ts +14 -0
  307. package/src/session/message-v2.ts +734 -0
  308. package/src/session/message.ts +148 -0
  309. package/src/session/overflow.ts +34 -0
  310. package/src/session/processor.ts +718 -0
  311. package/src/session/prompt/anthropic.txt +105 -0
  312. package/src/session/prompt/beast.txt +147 -0
  313. package/src/session/prompt/build-switch.txt +5 -0
  314. package/src/session/prompt/codex.txt +79 -0
  315. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  316. package/src/session/prompt/default.txt +95 -0
  317. package/src/session/prompt/gemini.txt +155 -0
  318. package/src/session/prompt/gpt.txt +107 -0
  319. package/src/session/prompt/kimi.txt +95 -0
  320. package/src/session/prompt/meta.txt +65 -0
  321. package/src/session/prompt/plan-mode.txt +70 -0
  322. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  323. package/src/session/prompt/plan.txt +26 -0
  324. package/src/session/prompt/trinity.txt +97 -0
  325. package/src/session/prompt.ts +1631 -0
  326. package/src/session/reminders.ts +92 -0
  327. package/src/session/retry.ts +201 -0
  328. package/src/session/revert.ts +146 -0
  329. package/src/session/run-state.ts +151 -0
  330. package/src/session/schema.ts +26 -0
  331. package/src/session/session.ts +1018 -0
  332. package/src/session/status.ts +56 -0
  333. package/src/session/summary.ts +160 -0
  334. package/src/session/system.ts +145 -0
  335. package/src/session/todo.ts +74 -0
  336. package/src/session/tools.ts +590 -0
  337. package/src/share/session.ts +58 -0
  338. package/src/share/share-next.ts +371 -0
  339. package/src/skill/discovery.ts +140 -0
  340. package/src/skill/index.ts +354 -0
  341. package/src/snapshot/index.ts +807 -0
  342. package/src/sql.d.ts +4 -0
  343. package/src/storage/schema.ts +5 -0
  344. package/src/storage/storage.ts +327 -0
  345. package/src/sync/README.md +179 -0
  346. package/src/sync/schema.ts +11 -0
  347. package/src/temporary.ts +31 -0
  348. package/src/tool/apply_patch.ts +313 -0
  349. package/src/tool/apply_patch.txt +33 -0
  350. package/src/tool/code-mode.ts +310 -0
  351. package/src/tool/edit.ts +737 -0
  352. package/src/tool/edit.txt +10 -0
  353. package/src/tool/external-directory.ts +49 -0
  354. package/src/tool/glob.ts +76 -0
  355. package/src/tool/glob.txt +6 -0
  356. package/src/tool/grep.ts +115 -0
  357. package/src/tool/grep.txt +8 -0
  358. package/src/tool/invalid.ts +21 -0
  359. package/src/tool/json-schema.ts +164 -0
  360. package/src/tool/lsp.ts +113 -0
  361. package/src/tool/lsp.txt +24 -0
  362. package/src/tool/mcp-websearch.ts +96 -0
  363. package/src/tool/plan-enter.txt +14 -0
  364. package/src/tool/plan-exit.txt +13 -0
  365. package/src/tool/plan.ts +79 -0
  366. package/src/tool/question.ts +44 -0
  367. package/src/tool/question.txt +10 -0
  368. package/src/tool/read.ts +386 -0
  369. package/src/tool/read.txt +14 -0
  370. package/src/tool/registry.ts +450 -0
  371. package/src/tool/schema.ts +14 -0
  372. package/src/tool/shell/id.ts +19 -0
  373. package/src/tool/shell/prompt.ts +293 -0
  374. package/src/tool/shell/shell.txt +21 -0
  375. package/src/tool/shell.ts +645 -0
  376. package/src/tool/skill.ts +70 -0
  377. package/src/tool/skill.txt +5 -0
  378. package/src/tool/task.ts +360 -0
  379. package/src/tool/task.txt +19 -0
  380. package/src/tool/todo.ts +46 -0
  381. package/src/tool/todowrite.txt +44 -0
  382. package/src/tool/tool.ts +183 -0
  383. package/src/tool/truncate.ts +156 -0
  384. package/src/tool/truncation-dir.ts +4 -0
  385. package/src/tool/webfetch.ts +192 -0
  386. package/src/tool/webfetch.txt +13 -0
  387. package/src/tool/websearch.ts +143 -0
  388. package/src/tool/websearch.txt +14 -0
  389. package/src/tool/write.ts +104 -0
  390. package/src/tool/write.txt +8 -0
  391. package/src/util/archive.ts +17 -0
  392. package/src/util/bom.ts +27 -0
  393. package/src/util/data-url.ts +9 -0
  394. package/src/util/defer.ts +10 -0
  395. package/src/util/effect-http-client.ts +11 -0
  396. package/src/util/error.ts +1 -0
  397. package/src/util/filesystem.ts +251 -0
  398. package/src/util/html.ts +8 -0
  399. package/src/util/iife.ts +3 -0
  400. package/src/util/lazy.ts +20 -0
  401. package/src/util/local-context.ts +25 -0
  402. package/src/util/locale.ts +2 -0
  403. package/src/util/media.ts +26 -0
  404. package/src/util/process.ts +177 -0
  405. package/src/util/proxy-env.ts +72 -0
  406. package/src/util/queue.ts +32 -0
  407. package/src/util/record.ts +1 -0
  408. package/src/util/repository.ts +232 -0
  409. package/src/util/rpc.ts +66 -0
  410. package/src/util/signal.ts +12 -0
  411. package/src/util/timeout.ts +13 -0
  412. package/src/util/token.ts +1 -0
  413. package/src/util/wildcard.ts +59 -0
  414. package/src/worktree/index.ts +623 -0
  415. package/tsconfig.json +16 -0
@@ -0,0 +1,450 @@
1
+ import { LayerNode } from "@opencode-ai/core/effect/layer-node"
2
+ import { httpClient } from "@opencode-ai/core/effect/app-node-platform"
3
+ import { Ripgrep } from "@opencode-ai/core/ripgrep"
4
+ import { PlanExitTool } from "./plan"
5
+ import { Session } from "@/session/session"
6
+ import { QuestionTool } from "./question"
7
+ import { ShellTool } from "./shell"
8
+ import { EditTool } from "./edit"
9
+ import { GlobTool } from "./glob"
10
+ import { GrepTool } from "./grep"
11
+ import { ReadTool } from "./read"
12
+ import { TaskTool } from "./task"
13
+ import { Database } from "@opencode-ai/core/database/database"
14
+ import { TodoWriteTool } from "./todo"
15
+ import { WebFetchTool } from "./webfetch"
16
+ import { WriteTool } from "./write"
17
+ import { InvalidTool } from "./invalid"
18
+ import { SkillTool } from "./skill"
19
+ import * as Tool from "./tool"
20
+ import { Config } from "@/config/config"
21
+ import { type ToolContext as PluginToolContext, type ToolDefinition } from "@opencode-ai/plugin"
22
+ import type { JSONSchema7, JSONSchema7Definition } from "@ai-sdk/provider"
23
+ import { Schema } from "effect"
24
+ import z from "zod"
25
+ import { Plugin } from "../plugin"
26
+ import { Provider } from "@/provider/provider"
27
+
28
+ import { WebSearchTool } from "./websearch"
29
+ import { LspTool } from "./lsp"
30
+ import * as Truncate from "./truncate"
31
+ import { ApplyPatchTool } from "./apply_patch"
32
+ import { Glob } from "@opencode-ai/core/util/glob"
33
+ import path from "path"
34
+ import { pathToFileURL } from "url"
35
+ import { Effect, Layer, Context } from "effect"
36
+ import { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner"
37
+ import { CrossSpawnSpawner } from "@opencode-ai/core/cross-spawn-spawner"
38
+ import { Format } from "../format"
39
+ import { InstanceState } from "@/effect/instance-state"
40
+ import { EffectBridge } from "@/effect/bridge"
41
+ import { Question } from "../question"
42
+ import { Todo } from "../session/todo"
43
+ import { LSP } from "@/lsp/lsp"
44
+ import { Instruction } from "../session/instruction"
45
+ import { FSUtil } from "@opencode-ai/core/fs-util"
46
+ import { EventV2Bridge } from "@/event-v2-bridge"
47
+ import { Agent } from "../agent/agent"
48
+ import { Skill } from "../skill"
49
+ import { Permission } from "@/permission"
50
+ import { BackgroundJob } from "@/background/job"
51
+ import { RuntimeFlags } from "@/effect/runtime-flags"
52
+ import { ProviderV2 } from "@opencode-ai/core/provider"
53
+ import { ModelV2 } from "@opencode-ai/core/model"
54
+ import { MCP } from "@/mcp"
55
+ import { PermissionV1 } from "@opencode-ai/core/v1/permission"
56
+ import { McpCatalog } from "@/mcp/catalog"
57
+
58
+ export function webSearchEnabled(providerID: ProviderV2.ID, flags = { exa: false, parallel: false }) {
59
+ return providerID === ProviderV2.ID.opencode || flags.exa || flags.parallel
60
+ }
61
+
62
+ type TaskDef = Tool.InferDef<typeof TaskTool>
63
+ type ReadDef = Tool.InferDef<typeof ReadTool>
64
+
65
+ type State = {
66
+ custom: Tool.Def[]
67
+ builtin: Tool.Def[]
68
+ task: TaskDef
69
+ read: ReadDef
70
+ }
71
+
72
+ export interface Interface {
73
+ readonly ids: () => Effect.Effect<string[]>
74
+ readonly all: () => Effect.Effect<Tool.Def[]>
75
+ readonly named: () => Effect.Effect<{ task: TaskDef; read: ReadDef }>
76
+ readonly tools: (model: {
77
+ providerID: ProviderV2.ID
78
+ modelID: ModelV2.ID
79
+ agent: Agent.Info
80
+ permission?: PermissionV1.Ruleset
81
+ }) => Effect.Effect<Tool.Def[]>
82
+ }
83
+
84
+ export class Service extends Context.Service<Service, Interface>()("@opencode/ToolRegistry") {}
85
+
86
+ const layer = Layer.effect(
87
+ Service,
88
+ Effect.gen(function* () {
89
+ const config = yield* Config.Service
90
+ const plugin = yield* Plugin.Service
91
+ const agents = yield* Agent.Service
92
+ const truncate = yield* Truncate.Service
93
+ const flags = yield* RuntimeFlags.Service
94
+ const mcp = yield* MCP.Service
95
+
96
+ const invalid = yield* InvalidTool
97
+ const task = yield* TaskTool
98
+ const read = yield* ReadTool
99
+ const question = yield* QuestionTool
100
+ const todo = yield* TodoWriteTool
101
+ const lsptool = yield* LspTool
102
+ const plan = yield* PlanExitTool
103
+ const webfetch = yield* WebFetchTool
104
+ const websearch = yield* WebSearchTool
105
+ const shell = yield* ShellTool
106
+ const globtool = yield* GlobTool
107
+ const writetool = yield* WriteTool
108
+ const edit = yield* EditTool
109
+ const greptool = yield* GrepTool
110
+ const patchtool = yield* ApplyPatchTool
111
+ const skilltool = yield* SkillTool
112
+ const agent = yield* Agent.Service
113
+ const codeMode = flags.experimentalCodeMode ? yield* Effect.promise(() => import("./code-mode")) : undefined
114
+ const codeModeTool = codeMode ? yield* codeMode.CodeModeTool : undefined
115
+
116
+ const state = yield* InstanceState.make<State>(
117
+ Effect.fn("ToolRegistry.state")(function* (ctx) {
118
+ const custom: Tool.Def[] = []
119
+
120
+ function fromPlugin(id: string, def: ToolDefinition): Tool.Def {
121
+ // Plugin tools still expose Zod args publicly; keep that compatibility
122
+ // boxed at the registry boundary and give the LLM the original JSON Schema.
123
+ // Normalize missing args to `{}` once — pre-1.14.49 the code was
124
+ // `z.object(def.args)` and Zod silently tolerated undefined (#27451, #27630).
125
+ const args = def.args ?? {}
126
+ const entries = Object.entries(args)
127
+ const allZod = entries.every((entry) => isZodType(entry[1]))
128
+ const zodParams = allZod ? z.object(args) : undefined
129
+ const jsonSchema = zodParams ? zodJsonSchema(zodParams) : legacyJsonSchema(entries)
130
+ const parameters = zodParams
131
+ ? Schema.declare<unknown>((u): u is unknown => zodParams.safeParse(u).success)
132
+ : Schema.Unknown
133
+ return {
134
+ id,
135
+ parameters,
136
+ jsonSchema,
137
+ description: def.description,
138
+ execute: (args, toolCtx) =>
139
+ Effect.gen(function* () {
140
+ // Bridge the host's Effect-based `ask` into a Promise-returning
141
+ // function for the plugin to make sure context persists
142
+ const bridge = yield* EffectBridge.make()
143
+ const pluginCtx: PluginToolContext = {
144
+ ...toolCtx,
145
+ ask: (req) => bridge.promise(toolCtx.ask(req)),
146
+ directory: ctx.directory,
147
+ worktree: ctx.worktree,
148
+ }
149
+ const result = yield* Effect.promise(() => def.execute(args as any, pluginCtx))
150
+ const output = typeof result === "string" ? result : result.output
151
+ const metadata = typeof result === "string" ? {} : (result.metadata ?? {})
152
+ const attachments = typeof result === "string" ? undefined : result.attachments
153
+ const info = yield* agent.get(toolCtx.agent)
154
+ const out = yield* truncate.output(output, {}, info)
155
+ return {
156
+ title: typeof result === "string" ? "" : (result.title ?? ""),
157
+ output: out.truncated ? out.content : output,
158
+ attachments,
159
+ metadata: {
160
+ ...metadata,
161
+ truncated: out.truncated,
162
+ ...(out.truncated && { outputPath: out.outputPath }),
163
+ },
164
+ }
165
+ }).pipe(
166
+ Effect.withSpan("Tool.execute", {
167
+ attributes: {
168
+ "tool.name": id,
169
+ "session.id": toolCtx.sessionID,
170
+ "message.id": toolCtx.messageID,
171
+ ...(toolCtx.callID ? { "tool.call_id": toolCtx.callID } : {}),
172
+ },
173
+ }),
174
+ ),
175
+ }
176
+ }
177
+
178
+ const dirs = yield* config.directories()
179
+ const matches = dirs.flatMap((dir) =>
180
+ Glob.scanSync("{tool,tools}/*.{js,ts}", { cwd: dir, absolute: true, dot: true, symlink: true }),
181
+ )
182
+ if (matches.length) yield* config.waitForDependencies()
183
+ for (const match of matches) {
184
+ const namespace = path.basename(match, path.extname(match))
185
+ // `match` is an absolute filesystem path from `Glob.scanSync(..., { absolute: true })`.
186
+ // Import it as `file://` so Node on Windows accepts the dynamic import.
187
+ const mod = yield* Effect.promise(() => import(pathToFileURL(match).href))
188
+ for (const [id, def] of Object.entries(mod)) {
189
+ if (!isPluginTool(def)) continue
190
+ custom.push(fromPlugin(id === "default" ? namespace : `${namespace}_${id}`, def))
191
+ }
192
+ }
193
+
194
+ const plugins = yield* plugin.list()
195
+ for (const p of plugins) {
196
+ for (const [id, def] of Object.entries(p.tool ?? {})) {
197
+ custom.push(fromPlugin(id, def))
198
+ }
199
+ }
200
+
201
+ yield* config.get()
202
+ const questionEnabled = ["app", "cli", "desktop"].includes(flags.client) || flags.enableQuestionTool
203
+
204
+ const tool = yield* Effect.all({
205
+ invalid: Tool.init(invalid),
206
+ shell: Tool.init(shell),
207
+ read: Tool.init(read),
208
+ glob: Tool.init(globtool),
209
+ grep: Tool.init(greptool),
210
+ edit: Tool.init(edit),
211
+ write: Tool.init(writetool),
212
+ task: Tool.init(task),
213
+ fetch: Tool.init(webfetch),
214
+ todo: Tool.init(todo),
215
+ search: Tool.init(websearch),
216
+ skill: Tool.init(skilltool),
217
+ patch: Tool.init(patchtool),
218
+ question: Tool.init(question),
219
+ lsp: Tool.init(lsptool),
220
+ plan: Tool.init(plan),
221
+ ...(codeModeTool ? { execute: Tool.init(codeModeTool) } : {}),
222
+ })
223
+
224
+ return {
225
+ custom,
226
+ builtin: [
227
+ tool.invalid,
228
+ ...(questionEnabled ? [tool.question] : []),
229
+ tool.shell,
230
+ tool.read,
231
+ tool.glob,
232
+ tool.grep,
233
+ tool.edit,
234
+ tool.write,
235
+ tool.task,
236
+ tool.fetch,
237
+ tool.todo,
238
+ tool.search,
239
+ tool.skill,
240
+ tool.patch,
241
+ ...(tool.execute ? [tool.execute] : []),
242
+ ...(flags.experimentalLspTool ? [tool.lsp] : []),
243
+ ...(flags.experimentalPlanMode && flags.client === "cli" ? [tool.plan] : []),
244
+ ],
245
+ task: tool.task,
246
+ read: tool.read,
247
+ }
248
+ }),
249
+ )
250
+
251
+ const all: Interface["all"] = Effect.fn("ToolRegistry.all")(function* () {
252
+ const s = yield* InstanceState.get(state)
253
+ return [...s.builtin, ...s.custom] as Tool.Def[]
254
+ })
255
+
256
+ const ids: Interface["ids"] = Effect.fn("ToolRegistry.ids")(function* () {
257
+ return (yield* all()).map((tool) => tool.id)
258
+ })
259
+
260
+ const describeTask = Effect.fn("ToolRegistry.describeTask")(function* (agent: Agent.Info) {
261
+ const items = (yield* agents.list()).filter((item) => item.mode !== "primary")
262
+ const filtered = items.filter(
263
+ (item) => Permission.evaluate("task", item.name, agent.permission).action !== "deny",
264
+ )
265
+ const list = filtered.toSorted((a, b) => a.name.localeCompare(b.name))
266
+ const description = list
267
+ .map(
268
+ (item) =>
269
+ `- ${item.name}: ${item.description ?? "This subagent should only be called manually by the user."}`,
270
+ )
271
+ .join("\n")
272
+ return ["Available agent types and the tools they have access to:", description].join("\n")
273
+ })
274
+
275
+ const describeCodeMode = Effect.fn("ToolRegistry.describeCodeMode")(function* (input: {
276
+ agent: Agent.Info
277
+ permission?: PermissionV1.Ruleset
278
+ }) {
279
+ if (!codeMode) return
280
+ const ruleset = Permission.merge(input.agent.permission, input.permission ?? [])
281
+ const tools = Permission.visibleTools(yield* mcp.tools(), ruleset)
282
+ if (Object.keys(tools).length === 0) return
283
+ return codeMode.describeCatalog(tools, Object.keys(yield* mcp.clients()).map(McpCatalog.sanitize))
284
+ })
285
+
286
+ const tools: Interface["tools"] = Effect.fn("ToolRegistry.tools")(function* (input) {
287
+ const filtered = (yield* all()).filter((tool) => {
288
+ if (tool.id === WebSearchTool.id) {
289
+ return webSearchEnabled(input.providerID, { exa: flags.enableExa, parallel: flags.enableParallel })
290
+ }
291
+
292
+ const usePatch =
293
+ input.modelID.includes("gpt-") && !input.modelID.includes("oss") && !input.modelID.includes("gpt-4")
294
+ if (tool.id === ApplyPatchTool.id) return usePatch
295
+ if (tool.id === EditTool.id || tool.id === WriteTool.id) return !usePatch
296
+
297
+ return true
298
+ })
299
+
300
+ const codeModeDescription = filtered.some((tool) => tool.id === "execute")
301
+ ? yield* describeCodeMode(input)
302
+ : undefined
303
+ const visible = filtered.filter((tool) => tool.id !== "execute" || codeModeDescription)
304
+
305
+ return yield* Effect.forEach(
306
+ visible,
307
+ Effect.fnUntraced(function* (tool: Tool.Def) {
308
+ const output = {
309
+ description: tool.description,
310
+ parameters: tool.parameters,
311
+ jsonSchema: tool.jsonSchema,
312
+ }
313
+ yield* plugin.trigger("tool.definition", { toolID: tool.id }, output)
314
+ const jsonSchema =
315
+ output.parameters === tool.parameters || output.jsonSchema !== tool.jsonSchema
316
+ ? output.jsonSchema
317
+ : undefined
318
+ return {
319
+ id: tool.id,
320
+ description: [
321
+ output.description,
322
+ tool.id === TaskTool.id ? yield* describeTask(input.agent) : undefined,
323
+ tool.id === "execute" ? codeModeDescription : undefined,
324
+ ]
325
+ .filter(Boolean)
326
+ .join("\n"),
327
+ parameters: output.parameters,
328
+ jsonSchema,
329
+ execute: tool.execute,
330
+ formatValidationError: tool.formatValidationError,
331
+ }
332
+ }),
333
+ { concurrency: "unbounded" },
334
+ )
335
+ })
336
+
337
+ const named: Interface["named"] = Effect.fn("ToolRegistry.named")(function* () {
338
+ const s = yield* InstanceState.get(state)
339
+ return { task: s.task, read: s.read }
340
+ })
341
+
342
+ return Service.of({ ids, all, named, tools })
343
+ }),
344
+ )
345
+
346
+ function isZodType(value: unknown): value is z.ZodType {
347
+ return typeof value === "object" && value !== null && "_zod" in value
348
+ }
349
+
350
+ function isPluginTool(value: unknown): value is ToolDefinition {
351
+ return typeof value === "object" && value !== null && "args" in value && "description" in value && "execute" in value
352
+ }
353
+
354
+ function isJsonSchemaDefinition(value: unknown): value is JSONSchema7Definition {
355
+ return typeof value === "boolean" || (typeof value === "object" && value !== null && !Array.isArray(value))
356
+ }
357
+
358
+ function legacyJsonSchema(entries: [string, unknown][]): JSONSchema7 {
359
+ const properties = Object.fromEntries(
360
+ entries.filter((entry): entry is [string, JSONSchema7Definition] => isJsonSchemaDefinition(entry[1])),
361
+ )
362
+ return {
363
+ type: "object",
364
+ properties,
365
+ required: Object.keys(properties),
366
+ }
367
+ }
368
+
369
+ function zodJsonSchema(schema: z.ZodType): JSONSchema7 {
370
+ const result = normalizeZodJsonSchema(z.toJSONSchema(schema, { io: "input", metadata: zodMetadataRegistry(schema) }))
371
+ if (!isJsonSchemaObject(result)) throw new Error("plugin tool Zod schema produced a non-object JSON Schema")
372
+ const { $defs, ...rest } = result
373
+ return (
374
+ $defs && isJsonSchemaObject($defs) ? { ...rest, definitions: $defs as JSONSchema7["definitions"] } : rest
375
+ ) as JSONSchema7
376
+ }
377
+
378
+ function zodMetadataRegistry(schema: z.ZodType) {
379
+ const registry = z.registry<Record<string, unknown>>()
380
+ const seen = new WeakSet<object>()
381
+ const collect = (value: unknown) => {
382
+ if (typeof value !== "object" || value === null) return
383
+ if (seen.has(value)) return
384
+ seen.add(value)
385
+
386
+ if (isZodType(value)) {
387
+ const metadata = typeof value.meta === "function" ? value.meta() : undefined
388
+ const description = typeof value.description === "string" ? value.description : undefined
389
+ const merged = {
390
+ ...(metadata && typeof metadata === "object" ? metadata : {}),
391
+ ...(description ? { description } : {}),
392
+ }
393
+ if (Object.keys(merged).length) registry.add(value, merged)
394
+ collect(value._zod.def)
395
+ return
396
+ }
397
+
398
+ for (const item of Object.values(value)) collect(item)
399
+ }
400
+ collect(schema)
401
+ return registry
402
+ }
403
+
404
+ function normalizeZodJsonSchema(value: unknown): unknown {
405
+ if (Array.isArray(value)) return value.map((item) => normalizeZodJsonSchema(item))
406
+ if (typeof value !== "object" || value === null) return value
407
+ return Object.fromEntries(
408
+ Object.entries(value)
409
+ .filter((entry) =>
410
+ (entry[0] === "exclusiveMaximum" || entry[0] === "exclusiveMinimum") && typeof entry[1] === "boolean"
411
+ ? false
412
+ : true,
413
+ )
414
+ .map(([key, item]) => [key, normalizeZodJsonSchema(item)]),
415
+ )
416
+ }
417
+
418
+ function isJsonSchemaObject(value: unknown): value is Record<string, unknown> {
419
+ return typeof value === "object" && value !== null && !Array.isArray(value)
420
+ }
421
+
422
+ export const node = LayerNode.make({
423
+ service: Service,
424
+ layer,
425
+ deps: [
426
+ Config.node,
427
+ Plugin.node,
428
+ Question.node,
429
+ Todo.node,
430
+ Agent.node,
431
+ Skill.node,
432
+ Session.node,
433
+ BackgroundJob.node,
434
+ Provider.node,
435
+ LSP.node,
436
+ Instruction.node,
437
+ FSUtil.node,
438
+ EventV2Bridge.node,
439
+ httpClient,
440
+ CrossSpawnSpawner.node,
441
+ Format.node,
442
+ Truncate.node,
443
+ RuntimeFlags.node,
444
+ MCP.node,
445
+ Database.node,
446
+ Ripgrep.node,
447
+ ],
448
+ })
449
+
450
+ export * as ToolRegistry from "./registry"
@@ -0,0 +1,14 @@
1
+ import { Schema } from "effect"
2
+
3
+ import { Identifier } from "@/id/id"
4
+ import { statics } from "@opencode-ai/core/schema"
5
+
6
+ const toolIdSchema = Schema.String.check(Schema.isStartsWith("tool")).pipe(Schema.brand("ToolID"))
7
+
8
+ export type ToolID = typeof toolIdSchema.Type
9
+
10
+ export const ToolID = toolIdSchema.pipe(
11
+ statics((schema: typeof toolIdSchema) => ({
12
+ ascending: (id?: string) => schema.make(Identifier.ascending("tool", id)),
13
+ })),
14
+ )
@@ -0,0 +1,19 @@
1
+ const kinds = ["bash", "pwsh", "powershell", "cmd"] as const
2
+ export type Kind = (typeof kinds)[number]
3
+
4
+ const shellKinds = new Set<string>(kinds)
5
+
6
+ function isKind(value: string): value is Kind {
7
+ return shellKinds.has(value)
8
+ }
9
+
10
+ export function toKind(value: string): Kind {
11
+ return isKind(value) ? value : "bash"
12
+ }
13
+
14
+ // Keep the exposed tool ID and permission key as "bash" for compatibility with
15
+ // existing plugins, users, and saved permissions. Rename with opencode 2.0.
16
+ export const ToolID = "bash"
17
+ export type ToolID = typeof ToolID
18
+
19
+ export * as ShellID from "./id"