@miaws/miaw 1.18.3 → 1.18.5

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 (752) hide show
  1. package/AGENTS.md +131 -0
  2. package/Dockerfile +18 -0
  3. package/README.md +15 -0
  4. package/{miaw.js → bin/miaw} +0 -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 +154 -12
  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/script/postinstall.mjs +189 -0
  17. package/script/profile-test-files.ts +42 -0
  18. package/script/publish.ts +213 -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 +463 -0
  42. package/src/account/repo.ts +173 -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 +250 -0
  48. package/src/acp/directory.ts +210 -0
  49. package/src/acp/error.ts +90 -0
  50. package/src/acp/event.ts +336 -0
  51. package/src/acp/permission.ts +124 -0
  52. package/src/acp/profile.ts +42 -0
  53. package/src/acp/service.ts +1048 -0
  54. package/src/acp/session.ts +231 -0
  55. package/src/acp/tool.ts +321 -0
  56. package/src/acp/usage.ts +232 -0
  57. package/src/agent/agent.ts +467 -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/summary.txt +11 -0
  62. package/src/agent/prompt/title.txt +44 -0
  63. package/src/agent/subagent-permissions.ts +27 -0
  64. package/src/audio.d.ts +14 -0
  65. package/src/auth/index.ts +99 -0
  66. package/src/background/job.ts +39 -0
  67. package/src/bus/global.ts +22 -0
  68. package/src/cli/bootstrap.ts +11 -0
  69. package/src/cli/cmd/account.ts +264 -0
  70. package/src/cli/cmd/acp.ts +73 -0
  71. package/src/cli/cmd/agent.ts +253 -0
  72. package/src/cli/cmd/attach.ts +97 -0
  73. package/src/cli/cmd/cmd.ts +7 -0
  74. package/src/cli/cmd/db.ts +62 -0
  75. package/src/cli/cmd/debug/agent.handler.ts +193 -0
  76. package/src/cli/cmd/debug/agent.ts +27 -0
  77. package/src/cli/cmd/debug/config.ts +14 -0
  78. package/src/cli/cmd/debug/file.ts +73 -0
  79. package/src/cli/cmd/debug/index.ts +87 -0
  80. package/src/cli/cmd/debug/lsp.ts +50 -0
  81. package/src/cli/cmd/debug/ripgrep.ts +79 -0
  82. package/src/cli/cmd/debug/scrap.ts +15 -0
  83. package/src/cli/cmd/debug/skill.ts +15 -0
  84. package/src/cli/cmd/debug/snapshot.ts +50 -0
  85. package/src/cli/cmd/debug/startup.ts +11 -0
  86. package/src/cli/cmd/debug/v2.ts +49 -0
  87. package/src/cli/cmd/export.ts +292 -0
  88. package/src/cli/cmd/generate.ts +54 -0
  89. package/src/cli/cmd/github.handler.ts +1593 -0
  90. package/src/cli/cmd/github.shared.ts +30 -0
  91. package/src/cli/cmd/github.ts +42 -0
  92. package/src/cli/cmd/import.ts +224 -0
  93. package/src/cli/cmd/mcp.ts +849 -0
  94. package/src/cli/cmd/models.ts +66 -0
  95. package/src/cli/cmd/plug.ts +230 -0
  96. package/src/cli/cmd/pr.ts +115 -0
  97. package/src/cli/cmd/prompt-display.ts +1 -0
  98. package/src/cli/cmd/providers.ts +534 -0
  99. package/src/cli/cmd/run/demo.ts +1274 -0
  100. package/src/cli/cmd/run/entry.body.ts +205 -0
  101. package/src/cli/cmd/run/footer.command.tsx +1064 -0
  102. package/src/cli/cmd/run/footer.menu.tsx +351 -0
  103. package/src/cli/cmd/run/footer.permission.tsx +472 -0
  104. package/src/cli/cmd/run/footer.prompt.tsx +1306 -0
  105. package/src/cli/cmd/run/footer.question.tsx +573 -0
  106. package/src/cli/cmd/run/footer.subagent.tsx +173 -0
  107. package/src/cli/cmd/run/footer.ts +1129 -0
  108. package/src/cli/cmd/run/footer.view.tsx +943 -0
  109. package/src/cli/cmd/run/footer.width.ts +27 -0
  110. package/src/cli/cmd/run/permission.shared.ts +256 -0
  111. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  112. package/src/cli/cmd/run/prompt.shared.ts +153 -0
  113. package/src/cli/cmd/run/question.shared.ts +340 -0
  114. package/src/cli/cmd/run/runtime.boot.ts +202 -0
  115. package/src/cli/cmd/run/runtime.lifecycle.ts +406 -0
  116. package/src/cli/cmd/run/runtime.queue.ts +349 -0
  117. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  118. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  119. package/src/cli/cmd/run/runtime.ts +814 -0
  120. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  121. package/src/cli/cmd/run/scrollback.surface.ts +431 -0
  122. package/src/cli/cmd/run/scrollback.writer.tsx +352 -0
  123. package/src/cli/cmd/run/session-data.ts +1113 -0
  124. package/src/cli/cmd/run/session-replay.ts +374 -0
  125. package/src/cli/cmd/run/session.shared.ts +196 -0
  126. package/src/cli/cmd/run/splash.ts +280 -0
  127. package/src/cli/cmd/run/stream.transport.ts +1462 -0
  128. package/src/cli/cmd/run/stream.ts +175 -0
  129. package/src/cli/cmd/run/subagent-data.ts +876 -0
  130. package/src/cli/cmd/run/theme.ts +690 -0
  131. package/src/cli/cmd/run/tool.ts +1489 -0
  132. package/src/cli/cmd/run/trace.ts +94 -0
  133. package/src/cli/cmd/run/turn-summary.ts +47 -0
  134. package/src/cli/cmd/run/types.ts +350 -0
  135. package/src/cli/cmd/run/variant.shared.ts +215 -0
  136. package/src/cli/cmd/run.ts +894 -0
  137. package/src/cli/cmd/serve.ts +24 -0
  138. package/src/cli/cmd/session.ts +147 -0
  139. package/src/cli/cmd/stats.ts +393 -0
  140. package/src/cli/cmd/tui.ts +224 -0
  141. package/src/cli/cmd/uninstall.ts +353 -0
  142. package/src/cli/cmd/upgrade.ts +74 -0
  143. package/src/cli/cmd/web.ts +84 -0
  144. package/src/cli/effect/prompt.ts +37 -0
  145. package/src/cli/effect-cmd.ts +96 -0
  146. package/src/cli/error.ts +130 -0
  147. package/src/cli/heap.ts +45 -0
  148. package/src/cli/logo.ts +1 -0
  149. package/src/cli/network.ts +64 -0
  150. package/src/cli/tui/layer.ts +7 -0
  151. package/src/cli/tui/validate-session.ts +29 -0
  152. package/src/cli/tui/worker.ts +71 -0
  153. package/src/cli/ui.ts +132 -0
  154. package/src/cli/upgrade.ts +53 -0
  155. package/src/command/index.ts +184 -0
  156. package/src/command/template/initialize.txt +66 -0
  157. package/src/command/template/review.txt +101 -0
  158. package/src/config/agent-preset.ts +175 -0
  159. package/src/config/agent.ts +59 -0
  160. package/src/config/command.ts +39 -0
  161. package/src/config/config.ts +703 -0
  162. package/src/config/entry-name.ts +19 -0
  163. package/src/config/managed.ts +69 -0
  164. package/src/config/markdown.ts +36 -0
  165. package/src/config/parse.ts +79 -0
  166. package/src/config/paths.ts +45 -0
  167. package/src/config/plugin.ts +79 -0
  168. package/src/config/tui-cwd.ts +5 -0
  169. package/src/config/tui-host-attention.ts +21 -0
  170. package/src/config/tui-migrate.ts +132 -0
  171. package/src/config/tui.ts +274 -0
  172. package/src/config/variable.ts +91 -0
  173. package/src/control-plane/adapters/index.ts +41 -0
  174. package/src/control-plane/adapters/worktree.ts +96 -0
  175. package/src/control-plane/dev/README.md +19 -0
  176. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  177. package/src/control-plane/types.ts +59 -0
  178. package/src/control-plane/util.ts +39 -0
  179. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  180. package/src/control-plane/workspace-context.ts +26 -0
  181. package/src/control-plane/workspace.ts +989 -0
  182. package/src/effect/app-runtime.ts +132 -0
  183. package/src/effect/bootstrap-runtime.ts +23 -0
  184. package/src/effect/bridge.ts +84 -0
  185. package/src/effect/config-service.ts +67 -0
  186. package/src/effect/instance-ref.ts +11 -0
  187. package/src/effect/instance-registry.ts +12 -0
  188. package/src/effect/instance-state.ts +69 -0
  189. package/src/effect/promise.ts +17 -0
  190. package/src/effect/run-service.ts +47 -0
  191. package/src/effect/runner.ts +217 -0
  192. package/src/effect/runtime-flags.ts +79 -0
  193. package/src/env/index.ts +43 -0
  194. package/src/event-v2-bridge.ts +79 -0
  195. package/src/format/formatter.ts +404 -0
  196. package/src/format/index.ts +205 -0
  197. package/src/git/index.ts +350 -0
  198. package/src/id/id.ts +80 -0
  199. package/src/ide/index.ts +61 -0
  200. package/src/image/image.ts +174 -0
  201. package/src/index.ts +142 -0
  202. package/src/installation/index.ts +350 -0
  203. package/src/lsp/client.ts +650 -0
  204. package/src/lsp/diagnostic.ts +29 -0
  205. package/src/lsp/language.ts +121 -0
  206. package/src/lsp/launch.ts +21 -0
  207. package/src/lsp/lsp.ts +511 -0
  208. package/src/lsp/server.ts +1983 -0
  209. package/src/markdown.d.ts +4 -0
  210. package/src/mcp/auth.ts +174 -0
  211. package/src/mcp/catalog.ts +144 -0
  212. package/src/mcp/index.ts +953 -0
  213. package/src/mcp/oauth-callback.ts +221 -0
  214. package/src/mcp/oauth-provider.ts +206 -0
  215. package/src/node.ts +4 -0
  216. package/src/patch/index.ts +686 -0
  217. package/src/permission/arity.ts +163 -0
  218. package/src/permission/evaluate.ts +1 -0
  219. package/src/permission/index.ts +230 -0
  220. package/src/plugin/azure.ts +26 -0
  221. package/src/plugin/cloudflare.ts +76 -0
  222. package/src/plugin/digitalocean.ts +383 -0
  223. package/src/plugin/github-copilot/copilot.ts +413 -0
  224. package/src/plugin/github-copilot/models.ts +246 -0
  225. package/src/plugin/index.ts +315 -0
  226. package/src/plugin/install.ts +439 -0
  227. package/src/plugin/loader.ts +237 -0
  228. package/src/plugin/meta.ts +188 -0
  229. package/src/plugin/openai/README.md +31 -0
  230. package/src/plugin/openai/codex.ts +640 -0
  231. package/src/plugin/openai/ws-pool.ts +270 -0
  232. package/src/plugin/openai/ws.ts +381 -0
  233. package/src/plugin/pty-environment.ts +24 -0
  234. package/src/plugin/shared.ts +323 -0
  235. package/src/plugin/snowflake-cortex.ts +529 -0
  236. package/src/plugin/tui/internal.ts +10 -0
  237. package/src/plugin/tui/runtime.ts +1130 -0
  238. package/src/plugin/xai.ts +734 -0
  239. package/src/project/bootstrap-service.ts +9 -0
  240. package/src/project/bootstrap.ts +76 -0
  241. package/src/project/instance-context.ts +24 -0
  242. package/src/project/instance-layer.ts +11 -0
  243. package/src/project/instance-runtime.ts +16 -0
  244. package/src/project/instance-store.ts +209 -0
  245. package/src/project/project.ts +519 -0
  246. package/src/project/vcs.ts +431 -0
  247. package/src/provider/auth.ts +233 -0
  248. package/src/provider/error.ts +188 -0
  249. package/src/provider/model-status.ts +8 -0
  250. package/src/provider/provider.ts +1975 -0
  251. package/src/provider/transform.ts +1426 -0
  252. package/src/question/index.ts +229 -0
  253. package/src/question/schema.ts +10 -0
  254. package/src/server/auth.ts +48 -0
  255. package/src/server/event.ts +13 -0
  256. package/src/server/global-lifecycle.ts +28 -0
  257. package/src/server/init-projectors.ts +3 -0
  258. package/src/server/mdns.ts +47 -0
  259. package/src/server/projectors.ts +1 -0
  260. package/src/server/proxy-util.ts +48 -0
  261. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  262. package/src/server/routes/instance/httpapi/api.ts +78 -0
  263. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  264. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  265. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  266. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  267. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  268. package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
  269. package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
  270. package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
  271. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  272. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  273. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  274. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  275. package/src/server/routes/instance/httpapi/groups/project-copy.ts +32 -0
  276. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  277. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  278. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  279. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  280. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  281. package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
  282. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  283. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  284. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  285. package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
  286. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  287. package/src/server/routes/instance/httpapi/handlers/control.ts +43 -0
  288. package/src/server/routes/instance/httpapi/handlers/event.ts +99 -0
  289. package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
  290. package/src/server/routes/instance/httpapi/handlers/file.ts +139 -0
  291. package/src/server/routes/instance/httpapi/handlers/global.ts +156 -0
  292. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  293. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  294. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  295. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +83 -0
  296. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  297. package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
  298. package/src/server/routes/instance/httpapi/handlers/pty.ts +273 -0
  299. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  300. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
  301. package/src/server/routes/instance/httpapi/handlers/session.ts +440 -0
  302. package/src/server/routes/instance/httpapi/handlers/sync.ts +89 -0
  303. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  304. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  305. package/src/server/routes/instance/httpapi/lifecycle.ts +54 -0
  306. package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
  307. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  308. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  309. package/src/server/routes/instance/httpapi/middleware/error.ts +43 -0
  310. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  311. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  312. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  313. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +41 -0
  314. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  315. package/src/server/routes/instance/httpapi/public.ts +535 -0
  316. package/src/server/routes/instance/httpapi/server.ts +298 -0
  317. package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
  318. package/src/server/server.ts +217 -0
  319. package/src/server/shared/fence.ts +60 -0
  320. package/src/server/shared/pty-ticket.ts +15 -0
  321. package/src/server/shared/public-ui.ts +12 -0
  322. package/src/server/shared/tui-control.ts +28 -0
  323. package/src/server/shared/ui.ts +108 -0
  324. package/src/server/shared/workspace-routing.ts +38 -0
  325. package/src/server/tui-event.ts +53 -0
  326. package/src/session/compaction.ts +620 -0
  327. package/src/session/instruction.ts +250 -0
  328. package/src/session/llm/AGENTS.md +90 -0
  329. package/src/session/llm/ai-sdk.ts +288 -0
  330. package/src/session/llm/native-request.ts +196 -0
  331. package/src/session/llm/native-runtime.ts +195 -0
  332. package/src/session/llm/request.ts +216 -0
  333. package/src/session/llm.ts +415 -0
  334. package/src/session/message-error.ts +14 -0
  335. package/src/session/message-v2.ts +744 -0
  336. package/src/session/message.ts +148 -0
  337. package/src/session/overflow.ts +34 -0
  338. package/src/session/processor.ts +1084 -0
  339. package/src/session/prompt/anthropic.txt +105 -0
  340. package/src/session/prompt/beast.txt +147 -0
  341. package/src/session/prompt/build-switch.txt +5 -0
  342. package/src/session/prompt/codex.txt +79 -0
  343. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  344. package/src/session/prompt/default.txt +95 -0
  345. package/src/session/prompt/gemini.txt +155 -0
  346. package/src/session/prompt/gpt.txt +107 -0
  347. package/src/session/prompt/kimi.txt +95 -0
  348. package/src/session/prompt/max-steps.txt +16 -0
  349. package/src/session/prompt/plan-mode.txt +70 -0
  350. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  351. package/src/session/prompt/plan.txt +26 -0
  352. package/src/session/prompt/trinity.txt +97 -0
  353. package/src/session/prompt/ultrawork.txt +289 -0
  354. package/src/session/prompt.ts +1725 -0
  355. package/src/session/reminders.ts +92 -0
  356. package/src/session/retry.ts +201 -0
  357. package/src/session/revert.ts +160 -0
  358. package/src/session/run-state.ts +156 -0
  359. package/src/session/schema.ts +26 -0
  360. package/src/session/session.ts +1119 -0
  361. package/src/session/status.ts +97 -0
  362. package/src/session/summary.ts +165 -0
  363. package/src/session/system.ts +117 -0
  364. package/src/session/todo.ts +90 -0
  365. package/src/session/tools.ts +207 -0
  366. package/src/session/ultrawork.ts +26 -0
  367. package/src/share/session.ts +61 -0
  368. package/src/share/share-next.ts +385 -0
  369. package/src/skill/discovery.ts +109 -0
  370. package/src/skill/index.ts +366 -0
  371. package/src/snapshot/index.ts +808 -0
  372. package/src/sql.d.ts +4 -0
  373. package/src/storage/schema.ts +5 -0
  374. package/src/storage/storage.ts +329 -0
  375. package/src/sync/README.md +179 -0
  376. package/src/sync/schema.ts +11 -0
  377. package/src/temporary.ts +31 -0
  378. package/src/tool/apply_patch.ts +313 -0
  379. package/src/tool/apply_patch.txt +33 -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 +440 -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 +307 -0
  403. package/src/tool/shell/shell.txt +21 -0
  404. package/src/tool/shell.ts +657 -0
  405. package/src/tool/skill.ts +71 -0
  406. package/src/tool/skill.txt +5 -0
  407. package/src/tool/task.ts +346 -0
  408. package/src/tool/task.txt +19 -0
  409. package/src/tool/todo.ts +57 -0
  410. package/src/tool/todowrite.txt +44 -0
  411. package/src/tool/tool.ts +183 -0
  412. package/src/tool/truncate.ts +158 -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/iife.ts +3 -0
  428. package/src/util/lazy.ts +20 -0
  429. package/src/util/local-context.ts +25 -0
  430. package/src/util/locale.ts +2 -0
  431. package/src/util/media.ts +26 -0
  432. package/src/util/process.ts +177 -0
  433. package/src/util/proxy-env.ts +72 -0
  434. package/src/util/queue.ts +32 -0
  435. package/src/util/record.ts +1 -0
  436. package/src/util/repository.ts +232 -0
  437. package/src/util/rpc.ts +66 -0
  438. package/src/util/signal.ts +12 -0
  439. package/src/util/timeout.ts +13 -0
  440. package/src/util/token.ts +1 -0
  441. package/src/util/wildcard.ts +59 -0
  442. package/src/worktree/index.ts +654 -0
  443. package/sst-env.d.ts +10 -0
  444. package/test/AGENTS.md +204 -0
  445. package/test/EFFECT_TEST_MIGRATION.md +169 -0
  446. package/test/account/repo.test.ts +353 -0
  447. package/test/account/service.test.ts +453 -0
  448. package/test/acp/config-option.test.ts +229 -0
  449. package/test/acp/content.test.ts +201 -0
  450. package/test/acp/directory.test.ts +186 -0
  451. package/test/acp/error.test.ts +67 -0
  452. package/test/acp/event.test.ts +743 -0
  453. package/test/acp/permission.test.ts +273 -0
  454. package/test/acp/service-session.test.ts +1174 -0
  455. package/test/acp/session.test.ts +200 -0
  456. package/test/acp/tool.test.ts +210 -0
  457. package/test/acp/usage.test.ts +315 -0
  458. package/test/agent/agent.test.ts +760 -0
  459. package/test/agent/plan-mode-subagent-bypass.test.ts +159 -0
  460. package/test/agent/plugin-agent-regression.test.ts +64 -0
  461. package/test/auth/auth.test.ts +77 -0
  462. package/test/background/job.test.ts +243 -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 +39 -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 +631 -0
  477. package/test/cli/help/help-snapshots.test.ts +137 -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 +84 -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 +1065 -0
  495. package/test/cli/run/session-data.test.ts +595 -0
  496. package/test/cli/run/session-replay.test.ts +692 -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 +217 -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 +36 -0
  516. package/test/config/agent-color.test.ts +47 -0
  517. package/test/config/config.test.ts +2041 -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 +886 -0
  528. package/test/control-plane/adapters.test.ts +71 -0
  529. package/test/control-plane/workspace.test.ts +1703 -0
  530. package/test/effect/app-graph-types.test.ts +108 -0
  531. package/test/effect/app-graph.test.ts +204 -0
  532. package/test/effect/app-runtime-logger.test.ts +99 -0
  533. package/test/effect/config-service.test.ts +65 -0
  534. package/test/effect/instance-state.test.ts +391 -0
  535. package/test/effect/run-service.test.ts +89 -0
  536. package/test/effect/runner.test.ts +514 -0
  537. package/test/effect/runtime-flags.test.ts +373 -0
  538. package/test/fake/account.ts +9 -0
  539. package/test/fake/auth.ts +8 -0
  540. package/test/fake/npm.ts +8 -0
  541. package/test/fake/provider.ts +82 -0
  542. package/test/fake/skill.ts +8 -0
  543. package/test/filesystem/filesystem.test.ts +319 -0
  544. package/test/fixture/agent-plugin.constants.ts +6 -0
  545. package/test/fixture/agent-plugin.ts +12 -0
  546. package/test/fixture/config.ts +23 -0
  547. package/test/fixture/db.ts +11 -0
  548. package/test/fixture/fixture.test.ts +26 -0
  549. package/test/fixture/fixture.ts +224 -0
  550. package/test/fixture/flag.ts +20 -0
  551. package/test/fixture/flock-worker.ts +72 -0
  552. package/test/fixture/lsp/fake-lsp-server.js +249 -0
  553. package/test/fixture/mcp-session-recovery.ts +50 -0
  554. package/test/fixture/plug-worker.ts +93 -0
  555. package/test/fixture/plugin-meta-worker.ts +19 -0
  556. package/test/fixture/plugin.ts +10 -0
  557. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  558. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  559. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  560. package/test/fixture/skills/index.json +6 -0
  561. package/test/fixture/tui-environment.tsx +32 -0
  562. package/test/fixture/tui-plugin.ts +355 -0
  563. package/test/fixture/tui-runtime.ts +56 -0
  564. package/test/fixture/tui-sdk.ts +82 -0
  565. package/test/fixture/workspace.ts +30 -0
  566. package/test/fixtures/recordings/session/native-anthropic-tool-loop.json +49 -0
  567. package/test/fixtures/recordings/session/native-openai-oauth-tool-loop.json +45 -0
  568. package/test/fixtures/recordings/session/native-zen-tool-loop.json +49 -0
  569. package/test/format/format.test.ts +228 -0
  570. package/test/git/git.test.ts +178 -0
  571. package/test/ide/ide.test.ts +82 -0
  572. package/test/image/fixtures/picture-5mb-base64.png +0 -0
  573. package/test/image/image.test.ts +123 -0
  574. package/test/installation/installation.test.ts +230 -0
  575. package/test/lib/cli-process.ts +459 -0
  576. package/test/lib/effect.ts +177 -0
  577. package/test/lib/filesystem.ts +10 -0
  578. package/test/lib/llm-server.ts +779 -0
  579. package/test/lib/snapshot.ts +73 -0
  580. package/test/lib/test-provider.ts +37 -0
  581. package/test/lib/websocket.ts +46 -0
  582. package/test/lsp/client.test.ts +488 -0
  583. package/test/lsp/index.test.ts +232 -0
  584. package/test/lsp/jdtls-root.test.ts +459 -0
  585. package/test/lsp/launch.test.ts +22 -0
  586. package/test/lsp/lifecycle.test.ts +160 -0
  587. package/test/mcp/auth.test.ts +78 -0
  588. package/test/mcp/headers.test.ts +126 -0
  589. package/test/mcp/lifecycle.test.ts +1213 -0
  590. package/test/mcp/oauth-auto-connect.test.ts +276 -0
  591. package/test/mcp/oauth-browser.test.ts +239 -0
  592. package/test/mcp/oauth-callback.test.ts +34 -0
  593. package/test/mcp/oauth-provider.test.ts +61 -0
  594. package/test/mcp/session-recovery.test.ts +27 -0
  595. package/test/patch/patch.test.ts +383 -0
  596. package/test/permission/arity.test.ts +33 -0
  597. package/test/permission/next.test.ts +1176 -0
  598. package/test/permission-task.test.ts +318 -0
  599. package/test/plugin/auth-override.test.ts +105 -0
  600. package/test/plugin/cloudflare.test.ts +68 -0
  601. package/test/plugin/codex.test.ts +247 -0
  602. package/test/plugin/github-copilot-models.test.ts +332 -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 +1303 -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 +877 -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 +120 -0
  612. package/test/plugin/workspace-adapter.test.ts +140 -0
  613. package/test/plugin/xai.test.ts +634 -0
  614. package/test/preload.ts +92 -0
  615. package/test/project/instance-bootstrap.test.ts +110 -0
  616. package/test/project/instance.test.ts +245 -0
  617. package/test/project/migrate-global.test.ts +167 -0
  618. package/test/project/project-directory.test.ts +201 -0
  619. package/test/project/project.test.ts +815 -0
  620. package/test/project/vcs.test.ts +336 -0
  621. package/test/project/worktree-remove.test.ts +126 -0
  622. package/test/project/worktree.test.ts +320 -0
  623. package/test/provider/amazon-bedrock.test.ts +360 -0
  624. package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
  625. package/test/provider/digitalocean.test.ts +123 -0
  626. package/test/provider/gitlab-duo.test.ts +412 -0
  627. package/test/provider/header-timeout.test.ts +233 -0
  628. package/test/provider/model-status.test.ts +61 -0
  629. package/test/provider/provider.test.ts +1793 -0
  630. package/test/provider/transform.test.ts +4207 -0
  631. package/test/question/question.test.ts +465 -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 +104 -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 +1685 -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 +123 -0
  654. package/test/server/httpapi-experimental.test.ts +297 -0
  655. package/test/server/httpapi-file.test.ts +73 -0
  656. package/test/server/httpapi-global.test.ts +66 -0
  657. package/test/server/httpapi-instance-context.test.ts +348 -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 +412 -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 +223 -0
  666. package/test/server/httpapi-provider.test.ts +400 -0
  667. package/test/server/httpapi-pty.test.ts +299 -0
  668. package/test/server/httpapi-public-openapi.test.ts +319 -0
  669. package/test/server/httpapi-query-schema-drift.test.ts +330 -0
  670. package/test/server/httpapi-reference.test.ts +62 -0
  671. package/test/server/httpapi-schema-error-body.test.ts +165 -0
  672. package/test/server/httpapi-sdk.test.ts +909 -0
  673. package/test/server/httpapi-session.test.ts +1011 -0
  674. package/test/server/httpapi-sync.test.ts +148 -0
  675. package/test/server/httpapi-ui.test.ts +453 -0
  676. package/test/server/httpapi-v2-location.test.ts +82 -0
  677. package/test/server/httpapi-v2-pty.test.ts +250 -0
  678. package/test/server/httpapi-workspace-routing.test.ts +555 -0
  679. package/test/server/httpapi-workspace.test.ts +513 -0
  680. package/test/server/negative-tokens-regression.test.ts +83 -0
  681. package/test/server/project-copy.test.ts +121 -0
  682. package/test/server/project-init-git.test.ts +114 -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 +109 -0
  687. package/test/server/session-diff-missing-patch.test.ts +96 -0
  688. package/test/server/session-list.test.ts +312 -0
  689. package/test/server/session-messages.test.ts +179 -0
  690. package/test/server/session-select.test.ts +66 -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 +1834 -0
  695. package/test/session/instruction.test.ts +256 -0
  696. package/test/session/llm-native-recorded.test.ts +433 -0
  697. package/test/session/llm-native.test.ts +760 -0
  698. package/test/session/llm.test.ts +1932 -0
  699. package/test/session/message-v2.test.ts +1661 -0
  700. package/test/session/messages-pagination.test.ts +1056 -0
  701. package/test/session/processor-effect.test.ts +1076 -0
  702. package/test/session/prompt.test.ts +2326 -0
  703. package/test/session/retry.test.ts +439 -0
  704. package/test/session/revert-compact.test.ts +639 -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 +248 -0
  708. package/test/session/snapshot-tool-race.test.ts +190 -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 +86 -0
  712. package/test/session/ultrawork.test.ts +25 -0
  713. package/test/share/share-next.test.ts +326 -0
  714. package/test/skill/discovery.test.ts +139 -0
  715. package/test/skill/skill.test.ts +571 -0
  716. package/test/snapshot/snapshot.test.ts +1121 -0
  717. package/test/storage/storage.test.ts +296 -0
  718. package/test/tool/__snapshots__/parameters.test.ts.snap +484 -0
  719. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  720. package/test/tool/apply_patch.test.ts +533 -0
  721. package/test/tool/edit.test.ts +578 -0
  722. package/test/tool/external-directory.test.ts +155 -0
  723. package/test/tool/fixtures/large-image.png +0 -0
  724. package/test/tool/fixtures/models-api.json +117299 -0
  725. package/test/tool/glob.test.ts +136 -0
  726. package/test/tool/grep.test.ts +225 -0
  727. package/test/tool/lsp.test.ts +181 -0
  728. package/test/tool/parameters.test.ts +293 -0
  729. package/test/tool/question.test.ts +138 -0
  730. package/test/tool/read.test.ts +605 -0
  731. package/test/tool/registry.test.ts +497 -0
  732. package/test/tool/shell.test.ts +1238 -0
  733. package/test/tool/skill.test.ts +136 -0
  734. package/test/tool/task.test.ts +898 -0
  735. package/test/tool/tool-define.test.ts +153 -0
  736. package/test/tool/truncation.test.ts +266 -0
  737. package/test/tool/webfetch.test.ts +113 -0
  738. package/test/tool/websearch.test.ts +99 -0
  739. package/test/tool/write.test.ts +276 -0
  740. package/test/util/data-url.test.ts +14 -0
  741. package/test/util/error.test.ts +16 -0
  742. package/test/util/filesystem.test.ts +656 -0
  743. package/test/util/glob.test.ts +164 -0
  744. package/test/util/iife.test.ts +36 -0
  745. package/test/util/lazy.test.ts +50 -0
  746. package/test/util/module.test.ts +59 -0
  747. package/test/util/process.test.ts +128 -0
  748. package/test/util/repository.test.ts +93 -0
  749. package/test/util/timeout.test.ts +21 -0
  750. package/test/util/wildcard.test.ts +90 -0
  751. package/test/v2/session-message-updater.test.ts +269 -0
  752. package/tsconfig.json +16 -0
