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,534 @@
1
+ import type { Argv } from "yargs"
2
+ import { Auth } from "../../auth"
3
+ import { cmd } from "./cmd"
4
+ import { CliError, effectCmd, fail } from "../effect-cmd"
5
+ import { UI } from "../ui"
6
+ import * as Prompt from "../effect/prompt"
7
+ import { ModelsDev } from "@opencode-ai/core/models-dev"
8
+
9
+ import { map, pipe, sortBy, values } from "remeda"
10
+ import path from "path"
11
+ import os from "os"
12
+ import { Config } from "@/config/config"
13
+ import { Global } from "@opencode-ai/core/global"
14
+ import { Plugin } from "../../plugin"
15
+ import type { Hooks } from "@opencode-ai/plugin"
16
+ import { Process } from "@/util/process"
17
+ import { errorMessage } from "@/util/error"
18
+ import { text } from "node:stream/consumers"
19
+ import { Effect, Option } from "effect"
20
+
21
+ type PluginAuth = NonNullable<Hooks["auth"]>
22
+
23
+ const promptValue = <Value>(value: Option.Option<Value>) => {
24
+ if (Option.isNone(value)) return Effect.die(new UI.CancelledError())
25
+ return Effect.succeed(value.value)
26
+ }
27
+
28
+ const put = Effect.fn("Cli.providers.put")(function* (key: string, info: Auth.Info) {
29
+ const auth = yield* Auth.Service
30
+ yield* Effect.orDie(auth.set(key, info))
31
+ })
32
+
33
+ const cliTry = <Value>(message: string, fn: () => PromiseLike<Value>) =>
34
+ Effect.tryPromise({
35
+ try: fn,
36
+ catch: (error) => new CliError({ message: message + errorMessage(error) }),
37
+ })
38
+
39
+ const handlePluginAuth = Effect.fn("Cli.providers.pluginAuth")(function* (
40
+ plugin: { auth: PluginAuth },
41
+ provider: string,
42
+ methodName?: string,
43
+ ) {
44
+ const index = yield* Effect.gen(function* () {
45
+ if (!methodName) {
46
+ if (plugin.auth.methods.length <= 1) return 0
47
+ return yield* promptValue(
48
+ yield* Prompt.select({
49
+ message: "Login method",
50
+ options: plugin.auth.methods.map((x, index) => ({
51
+ label: x.label,
52
+ value: index,
53
+ })),
54
+ }),
55
+ )
56
+ }
57
+ const match = plugin.auth.methods.findIndex((x) => x.label.toLowerCase() === methodName.toLowerCase())
58
+ if (match === -1) {
59
+ return yield* fail(
60
+ `Unknown method "${methodName}" for ${provider}. Available: ${plugin.auth.methods.map((x) => x.label).join(", ")}`,
61
+ )
62
+ }
63
+ return match
64
+ })
65
+ const method = plugin.auth.methods[index]
66
+
67
+ yield* Effect.sleep("10 millis")
68
+ const inputs: Record<string, string> = {}
69
+ if (method.prompts) {
70
+ for (const prompt of method.prompts) {
71
+ if (prompt.when) {
72
+ const value = inputs[prompt.when.key]
73
+ if (value === undefined) continue
74
+ const matches = prompt.when.op === "eq" ? value === prompt.when.value : value !== prompt.when.value
75
+ if (!matches) continue
76
+ }
77
+ if (prompt.condition && !prompt.condition(inputs)) continue
78
+ if (prompt.type === "select") {
79
+ const value = yield* Prompt.select({
80
+ message: prompt.message,
81
+ options: prompt.options,
82
+ })
83
+ inputs[prompt.key] = yield* promptValue(value)
84
+ continue
85
+ }
86
+ const value = yield* Prompt.text({
87
+ message: prompt.message,
88
+ placeholder: prompt.placeholder,
89
+ validate: prompt.validate ? (v) => prompt.validate!(v ?? "") : undefined,
90
+ })
91
+ inputs[prompt.key] = yield* promptValue(value)
92
+ }
93
+ }
94
+
95
+ if (method.type === "oauth") {
96
+ const authorize = yield* cliTry("Failed to authorize: ", () => method.authorize(inputs))
97
+
98
+ if (authorize.url) {
99
+ yield* Prompt.log.info("Go to: " + authorize.url)
100
+ }
101
+
102
+ if (authorize.method === "auto") {
103
+ if (authorize.instructions) {
104
+ yield* Prompt.log.info(authorize.instructions)
105
+ }
106
+ const spinner = Prompt.spinner()
107
+ yield* spinner.start("Waiting for authorization...")
108
+ const result = yield* cliTry("Failed to authorize: ", () => authorize.callback())
109
+ if (result.type === "failed") {
110
+ yield* spinner.stop("Failed to authorize", 1)
111
+ }
112
+ if (result.type === "success") {
113
+ const saveProvider = result.provider ?? provider
114
+ if ("refresh" in result) {
115
+ const { type: _, provider: __, refresh, access, expires, ...extraFields } = result
116
+ yield* put(saveProvider, {
117
+ type: "oauth",
118
+ refresh,
119
+ access,
120
+ expires,
121
+ ...extraFields,
122
+ })
123
+ }
124
+ if ("key" in result) {
125
+ yield* put(saveProvider, {
126
+ type: "api",
127
+ key: result.key,
128
+ ...(result.metadata ? { metadata: result.metadata } : {}),
129
+ })
130
+ }
131
+ yield* spinner.stop("Login successful")
132
+ }
133
+ }
134
+
135
+ if (authorize.method === "code") {
136
+ const code = yield* Prompt.text({
137
+ message: "Paste the authorization code here: ",
138
+ validate: (x) => (x && x.length > 0 ? undefined : "Required"),
139
+ })
140
+ const authorizationCode = yield* promptValue(code)
141
+ const result = yield* cliTry("Failed to authorize: ", () => authorize.callback(authorizationCode))
142
+ if (result.type === "failed") {
143
+ yield* Prompt.log.error("Failed to authorize")
144
+ }
145
+ if (result.type === "success") {
146
+ const saveProvider = result.provider ?? provider
147
+ if ("refresh" in result) {
148
+ const { type: _, provider: __, refresh, access, expires, ...extraFields } = result
149
+ yield* put(saveProvider, {
150
+ type: "oauth",
151
+ refresh,
152
+ access,
153
+ expires,
154
+ ...extraFields,
155
+ })
156
+ }
157
+ if ("key" in result) {
158
+ yield* put(saveProvider, {
159
+ type: "api",
160
+ key: result.key,
161
+ ...(result.metadata ? { metadata: result.metadata } : {}),
162
+ })
163
+ }
164
+ yield* Prompt.log.success("Login successful")
165
+ }
166
+ }
167
+
168
+ yield* Prompt.outro("Done")
169
+ return true
170
+ }
171
+
172
+ if (method.type === "api") {
173
+ const key = yield* Prompt.password({
174
+ message: "Enter your API key",
175
+ validate: (x) => (x && x.length > 0 ? undefined : "Required"),
176
+ })
177
+ const apiKey = yield* promptValue(key)
178
+
179
+ const metadata = Object.keys(inputs).length ? { metadata: inputs } : {}
180
+ const authorizeApi = method.authorize
181
+ if (!authorizeApi) {
182
+ yield* put(provider, {
183
+ type: "api",
184
+ key: apiKey,
185
+ ...metadata,
186
+ })
187
+ yield* Prompt.outro("Done")
188
+ return true
189
+ }
190
+
191
+ const result = yield* cliTry("Failed to authorize: ", () => authorizeApi(inputs))
192
+ if (result.type === "failed") {
193
+ yield* Prompt.log.error("Failed to authorize")
194
+ }
195
+ if (result.type === "success") {
196
+ const saveProvider = result.provider ?? provider
197
+ const merged = { ...(metadata.metadata ?? {}), ...(result.metadata ?? {}) }
198
+ yield* put(saveProvider, {
199
+ type: "api",
200
+ key: result.key ?? apiKey,
201
+ ...(Object.keys(merged).length ? { metadata: merged } : {}),
202
+ })
203
+ yield* Prompt.log.success("Login successful")
204
+ }
205
+ yield* Prompt.outro("Done")
206
+ return true
207
+ }
208
+
209
+ return false
210
+ })
211
+
212
+ export function resolvePluginProviders(input: {
213
+ hooks: Hooks[]
214
+ existingProviders: Record<string, unknown>
215
+ disabled: Set<string>
216
+ enabled?: Set<string>
217
+ providerNames: Record<string, string | undefined>
218
+ }): Array<{ id: string; name: string }> {
219
+ const seen = new Set<string>()
220
+ const result: Array<{ id: string; name: string }> = []
221
+
222
+ for (const hook of input.hooks) {
223
+ if (!hook.auth) continue
224
+ const id = hook.auth.provider
225
+ if (seen.has(id)) continue
226
+ seen.add(id)
227
+ if (Object.hasOwn(input.existingProviders, id)) continue
228
+ if (input.disabled.has(id)) continue
229
+ if (input.enabled && !input.enabled.has(id)) continue
230
+ result.push({
231
+ id,
232
+ name: input.providerNames[id] ?? id,
233
+ })
234
+ }
235
+
236
+ return result
237
+ }
238
+
239
+ export const ProvidersCommand = cmd({
240
+ command: "providers",
241
+ aliases: ["auth"],
242
+ describe: "manage AI providers and credentials",
243
+ builder: (yargs) =>
244
+ yargs.command(ProvidersListCommand).command(ProvidersLoginCommand).command(ProvidersLogoutCommand).demandCommand(),
245
+ async handler() {},
246
+ })
247
+
248
+ export const ProvidersListCommand = effectCmd({
249
+ command: "list",
250
+ aliases: ["ls"],
251
+ describe: "list providers and credentials",
252
+ // Lists global credentials + provider env vars; no project instance needed.
253
+ instance: false,
254
+ handler: Effect.fn("Cli.providers.list")(function* (_args) {
255
+ const authSvc = yield* Auth.Service
256
+ const modelsDev = yield* ModelsDev.Service
257
+
258
+ UI.empty()
259
+ const authPath = path.join(Global.Path.data, "auth.json")
260
+ const homedir = os.homedir()
261
+ const displayPath = authPath.startsWith(homedir) ? authPath.replace(homedir, "~") : authPath
262
+ yield* Prompt.intro(`Credentials ${UI.Style.TEXT_DIM}${displayPath}`)
263
+ const results = Object.entries(yield* Effect.orDie(authSvc.all()))
264
+ const database = yield* modelsDev.get()
265
+
266
+ for (const [providerID, result] of results) {
267
+ const name = database[providerID]?.name || providerID
268
+ yield* Prompt.log.info(`${name} ${UI.Style.TEXT_DIM}${result.type}`)
269
+ }
270
+
271
+ yield* Prompt.outro(`${results.length} credentials`)
272
+
273
+ const activeEnvVars: Array<{ provider: string; envVar: string }> = []
274
+
275
+ for (const [providerID, provider] of Object.entries(database)) {
276
+ for (const envVar of provider.env) {
277
+ if (process.env[envVar]) {
278
+ activeEnvVars.push({
279
+ provider: provider.name || providerID,
280
+ envVar,
281
+ })
282
+ }
283
+ }
284
+ }
285
+
286
+ if (activeEnvVars.length > 0) {
287
+ UI.empty()
288
+ yield* Prompt.intro("Environment")
289
+
290
+ for (const { provider, envVar } of activeEnvVars) {
291
+ yield* Prompt.log.info(`${provider} ${UI.Style.TEXT_DIM}${envVar}`)
292
+ }
293
+
294
+ yield* Prompt.outro(`${activeEnvVars.length} environment variable` + (activeEnvVars.length === 1 ? "" : "s"))
295
+ }
296
+ }),
297
+ })
298
+
299
+ export const ProvidersLoginCommand = effectCmd({
300
+ command: "login [url]",
301
+ describe: "log in to a provider",
302
+ // URL login skips instance bootstrap, which would load remote config with the stale token and crash before re-auth.
303
+ instance: (args) => !args.url,
304
+ builder: (yargs: Argv) =>
305
+ yargs
306
+ .positional("url", {
307
+ describe: "opencode auth provider",
308
+ type: "string",
309
+ })
310
+ .option("provider", {
311
+ alias: ["p"],
312
+ describe: "provider id or name to log in to (skips provider selection)",
313
+ type: "string",
314
+ })
315
+ .option("method", {
316
+ alias: ["m"],
317
+ describe: "login method label (skips method selection)",
318
+ type: "string",
319
+ }),
320
+ handler: Effect.fn("Cli.providers.login")(function* (args) {
321
+ const authSvc = yield* Auth.Service
322
+
323
+ UI.empty()
324
+ yield* Prompt.intro("Add credential")
325
+ if (args.url) {
326
+ const url = args.url.replace(/\/+$/, "")
327
+ const wellknown = (yield* cliTry(`Failed to load auth provider metadata from ${url}: `, () =>
328
+ fetch(`${url}/.well-known/opencode`).then((x) => x.json()),
329
+ )) as {
330
+ auth: { command: string[]; env: string }
331
+ }
332
+ yield* Prompt.log.info(`Running \`${wellknown.auth.command.join(" ")}\``)
333
+ const abort = new AbortController()
334
+ const proc = Process.spawn(wellknown.auth.command, { stdout: "pipe", stderr: "inherit", abort: abort.signal })
335
+ if (!proc.stdout) {
336
+ yield* Prompt.log.error("Failed")
337
+ yield* Prompt.outro("Done")
338
+ return
339
+ }
340
+ const [exit, token] = yield* cliTry("Failed to run auth provider command: ", () =>
341
+ Promise.all([proc.exited, text(proc.stdout!)]),
342
+ ).pipe(Effect.ensuring(Effect.sync(() => abort.abort())))
343
+ if (exit !== 0) {
344
+ yield* Prompt.log.error("Failed")
345
+ yield* Prompt.outro("Done")
346
+ return
347
+ }
348
+ yield* Effect.orDie(authSvc.set(url, { type: "wellknown", key: wellknown.auth.env, token: token.trim() }))
349
+ yield* Prompt.log.success("Logged into " + url)
350
+ yield* Prompt.outro("Done")
351
+ return
352
+ }
353
+
354
+ const cfgSvc = yield* Config.Service
355
+ const pluginSvc = yield* Plugin.Service
356
+ const modelsDev = yield* ModelsDev.Service
357
+ yield* Effect.ignore(modelsDev.refresh(true))
358
+
359
+ const config = yield* cfgSvc.get()
360
+
361
+ const disabled = new Set(config.disabled_providers ?? [])
362
+ const enabled = config.enabled_providers ? new Set(config.enabled_providers) : undefined
363
+
364
+ const allProviders = yield* modelsDev.get()
365
+ const providers: Record<string, (typeof allProviders)[string]> = {}
366
+ for (const [key, value] of Object.entries(allProviders)) {
367
+ if ((enabled ? enabled.has(key) : true) && !disabled.has(key)) providers[key] = value
368
+ }
369
+ const hooks = yield* pluginSvc.list()
370
+
371
+ const priority: Record<string, number> = {
372
+ opencode: 0,
373
+ openai: 1,
374
+ "github-copilot": 2,
375
+ google: 3,
376
+ anthropic: 4,
377
+ openrouter: 5,
378
+ vercel: 6,
379
+ }
380
+ const pluginProviders = resolvePluginProviders({
381
+ hooks,
382
+ existingProviders: providers,
383
+ disabled,
384
+ enabled,
385
+ providerNames: Object.fromEntries(Object.entries(config.provider ?? {}).map(([id, p]) => [id, p.name])),
386
+ })
387
+ const options = [
388
+ ...pipe(
389
+ providers,
390
+ values(),
391
+ sortBy(
392
+ (x) => priority[x.id] ?? 99,
393
+ (x) => x.name ?? x.id,
394
+ ),
395
+ map((x) => ({
396
+ label: x.name,
397
+ value: x.id,
398
+ hint: {
399
+ opencode: "recommended",
400
+ openai: "ChatGPT Plus/Pro or API key",
401
+ }[x.id],
402
+ })),
403
+ ),
404
+ ...pluginProviders.map((x) => ({
405
+ label: x.name,
406
+ value: x.id,
407
+ hint: "plugin",
408
+ })),
409
+ ]
410
+
411
+ let provider: string
412
+ if (args.provider) {
413
+ const input = args.provider
414
+ const byID = options.find((x) => x.value === input)
415
+ const byName = options.find((x) => x.label.toLowerCase() === input.toLowerCase())
416
+ const match = byID ?? byName
417
+ if (!match) {
418
+ return yield* fail(`Unknown provider "${input}"`)
419
+ }
420
+ provider = match.value
421
+ } else {
422
+ provider = yield* promptValue(
423
+ yield* Prompt.autocomplete({
424
+ message: "Select provider",
425
+ maxItems: 8,
426
+ options: [...options, { value: "other", label: "Other" }],
427
+ }),
428
+ )
429
+ }
430
+
431
+ const plugin = hooks.findLast((x) => x.auth?.provider === provider)
432
+ if (plugin && plugin.auth) {
433
+ const handled = yield* handlePluginAuth({ auth: plugin.auth! }, provider, args.method)
434
+ if (handled) return
435
+ }
436
+
437
+ if (provider === "other") {
438
+ provider = (yield* promptValue(
439
+ yield* Prompt.text({
440
+ message: "Enter provider id",
441
+ validate: (x) => (x && x.match(/^[0-9a-z-]+$/) ? undefined : "a-z, 0-9 and hyphens only"),
442
+ }),
443
+ )).replace(/^@ai-sdk\//, "")
444
+
445
+ const customPlugin = hooks.findLast((x) => x.auth?.provider === provider)
446
+ if (customPlugin && customPlugin.auth) {
447
+ const handled = yield* handlePluginAuth({ auth: customPlugin.auth! }, provider, args.method)
448
+ if (handled) return
449
+ }
450
+
451
+ yield* Prompt.log.warn(
452
+ `This only stores a credential for ${provider} - you will need configure it in opencode.json, check the docs for examples.`,
453
+ )
454
+ }
455
+
456
+ if (provider === "amazon-bedrock") {
457
+ yield* Prompt.log.info(
458
+ "Amazon Bedrock authentication priority:\n" +
459
+ " 1. Bearer token (AWS_BEARER_TOKEN_BEDROCK or /connect)\n" +
460
+ " 2. AWS credential chain (profile, access keys, IAM roles, EKS IRSA)\n\n" +
461
+ "Configure via opencode.json options (profile, region, endpoint) or\n" +
462
+ "AWS environment variables (AWS_PROFILE, AWS_REGION, AWS_ACCESS_KEY_ID, AWS_WEB_IDENTITY_TOKEN_FILE).",
463
+ )
464
+ }
465
+
466
+ if (provider === "opencode") {
467
+ yield* Prompt.log.info("Create an api key at https://opencode.ai/auth")
468
+ }
469
+
470
+ if (provider === "vercel") {
471
+ yield* Prompt.log.info("You can create an api key at https://vercel.link/ai-gateway-token")
472
+ }
473
+
474
+ if (["cloudflare", "cloudflare-ai-gateway"].includes(provider)) {
475
+ yield* Prompt.log.info(
476
+ "Cloudflare AI Gateway can be configured with CLOUDFLARE_GATEWAY_ID, CLOUDFLARE_ACCOUNT_ID, and CLOUDFLARE_API_TOKEN environment variables. Read more: https://opencode.ai/docs/providers/#cloudflare-ai-gateway",
477
+ )
478
+ }
479
+
480
+ const key = yield* Prompt.password({
481
+ message: "Enter your API key",
482
+ validate: (x) => (x && x.length > 0 ? undefined : "Required"),
483
+ })
484
+ const apiKey = yield* promptValue(key)
485
+ yield* Effect.orDie(authSvc.set(provider, { type: "api", key: apiKey }))
486
+
487
+ yield* Prompt.outro("Done")
488
+ }),
489
+ })
490
+
491
+ export const ProvidersLogoutCommand = effectCmd({
492
+ command: "logout [provider]",
493
+ describe: "log out from a configured provider",
494
+ builder: (yargs) =>
495
+ yargs.positional("provider", {
496
+ describe: "provider id or name to log out from",
497
+ type: "string",
498
+ }),
499
+ // Removes a global auth credential; no project instance needed.
500
+ instance: false,
501
+ handler: Effect.fn("Cli.providers.logout")(function* (args) {
502
+ const authSvc = yield* Auth.Service
503
+ const modelsDev = yield* ModelsDev.Service
504
+
505
+ UI.empty()
506
+ const credentials: Array<[string, Auth.Info]> = Object.entries(yield* Effect.orDie(authSvc.all()))
507
+ yield* Prompt.intro("Remove credential")
508
+ if (credentials.length === 0) {
509
+ yield* Prompt.log.error("No credentials found")
510
+ return
511
+ }
512
+ const database = yield* modelsDev.get()
513
+ const options = credentials.map(([key, value]) => ({
514
+ label: (database[key]?.name || key) + UI.Style.TEXT_DIM + " (" + value.type + ")",
515
+ value: key,
516
+ }))
517
+ const provider = args.provider
518
+ ? options.find(
519
+ (option) =>
520
+ option.value === args.provider ||
521
+ database[option.value]?.name?.toLowerCase() === args.provider?.toLowerCase(),
522
+ )?.value
523
+ : yield* promptValue(
524
+ yield* Prompt.autocomplete({
525
+ message: "Select provider",
526
+ maxItems: 8,
527
+ options,
528
+ }),
529
+ )
530
+ if (!provider) return yield* fail(`Unknown configured provider "${args.provider}"`)
531
+ yield* Effect.orDie(authSvc.remove(provider))
532
+ yield* Prompt.outro("Logout successful")
533
+ }),
534
+ })