@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.
- package/AGENTS.md +131 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/{miaw.js → bin/miaw} +0 -0
- package/bunfig.toml +7 -0
- package/git +0 -0
- package/migration/20260511173437_session-metadata/migration.sql +1 -0
- package/migration/20260511173437_session-metadata/snapshot.json +1500 -0
- package/package.json +154 -12
- package/parsers-config.ts +1 -0
- package/script/bench-search.ts +94 -0
- package/script/bench-test-suite.ts +52 -0
- package/script/build.ts +243 -0
- package/script/generate.ts +14 -0
- package/script/httpapi-exercise.ts +1 -0
- package/script/postinstall.mjs +189 -0
- package/script/profile-test-files.ts +42 -0
- package/script/publish.ts +213 -0
- package/script/run-workspace-server +106 -0
- package/script/schema.ts +77 -0
- package/script/time.ts +6 -0
- package/script/trace-imports.ts +153 -0
- package/specs/effect/error-boundaries-plan.md +235 -0
- package/specs/effect/errors.md +207 -0
- package/specs/effect/facades.md +218 -0
- package/specs/effect/guide.md +247 -0
- package/specs/effect/instance-context.md +13 -0
- package/specs/effect/loose-ends.md +30 -0
- package/specs/effect/migration.md +62 -0
- package/specs/effect/routes.md +61 -0
- package/specs/effect/schema.md +88 -0
- package/specs/effect/server-package.md +58 -0
- package/specs/effect/todo.md +241 -0
- package/specs/effect/tools.md +88 -0
- package/specs/openapi-translation-cleanup.md +204 -0
- package/specs/tui-plugins.md +544 -0
- package/specs/v2/api.ts +67 -0
- package/specs/v2/message-shape.md +136 -0
- package/specs/v2/notifications.md +13 -0
- package/specs/v2/tui-command-shim.md +67 -0
- package/src/account/account.ts +463 -0
- package/src/account/repo.ts +173 -0
- package/src/account/schema.ts +99 -0
- package/src/account/url.ts +8 -0
- package/src/acp/agent.ts +95 -0
- package/src/acp/config-option.ts +203 -0
- package/src/acp/content.ts +250 -0
- package/src/acp/directory.ts +210 -0
- package/src/acp/error.ts +90 -0
- package/src/acp/event.ts +336 -0
- package/src/acp/permission.ts +124 -0
- package/src/acp/profile.ts +42 -0
- package/src/acp/service.ts +1048 -0
- package/src/acp/session.ts +231 -0
- package/src/acp/tool.ts +321 -0
- package/src/acp/usage.ts +232 -0
- package/src/agent/agent.ts +467 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +9 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +11 -0
- package/src/agent/prompt/title.txt +44 -0
- package/src/agent/subagent-permissions.ts +27 -0
- package/src/audio.d.ts +14 -0
- package/src/auth/index.ts +99 -0
- package/src/background/job.ts +39 -0
- package/src/bus/global.ts +22 -0
- package/src/cli/bootstrap.ts +11 -0
- package/src/cli/cmd/account.ts +264 -0
- package/src/cli/cmd/acp.ts +73 -0
- package/src/cli/cmd/agent.ts +253 -0
- package/src/cli/cmd/attach.ts +97 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/db.ts +62 -0
- package/src/cli/cmd/debug/agent.handler.ts +193 -0
- package/src/cli/cmd/debug/agent.ts +27 -0
- package/src/cli/cmd/debug/config.ts +14 -0
- package/src/cli/cmd/debug/file.ts +73 -0
- package/src/cli/cmd/debug/index.ts +87 -0
- package/src/cli/cmd/debug/lsp.ts +50 -0
- package/src/cli/cmd/debug/ripgrep.ts +79 -0
- package/src/cli/cmd/debug/scrap.ts +15 -0
- package/src/cli/cmd/debug/skill.ts +15 -0
- package/src/cli/cmd/debug/snapshot.ts +50 -0
- package/src/cli/cmd/debug/startup.ts +11 -0
- package/src/cli/cmd/debug/v2.ts +49 -0
- package/src/cli/cmd/export.ts +292 -0
- package/src/cli/cmd/generate.ts +54 -0
- package/src/cli/cmd/github.handler.ts +1593 -0
- package/src/cli/cmd/github.shared.ts +30 -0
- package/src/cli/cmd/github.ts +42 -0
- package/src/cli/cmd/import.ts +224 -0
- package/src/cli/cmd/mcp.ts +849 -0
- package/src/cli/cmd/models.ts +66 -0
- package/src/cli/cmd/plug.ts +230 -0
- package/src/cli/cmd/pr.ts +115 -0
- package/src/cli/cmd/prompt-display.ts +1 -0
- package/src/cli/cmd/providers.ts +534 -0
- package/src/cli/cmd/run/demo.ts +1274 -0
- package/src/cli/cmd/run/entry.body.ts +205 -0
- package/src/cli/cmd/run/footer.command.tsx +1064 -0
- package/src/cli/cmd/run/footer.menu.tsx +351 -0
- package/src/cli/cmd/run/footer.permission.tsx +472 -0
- package/src/cli/cmd/run/footer.prompt.tsx +1306 -0
- package/src/cli/cmd/run/footer.question.tsx +573 -0
- package/src/cli/cmd/run/footer.subagent.tsx +173 -0
- package/src/cli/cmd/run/footer.ts +1129 -0
- package/src/cli/cmd/run/footer.view.tsx +943 -0
- package/src/cli/cmd/run/footer.width.ts +27 -0
- package/src/cli/cmd/run/permission.shared.ts +256 -0
- package/src/cli/cmd/run/prompt.editor.ts +157 -0
- package/src/cli/cmd/run/prompt.shared.ts +153 -0
- package/src/cli/cmd/run/question.shared.ts +340 -0
- package/src/cli/cmd/run/runtime.boot.ts +202 -0
- package/src/cli/cmd/run/runtime.lifecycle.ts +406 -0
- package/src/cli/cmd/run/runtime.queue.ts +349 -0
- package/src/cli/cmd/run/runtime.shared.ts +17 -0
- package/src/cli/cmd/run/runtime.stdin.ts +37 -0
- package/src/cli/cmd/run/runtime.ts +814 -0
- package/src/cli/cmd/run/scrollback.shared.ts +92 -0
- package/src/cli/cmd/run/scrollback.surface.ts +431 -0
- package/src/cli/cmd/run/scrollback.writer.tsx +352 -0
- package/src/cli/cmd/run/session-data.ts +1113 -0
- package/src/cli/cmd/run/session-replay.ts +374 -0
- package/src/cli/cmd/run/session.shared.ts +196 -0
- package/src/cli/cmd/run/splash.ts +280 -0
- package/src/cli/cmd/run/stream.transport.ts +1462 -0
- package/src/cli/cmd/run/stream.ts +175 -0
- package/src/cli/cmd/run/subagent-data.ts +876 -0
- package/src/cli/cmd/run/theme.ts +690 -0
- package/src/cli/cmd/run/tool.ts +1489 -0
- package/src/cli/cmd/run/trace.ts +94 -0
- package/src/cli/cmd/run/turn-summary.ts +47 -0
- package/src/cli/cmd/run/types.ts +350 -0
- package/src/cli/cmd/run/variant.shared.ts +215 -0
- package/src/cli/cmd/run.ts +894 -0
- package/src/cli/cmd/serve.ts +24 -0
- package/src/cli/cmd/session.ts +147 -0
- package/src/cli/cmd/stats.ts +393 -0
- package/src/cli/cmd/tui.ts +224 -0
- package/src/cli/cmd/uninstall.ts +353 -0
- package/src/cli/cmd/upgrade.ts +74 -0
- package/src/cli/cmd/web.ts +84 -0
- package/src/cli/effect/prompt.ts +37 -0
- package/src/cli/effect-cmd.ts +96 -0
- package/src/cli/error.ts +130 -0
- package/src/cli/heap.ts +45 -0
- package/src/cli/logo.ts +1 -0
- package/src/cli/network.ts +64 -0
- package/src/cli/tui/layer.ts +7 -0
- package/src/cli/tui/validate-session.ts +29 -0
- package/src/cli/tui/worker.ts +71 -0
- package/src/cli/ui.ts +132 -0
- package/src/cli/upgrade.ts +53 -0
- package/src/command/index.ts +184 -0
- package/src/command/template/initialize.txt +66 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/agent-preset.ts +175 -0
- package/src/config/agent.ts +59 -0
- package/src/config/command.ts +39 -0
- package/src/config/config.ts +703 -0
- package/src/config/entry-name.ts +19 -0
- package/src/config/managed.ts +69 -0
- package/src/config/markdown.ts +36 -0
- package/src/config/parse.ts +79 -0
- package/src/config/paths.ts +45 -0
- package/src/config/plugin.ts +79 -0
- package/src/config/tui-cwd.ts +5 -0
- package/src/config/tui-host-attention.ts +21 -0
- package/src/config/tui-migrate.ts +132 -0
- package/src/config/tui.ts +274 -0
- package/src/config/variable.ts +91 -0
- package/src/control-plane/adapters/index.ts +41 -0
- package/src/control-plane/adapters/worktree.ts +96 -0
- package/src/control-plane/dev/README.md +19 -0
- package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
- package/src/control-plane/types.ts +59 -0
- package/src/control-plane/util.ts +39 -0
- package/src/control-plane/workspace-adapter-runtime.ts +51 -0
- package/src/control-plane/workspace-context.ts +26 -0
- package/src/control-plane/workspace.ts +989 -0
- package/src/effect/app-runtime.ts +132 -0
- package/src/effect/bootstrap-runtime.ts +23 -0
- package/src/effect/bridge.ts +84 -0
- package/src/effect/config-service.ts +67 -0
- package/src/effect/instance-ref.ts +11 -0
- package/src/effect/instance-registry.ts +12 -0
- package/src/effect/instance-state.ts +69 -0
- package/src/effect/promise.ts +17 -0
- package/src/effect/run-service.ts +47 -0
- package/src/effect/runner.ts +217 -0
- package/src/effect/runtime-flags.ts +79 -0
- package/src/env/index.ts +43 -0
- package/src/event-v2-bridge.ts +79 -0
- package/src/format/formatter.ts +404 -0
- package/src/format/index.ts +205 -0
- package/src/git/index.ts +350 -0
- package/src/id/id.ts +80 -0
- package/src/ide/index.ts +61 -0
- package/src/image/image.ts +174 -0
- package/src/index.ts +142 -0
- package/src/installation/index.ts +350 -0
- package/src/lsp/client.ts +650 -0
- package/src/lsp/diagnostic.ts +29 -0
- package/src/lsp/language.ts +121 -0
- package/src/lsp/launch.ts +21 -0
- package/src/lsp/lsp.ts +511 -0
- package/src/lsp/server.ts +1983 -0
- package/src/markdown.d.ts +4 -0
- package/src/mcp/auth.ts +174 -0
- package/src/mcp/catalog.ts +144 -0
- package/src/mcp/index.ts +953 -0
- package/src/mcp/oauth-callback.ts +221 -0
- package/src/mcp/oauth-provider.ts +206 -0
- package/src/node.ts +4 -0
- package/src/patch/index.ts +686 -0
- package/src/permission/arity.ts +163 -0
- package/src/permission/evaluate.ts +1 -0
- package/src/permission/index.ts +230 -0
- package/src/plugin/azure.ts +26 -0
- package/src/plugin/cloudflare.ts +76 -0
- package/src/plugin/digitalocean.ts +383 -0
- package/src/plugin/github-copilot/copilot.ts +413 -0
- package/src/plugin/github-copilot/models.ts +246 -0
- package/src/plugin/index.ts +315 -0
- package/src/plugin/install.ts +439 -0
- package/src/plugin/loader.ts +237 -0
- package/src/plugin/meta.ts +188 -0
- package/src/plugin/openai/README.md +31 -0
- package/src/plugin/openai/codex.ts +640 -0
- package/src/plugin/openai/ws-pool.ts +270 -0
- package/src/plugin/openai/ws.ts +381 -0
- package/src/plugin/pty-environment.ts +24 -0
- package/src/plugin/shared.ts +323 -0
- package/src/plugin/snowflake-cortex.ts +529 -0
- package/src/plugin/tui/internal.ts +10 -0
- package/src/plugin/tui/runtime.ts +1130 -0
- package/src/plugin/xai.ts +734 -0
- package/src/project/bootstrap-service.ts +9 -0
- package/src/project/bootstrap.ts +76 -0
- package/src/project/instance-context.ts +24 -0
- package/src/project/instance-layer.ts +11 -0
- package/src/project/instance-runtime.ts +16 -0
- package/src/project/instance-store.ts +209 -0
- package/src/project/project.ts +519 -0
- package/src/project/vcs.ts +431 -0
- package/src/provider/auth.ts +233 -0
- package/src/provider/error.ts +188 -0
- package/src/provider/model-status.ts +8 -0
- package/src/provider/provider.ts +1975 -0
- package/src/provider/transform.ts +1426 -0
- package/src/question/index.ts +229 -0
- package/src/question/schema.ts +10 -0
- package/src/server/auth.ts +48 -0
- package/src/server/event.ts +13 -0
- package/src/server/global-lifecycle.ts +28 -0
- package/src/server/init-projectors.ts +3 -0
- package/src/server/mdns.ts +47 -0
- package/src/server/projectors.ts +1 -0
- package/src/server/proxy-util.ts +48 -0
- package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
- package/src/server/routes/instance/httpapi/api.ts +78 -0
- package/src/server/routes/instance/httpapi/errors.ts +193 -0
- package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
- package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
- package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
- package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
- package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
- package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
- package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
- package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
- package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
- package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +32 -0
- package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
- package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
- package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
- package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
- package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
- package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
- package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
- package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
- package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
- package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
- package/src/server/routes/instance/httpapi/handlers/control.ts +43 -0
- package/src/server/routes/instance/httpapi/handlers/event.ts +99 -0
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
- package/src/server/routes/instance/httpapi/handlers/file.ts +139 -0
- package/src/server/routes/instance/httpapi/handlers/global.ts +156 -0
- package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
- package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +83 -0
- package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
- package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
- package/src/server/routes/instance/httpapi/handlers/pty.ts +273 -0
- package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
- package/src/server/routes/instance/httpapi/handlers/session.ts +440 -0
- package/src/server/routes/instance/httpapi/handlers/sync.ts +89 -0
- package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
- package/src/server/routes/instance/httpapi/lifecycle.ts +54 -0
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
- package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
- package/src/server/routes/instance/httpapi/middleware/error.ts +43 -0
- package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +41 -0
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
- package/src/server/routes/instance/httpapi/public.ts +535 -0
- package/src/server/routes/instance/httpapi/server.ts +298 -0
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
- package/src/server/server.ts +217 -0
- package/src/server/shared/fence.ts +60 -0
- package/src/server/shared/pty-ticket.ts +15 -0
- package/src/server/shared/public-ui.ts +12 -0
- package/src/server/shared/tui-control.ts +28 -0
- package/src/server/shared/ui.ts +108 -0
- package/src/server/shared/workspace-routing.ts +38 -0
- package/src/server/tui-event.ts +53 -0
- package/src/session/compaction.ts +620 -0
- package/src/session/instruction.ts +250 -0
- package/src/session/llm/AGENTS.md +90 -0
- package/src/session/llm/ai-sdk.ts +288 -0
- package/src/session/llm/native-request.ts +196 -0
- package/src/session/llm/native-runtime.ts +195 -0
- package/src/session/llm/request.ts +216 -0
- package/src/session/llm.ts +415 -0
- package/src/session/message-error.ts +14 -0
- package/src/session/message-v2.ts +744 -0
- package/src/session/message.ts +148 -0
- package/src/session/overflow.ts +34 -0
- package/src/session/processor.ts +1084 -0
- package/src/session/prompt/anthropic.txt +105 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex.txt +79 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/default.txt +95 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/gpt.txt +107 -0
- package/src/session/prompt/kimi.txt +95 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-mode.txt +70 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/session/prompt/plan.txt +26 -0
- package/src/session/prompt/trinity.txt +97 -0
- package/src/session/prompt/ultrawork.txt +289 -0
- package/src/session/prompt.ts +1725 -0
- package/src/session/reminders.ts +92 -0
- package/src/session/retry.ts +201 -0
- package/src/session/revert.ts +160 -0
- package/src/session/run-state.ts +156 -0
- package/src/session/schema.ts +26 -0
- package/src/session/session.ts +1119 -0
- package/src/session/status.ts +97 -0
- package/src/session/summary.ts +165 -0
- package/src/session/system.ts +117 -0
- package/src/session/todo.ts +90 -0
- package/src/session/tools.ts +207 -0
- package/src/session/ultrawork.ts +26 -0
- package/src/share/session.ts +61 -0
- package/src/share/share-next.ts +385 -0
- package/src/skill/discovery.ts +109 -0
- package/src/skill/index.ts +366 -0
- package/src/snapshot/index.ts +808 -0
- package/src/sql.d.ts +4 -0
- package/src/storage/schema.ts +5 -0
- package/src/storage/storage.ts +329 -0
- package/src/sync/README.md +179 -0
- package/src/sync/schema.ts +11 -0
- package/src/temporary.ts +31 -0
- package/src/tool/apply_patch.ts +313 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/edit.ts +737 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +49 -0
- package/src/tool/glob.ts +76 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +112 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +21 -0
- package/src/tool/json-schema.ts +164 -0
- package/src/tool/lsp.ts +113 -0
- package/src/tool/lsp.txt +24 -0
- package/src/tool/mcp-websearch.ts +96 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +79 -0
- package/src/tool/question.ts +44 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read.ts +386 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/registry.ts +440 -0
- package/src/tool/schema.ts +14 -0
- package/src/tool/shell/id.ts +19 -0
- package/src/tool/shell/prompt.ts +307 -0
- package/src/tool/shell/shell.txt +21 -0
- package/src/tool/shell.ts +657 -0
- package/src/tool/skill.ts +71 -0
- package/src/tool/skill.txt +5 -0
- package/src/tool/task.ts +346 -0
- package/src/tool/task.txt +19 -0
- package/src/tool/todo.ts +57 -0
- package/src/tool/todowrite.txt +44 -0
- package/src/tool/tool.ts +183 -0
- package/src/tool/truncate.ts +158 -0
- package/src/tool/truncation-dir.ts +4 -0
- package/src/tool/webfetch.ts +192 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +143 -0
- package/src/tool/websearch.txt +14 -0
- package/src/tool/write.ts +104 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +17 -0
- package/src/util/bom.ts +27 -0
- package/src/util/data-url.ts +9 -0
- package/src/util/defer.ts +10 -0
- package/src/util/effect-http-client.ts +11 -0
- package/src/util/error.ts +1 -0
- package/src/util/filesystem.ts +251 -0
- package/src/util/iife.ts +3 -0
- package/src/util/lazy.ts +20 -0
- package/src/util/local-context.ts +25 -0
- package/src/util/locale.ts +2 -0
- package/src/util/media.ts +26 -0
- package/src/util/process.ts +177 -0
- package/src/util/proxy-env.ts +72 -0
- package/src/util/queue.ts +32 -0
- package/src/util/record.ts +1 -0
- package/src/util/repository.ts +232 -0
- package/src/util/rpc.ts +66 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +13 -0
- package/src/util/token.ts +1 -0
- package/src/util/wildcard.ts +59 -0
- package/src/worktree/index.ts +654 -0
- package/sst-env.d.ts +10 -0
- package/test/AGENTS.md +204 -0
- package/test/EFFECT_TEST_MIGRATION.md +169 -0
- package/test/account/repo.test.ts +353 -0
- package/test/account/service.test.ts +453 -0
- package/test/acp/config-option.test.ts +229 -0
- package/test/acp/content.test.ts +201 -0
- package/test/acp/directory.test.ts +186 -0
- package/test/acp/error.test.ts +67 -0
- package/test/acp/event.test.ts +743 -0
- package/test/acp/permission.test.ts +273 -0
- package/test/acp/service-session.test.ts +1174 -0
- package/test/acp/session.test.ts +200 -0
- package/test/acp/tool.test.ts +210 -0
- package/test/acp/usage.test.ts +315 -0
- package/test/agent/agent.test.ts +760 -0
- package/test/agent/plan-mode-subagent-bypass.test.ts +159 -0
- package/test/agent/plugin-agent-regression.test.ts +64 -0
- package/test/auth/auth.test.ts +77 -0
- package/test/background/job.test.ts +243 -0
- package/test/cli/account.test.ts +30 -0
- package/test/cli/acp/acp-test-client.ts +97 -0
- package/test/cli/acp/config-options.test.ts +103 -0
- package/test/cli/acp/helpers.ts +96 -0
- package/test/cli/acp/initialize-auth.test.ts +61 -0
- package/test/cli/acp/lifecycle.test.ts +118 -0
- package/test/cli/acp/prompt-content.test.ts +97 -0
- package/test/cli/acp/skills.test.ts +38 -0
- package/test/cli/cmd/tui/attention.test.ts +484 -0
- package/test/cli/effect-cmd-instance-als.test.ts +39 -0
- package/test/cli/error.test.ts +95 -0
- package/test/cli/github-action.test.ts +199 -0
- package/test/cli/github-remote.test.ts +90 -0
- package/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +631 -0
- package/test/cli/help/help-snapshots.test.ts +137 -0
- package/test/cli/import.test.ts +54 -0
- package/test/cli/mcp-add.test.ts +74 -0
- package/test/cli/plugin-auth-picker.test.ts +120 -0
- package/test/cli/run/entry.body.test.ts +536 -0
- package/test/cli/run/footer.menu.test.ts +43 -0
- package/test/cli/run/footer.view.test.tsx +1375 -0
- package/test/cli/run/footer.width.test.ts +35 -0
- package/test/cli/run/permission.shared.test.ts +144 -0
- package/test/cli/run/prompt.editor.test.ts +101 -0
- package/test/cli/run/prompt.shared.test.ts +101 -0
- package/test/cli/run/question.shared.test.ts +115 -0
- package/test/cli/run/run-process.test.ts +84 -0
- package/test/cli/run/runtime.boot.test.ts +283 -0
- package/test/cli/run/runtime.queue.test.ts +481 -0
- package/test/cli/run/runtime.stdin.test.ts +71 -0
- package/test/cli/run/runtime.test.ts +238 -0
- package/test/cli/run/scrollback.surface.test.ts +1065 -0
- package/test/cli/run/session-data.test.ts +595 -0
- package/test/cli/run/session-replay.test.ts +692 -0
- package/test/cli/run/session.shared.test.ts +247 -0
- package/test/cli/run/stream.test.ts +56 -0
- package/test/cli/run/stream.transport.test.ts +2363 -0
- package/test/cli/run/subagent-data.test.ts +547 -0
- package/test/cli/run/theme.test.ts +177 -0
- package/test/cli/run/variant.shared.test.ts +217 -0
- package/test/cli/serve/serve-process.test.ts +61 -0
- package/test/cli/smokes/read-only.test.ts +115 -0
- package/test/cli/tui/attach.test.ts +11 -0
- package/test/cli/tui/editor-context-zed.test.ts +379 -0
- package/test/cli/tui/editor-context.test.tsx +297 -0
- package/test/cli/tui/plugin-add.test.ts +110 -0
- package/test/cli/tui/plugin-install.test.ts +87 -0
- package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
- package/test/cli/tui/plugin-loader-entrypoint.test.ts +485 -0
- package/test/cli/tui/plugin-loader-pure.test.ts +72 -0
- package/test/cli/tui/plugin-loader.test.ts +1332 -0
- package/test/cli/tui/plugin-toggle.test.ts +264 -0
- package/test/cli/tui/thread.test.ts +36 -0
- package/test/config/agent-color.test.ts +47 -0
- package/test/config/config.test.ts +2041 -0
- package/test/config/entry-name.test.ts +57 -0
- package/test/config/fixtures/empty-frontmatter.md +4 -0
- package/test/config/fixtures/frontmatter.md +28 -0
- package/test/config/fixtures/markdown-header.md +11 -0
- package/test/config/fixtures/no-frontmatter.md +1 -0
- package/test/config/fixtures/weird-model-id.md +13 -0
- package/test/config/lsp.test.ts +69 -0
- package/test/config/markdown.test.ts +228 -0
- package/test/config/plugin.test.ts +0 -0
- package/test/config/tui.test.ts +886 -0
- package/test/control-plane/adapters.test.ts +71 -0
- package/test/control-plane/workspace.test.ts +1703 -0
- package/test/effect/app-graph-types.test.ts +108 -0
- package/test/effect/app-graph.test.ts +204 -0
- package/test/effect/app-runtime-logger.test.ts +99 -0
- package/test/effect/config-service.test.ts +65 -0
- package/test/effect/instance-state.test.ts +391 -0
- package/test/effect/run-service.test.ts +89 -0
- package/test/effect/runner.test.ts +514 -0
- package/test/effect/runtime-flags.test.ts +373 -0
- package/test/fake/account.ts +9 -0
- package/test/fake/auth.ts +8 -0
- package/test/fake/npm.ts +8 -0
- package/test/fake/provider.ts +82 -0
- package/test/fake/skill.ts +8 -0
- package/test/filesystem/filesystem.test.ts +319 -0
- package/test/fixture/agent-plugin.constants.ts +6 -0
- package/test/fixture/agent-plugin.ts +12 -0
- package/test/fixture/config.ts +23 -0
- package/test/fixture/db.ts +11 -0
- package/test/fixture/fixture.test.ts +26 -0
- package/test/fixture/fixture.ts +224 -0
- package/test/fixture/flag.ts +20 -0
- package/test/fixture/flock-worker.ts +72 -0
- package/test/fixture/lsp/fake-lsp-server.js +249 -0
- package/test/fixture/mcp-session-recovery.ts +50 -0
- package/test/fixture/plug-worker.ts +93 -0
- package/test/fixture/plugin-meta-worker.ts +19 -0
- package/test/fixture/plugin.ts +10 -0
- package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
- package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
- package/test/fixture/skills/cloudflare/SKILL.md +211 -0
- package/test/fixture/skills/index.json +6 -0
- package/test/fixture/tui-environment.tsx +32 -0
- package/test/fixture/tui-plugin.ts +355 -0
- package/test/fixture/tui-runtime.ts +56 -0
- package/test/fixture/tui-sdk.ts +82 -0
- package/test/fixture/workspace.ts +30 -0
- package/test/fixtures/recordings/session/native-anthropic-tool-loop.json +49 -0
- package/test/fixtures/recordings/session/native-openai-oauth-tool-loop.json +45 -0
- package/test/fixtures/recordings/session/native-zen-tool-loop.json +49 -0
- package/test/format/format.test.ts +228 -0
- package/test/git/git.test.ts +178 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/image/fixtures/picture-5mb-base64.png +0 -0
- package/test/image/image.test.ts +123 -0
- package/test/installation/installation.test.ts +230 -0
- package/test/lib/cli-process.ts +459 -0
- package/test/lib/effect.ts +177 -0
- package/test/lib/filesystem.ts +10 -0
- package/test/lib/llm-server.ts +779 -0
- package/test/lib/snapshot.ts +73 -0
- package/test/lib/test-provider.ts +37 -0
- package/test/lib/websocket.ts +46 -0
- package/test/lsp/client.test.ts +488 -0
- package/test/lsp/index.test.ts +232 -0
- package/test/lsp/jdtls-root.test.ts +459 -0
- package/test/lsp/launch.test.ts +22 -0
- package/test/lsp/lifecycle.test.ts +160 -0
- package/test/mcp/auth.test.ts +78 -0
- package/test/mcp/headers.test.ts +126 -0
- package/test/mcp/lifecycle.test.ts +1213 -0
- package/test/mcp/oauth-auto-connect.test.ts +276 -0
- package/test/mcp/oauth-browser.test.ts +239 -0
- package/test/mcp/oauth-callback.test.ts +34 -0
- package/test/mcp/oauth-provider.test.ts +61 -0
- package/test/mcp/session-recovery.test.ts +27 -0
- package/test/patch/patch.test.ts +383 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/next.test.ts +1176 -0
- package/test/permission-task.test.ts +318 -0
- package/test/plugin/auth-override.test.ts +105 -0
- package/test/plugin/cloudflare.test.ts +68 -0
- package/test/plugin/codex.test.ts +247 -0
- package/test/plugin/github-copilot-models.test.ts +332 -0
- package/test/plugin/install-concurrency.test.ts +140 -0
- package/test/plugin/install.test.ts +570 -0
- package/test/plugin/loader-shared.test.ts +1303 -0
- package/test/plugin/meta.test.ts +137 -0
- package/test/plugin/openai-rollout.test.ts +17 -0
- package/test/plugin/openai-ws.test.ts +877 -0
- package/test/plugin/shared.test.ts +88 -0
- package/test/plugin/snowflake-cortex.test.ts +278 -0
- package/test/plugin/trigger.test.ts +120 -0
- package/test/plugin/workspace-adapter.test.ts +140 -0
- package/test/plugin/xai.test.ts +634 -0
- package/test/preload.ts +92 -0
- package/test/project/instance-bootstrap.test.ts +110 -0
- package/test/project/instance.test.ts +245 -0
- package/test/project/migrate-global.test.ts +167 -0
- package/test/project/project-directory.test.ts +201 -0
- package/test/project/project.test.ts +815 -0
- package/test/project/vcs.test.ts +336 -0
- package/test/project/worktree-remove.test.ts +126 -0
- package/test/project/worktree.test.ts +320 -0
- package/test/provider/amazon-bedrock.test.ts +360 -0
- package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
- package/test/provider/digitalocean.test.ts +123 -0
- package/test/provider/gitlab-duo.test.ts +412 -0
- package/test/provider/header-timeout.test.ts +233 -0
- package/test/provider/model-status.test.ts +61 -0
- package/test/provider/provider.test.ts +1793 -0
- package/test/provider/transform.test.ts +4207 -0
- package/test/question/question.test.ts +465 -0
- package/test/server/AGENTS.md +15 -0
- package/test/server/auth.test.ts +59 -0
- package/test/server/global-bus.ts +31 -0
- package/test/server/global-session-list.test.ts +104 -0
- package/test/server/httpapi-authorization.test.ts +174 -0
- package/test/server/httpapi-compression.test.ts +151 -0
- package/test/server/httpapi-config.test.ts +110 -0
- package/test/server/httpapi-control-plane.test.ts +63 -0
- package/test/server/httpapi-cors-vary.test.ts +63 -0
- package/test/server/httpapi-cors.test.ts +122 -0
- package/test/server/httpapi-error-middleware.test.ts +101 -0
- package/test/server/httpapi-event.test.ts +94 -0
- package/test/server/httpapi-exercise/assertions.ts +64 -0
- package/test/server/httpapi-exercise/backend.ts +144 -0
- package/test/server/httpapi-exercise/dsl.ts +210 -0
- package/test/server/httpapi-exercise/environment.ts +40 -0
- package/test/server/httpapi-exercise/index.ts +1685 -0
- package/test/server/httpapi-exercise/report.ts +66 -0
- package/test/server/httpapi-exercise/routing.ts +96 -0
- package/test/server/httpapi-exercise/runner.ts +267 -0
- package/test/server/httpapi-exercise/runtime.ts +52 -0
- package/test/server/httpapi-exercise/types.ts +123 -0
- package/test/server/httpapi-experimental.test.ts +297 -0
- package/test/server/httpapi-file.test.ts +73 -0
- package/test/server/httpapi-global.test.ts +66 -0
- package/test/server/httpapi-instance-context.test.ts +348 -0
- package/test/server/httpapi-instance-route-auth.test.ts +81 -0
- package/test/server/httpapi-instance.test.ts +265 -0
- package/test/server/httpapi-layer.ts +33 -0
- package/test/server/httpapi-listen.test.ts +412 -0
- package/test/server/httpapi-mcp-oauth.test.ts +73 -0
- package/test/server/httpapi-mcp.test.ts +223 -0
- package/test/server/httpapi-mdns.test.ts +79 -0
- package/test/server/httpapi-promptasync-context.test.ts +223 -0
- package/test/server/httpapi-provider.test.ts +400 -0
- package/test/server/httpapi-pty.test.ts +299 -0
- package/test/server/httpapi-public-openapi.test.ts +319 -0
- package/test/server/httpapi-query-schema-drift.test.ts +330 -0
- package/test/server/httpapi-reference.test.ts +62 -0
- package/test/server/httpapi-schema-error-body.test.ts +165 -0
- package/test/server/httpapi-sdk.test.ts +909 -0
- package/test/server/httpapi-session.test.ts +1011 -0
- package/test/server/httpapi-sync.test.ts +148 -0
- package/test/server/httpapi-ui.test.ts +453 -0
- package/test/server/httpapi-v2-location.test.ts +82 -0
- package/test/server/httpapi-v2-pty.test.ts +250 -0
- package/test/server/httpapi-workspace-routing.test.ts +555 -0
- package/test/server/httpapi-workspace.test.ts +513 -0
- package/test/server/negative-tokens-regression.test.ts +83 -0
- package/test/server/project-copy.test.ts +121 -0
- package/test/server/project-init-git.test.ts +114 -0
- package/test/server/proxy-util.test.ts +113 -0
- package/test/server/sdk-error-shape.test.ts +81 -0
- package/test/server/sdk-v1-smoke.test.ts +57 -0
- package/test/server/session-actions.test.ts +109 -0
- package/test/server/session-diff-missing-patch.test.ts +96 -0
- package/test/server/session-list.test.ts +312 -0
- package/test/server/session-messages.test.ts +179 -0
- package/test/server/session-select.test.ts +66 -0
- package/test/server/workspace-proxy.test.ts +181 -0
- package/test/server/workspace-routing.test.ts +94 -0
- package/test/server/worktree-endpoint-repro.test.ts +307 -0
- package/test/session/compaction.test.ts +1834 -0
- package/test/session/instruction.test.ts +256 -0
- package/test/session/llm-native-recorded.test.ts +433 -0
- package/test/session/llm-native.test.ts +760 -0
- package/test/session/llm.test.ts +1932 -0
- package/test/session/message-v2.test.ts +1661 -0
- package/test/session/messages-pagination.test.ts +1056 -0
- package/test/session/processor-effect.test.ts +1076 -0
- package/test/session/prompt.test.ts +2326 -0
- package/test/session/retry.test.ts +439 -0
- package/test/session/revert-compact.test.ts +639 -0
- package/test/session/schema-decoding.test.ts +313 -0
- package/test/session/session-schema.test.ts +78 -0
- package/test/session/session.test.ts +248 -0
- package/test/session/snapshot-tool-race.test.ts +190 -0
- package/test/session/structured-output-integration.test.ts +235 -0
- package/test/session/structured-output.test.ts +387 -0
- package/test/session/system.test.ts +86 -0
- package/test/session/ultrawork.test.ts +25 -0
- package/test/share/share-next.test.ts +326 -0
- package/test/skill/discovery.test.ts +139 -0
- package/test/skill/skill.test.ts +571 -0
- package/test/snapshot/snapshot.test.ts +1121 -0
- package/test/storage/storage.test.ts +296 -0
- package/test/tool/__snapshots__/parameters.test.ts.snap +484 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/apply_patch.test.ts +533 -0
- package/test/tool/edit.test.ts +578 -0
- package/test/tool/external-directory.test.ts +155 -0
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +117299 -0
- package/test/tool/glob.test.ts +136 -0
- package/test/tool/grep.test.ts +225 -0
- package/test/tool/lsp.test.ts +181 -0
- package/test/tool/parameters.test.ts +293 -0
- package/test/tool/question.test.ts +138 -0
- package/test/tool/read.test.ts +605 -0
- package/test/tool/registry.test.ts +497 -0
- package/test/tool/shell.test.ts +1238 -0
- package/test/tool/skill.test.ts +136 -0
- package/test/tool/task.test.ts +898 -0
- package/test/tool/tool-define.test.ts +153 -0
- package/test/tool/truncation.test.ts +266 -0
- package/test/tool/webfetch.test.ts +113 -0
- package/test/tool/websearch.test.ts +99 -0
- package/test/tool/write.test.ts +276 -0
- package/test/util/data-url.test.ts +14 -0
- package/test/util/error.test.ts +16 -0
- package/test/util/filesystem.test.ts +656 -0
- package/test/util/glob.test.ts +164 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/module.test.ts +59 -0
- package/test/util/process.test.ts +128 -0
- package/test/util/repository.test.ts +93 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/wildcard.test.ts +90 -0
- package/test/v2/session-message-updater.test.ts +269 -0
- package/tsconfig.json +16 -0
|
@@ -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/miaw/packages/miaw"
|
|
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.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Typed Error Migration
|
|
2
|
+
|
|
3
|
+
This note expands the `ERR`, `RENDER`, and `HTTP` tracks from
|
|
4
|
+
[`todo.md`](./todo.md). It is the current reference for expected failures,
|
|
5
|
+
typed service errors, and HTTP error boundaries.
|
|
6
|
+
|
|
7
|
+
For the migration architecture and queue, see
|
|
8
|
+
[`error-boundaries-plan.md`](./error-boundaries-plan.md).
|
|
9
|
+
|
|
10
|
+
## Goal
|
|
11
|
+
|
|
12
|
+
- Expected service failures live on the Effect error channel.
|
|
13
|
+
- Service interfaces expose those failures in their return types.
|
|
14
|
+
- Domain errors are authored with `Schema.TaggedErrorClass`.
|
|
15
|
+
- `Effect.die(...)` is reserved for defects: bugs, impossible states,
|
|
16
|
+
violated invariants, and final unknown-boundary fallbacks.
|
|
17
|
+
- HTTP status codes and public wire bodies are handled at HTTP route
|
|
18
|
+
boundaries, not inside service modules.
|
|
19
|
+
- User-facing boundaries render useful structured error details instead of
|
|
20
|
+
opaque `Error: SomeName` strings.
|
|
21
|
+
|
|
22
|
+
## Service Error Shape
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
export class SessionBusyError extends Schema.TaggedErrorClass<SessionBusyError>()("SessionBusyError", {
|
|
26
|
+
sessionID: SessionID,
|
|
27
|
+
message: Schema.String,
|
|
28
|
+
}) {}
|
|
29
|
+
|
|
30
|
+
export type Error = Storage.Error | SessionBusyError
|
|
31
|
+
|
|
32
|
+
export interface Interface {
|
|
33
|
+
readonly get: (id: SessionID) => Effect.Effect<Info, Error>
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Rules:
|
|
38
|
+
|
|
39
|
+
- Use `Schema.TaggedErrorClass` for expected domain failures.
|
|
40
|
+
- Export a domain-level `Error` union from each service module.
|
|
41
|
+
- Put expected errors in service method signatures.
|
|
42
|
+
- Use `yield* new DomainError(...)` for direct early failures in
|
|
43
|
+
`Effect.gen` / `Effect.fn`.
|
|
44
|
+
- Use `Schema.Defect` for unknown cause fields when preserving the cause is
|
|
45
|
+
useful for logs or callers.
|
|
46
|
+
- Use `Effect.try(...)`, `Effect.tryPromise(...)`, `Effect.mapError`,
|
|
47
|
+
`Effect.catchTag`, and `Effect.catchTags` to translate external
|
|
48
|
+
failures into domain errors.
|
|
49
|
+
- Do not use `throw`, `Effect.die(...)`, or `catchDefect` for expected
|
|
50
|
+
user, IO, validation, missing-resource, auth, provider, worktree, or
|
|
51
|
+
busy-state failures.
|
|
52
|
+
|
|
53
|
+
## HTTP Boundary Shape
|
|
54
|
+
|
|
55
|
+
Service modules stay transport-agnostic. They should not import HTTP
|
|
56
|
+
status codes, `HttpApiError`, `HttpServerResponse`, or route-specific
|
|
57
|
+
error schemas.
|
|
58
|
+
|
|
59
|
+
HTTP handlers translate service errors into public endpoint errors:
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
const get = Effect.fn("SessionHttpApi.get")(function* (ctx: { params: { sessionID: SessionID } }) {
|
|
63
|
+
return yield* session
|
|
64
|
+
.get(ctx.params.sessionID)
|
|
65
|
+
.pipe(Effect.catchTag("StorageNotFoundError", () => notFound("Session not found")))
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Endpoint definitions declare which public errors can be emitted. Public
|
|
70
|
+
HTTP error schemas carry their response status with `httpApiStatus` or the
|
|
71
|
+
equivalent HttpApi schema annotation.
|
|
72
|
+
|
|
73
|
+
Effect's own HttpApi examples follow this pattern:
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
export class Unauthorized extends Schema.TaggedErrorClass<Unauthorized>()(
|
|
77
|
+
"Unauthorized",
|
|
78
|
+
{ message: Schema.String },
|
|
79
|
+
{ httpApiStatus: 401 },
|
|
80
|
+
) {}
|
|
81
|
+
|
|
82
|
+
export class Authorization extends HttpApiMiddleware.Service<
|
|
83
|
+
Authorization,
|
|
84
|
+
{
|
|
85
|
+
provides: CurrentUser
|
|
86
|
+
}
|
|
87
|
+
>()("app/Authorization", {
|
|
88
|
+
security: { bearer: HttpApiSecurity.bearer },
|
|
89
|
+
error: Unauthorized,
|
|
90
|
+
}) {}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Endpoint-level errors use the same idea:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
export class ConfigApiError extends Schema.ErrorClass<ConfigApiError>("ConfigApiError")(
|
|
97
|
+
{
|
|
98
|
+
name: Schema.Union(Schema.Literal("ConfigInvalidError"), Schema.Literal("ConfigJsonError")),
|
|
99
|
+
data: Schema.Struct({ message: Schema.optional(Schema.String), path: Schema.String }),
|
|
100
|
+
},
|
|
101
|
+
{ httpApiStatus: 400 },
|
|
102
|
+
) {}
|
|
103
|
+
|
|
104
|
+
HttpApiEndpoint.get("get", "/config", {
|
|
105
|
+
success: Config.Info,
|
|
106
|
+
error: ConfigApiError,
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The service error and HTTP error may be the same class only when the wire
|
|
111
|
+
shape is intentionally public. Use separate HTTP error schemas when the
|
|
112
|
+
service error contains internals, low-level causes, retry hints, or data
|
|
113
|
+
that should not be exposed to API clients.
|
|
114
|
+
|
|
115
|
+
Do not map every domain error into one universal HTTP error class. Prefer a
|
|
116
|
+
small public error vocabulary by route group: shared shapes like
|
|
117
|
+
`ApiNotFoundError`, route-specific shapes like `ConfigApiError`, and built-in
|
|
118
|
+
empty `HttpApiError.*` only when an empty/no-content body is the intended SDK
|
|
119
|
+
contract.
|
|
120
|
+
|
|
121
|
+
## Mapping Guidance
|
|
122
|
+
|
|
123
|
+
- Keep one-off translations inline in the handler.
|
|
124
|
+
- Extract tiny shared helpers when the same translation repeats across a
|
|
125
|
+
route group.
|
|
126
|
+
- Do not create one giant `unknown -> status` mapper.
|
|
127
|
+
- Do not grow generic HTTP middleware into a registry of domain errors.
|
|
128
|
+
- Preserve existing public `{ name, data }` bodies until a deliberate
|
|
129
|
+
breaking API change.
|
|
130
|
+
- Use built-in `HttpApiError.*` only when its generated body and SDK
|
|
131
|
+
surface are intentionally the public contract.
|
|
132
|
+
- Prefer `Schema.ErrorClass` for public HTTP error bodies whose wire shape is
|
|
133
|
+
not the same as the internal domain error shape.
|
|
134
|
+
- Prefer `Schema.TaggedErrorClass` for service/domain errors and middleware
|
|
135
|
+
errors that are naturally tagged by `_tag`.
|
|
136
|
+
- If preserving a legacy `{ name, data }` body, model that shape explicitly in
|
|
137
|
+
the public API error schema instead of relying on `NamedError.toObject()` in
|
|
138
|
+
generic middleware.
|
|
139
|
+
|
|
140
|
+
## User-Facing Rendering
|
|
141
|
+
|
|
142
|
+
HTTP serialization and user rendering are separate boundaries. The server
|
|
143
|
+
should send structured public errors; CLI and TUI code should format those
|
|
144
|
+
structures through one shared formatter.
|
|
145
|
+
|
|
146
|
+
For SDK calls using `{ throwOnError: true }`, the generated client may wrap the
|
|
147
|
+
decoded response body in an `Error`. The original body should remain available
|
|
148
|
+
under `error.cause.body`; `FormatError` is the right place to unwrap and render
|
|
149
|
+
that body. TUI aggregation helpers should call `FormatError` first, then fall
|
|
150
|
+
back to generic `Error.message` / string rendering.
|
|
151
|
+
|
|
152
|
+
When several parallel startup requests fail from the same underlying issue,
|
|
153
|
+
group identical rendered messages and list the affected request names once.
|
|
154
|
+
For example:
|
|
155
|
+
|
|
156
|
+
```text
|
|
157
|
+
Configuration is invalid at /path/to/miaw.json
|
|
158
|
+
↳ Expected object, got "not-object" provider.bad.options
|
|
159
|
+
Affected startup requests: config.providers, provider.list, app.agents, config.get
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Middleware Guidance
|
|
163
|
+
|
|
164
|
+
HTTP middleware should be cross-cutting: auth, context, schema decode
|
|
165
|
+
formatting, routing, and final unknown-defect fallback.
|
|
166
|
+
|
|
167
|
+
The current compatibility middleware still knows about some legacy domain
|
|
168
|
+
errors. As route groups declare expected errors and handlers map them, that
|
|
169
|
+
middleware should shrink. It should not gain new name checks.
|
|
170
|
+
|
|
171
|
+
Unknown `500` responses should log full details server-side with
|
|
172
|
+
`Cause.pretty(cause)` and return a safe public body.
|
|
173
|
+
|
|
174
|
+
The config startup regression in #27056 is the failure mode this rule is meant
|
|
175
|
+
to avoid: a user-authored invalid `miaw.json` crossed the HttpApi boundary
|
|
176
|
+
as a defect, so middleware replaced a useful `ConfigInvalidError` with a safe
|
|
177
|
+
generic `UnknownError`. The compatibility fix is to preserve config parse and
|
|
178
|
+
validation errors as client-visible `400`s. The target architecture is better:
|
|
179
|
+
config loading should fail on the typed error channel, config HTTP handlers
|
|
180
|
+
should map those errors to declared `ConfigApiError` responses, and the generic
|
|
181
|
+
middleware should never see them.
|
|
182
|
+
|
|
183
|
+
## Migration Order
|
|
184
|
+
|
|
185
|
+
Prefer small vertical slices:
|
|
186
|
+
|
|
187
|
+
1. Fix rendering at one user-visible boundary.
|
|
188
|
+
2. Convert one service domain to `Schema.TaggedErrorClass` errors.
|
|
189
|
+
3. Map those errors at the affected HTTP handlers.
|
|
190
|
+
4. Remove the corresponding name-based middleware branch if possible.
|
|
191
|
+
5. Add or update focused tests for both service error tags and HTTP wire
|
|
192
|
+
bodies.
|
|
193
|
+
|
|
194
|
+
Good early domains are storage not-found, worktree errors, and provider
|
|
195
|
+
auth validation errors because they currently drive HTTP behavior.
|
|
196
|
+
|
|
197
|
+
Config parse and validation errors are also a good early slice because they
|
|
198
|
+
are startup-blocking and must be rendered clearly in both CLI and TUI flows.
|
|
199
|
+
|
|
200
|
+
## Checklist For A PR
|
|
201
|
+
|
|
202
|
+
- [ ] Expected failures are typed errors, not defects.
|
|
203
|
+
- [ ] Service method signatures expose the expected error union.
|
|
204
|
+
- [ ] HTTP handlers translate domain errors at the boundary.
|
|
205
|
+
- [ ] Public HTTP error bodies preserve existing wire contracts.
|
|
206
|
+
- [ ] Generic middleware gets smaller or stays unchanged.
|
|
207
|
+
- [ ] Focused tests cover the service error and any public HTTP response.
|