openfork 1.17.14 → 1.17.15

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 (756) hide show
  1. package/AGENTS.md +131 -0
  2. package/Dockerfile +18 -0
  3. package/README.md +15 -0
  4. package/bin/opencode +199 -0
  5. package/bunfig.toml +7 -0
  6. package/git +0 -0
  7. package/migration/20260511173437_session-metadata/migration.sql +1 -0
  8. package/migration/20260511173437_session-metadata/snapshot.json +1500 -0
  9. package/package.json +155 -17
  10. package/parsers-config.ts +1 -0
  11. package/script/bench-search.ts +94 -0
  12. package/script/bench-test-suite.ts +52 -0
  13. package/script/build.ts +243 -0
  14. package/script/generate.ts +14 -0
  15. package/script/httpapi-exercise.ts +1 -0
  16. package/{postinstall.mjs → script/postinstall.mjs} +0 -0
  17. package/script/profile-test-files.ts +42 -0
  18. package/script/publish.ts +82 -0
  19. package/script/run-workspace-server +106 -0
  20. package/script/schema.ts +77 -0
  21. package/script/time.ts +6 -0
  22. package/script/trace-imports.ts +153 -0
  23. package/specs/effect/error-boundaries-plan.md +235 -0
  24. package/specs/effect/errors.md +207 -0
  25. package/specs/effect/facades.md +218 -0
  26. package/specs/effect/guide.md +247 -0
  27. package/specs/effect/instance-context.md +13 -0
  28. package/specs/effect/loose-ends.md +30 -0
  29. package/specs/effect/migration.md +62 -0
  30. package/specs/effect/routes.md +61 -0
  31. package/specs/effect/schema.md +88 -0
  32. package/specs/effect/server-package.md +58 -0
  33. package/specs/effect/todo.md +241 -0
  34. package/specs/effect/tools.md +88 -0
  35. package/specs/openapi-translation-cleanup.md +204 -0
  36. package/specs/tui-plugins.md +544 -0
  37. package/specs/v2/api.ts +67 -0
  38. package/specs/v2/message-shape.md +136 -0
  39. package/specs/v2/notifications.md +13 -0
  40. package/specs/v2/tui-command-shim.md +67 -0
  41. package/src/account/account.ts +461 -0
  42. package/src/account/repo.ts +171 -0
  43. package/src/account/schema.ts +99 -0
  44. package/src/account/url.ts +8 -0
  45. package/src/acp/agent.ts +95 -0
  46. package/src/acp/config-option.ts +203 -0
  47. package/src/acp/content.ts +269 -0
  48. package/src/acp/directory.ts +212 -0
  49. package/src/acp/error.ts +97 -0
  50. package/src/acp/event.ts +342 -0
  51. package/src/acp/permission.ts +254 -0
  52. package/src/acp/profile.ts +42 -0
  53. package/src/acp/service.ts +1097 -0
  54. package/src/acp/session.ts +232 -0
  55. package/src/acp/tool.ts +364 -0
  56. package/src/acp/usage.ts +239 -0
  57. package/src/agent/agent.ts +498 -0
  58. package/src/agent/generate.txt +75 -0
  59. package/src/agent/prompt/compaction.txt +9 -0
  60. package/src/agent/prompt/explore.txt +18 -0
  61. package/src/agent/prompt/goal.txt +36 -0
  62. package/src/agent/prompt/review.txt +31 -0
  63. package/src/agent/prompt/summary.txt +11 -0
  64. package/src/agent/prompt/title.txt +44 -0
  65. package/src/agent/subagent-permissions.ts +27 -0
  66. package/src/audio.d.ts +14 -0
  67. package/src/auth/index.ts +97 -0
  68. package/src/background/job.ts +37 -0
  69. package/src/bus/global.ts +22 -0
  70. package/src/cli/bootstrap.ts +11 -0
  71. package/src/cli/cmd/account.ts +264 -0
  72. package/src/cli/cmd/acp.ts +73 -0
  73. package/src/cli/cmd/agent.ts +259 -0
  74. package/src/cli/cmd/attach.ts +148 -0
  75. package/src/cli/cmd/cmd.ts +7 -0
  76. package/src/cli/cmd/db.ts +62 -0
  77. package/src/cli/cmd/debug/agent.handler.ts +193 -0
  78. package/src/cli/cmd/debug/agent.ts +27 -0
  79. package/src/cli/cmd/debug/config.ts +14 -0
  80. package/src/cli/cmd/debug/file.ts +73 -0
  81. package/src/cli/cmd/debug/index.ts +87 -0
  82. package/src/cli/cmd/debug/lsp.ts +50 -0
  83. package/src/cli/cmd/debug/ripgrep.ts +79 -0
  84. package/src/cli/cmd/debug/scrap.ts +16 -0
  85. package/src/cli/cmd/debug/skill.ts +15 -0
  86. package/src/cli/cmd/debug/snapshot.ts +50 -0
  87. package/src/cli/cmd/debug/startup.ts +11 -0
  88. package/src/cli/cmd/debug/v2.ts +42 -0
  89. package/src/cli/cmd/export.ts +292 -0
  90. package/src/cli/cmd/generate.ts +54 -0
  91. package/src/cli/cmd/github.handler.ts +1593 -0
  92. package/src/cli/cmd/github.shared.ts +30 -0
  93. package/src/cli/cmd/github.ts +42 -0
  94. package/src/cli/cmd/import.ts +224 -0
  95. package/src/cli/cmd/mcp.ts +840 -0
  96. package/src/cli/cmd/models.ts +66 -0
  97. package/src/cli/cmd/plug.ts +230 -0
  98. package/src/cli/cmd/pr.ts +115 -0
  99. package/src/cli/cmd/prompt-display.ts +1 -0
  100. package/src/cli/cmd/providers.ts +534 -0
  101. package/src/cli/cmd/run/demo.ts +1274 -0
  102. package/src/cli/cmd/run/entry.body.ts +205 -0
  103. package/src/cli/cmd/run/footer.command.tsx +1064 -0
  104. package/src/cli/cmd/run/footer.menu.tsx +351 -0
  105. package/src/cli/cmd/run/footer.permission.tsx +472 -0
  106. package/src/cli/cmd/run/footer.prompt.tsx +1306 -0
  107. package/src/cli/cmd/run/footer.question.tsx +573 -0
  108. package/src/cli/cmd/run/footer.subagent.tsx +175 -0
  109. package/src/cli/cmd/run/footer.ts +1129 -0
  110. package/src/cli/cmd/run/footer.view.tsx +945 -0
  111. package/src/cli/cmd/run/footer.width.ts +27 -0
  112. package/src/cli/cmd/run/permission.shared.ts +256 -0
  113. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  114. package/src/cli/cmd/run/prompt.shared.ts +153 -0
  115. package/src/cli/cmd/run/question.shared.ts +340 -0
  116. package/src/cli/cmd/run/runtime.boot.ts +202 -0
  117. package/src/cli/cmd/run/runtime.lifecycle.ts +406 -0
  118. package/src/cli/cmd/run/runtime.queue.ts +349 -0
  119. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  120. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  121. package/src/cli/cmd/run/runtime.ts +814 -0
  122. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  123. package/src/cli/cmd/run/scrollback.surface.ts +431 -0
  124. package/src/cli/cmd/run/scrollback.writer.tsx +352 -0
  125. package/src/cli/cmd/run/session-data.ts +1113 -0
  126. package/src/cli/cmd/run/session-replay.ts +374 -0
  127. package/src/cli/cmd/run/session.shared.ts +196 -0
  128. package/src/cli/cmd/run/splash.ts +280 -0
  129. package/src/cli/cmd/run/stream.transport.ts +1462 -0
  130. package/src/cli/cmd/run/stream.ts +175 -0
  131. package/src/cli/cmd/run/subagent-data.ts +876 -0
  132. package/src/cli/cmd/run/theme.ts +690 -0
  133. package/src/cli/cmd/run/tool.ts +1953 -0
  134. package/src/cli/cmd/run/trace.ts +94 -0
  135. package/src/cli/cmd/run/turn-summary.ts +47 -0
  136. package/src/cli/cmd/run/types.ts +350 -0
  137. package/src/cli/cmd/run/variant.shared.ts +216 -0
  138. package/src/cli/cmd/run.ts +1011 -0
  139. package/src/cli/cmd/serve.ts +24 -0
  140. package/src/cli/cmd/session.ts +147 -0
  141. package/src/cli/cmd/stats.ts +393 -0
  142. package/src/cli/cmd/tui.ts +305 -0
  143. package/src/cli/cmd/uninstall.ts +353 -0
  144. package/src/cli/cmd/upgrade.ts +74 -0
  145. package/src/cli/cmd/web.ts +84 -0
  146. package/src/cli/effect/prompt.ts +37 -0
  147. package/src/cli/effect-cmd.ts +96 -0
  148. package/src/cli/error.ts +130 -0
  149. package/src/cli/heap.ts +45 -0
  150. package/src/cli/logo.ts +1 -0
  151. package/src/cli/network.ts +80 -0
  152. package/src/cli/tui/layer.ts +8 -0
  153. package/src/cli/tui/validate-session.ts +29 -0
  154. package/src/cli/tui/worker.ts +80 -0
  155. package/src/cli/ui.ts +132 -0
  156. package/src/cli/upgrade.ts +53 -0
  157. package/src/command/index.ts +177 -0
  158. package/src/command/template/initialize.txt +66 -0
  159. package/src/command/template/review.txt +101 -0
  160. package/src/config/agent.ts +59 -0
  161. package/src/config/command.ts +39 -0
  162. package/src/config/config.ts +680 -0
  163. package/src/config/entry-name.ts +19 -0
  164. package/src/config/managed.ts +69 -0
  165. package/src/config/markdown.ts +36 -0
  166. package/src/config/parse.ts +79 -0
  167. package/src/config/paths.ts +45 -0
  168. package/src/config/plugin.ts +79 -0
  169. package/src/config/tui-cwd.ts +5 -0
  170. package/src/config/tui-host-attention.ts +21 -0
  171. package/src/config/tui-migrate.ts +132 -0
  172. package/src/config/tui.ts +276 -0
  173. package/src/config/variable.ts +91 -0
  174. package/src/control-plane/adapters/index.ts +41 -0
  175. package/src/control-plane/adapters/worktree.ts +96 -0
  176. package/src/control-plane/dev/README.md +19 -0
  177. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  178. package/src/control-plane/types.ts +59 -0
  179. package/src/control-plane/util.ts +39 -0
  180. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  181. package/src/control-plane/workspace-context.ts +26 -0
  182. package/src/control-plane/workspace.ts +964 -0
  183. package/src/effect/app-node-builder-v1.ts +12 -0
  184. package/src/effect/app-runtime.ts +135 -0
  185. package/src/effect/bootstrap-runtime.ts +19 -0
  186. package/src/effect/bridge.ts +84 -0
  187. package/src/effect/config-service.ts +67 -0
  188. package/src/effect/instance-ref.ts +11 -0
  189. package/src/effect/instance-registry.ts +12 -0
  190. package/src/effect/instance-state.ts +69 -0
  191. package/src/effect/promise.ts +17 -0
  192. package/src/effect/run-service.ts +47 -0
  193. package/src/effect/runner.ts +217 -0
  194. package/src/effect/runtime-flags.ts +78 -0
  195. package/src/env/index.ts +41 -0
  196. package/src/event-manifest.ts +3 -0
  197. package/src/event-v2-bridge.ts +71 -0
  198. package/src/format/formatter.ts +404 -0
  199. package/src/format/index.ts +203 -0
  200. package/src/git/index.ts +348 -0
  201. package/src/id/id.ts +80 -0
  202. package/src/ide/index.ts +54 -0
  203. package/src/image/image.ts +172 -0
  204. package/src/index.ts +142 -0
  205. package/src/installation/index.ts +336 -0
  206. package/src/lsp/client.ts +650 -0
  207. package/src/lsp/diagnostic.ts +29 -0
  208. package/src/lsp/language.ts +121 -0
  209. package/src/lsp/launch.ts +21 -0
  210. package/src/lsp/lsp.ts +507 -0
  211. package/src/lsp/server.ts +1983 -0
  212. package/src/markdown.d.ts +4 -0
  213. package/src/mcp/auth.ts +163 -0
  214. package/src/mcp/catalog.ts +170 -0
  215. package/src/mcp/index.ts +1018 -0
  216. package/src/mcp/oauth-callback.ts +194 -0
  217. package/src/mcp/oauth-provider.ts +259 -0
  218. package/src/node.ts +4 -0
  219. package/src/patch/index.ts +686 -0
  220. package/src/permission/arity.ts +163 -0
  221. package/src/permission/evaluate.ts +1 -0
  222. package/src/permission/index.ts +223 -0
  223. package/src/plugin/azure.ts +26 -0
  224. package/src/plugin/cloudflare.ts +76 -0
  225. package/src/plugin/digitalocean.ts +325 -0
  226. package/src/plugin/github-copilot/copilot.ts +414 -0
  227. package/src/plugin/github-copilot/models.ts +258 -0
  228. package/src/plugin/index.ts +314 -0
  229. package/src/plugin/install.ts +439 -0
  230. package/src/plugin/loader.ts +237 -0
  231. package/src/plugin/meta.ts +188 -0
  232. package/src/plugin/openai/README.md +31 -0
  233. package/src/plugin/openai/codex.ts +556 -0
  234. package/src/plugin/openai/ws-pool.ts +270 -0
  235. package/src/plugin/openai/ws.ts +381 -0
  236. package/src/plugin/pty-environment.ts +24 -0
  237. package/src/plugin/shared.ts +323 -0
  238. package/src/plugin/snowflake-cortex.ts +507 -0
  239. package/src/plugin/tui/internal.ts +10 -0
  240. package/src/plugin/tui/runtime.ts +1131 -0
  241. package/src/plugin/xai.ts +626 -0
  242. package/src/project/bootstrap-service.ts +9 -0
  243. package/src/project/bootstrap.ts +58 -0
  244. package/src/project/instance-context.ts +24 -0
  245. package/src/project/instance-runtime.ts +16 -0
  246. package/src/project/instance-store.ts +213 -0
  247. package/src/project/project.ts +483 -0
  248. package/src/project/vcs.ts +423 -0
  249. package/src/provider/auth.ts +229 -0
  250. package/src/provider/error.ts +188 -0
  251. package/src/provider/model-status.ts +8 -0
  252. package/src/provider/provider.ts +1981 -0
  253. package/src/provider/transform.ts +1561 -0
  254. package/src/question/index.ts +161 -0
  255. package/src/question/schema.ts +4 -0
  256. package/src/server/auth.ts +48 -0
  257. package/src/server/event.ts +10 -0
  258. package/src/server/global-lifecycle.ts +28 -0
  259. package/src/server/init-projectors.ts +3 -0
  260. package/src/server/mdns.ts +47 -0
  261. package/src/server/projectors.ts +1 -0
  262. package/src/server/proxy-util.ts +48 -0
  263. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  264. package/src/server/routes/instance/httpapi/api.ts +97 -0
  265. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  266. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  267. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  268. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  269. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  270. package/src/server/routes/instance/httpapi/groups/experimental.ts +275 -0
  271. package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
  272. package/src/server/routes/instance/httpapi/groups/global.ts +136 -0
  273. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  274. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  275. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  276. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  277. package/src/server/routes/instance/httpapi/groups/project-copy.ts +32 -0
  278. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  279. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  280. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  281. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  282. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  283. package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
  284. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  285. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  286. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  287. package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
  288. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  289. package/src/server/routes/instance/httpapi/handlers/control.ts +43 -0
  290. package/src/server/routes/instance/httpapi/handlers/event.ts +99 -0
  291. package/src/server/routes/instance/httpapi/handlers/experimental.ts +193 -0
  292. package/src/server/routes/instance/httpapi/handlers/file.ts +139 -0
  293. package/src/server/routes/instance/httpapi/handlers/global.ts +156 -0
  294. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  295. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  296. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  297. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +83 -0
  298. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  299. package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
  300. package/src/server/routes/instance/httpapi/handlers/pty.ts +273 -0
  301. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  302. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
  303. package/src/server/routes/instance/httpapi/handlers/session.ts +442 -0
  304. package/src/server/routes/instance/httpapi/handlers/sync.ts +89 -0
  305. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  306. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  307. package/src/server/routes/instance/httpapi/lifecycle.ts +54 -0
  308. package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
  309. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  310. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  311. package/src/server/routes/instance/httpapi/middleware/error.ts +43 -0
  312. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  313. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  314. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  315. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +41 -0
  316. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  317. package/src/server/routes/instance/httpapi/public.ts +537 -0
  318. package/src/server/routes/instance/httpapi/server.ts +325 -0
  319. package/src/server/routes/instance/httpapi/websocket-tracker.ts +60 -0
  320. package/src/server/server.ts +226 -0
  321. package/src/server/shared/fence.ts +60 -0
  322. package/src/server/shared/pty-ticket.ts +15 -0
  323. package/src/server/shared/public-ui.ts +12 -0
  324. package/src/server/shared/tui-control.ts +28 -0
  325. package/src/server/shared/ui.ts +108 -0
  326. package/src/server/shared/workspace-routing.ts +38 -0
  327. package/src/server/tui-event.ts +1 -0
  328. package/src/session/compaction.ts +562 -0
  329. package/src/session/instruction.ts +237 -0
  330. package/src/session/llm/AGENTS.md +90 -0
  331. package/src/session/llm/ai-sdk.ts +288 -0
  332. package/src/session/llm/native-request.ts +196 -0
  333. package/src/session/llm/native-runtime.ts +195 -0
  334. package/src/session/llm/request.ts +226 -0
  335. package/src/session/llm.ts +404 -0
  336. package/src/session/message-error.ts +14 -0
  337. package/src/session/message-v2.ts +734 -0
  338. package/src/session/message.ts +148 -0
  339. package/src/session/overflow.ts +34 -0
  340. package/src/session/processor.ts +718 -0
  341. package/src/session/prompt/anthropic.txt +105 -0
  342. package/src/session/prompt/beast.txt +147 -0
  343. package/src/session/prompt/build-switch.txt +5 -0
  344. package/src/session/prompt/codex.txt +79 -0
  345. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  346. package/src/session/prompt/default.txt +95 -0
  347. package/src/session/prompt/gemini.txt +155 -0
  348. package/src/session/prompt/gpt.txt +107 -0
  349. package/src/session/prompt/kimi.txt +95 -0
  350. package/src/session/prompt/plan-mode.txt +70 -0
  351. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  352. package/src/session/prompt/plan.txt +26 -0
  353. package/src/session/prompt/trinity.txt +97 -0
  354. package/src/session/prompt.ts +1631 -0
  355. package/src/session/reminders.ts +92 -0
  356. package/src/session/retry.ts +201 -0
  357. package/src/session/revert.ts +146 -0
  358. package/src/session/run-state.ts +151 -0
  359. package/src/session/schema.ts +26 -0
  360. package/src/session/session.ts +1018 -0
  361. package/src/session/status.ts +56 -0
  362. package/src/session/summary.ts +160 -0
  363. package/src/session/system.ts +143 -0
  364. package/src/session/todo.ts +74 -0
  365. package/src/session/tools.ts +590 -0
  366. package/src/share/session.ts +58 -0
  367. package/src/share/share-next.ts +371 -0
  368. package/src/skill/discovery.ts +140 -0
  369. package/src/skill/index.ts +354 -0
  370. package/src/snapshot/index.ts +807 -0
  371. package/src/sql.d.ts +4 -0
  372. package/src/storage/schema.ts +5 -0
  373. package/src/storage/storage.ts +327 -0
  374. package/src/sync/README.md +179 -0
  375. package/src/sync/schema.ts +11 -0
  376. package/src/temporary.ts +31 -0
  377. package/src/tool/apply_patch.ts +313 -0
  378. package/src/tool/apply_patch.txt +33 -0
  379. package/src/tool/code-mode.ts +324 -0
  380. package/src/tool/edit.ts +737 -0
  381. package/src/tool/edit.txt +10 -0
  382. package/src/tool/external-directory.ts +49 -0
  383. package/src/tool/glob.ts +76 -0
  384. package/src/tool/glob.txt +6 -0
  385. package/src/tool/grep.ts +112 -0
  386. package/src/tool/grep.txt +8 -0
  387. package/src/tool/invalid.ts +21 -0
  388. package/src/tool/json-schema.ts +164 -0
  389. package/src/tool/lsp.ts +113 -0
  390. package/src/tool/lsp.txt +24 -0
  391. package/src/tool/mcp-websearch.ts +96 -0
  392. package/src/tool/plan-enter.txt +14 -0
  393. package/src/tool/plan-exit.txt +13 -0
  394. package/src/tool/plan.ts +79 -0
  395. package/src/tool/question.ts +44 -0
  396. package/src/tool/question.txt +10 -0
  397. package/src/tool/read.ts +386 -0
  398. package/src/tool/read.txt +14 -0
  399. package/src/tool/registry.ts +450 -0
  400. package/src/tool/schema.ts +14 -0
  401. package/src/tool/shell/id.ts +19 -0
  402. package/src/tool/shell/prompt.ts +293 -0
  403. package/src/tool/shell/shell.txt +21 -0
  404. package/src/tool/shell.ts +645 -0
  405. package/src/tool/skill.ts +70 -0
  406. package/src/tool/skill.txt +5 -0
  407. package/src/tool/task.ts +346 -0
  408. package/src/tool/task.txt +37 -0
  409. package/src/tool/todo.ts +46 -0
  410. package/src/tool/todowrite.txt +44 -0
  411. package/src/tool/tool.ts +183 -0
  412. package/src/tool/truncate.ts +156 -0
  413. package/src/tool/truncation-dir.ts +4 -0
  414. package/src/tool/webfetch.ts +192 -0
  415. package/src/tool/webfetch.txt +13 -0
  416. package/src/tool/websearch.ts +143 -0
  417. package/src/tool/websearch.txt +14 -0
  418. package/src/tool/write.ts +104 -0
  419. package/src/tool/write.txt +8 -0
  420. package/src/util/archive.ts +17 -0
  421. package/src/util/bom.ts +27 -0
  422. package/src/util/data-url.ts +9 -0
  423. package/src/util/defer.ts +10 -0
  424. package/src/util/effect-http-client.ts +11 -0
  425. package/src/util/error.ts +1 -0
  426. package/src/util/filesystem.ts +251 -0
  427. package/src/util/html.ts +8 -0
  428. package/src/util/iife.ts +3 -0
  429. package/src/util/lazy.ts +20 -0
  430. package/src/util/local-context.ts +25 -0
  431. package/src/util/locale.ts +2 -0
  432. package/src/util/media.ts +26 -0
  433. package/src/util/process.ts +177 -0
  434. package/src/util/proxy-env.ts +72 -0
  435. package/src/util/queue.ts +32 -0
  436. package/src/util/record.ts +1 -0
  437. package/src/util/repository.ts +232 -0
  438. package/src/util/rpc.ts +66 -0
  439. package/src/util/signal.ts +12 -0
  440. package/src/util/timeout.ts +13 -0
  441. package/src/util/token.ts +1 -0
  442. package/src/util/wildcard.ts +59 -0
  443. package/src/worktree/index.ts +623 -0
  444. package/test/AGENTS.md +204 -0
  445. package/test/EFFECT_TEST_MIGRATION.md +169 -0
  446. package/test/account/repo.test.ts +355 -0
  447. package/test/account/service.test.ts +456 -0
  448. package/test/acp/config-option.test.ts +229 -0
  449. package/test/acp/content.test.ts +235 -0
  450. package/test/acp/directory.test.ts +188 -0
  451. package/test/acp/error.test.ts +67 -0
  452. package/test/acp/event.test.ts +751 -0
  453. package/test/acp/permission.test.ts +401 -0
  454. package/test/acp/service-session.test.ts +1248 -0
  455. package/test/acp/session.test.ts +201 -0
  456. package/test/acp/tool.test.ts +298 -0
  457. package/test/acp/usage.test.ts +318 -0
  458. package/test/agent/agent.test.ts +755 -0
  459. package/test/agent/plan-mode-subagent-bypass.test.ts +160 -0
  460. package/test/agent/plugin-agent-regression.test.ts +51 -0
  461. package/test/auth/auth.test.ts +75 -0
  462. package/test/background/job.test.ts +244 -0
  463. package/test/cli/account.test.ts +30 -0
  464. package/test/cli/acp/acp-test-client.ts +97 -0
  465. package/test/cli/acp/config-options.test.ts +103 -0
  466. package/test/cli/acp/helpers.ts +96 -0
  467. package/test/cli/acp/initialize-auth.test.ts +61 -0
  468. package/test/cli/acp/lifecycle.test.ts +118 -0
  469. package/test/cli/acp/prompt-content.test.ts +97 -0
  470. package/test/cli/acp/skills.test.ts +38 -0
  471. package/test/cli/cmd/tui/attention.test.ts +484 -0
  472. package/test/cli/effect-cmd-instance-als.test.ts +40 -0
  473. package/test/cli/error.test.ts +95 -0
  474. package/test/cli/github-action.test.ts +199 -0
  475. package/test/cli/github-remote.test.ts +90 -0
  476. package/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +623 -0
  477. package/test/cli/help/help-snapshots.test.ts +140 -0
  478. package/test/cli/import.test.ts +54 -0
  479. package/test/cli/mcp-add.test.ts +74 -0
  480. package/test/cli/plugin-auth-picker.test.ts +120 -0
  481. package/test/cli/run/entry.body.test.ts +536 -0
  482. package/test/cli/run/footer.menu.test.ts +43 -0
  483. package/test/cli/run/footer.view.test.tsx +1375 -0
  484. package/test/cli/run/footer.width.test.ts +35 -0
  485. package/test/cli/run/permission.shared.test.ts +144 -0
  486. package/test/cli/run/prompt.editor.test.ts +101 -0
  487. package/test/cli/run/prompt.shared.test.ts +101 -0
  488. package/test/cli/run/question.shared.test.ts +115 -0
  489. package/test/cli/run/run-process.test.ts +331 -0
  490. package/test/cli/run/runtime.boot.test.ts +283 -0
  491. package/test/cli/run/runtime.queue.test.ts +481 -0
  492. package/test/cli/run/runtime.stdin.test.ts +71 -0
  493. package/test/cli/run/runtime.test.ts +238 -0
  494. package/test/cli/run/scrollback.surface.test.ts +1092 -0
  495. package/test/cli/run/session-data.test.ts +593 -0
  496. package/test/cli/run/session-replay.test.ts +691 -0
  497. package/test/cli/run/session.shared.test.ts +247 -0
  498. package/test/cli/run/stream.test.ts +56 -0
  499. package/test/cli/run/stream.transport.test.ts +2363 -0
  500. package/test/cli/run/subagent-data.test.ts +547 -0
  501. package/test/cli/run/theme.test.ts +177 -0
  502. package/test/cli/run/variant.shared.test.ts +218 -0
  503. package/test/cli/serve/serve-process.test.ts +61 -0
  504. package/test/cli/smokes/read-only.test.ts +115 -0
  505. package/test/cli/tui/attach.test.ts +11 -0
  506. package/test/cli/tui/editor-context-zed.test.ts +379 -0
  507. package/test/cli/tui/editor-context.test.tsx +297 -0
  508. package/test/cli/tui/plugin-add.test.ts +110 -0
  509. package/test/cli/tui/plugin-install.test.ts +87 -0
  510. package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
  511. package/test/cli/tui/plugin-loader-entrypoint.test.ts +485 -0
  512. package/test/cli/tui/plugin-loader-pure.test.ts +72 -0
  513. package/test/cli/tui/plugin-loader.test.ts +1332 -0
  514. package/test/cli/tui/plugin-toggle.test.ts +264 -0
  515. package/test/cli/tui/thread.test.ts +95 -0
  516. package/test/config/agent-color.test.ts +47 -0
  517. package/test/config/config.test.ts +2027 -0
  518. package/test/config/entry-name.test.ts +57 -0
  519. package/test/config/fixtures/empty-frontmatter.md +4 -0
  520. package/test/config/fixtures/frontmatter.md +28 -0
  521. package/test/config/fixtures/markdown-header.md +11 -0
  522. package/test/config/fixtures/no-frontmatter.md +1 -0
  523. package/test/config/fixtures/weird-model-id.md +13 -0
  524. package/test/config/lsp.test.ts +69 -0
  525. package/test/config/markdown.test.ts +228 -0
  526. package/test/config/plugin.test.ts +0 -0
  527. package/test/config/tui.test.ts +894 -0
  528. package/test/control-plane/adapters.test.ts +71 -0
  529. package/test/control-plane/workspace.test.ts +1701 -0
  530. package/test/effect/app-runtime-logger.test.ts +101 -0
  531. package/test/effect/config-service.test.ts +65 -0
  532. package/test/effect/instance-state.test.ts +392 -0
  533. package/test/effect/run-service.test.ts +89 -0
  534. package/test/effect/runner.test.ts +514 -0
  535. package/test/effect/runtime-flags.test.ts +374 -0
  536. package/test/event-manifest.test.ts +24 -0
  537. package/test/fake/account.ts +9 -0
  538. package/test/fake/auth.ts +8 -0
  539. package/test/fake/npm.ts +8 -0
  540. package/test/fake/provider.ts +82 -0
  541. package/test/fake/skill.ts +8 -0
  542. package/test/filesystem/filesystem.test.ts +318 -0
  543. package/test/fixture/agent-plugin.constants.ts +6 -0
  544. package/test/fixture/agent-plugin.ts +12 -0
  545. package/test/fixture/config.ts +23 -0
  546. package/test/fixture/db.ts +11 -0
  547. package/test/fixture/fixture.test.ts +26 -0
  548. package/test/fixture/fixture.ts +228 -0
  549. package/test/fixture/flag.ts +20 -0
  550. package/test/fixture/flock-worker.ts +72 -0
  551. package/test/fixture/lsp/fake-lsp-server.js +249 -0
  552. package/test/fixture/mcp-session-recovery.ts +50 -0
  553. package/test/fixture/plug-worker.ts +93 -0
  554. package/test/fixture/plugin-meta-worker.ts +19 -0
  555. package/test/fixture/plugin.ts +10 -0
  556. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  557. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  558. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  559. package/test/fixture/skills/index.json +6 -0
  560. package/test/fixture/tui-environment.tsx +32 -0
  561. package/test/fixture/tui-plugin.ts +355 -0
  562. package/test/fixture/tui-runtime.ts +56 -0
  563. package/test/fixture/tui-sdk.ts +82 -0
  564. package/test/fixture/workspace.ts +34 -0
  565. package/test/fixtures/recordings/session/native-anthropic-tool-loop.json +49 -0
  566. package/test/fixtures/recordings/session/native-openai-oauth-tool-loop.json +45 -0
  567. package/test/fixtures/recordings/session/native-zen-tool-loop.json +49 -0
  568. package/test/format/format.test.ts +235 -0
  569. package/test/git/git.test.ts +179 -0
  570. package/test/ide/ide.test.ts +82 -0
  571. package/test/image/fixtures/picture-5mb-base64.png +0 -0
  572. package/test/image/image.test.ts +121 -0
  573. package/test/installation/installation.test.ts +240 -0
  574. package/test/lib/cli-process.ts +535 -0
  575. package/test/lib/effect.ts +177 -0
  576. package/test/lib/filesystem.ts +10 -0
  577. package/test/lib/llm-server.ts +779 -0
  578. package/test/lib/snapshot.ts +73 -0
  579. package/test/lib/test-provider.ts +37 -0
  580. package/test/lib/websocket.ts +46 -0
  581. package/test/lsp/client.test.ts +488 -0
  582. package/test/lsp/index.test.ts +231 -0
  583. package/test/lsp/jdtls-root.test.ts +459 -0
  584. package/test/lsp/launch.test.ts +22 -0
  585. package/test/lsp/lifecycle.test.ts +160 -0
  586. package/test/mcp/auth.test.ts +78 -0
  587. package/test/mcp/catalog.test.ts +47 -0
  588. package/test/mcp/headers.test.ts +127 -0
  589. package/test/mcp/lifecycle.test.ts +1304 -0
  590. package/test/mcp/oauth-auto-connect.test.ts +367 -0
  591. package/test/mcp/oauth-browser.test.ts +243 -0
  592. package/test/mcp/oauth-callback.test.ts +114 -0
  593. package/test/mcp/oauth-provider.test.ts +102 -0
  594. package/test/mcp/session-recovery.test.ts +27 -0
  595. package/test/patch/patch.test.ts +384 -0
  596. package/test/permission/arity.test.ts +33 -0
  597. package/test/permission/next.test.ts +1174 -0
  598. package/test/permission-task.test.ts +319 -0
  599. package/test/plugin/auth-override.test.ts +101 -0
  600. package/test/plugin/cloudflare.test.ts +68 -0
  601. package/test/plugin/codex.test.ts +256 -0
  602. package/test/plugin/github-copilot-models.test.ts +370 -0
  603. package/test/plugin/install-concurrency.test.ts +140 -0
  604. package/test/plugin/install.test.ts +570 -0
  605. package/test/plugin/loader-shared.test.ts +1306 -0
  606. package/test/plugin/meta.test.ts +137 -0
  607. package/test/plugin/openai-rollout.test.ts +17 -0
  608. package/test/plugin/openai-ws.test.ts +884 -0
  609. package/test/plugin/shared.test.ts +88 -0
  610. package/test/plugin/snowflake-cortex.test.ts +278 -0
  611. package/test/plugin/trigger.test.ts +108 -0
  612. package/test/plugin/workspace-adapter.test.ts +111 -0
  613. package/test/plugin/xai.test.ts +620 -0
  614. package/test/preload.ts +92 -0
  615. package/test/project/instance-bootstrap.test.ts +115 -0
  616. package/test/project/instance.test.ts +248 -0
  617. package/test/project/migrate-global.test.ts +168 -0
  618. package/test/project/project-directory.test.ts +202 -0
  619. package/test/project/project.test.ts +808 -0
  620. package/test/project/vcs.test.ts +335 -0
  621. package/test/project/worktree-remove.test.ts +128 -0
  622. package/test/project/worktree.test.ts +324 -0
  623. package/test/provider/amazon-bedrock.test.ts +361 -0
  624. package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
  625. package/test/provider/digitalocean.test.ts +124 -0
  626. package/test/provider/gitlab-duo.test.ts +412 -0
  627. package/test/provider/header-timeout.test.ts +234 -0
  628. package/test/provider/model-status.test.ts +61 -0
  629. package/test/provider/provider.test.ts +1912 -0
  630. package/test/provider/transform.test.ts +4742 -0
  631. package/test/question/question.test.ts +459 -0
  632. package/test/server/AGENTS.md +15 -0
  633. package/test/server/auth.test.ts +59 -0
  634. package/test/server/global-bus.ts +31 -0
  635. package/test/server/global-session-list.test.ts +108 -0
  636. package/test/server/httpapi-authorization.test.ts +174 -0
  637. package/test/server/httpapi-compression.test.ts +151 -0
  638. package/test/server/httpapi-config.test.ts +110 -0
  639. package/test/server/httpapi-control-plane.test.ts +63 -0
  640. package/test/server/httpapi-cors-vary.test.ts +63 -0
  641. package/test/server/httpapi-cors.test.ts +122 -0
  642. package/test/server/httpapi-error-middleware.test.ts +101 -0
  643. package/test/server/httpapi-event.test.ts +94 -0
  644. package/test/server/httpapi-exercise/assertions.ts +64 -0
  645. package/test/server/httpapi-exercise/backend.ts +144 -0
  646. package/test/server/httpapi-exercise/dsl.ts +210 -0
  647. package/test/server/httpapi-exercise/environment.ts +40 -0
  648. package/test/server/httpapi-exercise/index.ts +1802 -0
  649. package/test/server/httpapi-exercise/report.ts +66 -0
  650. package/test/server/httpapi-exercise/routing.ts +96 -0
  651. package/test/server/httpapi-exercise/runner.ts +267 -0
  652. package/test/server/httpapi-exercise/runtime.ts +52 -0
  653. package/test/server/httpapi-exercise/types.ts +127 -0
  654. package/test/server/httpapi-experimental.test.ts +298 -0
  655. package/test/server/httpapi-file.test.ts +83 -0
  656. package/test/server/httpapi-global.test.ts +66 -0
  657. package/test/server/httpapi-instance-context.test.ts +337 -0
  658. package/test/server/httpapi-instance-route-auth.test.ts +81 -0
  659. package/test/server/httpapi-instance.test.ts +265 -0
  660. package/test/server/httpapi-layer.ts +33 -0
  661. package/test/server/httpapi-listen.test.ts +465 -0
  662. package/test/server/httpapi-mcp-oauth.test.ts +73 -0
  663. package/test/server/httpapi-mcp.test.ts +223 -0
  664. package/test/server/httpapi-mdns.test.ts +79 -0
  665. package/test/server/httpapi-promptasync-context.test.ts +212 -0
  666. package/test/server/httpapi-provider.test.ts +401 -0
  667. package/test/server/httpapi-pty.test.ts +299 -0
  668. package/test/server/httpapi-public-openapi.test.ts +350 -0
  669. package/test/server/httpapi-query-schema-drift.test.ts +330 -0
  670. package/test/server/httpapi-reference.test.ts +63 -0
  671. package/test/server/httpapi-schema-error-body.test.ts +166 -0
  672. package/test/server/httpapi-sdk.test.ts +913 -0
  673. package/test/server/httpapi-session.test.ts +1090 -0
  674. package/test/server/httpapi-sync.test.ts +149 -0
  675. package/test/server/httpapi-ui.test.ts +456 -0
  676. package/test/server/httpapi-v2-location.test.ts +126 -0
  677. package/test/server/httpapi-v2-pty.test.ts +250 -0
  678. package/test/server/httpapi-workspace-routing.test.ts +552 -0
  679. package/test/server/httpapi-workspace.test.ts +506 -0
  680. package/test/server/negative-tokens-regression.test.ts +84 -0
  681. package/test/server/project-copy.test.ts +127 -0
  682. package/test/server/project-init-git.test.ts +118 -0
  683. package/test/server/proxy-util.test.ts +113 -0
  684. package/test/server/sdk-error-shape.test.ts +81 -0
  685. package/test/server/sdk-v1-smoke.test.ts +57 -0
  686. package/test/server/session-actions.test.ts +110 -0
  687. package/test/server/session-diff-missing-patch.test.ts +97 -0
  688. package/test/server/session-list.test.ts +302 -0
  689. package/test/server/session-messages.test.ts +180 -0
  690. package/test/server/session-select.test.ts +67 -0
  691. package/test/server/workspace-proxy.test.ts +181 -0
  692. package/test/server/workspace-routing.test.ts +94 -0
  693. package/test/server/worktree-endpoint-repro.test.ts +307 -0
  694. package/test/session/compaction.test.ts +1819 -0
  695. package/test/session/instruction.test.ts +264 -0
  696. package/test/session/llm-native-recorded.test.ts +413 -0
  697. package/test/session/llm-native.test.ts +761 -0
  698. package/test/session/llm.test.ts +2003 -0
  699. package/test/session/message-v2.test.ts +1661 -0
  700. package/test/session/messages-pagination.test.ts +1057 -0
  701. package/test/session/processor-effect.test.ts +1067 -0
  702. package/test/session/prompt.test.ts +2402 -0
  703. package/test/session/retry.test.ts +440 -0
  704. package/test/session/revert-compact.test.ts +638 -0
  705. package/test/session/schema-decoding.test.ts +313 -0
  706. package/test/session/session-schema.test.ts +78 -0
  707. package/test/session/session.test.ts +253 -0
  708. package/test/session/snapshot-tool-race.test.ts +189 -0
  709. package/test/session/structured-output-integration.test.ts +235 -0
  710. package/test/session/structured-output.test.ts +387 -0
  711. package/test/session/system.test.ts +142 -0
  712. package/test/share/share-next.test.ts +324 -0
  713. package/test/skill/discovery.test.ts +186 -0
  714. package/test/skill/skill.test.ts +585 -0
  715. package/test/snapshot/snapshot.test.ts +1218 -0
  716. package/test/storage/storage.test.ts +297 -0
  717. package/test/tool/__snapshots__/parameters.test.ts.snap +466 -0
  718. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  719. package/test/tool/apply_patch.test.ts +529 -0
  720. package/test/tool/code-mode-integration.test.ts +329 -0
  721. package/test/tool/code-mode.test.ts +714 -0
  722. package/test/tool/edit.test.ts +574 -0
  723. package/test/tool/external-directory.test.ts +156 -0
  724. package/test/tool/fixtures/large-image.png +0 -0
  725. package/test/tool/fixtures/models-api.json +117299 -0
  726. package/test/tool/glob.test.ts +132 -0
  727. package/test/tool/grep.test.ts +221 -0
  728. package/test/tool/lsp.test.ts +184 -0
  729. package/test/tool/parameters.test.ts +290 -0
  730. package/test/tool/question.test.ts +133 -0
  731. package/test/tool/read.test.ts +608 -0
  732. package/test/tool/registry.test.ts +572 -0
  733. package/test/tool/shell.test.ts +1199 -0
  734. package/test/tool/skill.test.ts +134 -0
  735. package/test/tool/task.test.ts +905 -0
  736. package/test/tool/tool-define.test.ts +154 -0
  737. package/test/tool/truncation.test.ts +264 -0
  738. package/test/tool/webfetch.test.ts +119 -0
  739. package/test/tool/websearch.test.ts +99 -0
  740. package/test/tool/write.test.ts +279 -0
  741. package/test/util/data-url.test.ts +14 -0
  742. package/test/util/error.test.ts +16 -0
  743. package/test/util/filesystem.test.ts +656 -0
  744. package/test/util/glob.test.ts +164 -0
  745. package/test/util/html.test.ts +15 -0
  746. package/test/util/iife.test.ts +36 -0
  747. package/test/util/lazy.test.ts +50 -0
  748. package/test/util/module.test.ts +59 -0
  749. package/test/util/process.test.ts +128 -0
  750. package/test/util/repository.test.ts +93 -0
  751. package/test/util/timeout.test.ts +21 -0
  752. package/test/util/wildcard.test.ts +90 -0
  753. package/test/v2/session-message-updater.test.ts +269 -0
  754. package/tsconfig.json +16 -0
  755. package/LICENSE +0 -21
  756. package/bin/openfork.exe +0 -10
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env bun
2
+ import { $ } from "bun"
3
+ import pkg from "../package.json"
4
+ import { Script } from "@openfork-ai/script"
5
+ import { fileURLToPath } from "url"
6
+
7
+ const dir = fileURLToPath(new URL("..", import.meta.url))
8
+ process.chdir(dir)
9
+
10
+ async function published(name: string, version: string) {
11
+ return (await $`npm view ${name}@${version} version`.nothrow()).exitCode === 0
12
+ }
13
+
14
+ async function publish(dir: string, name: string, version: string) {
15
+ if (process.platform !== "win32") await $`chmod -R 755 .`.cwd(dir)
16
+ if (await published(name, version)) {
17
+ console.log(`already published ${name}@${version}`)
18
+ return
19
+ }
20
+ await $`bun pm pack`.cwd(dir)
21
+ await $`npm publish *.tgz --access public --tag ${Script.channel}`.cwd(dir)
22
+ }
23
+
24
+ const binaries: Record<string, string> = {}
25
+ for (const filepath of new Bun.Glob("*/package.json").scanSync({ cwd: "./dist" })) {
26
+ const pkg = await Bun.file(`./dist/${filepath}`).json()
27
+ binaries[pkg.name] = pkg.version
28
+ }
29
+ console.log("binaries", binaries)
30
+ const version = Object.values(binaries)[0]
31
+
32
+ await $`mkdir -p ./dist/${pkg.name}`
33
+ await $`mkdir -p ./dist/${pkg.name}/bin`
34
+ await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
35
+ await Bun.file(`./dist/${pkg.name}/LICENSE`).write(await Bun.file("../../LICENSE").text())
36
+
37
+ // Create the bin shim that warns if postinstall hasn't run
38
+ await Bun.file(`./dist/${pkg.name}/bin/${pkg.name}.exe`).write(
39
+ [
40
+ `echo "Error: ${pkg.name}'s postinstall script was not run." >&2`,
41
+ 'echo "" >&2',
42
+ 'echo "This occurs when using --ignore-scripts during installation, or when using a" >&2',
43
+ 'echo "package manager like pnpm that does not run postinstall scripts by default." >&2',
44
+ 'echo "" >&2',
45
+ 'echo "To fix this, run the postinstall script manually:" >&2',
46
+ `echo " cd node_modules/${pkg.name} && node postinstall.mjs" >&2`,
47
+ 'echo "" >&2',
48
+ `echo "Or reinstall ${pkg.name} without the --ignore-scripts flag." >&2`,
49
+ "exit 1",
50
+ "",
51
+ ].join("\n"),
52
+ )
53
+
54
+ await Bun.file(`./dist/${pkg.name}/package.json`).write(
55
+ JSON.stringify(
56
+ {
57
+ name: pkg.name,
58
+ bin: {
59
+ [pkg.name]: `./bin/${pkg.name}.exe`,
60
+ },
61
+ scripts: {
62
+ postinstall: "node ./postinstall.mjs",
63
+ },
64
+ version: version,
65
+ license: pkg.license,
66
+ os: ["darwin", "linux", "win32"],
67
+ cpu: ["arm64", "x64"],
68
+ optionalDependencies: binaries,
69
+ },
70
+ null,
71
+ 2,
72
+ ),
73
+ )
74
+
75
+ // Publish all platform-specific packages in parallel, then the wrapper
76
+ const tasks = Object.entries(binaries).map(async ([name]) => {
77
+ await publish(`./dist/${name}`, name, binaries[name])
78
+ })
79
+ await Promise.all(tasks)
80
+ await publish(`./dist/${pkg.name}`, pkg.name, version)
81
+
82
+ console.log(`Published ${pkg.name}@${version}`)
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // This script runs a separate OpenCode server to be used as a remote
4
+ // workspace, simulating a remote environment but all local to make
5
+ // debugger easier
6
+ //
7
+ // *Important*: make sure you add the debug workspace plugin first.
8
+ // In `.opencode/opencode.jsonc` in the root of this project add:
9
+ //
10
+ // "plugin": ["../packages/opencode/src/control-plane/dev/debug-workspace-plugin.ts"]
11
+ //
12
+ // Afterwards, run `./packages/opencode/script/run-workspace-server`
13
+
14
+ import { stat } from "node:fs/promises"
15
+ import { setTimeout as sleep } from "node:timers/promises"
16
+
17
+ const DEV_DATA_FILE = "/tmp/opencode-workspace-dev-data.json"
18
+ const RESTART_POLL_INTERVAL = 250
19
+
20
+ async function readData() {
21
+ return await Bun.file(DEV_DATA_FILE).json()
22
+ }
23
+
24
+ async function readDataMtime() {
25
+ return await stat(DEV_DATA_FILE)
26
+ .then((info) => info.mtimeMs)
27
+ .catch((error) => {
28
+ if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
29
+ return undefined
30
+ }
31
+
32
+ throw error
33
+ })
34
+ }
35
+
36
+ async function readSnapshot() {
37
+ while (true) {
38
+ try {
39
+ const before = await readDataMtime()
40
+ if (before === undefined) {
41
+ await sleep(RESTART_POLL_INTERVAL)
42
+ continue
43
+ }
44
+
45
+ const data = await readData()
46
+ const after = await readDataMtime()
47
+
48
+ if (before === after) {
49
+ return { data, mtime: after }
50
+ }
51
+ } catch (error) {
52
+ if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
53
+ await sleep(RESTART_POLL_INTERVAL)
54
+ continue
55
+ }
56
+
57
+ throw error
58
+ }
59
+ }
60
+ }
61
+
62
+ function startDevServer(data: any) {
63
+ const env = Object.fromEntries(Object.entries(data.env ?? {}).filter(([, value]) => value !== undefined))
64
+
65
+ return Bun.spawn(["bun", "run", "dev", "serve", "--port", String(data.port), "--print-logs"], {
66
+ env: {
67
+ ...process.env,
68
+ ...env,
69
+ XDG_DATA_HOME: "/tmp/data",
70
+ },
71
+ stdin: "inherit",
72
+ stdout: "inherit",
73
+ stderr: "inherit",
74
+ })
75
+ }
76
+
77
+ async function waitForRestartSignal(mtime: number, signal: AbortSignal) {
78
+ while (!signal.aborted) {
79
+ await sleep(RESTART_POLL_INTERVAL)
80
+ if (signal.aborted) return false
81
+ if ((await readDataMtime()) !== mtime) return true
82
+ }
83
+
84
+ return false
85
+ }
86
+
87
+ while (true) {
88
+ const { data, mtime } = await readSnapshot()
89
+ const proc = startDevServer(data)
90
+ const restartAbort = new AbortController()
91
+
92
+ const result = await Promise.race([
93
+ proc.exited.then((code) => ({ type: "exit" as const, code })),
94
+ waitForRestartSignal(mtime, restartAbort.signal).then((restart) => ({ type: "restart" as const, restart })),
95
+ ])
96
+
97
+ restartAbort.abort()
98
+
99
+ if (result.type === "restart" && result.restart) {
100
+ proc.kill()
101
+ await proc.exited
102
+ continue
103
+ }
104
+
105
+ process.exit(result.code)
106
+ }
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { Config } from "@/config/config"
4
+ import { ConfigV1 } from "@openfork-ai/core/v1/config/config"
5
+ import { TuiConfig } from "@openfork-ai/tui/config"
6
+ import { Schema } from "effect"
7
+
8
+ type JsonSchema = Record<string, unknown>
9
+ const MODEL_REF = "https://models.dev/model-schema.json#/$defs/Model"
10
+
11
+ function generateEffect(schema: Schema.Top) {
12
+ const document = Schema.toJsonSchemaDocument(schema)
13
+ const normalized = normalize({
14
+ $schema: "https://json-schema.org/draft/2020-12/schema",
15
+ ...document.schema,
16
+ $defs: document.definitions,
17
+ })
18
+ if (!isRecord(normalized)) throw new Error("schema generator produced a non-object schema")
19
+ const restored = restoreModelRefs(normalized)
20
+ if (!isRecord(restored)) throw new Error("schema generator produced a non-object schema")
21
+ restored.allowComments = true
22
+ restored.allowTrailingCommas = true
23
+ return restored
24
+ }
25
+
26
+ function normalize(value: unknown): unknown {
27
+ if (Array.isArray(value)) return value.map(normalize)
28
+ if (!isRecord(value)) return value
29
+
30
+ const schema = Object.fromEntries(Object.entries(value).map(([key, item]) => [key, normalize(item)]))
31
+
32
+ if (Array.isArray(schema.anyOf)) {
33
+ const anyOf = schema.anyOf.filter((item) => !isRecord(item) || item.type !== "null")
34
+ if (anyOf.length !== schema.anyOf.length) {
35
+ const { anyOf: _, ...rest } = schema
36
+ if (anyOf.length === 1 && isRecord(anyOf[0])) return normalize({ ...anyOf[0], ...rest })
37
+ return { ...rest, anyOf }
38
+ }
39
+ }
40
+
41
+ if (Array.isArray(schema.allOf) && schema.allOf.length === 1 && isRecord(schema.allOf[0])) {
42
+ const { allOf: _, ...rest } = schema
43
+ return normalize({ ...schema.allOf[0], ...rest })
44
+ }
45
+
46
+ if (schema.type === "integer" && schema.maximum === undefined) {
47
+ return { ...schema, maximum: Number.MAX_SAFE_INTEGER }
48
+ }
49
+
50
+ return schema
51
+ }
52
+
53
+ function restoreModelRefs(value: unknown, key?: string): unknown {
54
+ if (Array.isArray(value)) return value.map((item) => restoreModelRefs(item))
55
+ if (!isRecord(value)) return value
56
+
57
+ const schema = Object.fromEntries(Object.entries(value).map(([name, item]) => [name, restoreModelRefs(item, name)]))
58
+ if ((key === "model" || key === "small_model") && schema.type === "string") {
59
+ return { ...schema, $ref: MODEL_REF }
60
+ }
61
+ return schema
62
+ }
63
+
64
+ function isRecord(value: unknown): value is JsonSchema {
65
+ return typeof value === "object" && value !== null && !Array.isArray(value)
66
+ }
67
+
68
+ const configFile = process.argv[2]
69
+ const tuiFile = process.argv[3]
70
+
71
+ console.log(configFile)
72
+ await Bun.write(configFile, JSON.stringify(generateEffect(ConfigV1.Info), null, 2))
73
+
74
+ if (tuiFile) {
75
+ console.log(tuiFile)
76
+ await Bun.write(tuiFile, JSON.stringify(generateEffect(TuiConfig.Info), null, 2))
77
+ }
package/script/time.ts ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import path from "path"
4
+ const toDynamicallyImport = path.join(process.cwd(), process.argv[2])
5
+ await import(toDynamicallyImport)
6
+ console.log(performance.now())
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env bun
2
+ import * as path from "path"
3
+ import * as ts from "typescript"
4
+
5
+ const BASE_DIR = "/home/thdxr/dev/projects/anomalyco/opencode/packages/openfork"
6
+
7
+ // Get entry file from command line arg or use default
8
+ const ENTRY_FILE = process.argv[2] || "src/plugin/tui/runtime.ts"
9
+
10
+ const visited = new Set<string>()
11
+
12
+ function resolveImport(importPath: string, fromFile: string): string | null {
13
+ if (importPath.startsWith("@/")) {
14
+ return path.join(BASE_DIR, "src", importPath.slice(2))
15
+ }
16
+
17
+ if (importPath.startsWith("./") || importPath.startsWith("../")) {
18
+ const dir = path.dirname(fromFile)
19
+ return path.resolve(dir, importPath)
20
+ }
21
+
22
+ return null
23
+ }
24
+
25
+ function isInternalImport(importPath: string): boolean {
26
+ return importPath.startsWith("@/") || importPath.startsWith("./") || importPath.startsWith("../")
27
+ }
28
+
29
+ async function tryExtensions(filePath: string): Promise<string | null> {
30
+ const extensions = [".ts", ".tsx", ".js", ".jsx"]
31
+
32
+ try {
33
+ const file = Bun.file(filePath)
34
+ const stat = await file.stat()
35
+
36
+ if (stat?.isDirectory()) {
37
+ for (const ext of extensions) {
38
+ const indexPath = path.join(filePath, "index" + ext)
39
+ const indexFile = Bun.file(indexPath)
40
+ if (await indexFile.exists()) return indexPath
41
+ }
42
+ return null
43
+ }
44
+
45
+ // It's a file
46
+ return filePath
47
+ } catch {
48
+ // Path doesn't exist, try adding extensions
49
+ for (const ext of extensions) {
50
+ const withExt = filePath + ext
51
+ const extFile = Bun.file(withExt)
52
+ if (await extFile.exists()) return withExt
53
+ }
54
+ return null
55
+ }
56
+ }
57
+
58
+ function extractImports(sourceFile: ts.SourceFile): string[] {
59
+ const imports: string[] = []
60
+
61
+ function visit(node: ts.Node) {
62
+ // import x from "path" or import { x } from "path"
63
+ if (ts.isImportDeclaration(node)) {
64
+ // Skip type-only imports
65
+ if (node.importClause?.isTypeOnly) return
66
+
67
+ const moduleSpec = node.moduleSpecifier
68
+ if (ts.isStringLiteral(moduleSpec)) {
69
+ imports.push(moduleSpec.text)
70
+ }
71
+ }
72
+
73
+ // export { x } from "path"
74
+ if (ts.isExportDeclaration(node) && node.moduleSpecifier) {
75
+ if (ts.isStringLiteral(node.moduleSpecifier)) {
76
+ imports.push(node.moduleSpecifier.text)
77
+ }
78
+ }
79
+
80
+ // Dynamic import: import("path")
81
+ if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
82
+ const arg = node.arguments[0]
83
+ if (arg && ts.isStringLiteral(arg)) {
84
+ imports.push(arg.text)
85
+ }
86
+ }
87
+
88
+ ts.forEachChild(node, visit)
89
+ }
90
+
91
+ visit(sourceFile)
92
+ return imports
93
+ }
94
+
95
+ async function traceFile(filePath: string, depth = 0): Promise<void> {
96
+ const normalizedPath = path.relative(BASE_DIR, filePath)
97
+
98
+ if (visited.has(filePath)) {
99
+ return
100
+ }
101
+
102
+ // Only trace TypeScript/JavaScript files
103
+ if (!filePath.match(/\.(ts|tsx|js|jsx)$/)) {
104
+ return
105
+ }
106
+
107
+ visited.add(filePath)
108
+ console.log("\t".repeat(depth) + normalizedPath)
109
+
110
+ let content: string
111
+ try {
112
+ content = await Bun.file(filePath).text()
113
+ } catch {
114
+ return
115
+ }
116
+
117
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true)
118
+
119
+ const imports = extractImports(sourceFile)
120
+ const internalImports = imports.filter(isInternalImport)
121
+ const externalImports = imports.filter((imp) => !isInternalImport(imp))
122
+
123
+ // Print external imports
124
+ for (const imp of externalImports) {
125
+ console.log("\t".repeat(depth + 1) + `[ext] ${imp}`)
126
+ }
127
+
128
+ for (const imp of internalImports) {
129
+ const resolved = resolveImport(imp, filePath)
130
+ if (!resolved) continue
131
+
132
+ const actualPath = await tryExtensions(resolved)
133
+ if (!actualPath) continue
134
+
135
+ await traceFile(actualPath, depth + 1)
136
+ }
137
+ }
138
+
139
+ async function main() {
140
+ const entryPath = path.join(BASE_DIR, ENTRY_FILE)
141
+
142
+ // Check if file exists
143
+ const file = Bun.file(entryPath)
144
+ if (!(await file.exists())) {
145
+ console.error(`File not found: ${ENTRY_FILE}`)
146
+ console.error(`Resolved to: ${entryPath}`)
147
+ process.exit(1)
148
+ }
149
+
150
+ await traceFile(entryPath)
151
+ }
152
+
153
+ main().catch(console.error)
@@ -0,0 +1,235 @@
1
+ # Error Boundaries Plan
2
+
3
+ Plan for removing `NamedError` as connective tissue while keeping public
4
+ wire contracts stable.
5
+
6
+ ## Desired Shape
7
+
8
+ ```text
9
+ Domain/service error
10
+ Schema.TaggedErrorClass
11
+ - catchable with catchTag / catchTags
12
+ - appears in service method error type
13
+ - no HTTP status
14
+ - no toObject()
15
+
16
+ HTTP public error
17
+ Schema.ErrorClass / TaggedErrorClass with httpApiStatus
18
+ - endpoint-declared public contract
19
+ - owns legacy { name, data } only when that is the SDK wire shape
20
+
21
+ CLI/user rendering
22
+ FormatError and small format helpers
23
+ - converts domain errors to text
24
+ - preserves useful structured fields
25
+
26
+ Session/model-visible error
27
+ first-class session/message error schema or helper
28
+ - owns { name, data } event/message shape
29
+ - not a service error class
30
+ ```
31
+
32
+ The important rule: a service error should not also be the HTTP body, CLI
33
+ formatter, and session event body. Each seam adapts the error into the
34
+ shape it owns.
35
+
36
+ ## Concrete Example: Provider Model Not Found
37
+
38
+ Before:
39
+
40
+ ```ts
41
+ export const ModelNotFoundError = NamedError.create("ProviderModelNotFoundError", {
42
+ providerID: ProviderID,
43
+ modelID: ModelID,
44
+ suggestions: Schema.optional(Schema.Array(Schema.String)),
45
+ })
46
+ ```
47
+
48
+ Problems:
49
+
50
+ - Throwing it inside `Effect.fn` made it behave like a defect unless a
51
+ compatibility bridge caught it.
52
+ - HTTP middleware knew that this one domain error should be a `400`.
53
+ - Callers read `.data.*`, which couples them to the legacy `{ name, data }`
54
+ wire shape.
55
+
56
+ After:
57
+
58
+ ```ts
59
+ export class ModelNotFoundError extends Schema.TaggedErrorClass<ModelNotFoundError>()("ProviderModelNotFoundError", {
60
+ providerID: ProviderID,
61
+ modelID: ModelID,
62
+ suggestions: Schema.optional(Schema.Array(Schema.String)),
63
+ cause: Schema.optional(Schema.Defect),
64
+ }) {}
65
+
66
+ export interface Interface {
67
+ readonly getModel: (providerID: ProviderID, modelID: ModelID) => Effect.Effect<Model, ModelNotFoundError>
68
+ }
69
+ ```
70
+
71
+ Boundary adapters:
72
+
73
+ ```text
74
+ CLI
75
+ └─ FormatError sees _tag ProviderModelNotFoundError -> nice text
76
+
77
+ Session prompt
78
+ └─ catch ModelNotFoundError -> publish Session.Event.Error as message/session wire shape
79
+
80
+ HTTP route
81
+ └─ catch ModelNotFoundError -> declared BadRequest public API error when the endpoint needs it
82
+
83
+ HTTP middleware
84
+ └─ no Provider.ModelNotFoundError knowledge
85
+ ```
86
+
87
+ ## Refining Known Promise Failures
88
+
89
+ Use `EffectPromise.refineRejection(...)` when a Promise boundary can reject
90
+ with many unknown values, but only one or two rejection classes are expected
91
+ domain failures. Unknown rejections stay defects; the helper maps only known
92
+ rejection shapes to typed errors.
93
+
94
+ ```ts
95
+ const language =
96
+ yield *
97
+ EffectPromise.refineRejection(
98
+ async () => loadFromProvider(),
99
+ (cause) => (cause instanceof NoSuchModelError ? new ModelNotFoundError({ providerID, modelID, cause }) : undefined),
100
+ )
101
+ ```
102
+
103
+ Use this when the Promise can genuinely reject and most rejection values are
104
+ still defects for the current module. Use `Effect.tryPromise({ try, catch })`
105
+ when every rejection should become the same expected error type. Use
106
+ `Effect.promise(...)` only when rejection means a defect and you do not need
107
+ to refine known rejection classes.
108
+
109
+ ## Helper Modules We Probably Want
110
+
111
+ Add helpers only when repeated call sites prove the seam is real.
112
+
113
+ ### HTTP API Errors
114
+
115
+ Likely location: `src/server/routes/instance/httpapi/errors.ts`.
116
+
117
+ Purpose:
118
+
119
+ - construct public HTTP error bodies
120
+ - preserve legacy `{ name, data }` where needed
121
+ - attach `httpApiStatus`
122
+
123
+ Good helpers:
124
+
125
+ ```ts
126
+ notFound(message)
127
+ badRequest(message)
128
+ unknown()
129
+ ```
130
+
131
+ Avoid:
132
+
133
+ ```ts
134
+ mapAnyDomainError(error)
135
+ ```
136
+
137
+ That recreates the giant middleware mapper problem.
138
+
139
+ ### Session / Message Error Wire Helpers
140
+
141
+ Likely location: near `src/session/message-error.ts` or a new narrow
142
+ module such as `src/session/event-error.ts`.
143
+
144
+ Purpose:
145
+
146
+ - construct the `{ name, data }` shape used by `Session.Event.Error` and
147
+ assistant message errors
148
+ - replace `new NamedError.Unknown(...).toObject()` call sites
149
+ - keep model-visible error bodies separate from service/domain errors
150
+
151
+ Good helpers:
152
+
153
+ ```ts
154
+ unknown(message)
155
+ agentNotFound(agent, available)
156
+ commandNotFound(command, available)
157
+ modelNotFound(error: Provider.ModelNotFoundError)
158
+ ```
159
+
160
+ ### CLI Formatters
161
+
162
+ Likely location: `src/cli/error.ts` until repetition demands domain-local
163
+ format helpers.
164
+
165
+ Purpose:
166
+
167
+ - produce human-readable terminal messages from typed errors
168
+ - support old `{ name, data }` shapes only while compatibility is needed
169
+
170
+ ## Migration Queue
171
+
172
+ ### Remove Domain Knowledge From HTTP Middleware
173
+
174
+ - [x] Storage not found no longer maps through defect fallback.
175
+ - [x] Worktree expected errors moved to typed errors.
176
+ - [x] Provider auth expected errors moved to typed errors.
177
+ - [x] Provider model not found no longer needs an HTTP middleware status
178
+ special case.
179
+ - [ ] Convert `Session.BusyError` and map it at route boundaries.
180
+ - [ ] Delete the broad `NamedError` middleware branch once no route relies
181
+ on defect-wrapped legacy domain errors.
182
+ - [ ] Keep one final unknown-defect fallback that logs `Cause.pretty(cause)`
183
+ and returns a safe `500` body.
184
+
185
+ ### Remaining `NamedError.create(...)` Service Errors
186
+
187
+ These should become `Schema.TaggedErrorClass` when touched:
188
+
189
+ - [ ] `src/provider/provider.ts` — `ProviderInitError`.
190
+ - [ ] `src/storage/db.ts` — database `NotFoundError`.
191
+ - [ ] `src/mcp/index.ts` — `MCPFailed`.
192
+ - [ ] `src/skill/index.ts` — `SkillInvalidError`,
193
+ `SkillNameMismatchError`.
194
+ - [ ] `src/lsp/client.ts` — `LSPInitializeError`.
195
+ - [ ] `src/ide/index.ts` — install errors.
196
+ - [ ] `src/config/error.ts`, `src/config/config.ts`,
197
+ `src/config/markdown.ts` — config errors. These already render well
198
+ in the CLI, so migrate carefully and preserve diagnostics.
199
+
200
+ ### Session / Message Wire Errors
201
+
202
+ These are not ordinary service errors. They mostly build `{ name, data }`
203
+ objects for model-visible/session-visible output.
204
+
205
+ - [ ] Add a first-class session/message error wire helper.
206
+ - [ ] Replace `new NamedError.Unknown(...).toObject()` in
207
+ `src/session/prompt.ts`.
208
+ - [ ] Replace `new NamedError.Unknown(...).toObject()` in config/skill/plugin
209
+ session event publishing.
210
+ - [ ] Move `src/session/message-error.ts` and `src/session/message-v2.ts`
211
+ away from `NamedError.create(...)` once the wire helper exists.
212
+ - [ ] Update retry/message tests to assert the wire schema/helper output,
213
+ not `NamedError` instances.
214
+
215
+ ### CLI Rendering
216
+
217
+ - [x] Tagged config errors render with useful diagnostics.
218
+ - [x] Provider model not found renders from both old `{ name, data }` and
219
+ new `_tag` shapes.
220
+ - [ ] Add typed render cases as more `NamedError.create(...)` domains move
221
+ to `Schema.TaggedErrorClass`.
222
+ - [ ] Eventually remove old-shape compatibility branches when no callers can
223
+ produce them.
224
+
225
+ ## PR Checklist
226
+
227
+ For each migrated error:
228
+
229
+ - [ ] Domain error is `Schema.TaggedErrorClass`.
230
+ - [ ] Service method exposes the typed error in its error channel.
231
+ - [ ] No service error has `toObject()` just for compatibility.
232
+ - [ ] CLI, HTTP, and session/message adapters each own their output shape.
233
+ - [ ] HTTP middleware gets smaller or stays unchanged.
234
+ - [ ] Focused tests cover the domain error and any public rendering/wire
235
+ shape touched by the PR.