orynacode-ai 1.16.2
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/BUN_SHELL_MIGRATION_PLAN.md +136 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/orynacode +199 -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 +155 -0
- package/parsers-config.ts +386 -0
- package/script/bench-search.ts +115 -0
- package/script/bench-test-suite.ts +52 -0
- package/script/build.ts +244 -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 +459 -0
- package/src/account/repo.ts +170 -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 +344 -0
- package/src/acp/permission.ts +145 -0
- package/src/acp/profile.ts +42 -0
- package/src/acp/service.ts +1062 -0
- package/src/acp/session.ts +231 -0
- package/src/acp/tool.ts +317 -0
- package/src/acp/usage.ts +239 -0
- package/src/agent/agent.ts +433 -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 +35 -0
- package/src/audio.d.ts +14 -0
- package/src/auth/index.ts +96 -0
- package/src/background/job.ts +36 -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 +76 -0
- package/src/cli/cmd/agent.ts +259 -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 +87 -0
- package/src/cli/cmd/debug/index.ts +87 -0
- package/src/cli/cmd/debug/lsp.ts +51 -0
- package/src/cli/cmd/debug/ripgrep.ts +99 -0
- package/src/cli/cmd/debug/scrap.ts +18 -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 +46 -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 +846 -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 +48 -0
- package/src/cli/cmd/providers.ts +506 -0
- package/src/cli/cmd/run/demo.ts +1274 -0
- package/src/cli/cmd/run/entry.body.ts +194 -0
- package/src/cli/cmd/run/footer.command.tsx +899 -0
- package/src/cli/cmd/run/footer.menu.tsx +306 -0
- package/src/cli/cmd/run/footer.permission.tsx +475 -0
- package/src/cli/cmd/run/footer.prompt.tsx +1207 -0
- package/src/cli/cmd/run/footer.question.tsx +579 -0
- package/src/cli/cmd/run/footer.subagent.tsx +171 -0
- package/src/cli/cmd/run/footer.ts +1092 -0
- package/src/cli/cmd/run/footer.view.tsx +935 -0
- package/src/cli/cmd/run/otel.ts +117 -0
- package/src/cli/cmd/run/permission.shared.ts +256 -0
- package/src/cli/cmd/run/prompt.shared.ts +147 -0
- package/src/cli/cmd/run/question.shared.ts +340 -0
- package/src/cli/cmd/run/runtime.boot.ts +210 -0
- package/src/cli/cmd/run/runtime.lifecycle.ts +369 -0
- package/src/cli/cmd/run/runtime.queue.ts +347 -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 +879 -0
- package/src/cli/cmd/run/scrollback.shared.ts +92 -0
- package/src/cli/cmd/run/scrollback.surface.ts +435 -0
- package/src/cli/cmd/run/scrollback.writer.tsx +335 -0
- package/src/cli/cmd/run/session-data.ts +1113 -0
- package/src/cli/cmd/run/session-replay.ts +301 -0
- package/src/cli/cmd/run/session.shared.ts +196 -0
- package/src/cli/cmd/run/splash.ts +310 -0
- package/src/cli/cmd/run/stream.transport.ts +1465 -0
- package/src/cli/cmd/run/stream.ts +175 -0
- package/src/cli/cmd/run/subagent-data.ts +844 -0
- package/src/cli/cmd/run/theme.ts +603 -0
- package/src/cli/cmd/run/tool.ts +1489 -0
- package/src/cli/cmd/run/trace.ts +94 -0
- package/src/cli/cmd/run/types.ts +342 -0
- package/src/cli/cmd/run/variant.shared.ts +215 -0
- package/src/cli/cmd/run.ts +879 -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/app.tsx +1113 -0
- package/src/cli/cmd/tui/attach.ts +103 -0
- package/src/cli/cmd/tui/attention.ts +262 -0
- package/src/cli/cmd/tui/component/bg-pulse-render.ts +436 -0
- package/src/cli/cmd/tui/component/bg-pulse.tsx +99 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/command-palette.tsx +79 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +85 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +185 -0
- package/src/cli/cmd/tui/component/dialog-move-session.tsx +240 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +687 -0
- package/src/cli/cmd/tui/component/dialog-retry-action.tsx +160 -0
- package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +99 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +318 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-skill.tsx +36 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +168 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +47 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +313 -0
- package/src/cli/cmd/tui/component/dialog-workspace-file-changes.tsx +144 -0
- package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +112 -0
- package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +69 -0
- package/src/cli/cmd/tui/component/error-component.tsx +81 -0
- package/src/cli/cmd/tui/component/logo.tsx +885 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +799 -0
- package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +117 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1725 -0
- package/src/cli/cmd/tui/component/prompt/move.tsx +192 -0
- package/src/cli/cmd/tui/component/prompt/part.ts +31 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/prompt/traits.ts +35 -0
- package/src/cli/cmd/tui/component/prompt/workspace.tsx +137 -0
- package/src/cli/cmd/tui/component/spinner.tsx +24 -0
- package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/component/use-connected.tsx +9 -0
- package/src/cli/cmd/tui/component/workspace-label.tsx +19 -0
- package/src/cli/cmd/tui/config/cwd.ts +5 -0
- package/src/cli/cmd/tui/config/keybind.ts +467 -0
- package/src/cli/cmd/tui/config/tui-migrate.ts +154 -0
- package/src/cli/cmd/tui/config/tui-schema.ts +88 -0
- package/src/cli/cmd/tui/config/tui.ts +308 -0
- package/src/cli/cmd/tui/context/agent.tsx +11 -0
- package/src/cli/cmd/tui/context/aggregate-failures.ts +51 -0
- package/src/cli/cmd/tui/context/args.tsx +15 -0
- package/src/cli/cmd/tui/context/directory.ts +15 -0
- package/src/cli/cmd/tui/context/editor-zed.ts +287 -0
- package/src/cli/cmd/tui/context/editor.ts +469 -0
- package/src/cli/cmd/tui/context/event.ts +38 -0
- package/src/cli/cmd/tui/context/exit.tsx +42 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/kv.tsx +76 -0
- package/src/cli/cmd/tui/context/local.tsx +510 -0
- package/src/cli/cmd/tui/context/path-format.tsx +39 -0
- package/src/cli/cmd/tui/context/project.tsx +111 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +52 -0
- package/src/cli/cmd/tui/context/sdk.tsx +142 -0
- package/src/cli/cmd/tui/context/sync-v2.tsx +447 -0
- package/src/cli/cmd/tui/context/sync.tsx +628 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/opencode.json +245 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/oryna.json +95 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1341 -0
- package/src/cli/cmd/tui/context/thinking.ts +67 -0
- package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
- package/src/cli/cmd/tui/event.ts +53 -0
- package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +98 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +288 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +59 -0
- package/src/cli/cmd/tui/feature-plugins/session/dialog.tsx +356 -0
- package/src/cli/cmd/tui/feature-plugins/session/index.tsx +32 -0
- package/src/cli/cmd/tui/feature-plugins/session/preview-pane.tsx +288 -0
- package/src/cli/cmd/tui/feature-plugins/session/util.tsx +54 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +65 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +70 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +96 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +65 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +97 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +49 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree-utils.ts +232 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree.tsx +162 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-ui.tsx +103 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer.tsx +1058 -0
- package/src/cli/cmd/tui/feature-plugins/system/notifications.ts +94 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +269 -0
- package/src/cli/cmd/tui/feature-plugins/system/session-v2.tsx +1184 -0
- package/src/cli/cmd/tui/feature-plugins/system/which-key.tsx +608 -0
- package/src/cli/cmd/tui/keymap.tsx +283 -0
- package/src/cli/cmd/tui/layer.ts +6 -0
- package/src/cli/cmd/tui/plugin/api.tsx +390 -0
- package/src/cli/cmd/tui/plugin/command-shim.ts +109 -0
- package/src/cli/cmd/tui/plugin/internal.ts +42 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +1131 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
- package/src/cli/cmd/tui/routes/home/session-destination.tsx +39 -0
- package/src/cli/cmd/tui/routes/home.tsx +149 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +108 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +2629 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +729 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +514 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +102 -0
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +132 -0
- package/src/cli/cmd/tui/thread.ts +264 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +66 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +108 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +217 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +40 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +126 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +712 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +218 -0
- package/src/cli/cmd/tui/ui/link.tsx +34 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +102 -0
- package/src/cli/cmd/tui/util/audio.ts +58 -0
- package/src/cli/cmd/tui/util/clipboard.ts +181 -0
- package/src/cli/cmd/tui/util/collapse-tool-output.ts +19 -0
- package/src/cli/cmd/tui/util/editor.ts +43 -0
- package/src/cli/cmd/tui/util/layout.ts +25 -0
- package/src/cli/cmd/tui/util/model.ts +23 -0
- package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
- package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
- package/src/cli/cmd/tui/util/scroll.ts +25 -0
- package/src/cli/cmd/tui/util/selection.ts +73 -0
- package/src/cli/cmd/tui/util/signal.ts +41 -0
- package/src/cli/cmd/tui/util/transcript.ts +112 -0
- package/src/cli/cmd/tui/validate-session.ts +29 -0
- package/src/cli/cmd/tui/win32.ts +130 -0
- package/src/cli/cmd/tui/worker.ts +99 -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 +118 -0
- package/src/cli/heap.ts +59 -0
- package/src/cli/logo.ts +21 -0
- package/src/cli/network.ts +64 -0
- package/src/cli/ui.ts +132 -0
- package/src/cli/upgrade.ts +53 -0
- package/src/command/index.ts +181 -0
- package/src/command/template/initialize.txt +66 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/agent.ts +68 -0
- package/src/config/command.ts +45 -0
- package/src/config/config.ts +679 -0
- package/src/config/entry-name.ts +19 -0
- package/src/config/managed.ts +77 -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/reference.ts +48 -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 +1075 -0
- package/src/effect/app-runtime.ts +133 -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 +72 -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 +76 -0
- package/src/env/index.ts +40 -0
- package/src/event-v2-bridge.ts +76 -0
- package/src/format/formatter.ts +404 -0
- package/src/format/index.ts +212 -0
- package/src/git/index.ts +347 -0
- package/src/id/id.ts +80 -0
- package/src/ide/index.ts +70 -0
- package/src/image/image.ts +177 -0
- package/src/index.ts +208 -0
- package/src/installation/index.ts +349 -0
- package/src/lsp/client.ts +686 -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 +517 -0
- package/src/lsp/server.ts +2064 -0
- package/src/markdown.d.ts +4 -0
- package/src/mcp/auth.ts +171 -0
- package/src/mcp/index.ts +982 -0
- package/src/mcp/oauth-callback.ts +232 -0
- package/src/mcp/oauth-provider.ts +217 -0
- package/src/node.ts +5 -0
- package/src/oryna/agent.ts +112 -0
- package/src/oryna/reply-service.ts +8 -0
- package/src/patch/index.ts +689 -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 +391 -0
- package/src/plugin/github-copilot/copilot.ts +417 -0
- package/src/plugin/github-copilot/models.ts +246 -0
- package/src/plugin/index.ts +323 -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 +647 -0
- package/src/plugin/openai/ws-pool.ts +290 -0
- package/src/plugin/openai/ws.ts +381 -0
- package/src/plugin/oryna.ts +349 -0
- package/src/plugin/shared.ts +323 -0
- package/src/plugin/xai.ts +742 -0
- package/src/project/bootstrap-service.ts +9 -0
- package/src/project/bootstrap.ts +80 -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 +207 -0
- package/src/project/project.ts +520 -0
- package/src/project/vcs.ts +435 -0
- package/src/provider/auth.ts +230 -0
- package/src/provider/error.ts +188 -0
- package/src/provider/model-status.ts +8 -0
- package/src/provider/provider.ts +2009 -0
- package/src/provider/transform.ts +1363 -0
- package/src/pty-preparation.ts +30 -0
- package/src/question/index.ts +229 -0
- package/src/question/schema.ts +10 -0
- package/src/reference/reference.ts +239 -0
- package/src/reference/repository-cache.ts +320 -0
- package/src/server/auth.ts +48 -0
- package/src/server/cors.ts +34 -0
- package/src/server/event.ts +13 -0
- package/src/server/global-lifecycle.ts +37 -0
- package/src/server/init-projectors.ts +3 -0
- package/src/server/mdns.ts +60 -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 +172 -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 +88 -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 +151 -0
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
- package/src/server/routes/instance/httpapi/handlers/control.ts +40 -0
- package/src/server/routes/instance/httpapi/handlers/event.ts +102 -0
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
- package/src/server/routes/instance/httpapi/handlers/file.ts +103 -0
- package/src/server/routes/instance/httpapi/handlers/global.ts +157 -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 +157 -0
- package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
- package/src/server/routes/instance/httpapi/handlers/provider.ts +160 -0
- package/src/server/routes/instance/httpapi/handlers/pty.ts +258 -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 +442 -0
- package/src/server/routes/instance/httpapi/handlers/sync.ts +95 -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 +57 -0
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +147 -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 +36 -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 +42 -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 +277 -0
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
- package/src/server/server.ts +218 -0
- package/src/server/shared/fence.ts +68 -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/session/compaction.ts +609 -0
- package/src/session/instruction.ts +237 -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 +215 -0
- package/src/session/llm.ts +402 -0
- package/src/session/message-error.ts +14 -0
- package/src/session/message-v2.ts +745 -0
- package/src/session/message.ts +148 -0
- package/src/session/overflow.ts +34 -0
- package/src/session/processor.ts +1063 -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/reference.ts +72 -0
- package/src/session/prompt/trinity.txt +97 -0
- package/src/session/prompt.ts +1755 -0
- package/src/session/reminders.ts +92 -0
- package/src/session/retry.ts +201 -0
- package/src/session/revert.ts +153 -0
- package/src/session/run-state.ts +153 -0
- package/src/session/schema.ts +26 -0
- package/src/session/session.ts +1116 -0
- package/src/session/status.ts +94 -0
- package/src/session/summary.ts +162 -0
- package/src/session/system.ts +84 -0
- package/src/session/todo.ts +87 -0
- package/src/session/tools.ts +211 -0
- package/src/share/session.ts +58 -0
- package/src/share/share-next.ts +379 -0
- package/src/shell/shell.ts +215 -0
- package/src/skill/discovery.ts +115 -0
- package/src/skill/index.ts +357 -0
- package/src/snapshot/index.ts +759 -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 +33 -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 +84 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +140 -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 +392 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/registry.ts +475 -0
- package/src/tool/reply.ts +29 -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 +660 -0
- package/src/tool/skill.ts +72 -0
- package/src/tool/skill.txt +5 -0
- package/src/tool/task.ts +338 -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 +160 -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 +88 -0
- package/src/util/filesystem.ts +251 -0
- package/src/util/format.ts +20 -0
- package/src/util/iife.ts +3 -0
- package/src/util/lan-scan.ts +90 -0
- package/src/util/lazy.ts +20 -0
- package/src/util/local-context.ts +25 -0
- package/src/util/locale.ts +86 -0
- package/src/util/media.ts +26 -0
- package/src/util/process.ts +176 -0
- package/src/util/proxy-env.ts +72 -0
- package/src/util/queue.ts +32 -0
- package/src/util/record.ts +3 -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 +645 -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 +711 -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 +710 -0
- package/test/agent/plan-mode-subagent-bypass.test.ts +213 -0
- package/test/agent/plugin-agent-regression.test.ts +62 -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/aggregate-failures.test.ts +93 -0
- package/test/cli/cmd/tui/attention.test.ts +484 -0
- package/test/cli/cmd/tui/dialog-workspace-create.test.ts +28 -0
- package/test/cli/cmd/tui/model-options.test.ts +30 -0
- package/test/cli/cmd/tui/notifications.test.ts +267 -0
- package/test/cli/cmd/tui/prompt-history.test.ts +44 -0
- package/test/cli/cmd/tui/prompt-part.test.ts +77 -0
- package/test/cli/cmd/tui/prompt-traits.test.ts +29 -0
- package/test/cli/cmd/tui/provider-options.test.ts +29 -0
- package/test/cli/cmd/tui/sync-fixture.tsx +64 -0
- package/test/cli/cmd/tui/sync-live-hydration.test.tsx +278 -0
- package/test/cli/cmd/tui/sync-undefined-messages.test.tsx +47 -0
- package/test/cli/cmd/tui/sync.test.tsx +70 -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 +927 -0
- package/test/cli/run/permission.shared.test.ts +144 -0
- package/test/cli/run/prompt.shared.test.ts +133 -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 +282 -0
- package/test/cli/run/runtime.queue.test.ts +465 -0
- package/test/cli/run/runtime.stdin.test.ts +71 -0
- package/test/cli/run/scrollback.surface.test.ts +1048 -0
- package/test/cli/run/session-data.test.ts +595 -0
- package/test/cli/run/session-replay.test.ts +456 -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 +456 -0
- package/test/cli/run/theme.test.ts +152 -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/__snapshots__/inline-tool-wrap-snapshot.test.tsx.snap +72 -0
- package/test/cli/tui/app-lifecycle.test.ts +261 -0
- package/test/cli/tui/dialog-prompt.test.tsx +146 -0
- package/test/cli/tui/diff-viewer-file-tree-utils.test.ts +323 -0
- package/test/cli/tui/diff-viewer-file-tree.test.tsx +197 -0
- package/test/cli/tui/diff-viewer.test.tsx +230 -0
- package/test/cli/tui/editor-context-zed.test.ts +384 -0
- package/test/cli/tui/editor-context.test.tsx +288 -0
- package/test/cli/tui/inline-tool-wrap-snapshot.test.tsx +232 -0
- package/test/cli/tui/keymap.test.tsx +136 -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/prompt-submit-race.test.ts +98 -0
- package/test/cli/tui/revert-diff.test.ts +35 -0
- package/test/cli/tui/slot-replace.test.tsx +50 -0
- package/test/cli/tui/sync-v2.test.tsx +558 -0
- package/test/cli/tui/theme-store.test.ts +76 -0
- package/test/cli/tui/thinking.test.ts +36 -0
- package/test/cli/tui/thread.test.ts +28 -0
- package/test/cli/tui/transcript.test.ts +426 -0
- package/test/cli/tui/use-event.test.tsx +145 -0
- package/test/config/agent-color.test.ts +47 -0
- package/test/config/config.test.ts +1991 -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 +878 -0
- package/test/control-plane/adapters.test.ts +71 -0
- package/test/control-plane/workspace.test.ts +1704 -0
- package/test/effect/app-runtime-logger.test.ts +105 -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/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-plugin.ts +355 -0
- package/test/fixture/tui-runtime.ts +64 -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 +771 -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 +493 -0
- package/test/lsp/index.test.ts +232 -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 +888 -0
- package/test/mcp/oauth-auto-connect.test.ts +236 -0
- package/test/mcp/oauth-browser.test.ts +228 -0
- package/test/mcp/oauth-callback.test.ts +34 -0
- package/test/mcp/oauth-provider.test.ts +61 -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/trigger.test.ts +120 -0
- package/test/plugin/workspace-adapter.test.ts +137 -0
- package/test/plugin/xai.test.ts +634 -0
- package/test/preload.ts +95 -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 +170 -0
- package/test/project/project-directory.test.ts +169 -0
- package/test/project/project.test.ts +818 -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 +3937 -0
- package/test/pty/pty-shell.test.ts +102 -0
- package/test/question/question.test.ts +465 -0
- package/test/reference/reference.test.ts +310 -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 +107 -0
- package/test/server/httpapi-authorization.test.ts +174 -0
- package/test/server/httpapi-compression.test.ts +154 -0
- package/test/server/httpapi-config.test.ts +113 -0
- package/test/server/httpapi-control-plane.test.ts +63 -0
- package/test/server/httpapi-cors-vary.test.ts +66 -0
- package/test/server/httpapi-cors.test.ts +122 -0
- package/test/server/httpapi-error-middleware.test.ts +96 -0
- package/test/server/httpapi-event.test.ts +97 -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 +1535 -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 +300 -0
- package/test/server/httpapi-file.test.ts +76 -0
- package/test/server/httpapi-global.test.ts +66 -0
- package/test/server/httpapi-instance-context.test.ts +347 -0
- package/test/server/httpapi-instance-route-auth.test.ts +84 -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 +415 -0
- package/test/server/httpapi-mcp-oauth.test.ts +73 -0
- package/test/server/httpapi-mcp.test.ts +226 -0
- package/test/server/httpapi-mdns.test.ts +82 -0
- package/test/server/httpapi-promptasync-context.test.ts +222 -0
- package/test/server/httpapi-provider.test.ts +403 -0
- package/test/server/httpapi-pty.test.ts +275 -0
- package/test/server/httpapi-public-openapi.test.ts +297 -0
- package/test/server/httpapi-query-schema-drift.test.ts +330 -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 +1013 -0
- package/test/server/httpapi-sync.test.ts +154 -0
- package/test/server/httpapi-ui.test.ts +456 -0
- package/test/server/httpapi-v2-location.test.ts +85 -0
- package/test/server/httpapi-workspace-routing.test.ts +554 -0
- package/test/server/httpapi-workspace.test.ts +515 -0
- package/test/server/negative-tokens-regression.test.ts +83 -0
- package/test/server/project-copy.test.ts +101 -0
- package/test/server/project-init-git.test.ts +117 -0
- package/test/server/proxy-util.test.ts +113 -0
- package/test/server/sdk-error-shape.test.ts +84 -0
- package/test/server/sdk-v1-smoke.test.ts +60 -0
- package/test/server/session-actions.test.ts +112 -0
- package/test/server/session-diff-missing-patch.test.ts +99 -0
- package/test/server/session-list.test.ts +314 -0
- package/test/server/session-messages.test.ts +182 -0
- package/test/server/session-select.test.ts +69 -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 +1835 -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 +1059 -0
- package/test/session/processor-effect.test.ts +1101 -0
- package/test/session/prompt.test.ts +2318 -0
- package/test/session/retry.test.ts +439 -0
- package/test/session/revert-compact.test.ts +642 -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 +251 -0
- package/test/session/snapshot-tool-race.test.ts +280 -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 +84 -0
- package/test/share/share-next.test.ts +344 -0
- package/test/shell/shell.test.ts +99 -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/storage/workspace-time-migration.test.ts +50 -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 +188 -0
- package/test/tool/grep.test.ts +266 -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 +654 -0
- package/test/tool/registry.test.ts +539 -0
- package/test/tool/shell.test.ts +1238 -0
- package/test/tool/skill.test.ts +132 -0
- package/test/tool/task.test.ts +901 -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 +64 -0
- package/test/util/filesystem.test.ts +656 -0
- package/test/util/format.test.ts +59 -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/log.test.ts +77 -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 +270 -0
- package/tsconfig.json +17 -0
|
@@ -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/opencode.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 `opencode.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.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Facade removal checklist
|
|
2
|
+
|
|
3
|
+
Concrete inventory of the remaining `makeRuntime(...)`-backed facades in `packages/opencode`.
|
|
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 opencode 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.
|