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,404 @@
1
+ import { Npm } from "@opencode-ai/core/npm"
2
+ import type { InstanceContext } from "../project/instance-context"
3
+ import { Filesystem } from "@/util/filesystem"
4
+ import { Process } from "@/util/process"
5
+ import { which } from "@opencode-ai/core/util/which"
6
+
7
+ export interface Context extends Pick<InstanceContext, "directory" | "worktree"> {
8
+ experimentalOxfmt: boolean
9
+ }
10
+
11
+ export interface Info {
12
+ name: string
13
+ environment?: Record<string, string>
14
+ extensions: string[]
15
+ enabled(context: Context): Promise<string[] | false>
16
+ }
17
+
18
+ export const gofmt: Info = {
19
+ name: "gofmt",
20
+ extensions: [".go"],
21
+ async enabled() {
22
+ const match = which("gofmt")
23
+ if (!match) return false
24
+ return [match, "-w", "$FILE"]
25
+ },
26
+ }
27
+
28
+ export const mix: Info = {
29
+ name: "mix",
30
+ extensions: [".ex", ".exs", ".eex", ".heex", ".leex", ".neex", ".sface"],
31
+ async enabled() {
32
+ const match = which("mix")
33
+ if (!match) return false
34
+ return [match, "format", "$FILE"]
35
+ },
36
+ }
37
+
38
+ export const prettier: Info = {
39
+ name: "prettier",
40
+ environment: {
41
+ BUN_BE_BUN: "1",
42
+ },
43
+ extensions: [
44
+ ".js",
45
+ ".jsx",
46
+ ".mjs",
47
+ ".cjs",
48
+ ".ts",
49
+ ".tsx",
50
+ ".mts",
51
+ ".cts",
52
+ ".html",
53
+ ".htm",
54
+ ".css",
55
+ ".scss",
56
+ ".sass",
57
+ ".less",
58
+ ".vue",
59
+ ".svelte",
60
+ ".json",
61
+ ".jsonc",
62
+ ".yaml",
63
+ ".yml",
64
+ ".toml",
65
+ ".xml",
66
+ ".md",
67
+ ".mdx",
68
+ ".graphql",
69
+ ".gql",
70
+ ],
71
+ async enabled(context) {
72
+ const items = await Filesystem.findUp("package.json", context.directory, context.worktree)
73
+ for (const item of items) {
74
+ const json = await Filesystem.readJson<{
75
+ dependencies?: Record<string, string>
76
+ devDependencies?: Record<string, string>
77
+ }>(item)
78
+ if (json.dependencies?.prettier || json.devDependencies?.prettier) {
79
+ const bin = await Npm.which("prettier")
80
+ if (bin) return [bin, "--write", "$FILE"]
81
+ }
82
+ }
83
+ return false
84
+ },
85
+ }
86
+
87
+ export const oxfmt: Info = {
88
+ name: "oxfmt",
89
+ environment: {
90
+ BUN_BE_BUN: "1",
91
+ },
92
+ extensions: [".js", ".jsx", ".mjs", ".cjs", ".ts", ".tsx", ".mts", ".cts"],
93
+ async enabled(context) {
94
+ if (!context.experimentalOxfmt) return false
95
+ const items = await Filesystem.findUp("package.json", context.directory, context.worktree)
96
+ for (const item of items) {
97
+ const json = await Filesystem.readJson<{
98
+ dependencies?: Record<string, string>
99
+ devDependencies?: Record<string, string>
100
+ }>(item)
101
+ if (json.dependencies?.oxfmt || json.devDependencies?.oxfmt) {
102
+ const bin = await Npm.which("oxfmt")
103
+ if (bin) return [bin, "$FILE"]
104
+ }
105
+ }
106
+ return false
107
+ },
108
+ }
109
+
110
+ export const biome: Info = {
111
+ name: "biome",
112
+ environment: {
113
+ BUN_BE_BUN: "1",
114
+ },
115
+ extensions: [
116
+ ".js",
117
+ ".jsx",
118
+ ".mjs",
119
+ ".cjs",
120
+ ".ts",
121
+ ".tsx",
122
+ ".mts",
123
+ ".cts",
124
+ ".html",
125
+ ".htm",
126
+ ".css",
127
+ ".scss",
128
+ ".sass",
129
+ ".less",
130
+ ".vue",
131
+ ".svelte",
132
+ ".json",
133
+ ".jsonc",
134
+ ".yaml",
135
+ ".yml",
136
+ ".toml",
137
+ ".xml",
138
+ ".md",
139
+ ".mdx",
140
+ ".graphql",
141
+ ".gql",
142
+ ],
143
+ async enabled(context) {
144
+ const configs = ["biome.json", "biome.jsonc"]
145
+ for (const config of configs) {
146
+ const found = await Filesystem.findUp(config, context.directory, context.worktree)
147
+ if (found.length > 0) {
148
+ const bin = await Npm.which("@biomejs/biome")
149
+ if (bin) return [bin, "format", "--write", "$FILE"]
150
+ }
151
+ }
152
+ return false
153
+ },
154
+ }
155
+
156
+ export const zig: Info = {
157
+ name: "zig",
158
+ extensions: [".zig", ".zon"],
159
+ async enabled() {
160
+ const match = which("zig")
161
+ if (!match) return false
162
+ return [match, "fmt", "$FILE"]
163
+ },
164
+ }
165
+
166
+ export const clang: Info = {
167
+ name: "clang-format",
168
+ extensions: [".c", ".cc", ".cpp", ".cxx", ".c++", ".h", ".hh", ".hpp", ".hxx", ".h++", ".ino", ".C", ".H"],
169
+ async enabled(context) {
170
+ const items = await Filesystem.findUp(".clang-format", context.directory, context.worktree)
171
+ if (items.length > 0) {
172
+ const match = which("clang-format")
173
+ if (match) return [match, "-i", "$FILE"]
174
+ }
175
+ return false
176
+ },
177
+ }
178
+
179
+ export const ktlint: Info = {
180
+ name: "ktlint",
181
+ extensions: [".kt", ".kts"],
182
+ async enabled() {
183
+ const match = which("ktlint")
184
+ if (!match) return false
185
+ return [match, "-F", "$FILE"]
186
+ },
187
+ }
188
+
189
+ export const ruff: Info = {
190
+ name: "ruff",
191
+ extensions: [".py", ".pyi"],
192
+ async enabled(context) {
193
+ if (!which("ruff")) return false
194
+ const configs = ["pyproject.toml", "ruff.toml", ".ruff.toml"]
195
+ for (const config of configs) {
196
+ const found = await Filesystem.findUp(config, context.directory, context.worktree)
197
+ if (found.length > 0) {
198
+ if (config === "pyproject.toml") {
199
+ const content = await Filesystem.readText(found[0])
200
+ if (content.includes("[tool.ruff]")) return ["ruff", "format", "$FILE"]
201
+ } else {
202
+ return ["ruff", "format", "$FILE"]
203
+ }
204
+ }
205
+ }
206
+ const deps = ["requirements.txt", "pyproject.toml", "Pipfile"]
207
+ for (const dep of deps) {
208
+ const found = await Filesystem.findUp(dep, context.directory, context.worktree)
209
+ if (found.length > 0) {
210
+ const content = await Filesystem.readText(found[0])
211
+ if (content.includes("ruff")) return ["ruff", "format", "$FILE"]
212
+ }
213
+ }
214
+ return false
215
+ },
216
+ }
217
+
218
+ export const rlang: Info = {
219
+ name: "air",
220
+ extensions: [".R"],
221
+ async enabled() {
222
+ const air = which("air")
223
+ if (air == null) return false
224
+
225
+ const output = await Process.text([air, "--help"], { nothrow: true })
226
+
227
+ // Check for "Air: An R language server and formatter"
228
+ const firstLine = output.text.split("\n")[0]
229
+ const hasR = firstLine.includes("R language")
230
+ const hasFormatter = firstLine.includes("formatter")
231
+ if (output.code === 0 && hasR && hasFormatter) return [air, "format", "$FILE"]
232
+ return false
233
+ },
234
+ }
235
+
236
+ export const uvformat: Info = {
237
+ name: "uv",
238
+ extensions: [".py", ".pyi"],
239
+ async enabled(context) {
240
+ if (await ruff.enabled(context)) return false
241
+ const uv = which("uv")
242
+ if (uv == null) return false
243
+ const output = await Process.run([uv, "format", "--help"], { nothrow: true })
244
+ if (output.code === 0) return [uv, "format", "--", "$FILE"]
245
+ return false
246
+ },
247
+ }
248
+
249
+ export const rubocop: Info = {
250
+ name: "rubocop",
251
+ extensions: [".rb", ".rake", ".gemspec", ".ru"],
252
+ async enabled() {
253
+ const match = which("rubocop")
254
+ if (!match) return false
255
+ return [match, "--autocorrect", "$FILE"]
256
+ },
257
+ }
258
+
259
+ export const standardrb: Info = {
260
+ name: "standardrb",
261
+ extensions: [".rb", ".rake", ".gemspec", ".ru"],
262
+ async enabled() {
263
+ const match = which("standardrb")
264
+ if (!match) return false
265
+ return [match, "--fix", "$FILE"]
266
+ },
267
+ }
268
+
269
+ export const htmlbeautifier: Info = {
270
+ name: "htmlbeautifier",
271
+ extensions: [".erb", ".html.erb"],
272
+ async enabled() {
273
+ const match = which("htmlbeautifier")
274
+ if (!match) return false
275
+ return [match, "$FILE"]
276
+ },
277
+ }
278
+
279
+ export const dart: Info = {
280
+ name: "dart",
281
+ extensions: [".dart"],
282
+ async enabled() {
283
+ const match = which("dart")
284
+ if (!match) return false
285
+ return [match, "format", "$FILE"]
286
+ },
287
+ }
288
+
289
+ export const ocamlformat: Info = {
290
+ name: "ocamlformat",
291
+ extensions: [".ml", ".mli"],
292
+ async enabled(context) {
293
+ if (!which("ocamlformat")) return false
294
+ const items = await Filesystem.findUp(".ocamlformat", context.directory, context.worktree)
295
+ if (items.length > 0) return ["ocamlformat", "-i", "$FILE"]
296
+ return false
297
+ },
298
+ }
299
+
300
+ export const terraform: Info = {
301
+ name: "terraform",
302
+ extensions: [".tf", ".tfvars"],
303
+ async enabled() {
304
+ const match = which("terraform")
305
+ if (!match) return false
306
+ return [match, "fmt", "$FILE"]
307
+ },
308
+ }
309
+
310
+ export const latexindent: Info = {
311
+ name: "latexindent",
312
+ extensions: [".tex"],
313
+ async enabled() {
314
+ const match = which("latexindent")
315
+ if (!match) return false
316
+ return [match, "-w", "-s", "$FILE"]
317
+ },
318
+ }
319
+
320
+ export const gleam: Info = {
321
+ name: "gleam",
322
+ extensions: [".gleam"],
323
+ async enabled() {
324
+ const match = which("gleam")
325
+ if (!match) return false
326
+ return [match, "format", "$FILE"]
327
+ },
328
+ }
329
+
330
+ export const shfmt: Info = {
331
+ name: "shfmt",
332
+ extensions: [".sh", ".bash"],
333
+ async enabled() {
334
+ const match = which("shfmt")
335
+ if (!match) return false
336
+ return [match, "-w", "$FILE"]
337
+ },
338
+ }
339
+
340
+ export const nixfmt: Info = {
341
+ name: "nixfmt",
342
+ extensions: [".nix"],
343
+ async enabled() {
344
+ const match = which("nixfmt")
345
+ if (!match) return false
346
+ return [match, "$FILE"]
347
+ },
348
+ }
349
+
350
+ export const rustfmt: Info = {
351
+ name: "rustfmt",
352
+ extensions: [".rs"],
353
+ async enabled() {
354
+ const match = which("rustfmt")
355
+ if (!match) return false
356
+ return [match, "$FILE"]
357
+ },
358
+ }
359
+
360
+ export const pint: Info = {
361
+ name: "pint",
362
+ extensions: [".php"],
363
+ async enabled(context) {
364
+ const items = await Filesystem.findUp("composer.json", context.directory, context.worktree)
365
+ for (const item of items) {
366
+ const json = await Filesystem.readJson<{
367
+ require?: Record<string, string>
368
+ "require-dev"?: Record<string, string>
369
+ }>(item)
370
+ if (json.require?.["laravel/pint"] || json["require-dev"]?.["laravel/pint"]) return ["./vendor/bin/pint", "$FILE"]
371
+ }
372
+ return false
373
+ },
374
+ }
375
+
376
+ export const ormolu: Info = {
377
+ name: "ormolu",
378
+ extensions: [".hs"],
379
+ async enabled() {
380
+ const match = which("ormolu")
381
+ if (!match) return false
382
+ return [match, "-i", "$FILE"]
383
+ },
384
+ }
385
+
386
+ export const cljfmt: Info = {
387
+ name: "cljfmt",
388
+ extensions: [".clj", ".cljs", ".cljc", ".edn"],
389
+ async enabled() {
390
+ const match = which("cljfmt")
391
+ if (!match) return false
392
+ return [match, "fix", "--quiet", "$FILE"]
393
+ },
394
+ }
395
+
396
+ export const dfmt: Info = {
397
+ name: "dfmt",
398
+ extensions: [".d"],
399
+ async enabled() {
400
+ const match = which("dfmt")
401
+ if (!match) return false
402
+ return [match, "-i", "$FILE"]
403
+ },
404
+ }
@@ -0,0 +1,203 @@
1
+ import { LayerNode } from "@opencode-ai/core/effect/layer-node"
2
+ import { Effect, Layer, Context, Schema } from "effect"
3
+ import { serviceUse } from "@opencode-ai/core/effect/service-use"
4
+ import { ChildProcess } from "effect/unstable/process"
5
+ import { AppProcess } from "@opencode-ai/core/process"
6
+ import { InstanceState } from "@/effect/instance-state"
7
+ import path from "path"
8
+ import { mergeDeep } from "remeda"
9
+ import { Config } from "@/config/config"
10
+ import { RuntimeFlags } from "@/effect/runtime-flags"
11
+ import { errorMessage } from "@/util/error"
12
+ import * as Formatter from "./formatter"
13
+
14
+ export const Status = Schema.Struct({
15
+ name: Schema.String,
16
+ extensions: Schema.Array(Schema.String),
17
+ enabled: Schema.Boolean,
18
+ }).annotate({ identifier: "FormatterStatus" })
19
+ export type Status = Schema.Schema.Type<typeof Status>
20
+
21
+ export interface Interface {
22
+ readonly init: () => Effect.Effect<void>
23
+ readonly status: () => Effect.Effect<Status[]>
24
+ readonly file: (filepath: string) => Effect.Effect<boolean>
25
+ }
26
+
27
+ export class Service extends Context.Service<Service, Interface>()("@opencode/Format") {}
28
+
29
+ export const use = serviceUse(Service)
30
+
31
+ const layer = Layer.effect(
32
+ Service,
33
+ Effect.gen(function* () {
34
+ const config = yield* Config.Service
35
+ const appProcess = yield* AppProcess.Service
36
+ const flags = yield* RuntimeFlags.Service
37
+
38
+ const state = yield* InstanceState.make(
39
+ Effect.fn("Format.state")(function* (ctx) {
40
+ const commands: Record<string, string[] | false> = {}
41
+ const formatters: Record<string, Formatter.Info> = {}
42
+
43
+ async function getCommand(item: Formatter.Info) {
44
+ let cmd = commands[item.name]
45
+ if (cmd === false || cmd === undefined) {
46
+ cmd = await item.enabled({ ...ctx, experimentalOxfmt: flags.experimentalOxfmt })
47
+ commands[item.name] = cmd
48
+ }
49
+ return cmd
50
+ }
51
+
52
+ async function isEnabled(item: Formatter.Info) {
53
+ const cmd = await getCommand(item)
54
+ return cmd !== false
55
+ }
56
+
57
+ async function getFormatter(ext: string) {
58
+ const matching = Object.values(formatters).filter((item) => item.extensions.includes(ext))
59
+ const checks = await Promise.all(
60
+ matching.map(async (item) => {
61
+ const cmd = await getCommand(item)
62
+ return {
63
+ item,
64
+ cmd,
65
+ }
66
+ }),
67
+ )
68
+ return checks
69
+ .filter((x): x is { item: Formatter.Info; cmd: string[] } => x.cmd !== false)
70
+ .map((x) => ({ item: x.item, cmd: x.cmd }))
71
+ }
72
+
73
+ function formatFile(filepath: string) {
74
+ return Effect.gen(function* () {
75
+ yield* Effect.logInfo("formatting", { file: filepath })
76
+ const formatters = yield* Effect.promise(() => getFormatter(path.extname(filepath)))
77
+
78
+ if (!formatters.length) return false
79
+
80
+ for (const { item, cmd } of formatters) {
81
+ yield* Effect.logInfo("running", { command: cmd })
82
+ const replaced = cmd.map((x) => x.replace("$FILE", filepath))
83
+ const dir = yield* InstanceState.directory
84
+ const result = yield* appProcess
85
+ .run(
86
+ ChildProcess.make(replaced[0]!, replaced.slice(1), {
87
+ cwd: dir,
88
+ env: item.environment,
89
+ extendEnv: true,
90
+ stdin: "ignore",
91
+ stdout: "ignore",
92
+ stderr: "ignore",
93
+ }),
94
+ )
95
+ .pipe(
96
+ Effect.catch((error) =>
97
+ Effect.logError("failed to format file", {
98
+ error: "spawn failed",
99
+ command: cmd,
100
+ ...item.environment,
101
+ file: filepath,
102
+ cause: errorMessage(error.cause ?? error),
103
+ }).pipe(Effect.as(undefined)),
104
+ ),
105
+ )
106
+ if (result && result.exitCode !== 0) {
107
+ yield* Effect.logError("failed", {
108
+ command: cmd,
109
+ ...item.environment,
110
+ })
111
+ }
112
+ }
113
+
114
+ return true
115
+ })
116
+ }
117
+
118
+ const cfg = yield* config.get()
119
+
120
+ if (!cfg.formatter) {
121
+ yield* Effect.logInfo("all formatters are disabled")
122
+ yield* Effect.logInfo("init")
123
+ return {
124
+ formatters,
125
+ isEnabled,
126
+ formatFile,
127
+ }
128
+ }
129
+
130
+ for (const item of Object.values(Formatter)) {
131
+ formatters[item.name] = item
132
+ }
133
+
134
+ if (cfg.formatter !== true) {
135
+ for (const [name, item] of Object.entries(cfg.formatter)) {
136
+ const builtIn = Formatter[name as keyof typeof Formatter]
137
+
138
+ // Ruff and uv are both the same formatter, so disabling either should disable both.
139
+ if (["ruff", "uv"].includes(name) && (cfg.formatter.ruff?.disabled || cfg.formatter.uv?.disabled)) {
140
+ // TODO combine formatters so shared backends like Ruff/uv don't need linked disable handling here.
141
+ delete formatters.ruff
142
+ delete formatters.uv
143
+ continue
144
+ }
145
+ if (item.disabled) {
146
+ delete formatters[name]
147
+ continue
148
+ }
149
+ const info = mergeDeep(builtIn ?? { extensions: [] }, item)
150
+
151
+ formatters[name] = {
152
+ ...info,
153
+ name,
154
+ extensions: info.extensions ?? [],
155
+ enabled: builtIn && !info.command ? builtIn.enabled : async (_context) => info.command ?? false,
156
+ }
157
+ }
158
+ }
159
+
160
+ yield* Effect.logInfo("init")
161
+
162
+ return {
163
+ formatters,
164
+ isEnabled,
165
+ formatFile,
166
+ }
167
+ }),
168
+ )
169
+
170
+ const init = Effect.fn("Format.init")(function* () {
171
+ yield* InstanceState.get(state)
172
+ })
173
+
174
+ const status = Effect.fn("Format.status")(function* () {
175
+ const { formatters, isEnabled } = yield* InstanceState.get(state)
176
+ const result: Status[] = []
177
+ for (const formatter of Object.values(formatters)) {
178
+ const isOn = yield* Effect.promise(() => isEnabled(formatter))
179
+ result.push({
180
+ name: formatter.name,
181
+ extensions: formatter.extensions,
182
+ enabled: isOn,
183
+ })
184
+ }
185
+ return result
186
+ })
187
+
188
+ const file = Effect.fn("Format.file")(function* (filepath: string) {
189
+ const { formatFile } = yield* InstanceState.get(state)
190
+ return yield* formatFile(filepath)
191
+ })
192
+
193
+ return Service.of({ init, status, file })
194
+ }),
195
+ )
196
+
197
+ export const node = LayerNode.make({
198
+ service: Service,
199
+ layer: layer,
200
+ deps: [Config.node, AppProcess.node, RuntimeFlags.node],
201
+ })
202
+
203
+ export * as Format from "."