@@ -0,0 +1,218 @@
1
+ # Facade removal checklist
2
+
3
+ Concrete inventory of the remaining `makeRuntime(...)`-backed facades in `packages/miaw`.
4
+
5
+ Current status on this branch:
6
+
7
+ - `src/` has 5 `makeRuntime(...)` call sites total.
8
+ - 2 are intentionally excluded from this checklist: `src/bus/index.ts` and `src/effect/cross-spawn-spawner.ts`.
9
+ - That leaves 2 live runtime-backed service facades still worth tracking here: `src/npm/index.ts` and `src/cli/cmd/tui/config/tui.ts`.
10
+
11
+ Recent progress:
12
+
13
+ - Wave 1 is merged: `Pty`, `Skill`, `Vcs`, `ToolRegistry`, `Auth`.
14
+ - Wave 2 is merged: `Config`, `Provider`, `File`, `LSP`, `MCP`.
15
+
16
+ ## Priority hotspots
17
+
18
+ - `src/cli/cmd/tui/config/tui.ts` still exports `makeRuntime(...)` plus async facade helpers for `get()` and `waitForDependencies()`.
19
+ - `src/npm/index.ts` still exports `makeRuntime(...)` plus async facade helpers for `install()`, `add()`, `outdated()`, and `which()`.
20
+
21
+ ## Completed Batches
22
+
23
+ Low-risk batch, all merged:
24
+
25
+ 1. `src/pty/index.ts`
26
+ 2. `src/skill/index.ts`
27
+ 3. `src/project/vcs.ts`
28
+ 4. `src/tool/registry.ts`
29
+ 5. `src/auth/index.ts`
30
+
31
+ Caller-heavy batch, all merged:
32
+
33
+ 1. `src/config/config.ts`
34
+ 2. `src/provider/provider.ts`
35
+ 3. `../core/src/filesystem.ts`
36
+ 4. `src/lsp/index.ts`
37
+ 5. `src/mcp/index.ts`
38
+
39
+ Shared pattern:
40
+
41
+ - one service file still exports `makeRuntime(...)` + async facades
42
+ - one or two route or CLI entrypoints call those facades directly
43
+ - tests call the facade directly and need to switch to `yield* svc.method(...)`
44
+ - once callers are gone, delete `makeRuntime(...)`, remove async facade exports, and drop the `makeRuntime` import
45
+
46
+ ## Done means
47
+
48
+ For each service in the low-risk batch, the work is complete only when all of these are true:
49
+
50
+ 1. all production callers stop using `Namespace.method(...)` facade calls
51
+ 2. all direct test callers stop using the facade and instead yield the service from context
52
+ 3. the service file no longer has `makeRuntime(...)`
53
+ 4. the service file no longer exports runtime-backed facade helpers
54
+ 5. `grep` for the migrated facade methods only finds the service implementation itself or unrelated names
55
+
56
+ ## Caller templates
57
+
58
+ ### Route handlers
59
+
60
+ Use one `AppRuntime.runPromise(Effect.gen(...))` body and yield the service inside it.
61
+
62
+ ```ts
63
+ const value = await AppRuntime.runPromise(
64
+ Effect.gen(function* () {
65
+ const pty = yield* Pty.Service
66
+ return yield* pty.list()
67
+ }),
68
+ )
69
+ ```
70
+
71
+ If two service calls are independent, keep them in the same effect body and use `Effect.all(...)`.
72
+
73
+ ### Plain async CLI or script entrypoints
74
+
75
+ If the caller is not itself an Effect service yet, still prefer one contiguous `AppRuntime.runPromise(Effect.gen(...))` block for the whole unit of work.
76
+
77
+ ```ts
78
+ const skills = await AppRuntime.runPromise(
79
+ Effect.gen(function* () {
80
+ const auth = yield* Auth.Service
81
+ const skill = yield* Skill.Service
82
+ yield* auth.set(key, info)
83
+ return yield* skill.all()
84
+ }),
85
+ )
86
+ ```
87
+
88
+ Only fall back to `AppRuntime.runPromise(Service.use(...))` for truly isolated one-off calls or awkward callback boundaries. Do not stack multiple tiny `runPromise(...)` calls in the same contiguous workflow.
89
+
90
+ This is the right intermediate state. Do not block facade removal on effectifying the whole CLI file.
91
+
92
+ ### Bootstrap or fire-and-forget startup code
93
+
94
+ If the old facade call existed only to kick off initialization, call the service through the existing runtime for that file.
95
+
96
+ ```ts
97
+ void BootstrapRuntime.runPromise(Vcs.Service.use((svc) => svc.init()))
98
+ ```
99
+
100
+ Do not reintroduce a dedicated runtime in the service just for bootstrap.
101
+
102
+ ### Tests
103
+
104
+ Convert facade tests to full effect style.
105
+
106
+ ```ts
107
+ it.effect("does the thing", () =>
108
+ Effect.gen(function* () {
109
+ const svc = yield* Pty.Service
110
+ const info = yield* svc.create({ command: "cat", title: "a" })
111
+ yield* svc.remove(info.id)
112
+ }).pipe(Effect.provide(Pty.defaultLayer)),
113
+ )
114
+ ```
115
+
116
+ If the repo test already uses `testEffect(...)`, prefer `testEffect(Service.defaultLayer)` and `yield* Service.Service` inside the test body.
117
+
118
+ Do not route tests through `AppRuntime` unless the test is explicitly exercising the app runtime. For facade removal, tests should usually provide the specific service layer they need.
119
+
120
+ If the test uses `provideTmpdirInstance(...)`, remember that fixture needs a live `ChildProcessSpawner` layer. For services whose `defaultLayer` does not already provide that infra, prefer the repo-standard cross-spawn layer:
121
+
122
+ ```ts
123
+ const infra = CrossSpawnSpawner.defaultLayer
124
+
125
+ const it = testEffect(Layer.mergeAll(MyService.defaultLayer, infra))
126
+ ```
127
+
128
+ Without that extra layer, tests fail at runtime with `Service not found: effect/process/ChildProcessSpawner`.
129
+
130
+ ## Questions already answered
131
+
132
+ ### Do we need to effectify the whole caller first?
133
+
134
+ No.
135
+
136
+ - route files: compose the handler with `AppRuntime.runPromise(Effect.gen(...))`
137
+ - CLI and scripts: use `AppRuntime.runPromise(Service.use(...))`
138
+ - bootstrap: use the existing bootstrap runtime
139
+
140
+ Facade removal does not require a bigger refactor than that.
141
+
142
+ ### Should tests keep calling the namespace from async test bodies?
143
+
144
+ No. Convert them now.
145
+
146
+ The end state is `yield* svc.method(...)`, not `await Namespace.method(...)` inside `async` tests.
147
+
148
+ ### Should we keep `runPromise` exported for convenience?
149
+
150
+ No. For this batch the goal is to delete the service-local runtime entirely.
151
+
152
+ ### What if a route has websocket callbacks or nested async handlers?
153
+
154
+ Keep the route shape, but replace each facade call with `AppRuntime.runPromise(Service.use(...))` or wrap the surrounding async section in one `Effect.gen(...)` when practical. Do not keep the service facade just because the route has callback-shaped code.
155
+
156
+ ### Should we use one `runPromise` per service call?
157
+
158
+ No.
159
+
160
+ Default to one contiguous `AppRuntime.runPromise(Effect.gen(...))` block per handler, command, or workflow. Yield every service you need inside that block.
161
+
162
+ Multiple tiny `runPromise(...)` calls are only acceptable when the caller structure forces it, such as websocket lifecycle callbacks, external callback APIs, or genuinely unrelated one-off operations.
163
+
164
+ ### Should we wrap a single service expression in `Effect.gen(...)`?
165
+
166
+ Usually no.
167
+
168
+ Prefer the direct form when there is only one expression:
169
+
170
+ ```ts
171
+ await Effect.runPromise(FileSystem.Service.use((svc) => svc.read({ path })))
172
+ ```
173
+
174
+ Use `Effect.gen(...)` when the workflow actually needs multiple yielded values or branching.
175
+
176
+ ## Learnings
177
+
178
+ These were the recurring mistakes and useful corrections from the first two batches:
179
+
180
+ 1. Tests should usually provide the specific service layer, not `AppRuntime`.
181
+ 2. If a test uses `provideTmpdirInstance(...)` and needs child processes, prefer `CrossSpawnSpawner.defaultLayer`.
182
+ 3. Location-scoped services may need both the service layer and the right location fixture. `FileSystem` tests, for example, provide `Location.Service` plus `FileSystem.locationLayer`.
183
+ 4. Do not wrap a single `Service.use(...)` call in `Effect.gen(...)` just to return it. Use the direct form.
184
+ 5. For CLI readability, extract file-local preload helpers when the handler starts doing config load + service load + batched effect fanout inline.
185
+ 6. When rebasing a facade branch after nearby merges, prefer the already-cleaned service/test version over older inline facade-era code.
186
+
187
+ ## Remaining work
188
+
189
+ Most of the original facade-removal backlog is already done. The practical remaining work is narrower now:
190
+
191
+ 1. remove the `Npm` runtime-backed facade from `src/npm/index.ts`
192
+ 2. remove the `TuiConfig` runtime-backed facade from `src/cli/cmd/tui/config/tui.ts`
193
+
194
+ ## Checklist
195
+
196
+ - [ ] `src/npm/index.ts` (`Npm`) - still exports runtime-backed async facade helpers on top of `Npm.Service`
197
+ - [ ] `src/cli/cmd/tui/config/tui.ts` (`TuiConfig`) - still exports runtime-backed async facade helpers on top of `TuiConfig.Service`
198
+ - [x] `src/session/session.ts` / `src/session/prompt.ts` / `src/session/revert.ts` / `src/session/summary.ts` - service-local facades removed
199
+ - [x] `src/agent/agent.ts` (`Agent`) - service-local facades removed
200
+ - [x] `src/permission/index.ts` (`Permission`) - service-local facades removed
201
+ - [x] `src/worktree/index.ts` (`Worktree`) - service-local facades removed
202
+ - [x] `src/plugin/index.ts` (`Plugin`) - service-local facades removed
203
+ - [x] `src/snapshot/index.ts` (`Snapshot`) - service-local facades removed
204
+ - [x] `../core/src/filesystem.ts` (`FileSystem`) - legacy miaw service removed
205
+ - [x] `src/lsp/index.ts` (`LSP`) - facades removed and merged
206
+ - [x] `src/mcp/index.ts` (`MCP`) - facades removed and merged
207
+ - [x] `src/config/config.ts` (`Config`) - facades removed and merged
208
+ - [x] `src/provider/provider.ts` (`Provider`) - facades removed and merged
209
+ - [x] `src/pty/index.ts` (`Pty`) - facades removed and merged
210
+ - [x] `src/skill/index.ts` (`Skill`) - facades removed and merged
211
+ - [x] `src/project/vcs.ts` (`Vcs`) - facades removed and merged
212
+ - [x] `src/tool/registry.ts` (`ToolRegistry`) - facades removed and merged
213
+ - [x] `src/auth/index.ts` (`Auth`) - facades removed and merged
214
+
215
+ ## Excluded `makeRuntime(...)` sites
216
+
217
+ - `src/bus/index.ts` - core bus plumbing, not a normal facade-removal target.
218
+ - `src/effect/cross-spawn-spawner.ts` - runtime helper for `ChildProcessSpawner`, not a service namespace facade.
@@ -0,0 +1,247 @@
1
+ # Effect Guide
2
+
3
+ How we write Effect code in `packages/miaw`. The companion roadmap is
4
+ [`todo.md`](./todo.md).
5
+
6
+ This guide describes the preferred shape for new work and migrations. If a
7
+ legacy file differs, migrate it only when it is already in scope.
8
+
9
+ ## Service Shape
10
+
11
+ Use one module per service: flat top-level exports, traced Effect methods,
12
+ explicit layers, and a self-reexport at the bottom.
13
+
14
+ ```ts
15
+ export interface Interface {
16
+ readonly get: (id: FooID) => Effect.Effect<FooInfo, FooError>
17
+ }
18
+
19
+ export class Service extends Context.Service<Service, Interface>()("@miaw/Foo") {}
20
+
21
+ export const layer = Layer.effect(
22
+ Service,
23
+ Effect.gen(function* () {
24
+ const state = yield* InstanceState.make<State>(Effect.fn("Foo.state")(() => Effect.succeed({})))
25
+
26
+ const get = Effect.fn("Foo.get")(function* (id: FooID) {
27
+ const s = yield* InstanceState.get(state)
28
+ return yield* loadFoo(s, id)
29
+ })
30
+
31
+ return Service.of({ get })
32
+ }),
33
+ )
34
+
35
+ export const defaultLayer = layer.pipe(Layer.provide(FooDep.defaultLayer))
36
+
37
+ export * as Foo from "./foo"
38
+ ```
39
+
40
+ Rules:
41
+
42
+ - Do not use `export namespace Foo { ... }`.
43
+ - Use `Effect.fn("Foo.method")` for public service methods.
44
+ - Use `Effect.fnUntraced` for small internal helpers that do not need a
45
+ span.
46
+ - Keep helpers as non-exported top-level declarations in the same file.
47
+ - Self-reexport with `export * as Foo from "."` for `index.ts`, otherwise
48
+ `export * as Foo from "./foo"`.
49
+ - In `src/config`, keep the existing top-of-file self-export pattern.
50
+
51
+ ## Runtime Boundaries
52
+
53
+ Most code should run through [`AppRuntime`](../../src/effect/app-runtime.ts).
54
+ It hosts `AppLayer`, shares the global `memoMap`, and restores the current
55
+ instance/workspace refs when crossing from non-Effect code.
56
+
57
+ Use `AppRuntime.runPromise(effect)` at app boundaries such as CLI commands,
58
+ HTTP handlers, or plain async adapters.
59
+
60
+ `makeRuntime(...)` still exists for a few intentional service-local
61
+ boundaries and migration leftovers. Do not add a new service-local runtime
62
+ unless the service truly cannot live in `AppLayer`.
63
+
64
+ ## Runtime Flags
65
+
66
+ Read miaw runtime flags through
67
+ [`RuntimeFlags.Service`](../../src/effect/runtime-flags.ts), not through
68
+ mutable `Flag` or late `process.env` reads.
69
+
70
+ Tests should vary behavior with explicit layer variants:
71
+
72
+ ```ts
73
+ const it = testEffect(MyService.defaultLayer.pipe(Layer.provide(RuntimeFlags.layer({ experimentalReferences: true }))))
74
+ ```
75
+
76
+ Do not mutate `process.env` or `Flag` after services/layers are built.
77
+
78
+ ## Per-Instance State
79
+
80
+ Use [`InstanceState`](../../src/effect/instance-state.ts) when two open
81
+ directories should not share one copy of a service's state. It is backed by
82
+ a `ScopedCache`, keyed by directory, and disposed automatically when an
83
+ instance is unloaded.
84
+
85
+ Put subscriptions, finalizers, and scoped background work inside the
86
+ `InstanceState.make(...)` initializer:
87
+
88
+ ```ts
89
+ const cache =
90
+ yield *
91
+ InstanceState.make<State>(
92
+ Effect.fn("Foo.state")(function* () {
93
+ const bus = yield* Bus.Service
94
+
95
+ yield* bus.subscribeAll().pipe(
96
+ Stream.runForEach((event) => handleEvent(event)),
97
+ Effect.forkScoped,
98
+ )
99
+
100
+ yield* Effect.acquireRelease(openResource, closeResource)
101
+
102
+ return yield* loadInitialState()
103
+ }),
104
+ )
105
+ ```
106
+
107
+ Do not add separate `started` flags on top of `InstanceState`. Let
108
+ `ScopedCache` handle run-once and deduplication.
109
+
110
+ To make `init()` non-blocking, fork at the caller/bootstrap boundary. Do
111
+ not fork inside `InstanceState.make(...)` just to return early with
112
+ partially initialized state.
113
+
114
+ ## Errors
115
+
116
+ Expected domain failures belong on the Effect error channel. Defects are
117
+ for bugs, impossible states, and final unknown-boundary fallbacks.
118
+
119
+ ```ts
120
+ export class SessionBusyError extends Schema.TaggedErrorClass<SessionBusyError>()("SessionBusyError", {
121
+ sessionID: SessionID,
122
+ message: Schema.String,
123
+ }) {}
124
+
125
+ export type Error = Storage.Error | SessionBusyError
126
+
127
+ export interface Interface {
128
+ readonly get: (id: SessionID) => Effect.Effect<Info, Error>
129
+ }
130
+ ```
131
+
132
+ Rules:
133
+
134
+ - Use `Schema.TaggedErrorClass` for new expected domain errors.
135
+ - Export a domain-level `Error` union from service modules.
136
+ - In `Effect.gen` / `Effect.fn`, prefer `yield* new MyError(...)` for
137
+ direct expected failures.
138
+ - Use `Schema.Defect` for unknown cause fields.
139
+ - Use `Effect.try(...)`, `Effect.tryPromise(...)`, `Effect.mapError`,
140
+ `Effect.catchTag`, and `Effect.catchTags` to translate external
141
+ failures into domain errors.
142
+ - Do not use `Effect.die(...)` for user, IO, validation, missing-resource,
143
+ auth, provider, or busy-state failures.
144
+
145
+ ## HTTP Error Boundaries
146
+
147
+ Service modules stay HTTP-agnostic. They should not import HTTP status
148
+ codes, `HttpApiError`, `HttpServerResponse`, or route-specific error
149
+ schemas.
150
+
151
+ HTTP handlers translate service errors into endpoint-declared public error
152
+ schemas. Keep mappings inline when they are one-off; extract tiny shared
153
+ helpers only when the same translation repeats.
154
+
155
+ Do not turn generic middleware into a registry of domain errors. Middleware
156
+ should handle cross-cutting concerns and the final unknown-defect fallback.
157
+
158
+ Preserve legacy public wire shapes, such as `{ name, data }`, until a
159
+ deliberate breaking API change.
160
+
161
+ ## Schemas
162
+
163
+ Use Effect Schema as the source of truth.
164
+
165
+ - Use `Schema.Class` for exported data objects with a clear identity.
166
+ - Use `Schema.Struct` for local shapes and simple nested objects.
167
+ - Use `Schema.brand` for single-value IDs.
168
+ - Reuse named refinements instead of re-spelling constraints.
169
+ - Prefer narrow boundary helpers over generic Schema-to-Zod bridges.
170
+
171
+ Intentional boundaries:
172
+
173
+ - Public plugin tools still expose Zod through `tool.schema = z`.
174
+ - Tool parameter JSON Schema is generated through tool-specific helpers.
175
+ - Public config and TUI schemas are generated through the schema script.
176
+
177
+ ## Preferred Services
178
+
179
+ In effectified code, yield existing services instead of dropping to ad hoc
180
+ platform APIs.
181
+
182
+ - Use `FSUtil.Service` instead of raw `fs/promises` for app file IO.
183
+ - Use `AppProcess.Service` instead of direct `ChildProcessSpawner.spawn` or
184
+ legacy process helpers.
185
+ - Use `HttpClient.HttpClient` instead of raw `fetch` inside Effect code.
186
+ - Use `Path.Path`, `Config`, `Clock`, and `DateTime` when already inside
187
+ Effect.
188
+ - Use `Effect.callback` for callback-based APIs.
189
+ - Use `Effect.void` instead of `Effect.succeed(undefined)`.
190
+ - Use `Effect.cached` when concurrent callers should share one in-flight
191
+ computation.
192
+
193
+ For background loops, use `Effect.repeat` or `Effect.schedule` with
194
+ `Effect.forkScoped` in the owning layer/state scope.
195
+
196
+ ## Promise And ALS Bridges
197
+
198
+ [`EffectBridge`](../../src/effect/bridge.ts) is the sanctioned helper for
199
+ Promise/callback interop that needs to preserve instance/workspace context.
200
+ It preserves explicit `InstanceRef` / `WorkspaceRef` context for effects run
201
+ through the bridge. Plain JS callbacks that need instance data should receive
202
+ that data explicitly.
203
+
204
+ ## Testing
205
+
206
+ Detailed test migration rules live in
207
+ [`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md).
208
+
209
+ Core pattern:
210
+
211
+ ```ts
212
+ const it = testEffect(Layer.mergeAll(MyService.defaultLayer))
213
+
214
+ describe("my service", () => {
215
+ it.instance("does the thing", () =>
216
+ Effect.gen(function* () {
217
+ const svc = yield* MyService.Service
218
+ expect(yield* svc.run()).toEqual("ok")
219
+ }),
220
+ )
221
+ })
222
+ ```
223
+
224
+ Rules:
225
+
226
+ - Use `it.effect(...)` for TestClock/TestConsole tests.
227
+ - Use `it.live(...)` for real timers, filesystem mtimes, child processes,
228
+ git, locks, or other live integration behavior.
229
+ - Use `it.instance(...)` for service tests that need a scoped instance.
230
+ - Prefer Effect-aware fixtures from `test/fixture/fixture.ts`.
231
+ - Avoid sleeps; wait for real events or deterministic state transitions.
232
+ - Avoid mutable `process.env`, `Flag`, or module-global changes after
233
+ layers are built.
234
+ - Use `Layer.mock` for partial service stubs.
235
+ - Avoid custom `ManagedRuntime`, `attach(...)`, or ad hoc `run(...)` test
236
+ wrappers.
237
+
238
+ ## Verification
239
+
240
+ From `packages/miaw`:
241
+
242
+ ```bash
243
+ bun run typecheck
244
+ bun run test -- path/to/test.ts
245
+ ```
246
+
247
+ Do not run tests from the repo root; the repo has a guard for that.
@@ -0,0 +1,13 @@
1
+ # Instance Context
2
+
3
+ Instance selection is now Effect-provided context.
4
+
5
+ Use these APIs:
6
+
7
+ - `InstanceRef` for the current project context.
8
+ - `WorkspaceRef` for the current workspace id.
9
+ - `InstanceState.context` / `InstanceState.directory` inside Effect services that require an instance.
10
+ - `InstanceStore` at entry boundaries that need to load, reload, or dispose project contexts.
11
+ - `EffectBridge` for native, plugin, or plain JavaScript callback boundaries that need to re-enter Effect with captured refs.
12
+
13
+ Do not add new ambient instance globals. Promise and callback boundaries should either stay in Effect, use `EffectBridge`, or pass the required context explicitly.
@@ -0,0 +1,30 @@
1
+ # Effect loose ends
2
+
3
+ Small follow-ups that do not fit neatly into the main facade, route, tool, or schema migration checklists.
4
+
5
+ ## Config / TUI
6
+
7
+ - [ ] `cli/cmd/tui/config/tui.ts` - finish the internal Effect migration.
8
+ Keep the current precedence and migration semantics intact while converting the remaining internal async helpers (`loadState`, `mergeFile`, `loadFile`, `load`) to `Effect.gen(...)` / `Effect.fn(...)`.
9
+ - [ ] `cli/cmd/tui/config/tui.ts` callers - once the internal service is stable, migrate plain async callers to use `TuiConfig.Service` directly where that actually simplifies the code.
10
+ Likely first callers: `cli/cmd/tui/attach.ts`, `cli/cmd/tui/thread.ts`, `cli/cmd/tui/plugin/runtime.ts`.
11
+ - [x] `env/index.ts` - already uses `InstanceState.make(...)`.
12
+
13
+ ## ConfigPaths
14
+
15
+ - [ ] `config/paths.ts` - split pure helpers from effectful helpers.
16
+ Keep `fileInDirectory(...)` as a plain function.
17
+ - [ ] `config/paths.ts` - add a `ConfigPaths.Service` for the effectful operations so callers do not inherit `FSUtil.Service` directly.
18
+ Initial service surface should cover:
19
+ - `projectFiles(...)`
20
+ - `directories(...)`
21
+ - `readFile(...)`
22
+ - `parseText(...)`
23
+ - [ ] `config/config.ts` - switch internal config loading from `Effect.promise(() => ConfigPaths.*(...))` to `yield* paths.*(...)` once the service exists.
24
+ - [ ] `cli/cmd/tui/config/tui.ts` - switch TUI config loading from async `ConfigPaths.*` wrappers to the `ConfigPaths.Service` once that service exists.
25
+ - [ ] `cli/cmd/tui/config/tui-migrate.ts` - decide whether to leave this as a plain async module using wrapper functions or effectify it fully after `ConfigPaths.Service` lands.
26
+
27
+ ## Notes
28
+
29
+ - Prefer small, semantics-preserving config migrations. Config precedence, legacy key migration, and plugin origin tracking are easy to break accidentally.
30
+ - When changing config loading internals, rerun the config and TUI suites first before broad package sweeps.
@@ -0,0 +1,62 @@
1
+ # Effect Migration Patterns
2
+
3
+ This is the compact reference for moving code toward the current Effect
4
+ shape. The high-level roadmap is [`todo.md`](./todo.md); examples and
5
+ rules are in [`guide.md`](./guide.md).
6
+
7
+ ## Default Shape
8
+
9
+ - Service methods return `Effect`.
10
+ - Service methods are named with `Effect.fn("Domain.method")`.
11
+ - Expected failures are typed errors on the error channel.
12
+ - Dependencies are yielded once at layer construction and closed over by
13
+ methods.
14
+ - `defaultLayer` wires production dependencies; tests can use open layers
15
+ when replacing dependencies.
16
+
17
+ ## Instance State
18
+
19
+ Use `InstanceState` for per-directory state, subscriptions, scoped
20
+ background work, and per-instance cleanup.
21
+
22
+ Do not add ad hoc `started` flags on top of `InstanceState`; the scoped
23
+ cache handles run-once and concurrent deduplication.
24
+
25
+ ## Runtime Boundaries
26
+
27
+ Prefer `AppRuntime` for crossing from non-Effect code into the shared app
28
+ layer.
29
+
30
+ `makeRuntime(...)` exists for intentional service-local boundaries and
31
+ legacy facades. Do not add new service-local runtimes unless the service is
32
+ genuinely outside `AppLayer`.
33
+
34
+ ## Platform Edges
35
+
36
+ - Use `FSUtil.Service` instead of raw filesystem APIs in
37
+ effectified services.
38
+ - Use `AppProcess.Service` instead of raw process wrappers.
39
+ - Use `HttpClient.HttpClient` instead of raw `fetch` in Effect code.
40
+ - Use `Effect.cached` for shared in-flight work.
41
+ - Use `Effect.callback` for callback APIs.
42
+
43
+ ## Tests During Migration
44
+
45
+ When migrating code, migrate touched tests toward
46
+ [`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md):
47
+
48
+ - `testEffect(...)`
49
+ - `it.effect`, `it.live`, or `it.instance`
50
+ - explicit layers for behavior changes
51
+ - deterministic waits instead of sleeps
52
+ - no mutable env/global flags after layers are built
53
+
54
+ ## Migration Checklist
55
+
56
+ - [ ] The code has a single Effect body instead of Promise wrappers around
57
+ service calls.
58
+ - [ ] Expected failures are typed errors, not thrown exceptions or defects.
59
+ - [ ] Layer requirements are explicit.
60
+ - [ ] Tests use Effect-aware fixtures and focused layers.
61
+ - [ ] Public behavior and wire shapes are preserved unless intentionally
62
+ changed.
@@ -0,0 +1,61 @@
1
+ # HTTP Route Patterns
2
+
3
+ Current guidance for `packages/miaw/src/server/routes/instance/httpapi`.
4
+
5
+ ## Handler Shape
6
+
7
+ Use `HttpApiBuilder.group(...)` for normal JSON and streaming HTTP API
8
+ endpoints. Yield stable services once while building the handler layer,
9
+ then close over those services in endpoint implementations.
10
+
11
+ ```ts
12
+ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) =>
13
+ Effect.gen(function* () {
14
+ const session = yield* Session.Service
15
+
16
+ return handlers.handle("list", () => session.list())
17
+ }),
18
+ )
19
+ ```
20
+
21
+ Use raw `HttpRouter` only for routes that do not fit the request/response
22
+ HttpApi model, such as WebSocket upgrades or catch-all fallback routes.
23
+
24
+ Do not rebuild stable layers inside request handlers. Provide stable
25
+ services at the route/layer boundary and use request-level provisioning
26
+ only for request-derived context.
27
+
28
+ ## Error Boundaries
29
+
30
+ Expected service errors should be mapped at the handler boundary to
31
+ endpoint-declared public HTTP errors. Keep one-off mappings inline. Extract
32
+ small helpers when the same mapping repeats.
33
+
34
+ Generic middleware should not become a domain-error mapper. It should
35
+ handle cross-cutting concerns and final unknown-defect fallback.
36
+
37
+ Public JSON errors should be explicit schema contracts declared on each
38
+ endpoint or group. Built-in `HttpApiError.*` is fine only when its generated
39
+ body is intentionally the public wire shape.
40
+
41
+ Preserve existing `{ name, data }` error bodies until a deliberate breaking
42
+ API change.
43
+
44
+ ## OpenAPI Compatibility
45
+
46
+ `public.ts` still owns SDK/OpenAPI compatibility transforms. Shrink those
47
+ transforms by tightening source schemas one workaround at a time.
48
+
49
+ When an OpenAPI-visible source schema changes:
50
+
51
+ - verify the generated SDK diff is intentional
52
+ - preserve legacy compatibility unless the PR explicitly changes it
53
+ - prefer source-schema fixes over new post-processing rules
54
+
55
+ ## Checklist For Route PRs
56
+
57
+ - [ ] Stable services are yielded at handler-layer construction.
58
+ - [ ] Expected domain errors are translated at the route boundary.
59
+ - [ ] Endpoint/group error schemas describe the public body and status.
60
+ - [ ] Middleware does not gain new domain-specific name checks.
61
+ - [ ] Raw routes are used only when HttpApi is the wrong abstraction.