openfork 1.17.14 → 1.17.16
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/bin/opencode +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 -17
- 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/{postinstall.mjs → script/postinstall.mjs} +0 -0
- package/script/profile-test-files.ts +42 -0
- package/script/publish.ts +82 -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 +461 -0
- package/src/account/repo.ts +171 -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 +269 -0
- package/src/acp/directory.ts +212 -0
- package/src/acp/error.ts +97 -0
- package/src/acp/event.ts +342 -0
- package/src/acp/permission.ts +254 -0
- package/src/acp/profile.ts +42 -0
- package/src/acp/service.ts +1097 -0
- package/src/acp/session.ts +232 -0
- package/src/acp/tool.ts +364 -0
- package/src/acp/usage.ts +239 -0
- package/src/agent/agent.ts +498 -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/goal.txt +36 -0
- package/src/agent/prompt/review.txt +31 -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 +97 -0
- package/src/background/job.ts +37 -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 +259 -0
- package/src/cli/cmd/attach.ts +148 -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 +16 -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 +42 -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 +840 -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 +175 -0
- package/src/cli/cmd/run/footer.ts +1129 -0
- package/src/cli/cmd/run/footer.view.tsx +945 -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 +1953 -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 +216 -0
- package/src/cli/cmd/run.ts +1011 -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 +305 -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 +80 -0
- package/src/cli/tui/layer.ts +8 -0
- package/src/cli/tui/validate-session.ts +29 -0
- package/src/cli/tui/worker.ts +80 -0
- package/src/cli/ui.ts +132 -0
- package/src/cli/upgrade.ts +53 -0
- package/src/command/index.ts +177 -0
- package/src/command/template/initialize.txt +66 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/agent.ts +59 -0
- package/src/config/command.ts +39 -0
- package/src/config/config.ts +680 -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 +276 -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 +964 -0
- package/src/effect/app-node-builder-v1.ts +12 -0
- package/src/effect/app-runtime.ts +135 -0
- package/src/effect/bootstrap-runtime.ts +19 -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 +78 -0
- package/src/env/index.ts +41 -0
- package/src/event-manifest.ts +3 -0
- package/src/event-v2-bridge.ts +71 -0
- package/src/format/formatter.ts +404 -0
- package/src/format/index.ts +203 -0
- package/src/git/index.ts +348 -0
- package/src/id/id.ts +80 -0
- package/src/ide/index.ts +54 -0
- package/src/image/image.ts +172 -0
- package/src/index.ts +142 -0
- package/src/installation/index.ts +336 -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 +507 -0
- package/src/lsp/server.ts +1983 -0
- package/src/markdown.d.ts +4 -0
- package/src/mcp/auth.ts +163 -0
- package/src/mcp/catalog.ts +170 -0
- package/src/mcp/index.ts +1018 -0
- package/src/mcp/oauth-callback.ts +194 -0
- package/src/mcp/oauth-provider.ts +259 -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 +223 -0
- package/src/plugin/azure.ts +26 -0
- package/src/plugin/cloudflare.ts +76 -0
- package/src/plugin/digitalocean.ts +325 -0
- package/src/plugin/github-copilot/copilot.ts +414 -0
- package/src/plugin/github-copilot/models.ts +258 -0
- package/src/plugin/index.ts +314 -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 +556 -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 +507 -0
- package/src/plugin/tui/internal.ts +10 -0
- package/src/plugin/tui/runtime.ts +1131 -0
- package/src/plugin/xai.ts +626 -0
- package/src/project/bootstrap-service.ts +9 -0
- package/src/project/bootstrap.ts +58 -0
- package/src/project/instance-context.ts +24 -0
- package/src/project/instance-runtime.ts +16 -0
- package/src/project/instance-store.ts +213 -0
- package/src/project/project.ts +483 -0
- package/src/project/vcs.ts +423 -0
- package/src/provider/auth.ts +229 -0
- package/src/provider/error.ts +188 -0
- package/src/provider/model-status.ts +8 -0
- package/src/provider/provider.ts +1981 -0
- package/src/provider/transform.ts +1561 -0
- package/src/question/index.ts +161 -0
- package/src/question/schema.ts +4 -0
- package/src/server/auth.ts +48 -0
- package/src/server/event.ts +10 -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 +97 -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 +275 -0
- package/src/server/routes/instance/httpapi/groups/file.ts +185 -0
- package/src/server/routes/instance/httpapi/groups/global.ts +136 -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 +193 -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 +442 -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 +537 -0
- package/src/server/routes/instance/httpapi/server.ts +325 -0
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +60 -0
- package/src/server/server.ts +226 -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 +1 -0
- package/src/session/compaction.ts +562 -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 +226 -0
- package/src/session/llm.ts +404 -0
- package/src/session/message-error.ts +14 -0
- package/src/session/message-v2.ts +734 -0
- package/src/session/message.ts +148 -0
- package/src/session/overflow.ts +34 -0
- package/src/session/processor.ts +718 -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/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.ts +1631 -0
- package/src/session/reminders.ts +92 -0
- package/src/session/retry.ts +201 -0
- package/src/session/revert.ts +146 -0
- package/src/session/run-state.ts +151 -0
- package/src/session/schema.ts +26 -0
- package/src/session/session.ts +1018 -0
- package/src/session/status.ts +56 -0
- package/src/session/summary.ts +160 -0
- package/src/session/system.ts +143 -0
- package/src/session/todo.ts +74 -0
- package/src/session/tools.ts +590 -0
- package/src/share/session.ts +58 -0
- package/src/share/share-next.ts +371 -0
- package/src/skill/discovery.ts +140 -0
- package/src/skill/index.ts +354 -0
- package/src/snapshot/index.ts +807 -0
- package/src/sql.d.ts +4 -0
- package/src/storage/schema.ts +5 -0
- package/src/storage/storage.ts +327 -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/code-mode.ts +324 -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 +450 -0
- package/src/tool/schema.ts +14 -0
- package/src/tool/shell/id.ts +19 -0
- package/src/tool/shell/prompt.ts +293 -0
- package/src/tool/shell/shell.txt +21 -0
- package/src/tool/shell.ts +645 -0
- package/src/tool/skill.ts +70 -0
- package/src/tool/skill.txt +5 -0
- package/src/tool/task.ts +346 -0
- package/src/tool/task.txt +37 -0
- package/src/tool/todo.ts +46 -0
- package/src/tool/todowrite.txt +44 -0
- package/src/tool/tool.ts +183 -0
- package/src/tool/truncate.ts +156 -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/html.ts +8 -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 +623 -0
- package/test/AGENTS.md +204 -0
- package/test/EFFECT_TEST_MIGRATION.md +169 -0
- package/test/account/repo.test.ts +355 -0
- package/test/account/service.test.ts +456 -0
- package/test/acp/config-option.test.ts +229 -0
- package/test/acp/content.test.ts +235 -0
- package/test/acp/directory.test.ts +188 -0
- package/test/acp/error.test.ts +67 -0
- package/test/acp/event.test.ts +751 -0
- package/test/acp/permission.test.ts +401 -0
- package/test/acp/service-session.test.ts +1248 -0
- package/test/acp/session.test.ts +201 -0
- package/test/acp/tool.test.ts +298 -0
- package/test/acp/usage.test.ts +318 -0
- package/test/agent/agent.test.ts +755 -0
- package/test/agent/plan-mode-subagent-bypass.test.ts +160 -0
- package/test/agent/plugin-agent-regression.test.ts +51 -0
- package/test/auth/auth.test.ts +75 -0
- package/test/background/job.test.ts +244 -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 +40 -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 +623 -0
- package/test/cli/help/help-snapshots.test.ts +140 -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 +331 -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 +1092 -0
- package/test/cli/run/session-data.test.ts +593 -0
- package/test/cli/run/session-replay.test.ts +691 -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 +218 -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 +95 -0
- package/test/config/agent-color.test.ts +47 -0
- package/test/config/config.test.ts +2027 -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 +894 -0
- package/test/control-plane/adapters.test.ts +71 -0
- package/test/control-plane/workspace.test.ts +1701 -0
- package/test/effect/app-runtime-logger.test.ts +101 -0
- package/test/effect/config-service.test.ts +65 -0
- package/test/effect/instance-state.test.ts +392 -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 +374 -0
- package/test/event-manifest.test.ts +24 -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 +318 -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 +228 -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 +34 -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 +235 -0
- package/test/git/git.test.ts +179 -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 +121 -0
- package/test/installation/installation.test.ts +240 -0
- package/test/lib/cli-process.ts +535 -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 +231 -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/catalog.test.ts +47 -0
- package/test/mcp/headers.test.ts +127 -0
- package/test/mcp/lifecycle.test.ts +1304 -0
- package/test/mcp/oauth-auto-connect.test.ts +367 -0
- package/test/mcp/oauth-browser.test.ts +243 -0
- package/test/mcp/oauth-callback.test.ts +114 -0
- package/test/mcp/oauth-provider.test.ts +102 -0
- package/test/mcp/session-recovery.test.ts +27 -0
- package/test/patch/patch.test.ts +384 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/next.test.ts +1174 -0
- package/test/permission-task.test.ts +319 -0
- package/test/plugin/auth-override.test.ts +101 -0
- package/test/plugin/cloudflare.test.ts +68 -0
- package/test/plugin/codex.test.ts +256 -0
- package/test/plugin/github-copilot-models.test.ts +370 -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 +1306 -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 +884 -0
- package/test/plugin/shared.test.ts +88 -0
- package/test/plugin/snowflake-cortex.test.ts +278 -0
- package/test/plugin/trigger.test.ts +108 -0
- package/test/plugin/workspace-adapter.test.ts +111 -0
- package/test/plugin/xai.test.ts +620 -0
- package/test/preload.ts +92 -0
- package/test/project/instance-bootstrap.test.ts +115 -0
- package/test/project/instance.test.ts +248 -0
- package/test/project/migrate-global.test.ts +168 -0
- package/test/project/project-directory.test.ts +202 -0
- package/test/project/project.test.ts +808 -0
- package/test/project/vcs.test.ts +335 -0
- package/test/project/worktree-remove.test.ts +128 -0
- package/test/project/worktree.test.ts +324 -0
- package/test/provider/amazon-bedrock.test.ts +361 -0
- package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
- package/test/provider/digitalocean.test.ts +124 -0
- package/test/provider/gitlab-duo.test.ts +412 -0
- package/test/provider/header-timeout.test.ts +234 -0
- package/test/provider/model-status.test.ts +61 -0
- package/test/provider/provider.test.ts +1912 -0
- package/test/provider/transform.test.ts +4742 -0
- package/test/question/question.test.ts +459 -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 +108 -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 +1802 -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 +127 -0
- package/test/server/httpapi-experimental.test.ts +298 -0
- package/test/server/httpapi-file.test.ts +83 -0
- package/test/server/httpapi-global.test.ts +66 -0
- package/test/server/httpapi-instance-context.test.ts +337 -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 +465 -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 +212 -0
- package/test/server/httpapi-provider.test.ts +401 -0
- package/test/server/httpapi-pty.test.ts +299 -0
- package/test/server/httpapi-public-openapi.test.ts +350 -0
- package/test/server/httpapi-query-schema-drift.test.ts +330 -0
- package/test/server/httpapi-reference.test.ts +63 -0
- package/test/server/httpapi-schema-error-body.test.ts +166 -0
- package/test/server/httpapi-sdk.test.ts +913 -0
- package/test/server/httpapi-session.test.ts +1090 -0
- package/test/server/httpapi-sync.test.ts +149 -0
- package/test/server/httpapi-ui.test.ts +456 -0
- package/test/server/httpapi-v2-location.test.ts +126 -0
- package/test/server/httpapi-v2-pty.test.ts +250 -0
- package/test/server/httpapi-workspace-routing.test.ts +552 -0
- package/test/server/httpapi-workspace.test.ts +506 -0
- package/test/server/negative-tokens-regression.test.ts +84 -0
- package/test/server/project-copy.test.ts +127 -0
- package/test/server/project-init-git.test.ts +118 -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 +110 -0
- package/test/server/session-diff-missing-patch.test.ts +97 -0
- package/test/server/session-list.test.ts +302 -0
- package/test/server/session-messages.test.ts +180 -0
- package/test/server/session-select.test.ts +67 -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 +1819 -0
- package/test/session/instruction.test.ts +264 -0
- package/test/session/llm-native-recorded.test.ts +413 -0
- package/test/session/llm-native.test.ts +761 -0
- package/test/session/llm.test.ts +2003 -0
- package/test/session/message-v2.test.ts +1661 -0
- package/test/session/messages-pagination.test.ts +1057 -0
- package/test/session/processor-effect.test.ts +1067 -0
- package/test/session/prompt.test.ts +2402 -0
- package/test/session/retry.test.ts +440 -0
- package/test/session/revert-compact.test.ts +638 -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 +253 -0
- package/test/session/snapshot-tool-race.test.ts +189 -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 +142 -0
- package/test/share/share-next.test.ts +324 -0
- package/test/skill/discovery.test.ts +186 -0
- package/test/skill/skill.test.ts +585 -0
- package/test/snapshot/snapshot.test.ts +1218 -0
- package/test/storage/storage.test.ts +297 -0
- package/test/tool/__snapshots__/parameters.test.ts.snap +466 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/apply_patch.test.ts +529 -0
- package/test/tool/code-mode-integration.test.ts +329 -0
- package/test/tool/code-mode.test.ts +714 -0
- package/test/tool/edit.test.ts +574 -0
- package/test/tool/external-directory.test.ts +156 -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 +132 -0
- package/test/tool/grep.test.ts +221 -0
- package/test/tool/lsp.test.ts +184 -0
- package/test/tool/parameters.test.ts +290 -0
- package/test/tool/question.test.ts +133 -0
- package/test/tool/read.test.ts +608 -0
- package/test/tool/registry.test.ts +572 -0
- package/test/tool/shell.test.ts +1199 -0
- package/test/tool/skill.test.ts +134 -0
- package/test/tool/task.test.ts +905 -0
- package/test/tool/tool-define.test.ts +154 -0
- package/test/tool/truncation.test.ts +264 -0
- package/test/tool/webfetch.test.ts +119 -0
- package/test/tool/websearch.test.ts +99 -0
- package/test/tool/write.test.ts +279 -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/html.test.ts +15 -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
- package/LICENSE +0 -21
- package/bin/openfork.exe +0 -10
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { $ } from "bun"
|
|
3
|
+
import pkg from "../package.json"
|
|
4
|
+
import { Script } from "@openfork-ai/script"
|
|
5
|
+
import { fileURLToPath } from "url"
|
|
6
|
+
|
|
7
|
+
const dir = fileURLToPath(new URL("..", import.meta.url))
|
|
8
|
+
process.chdir(dir)
|
|
9
|
+
|
|
10
|
+
async function published(name: string, version: string) {
|
|
11
|
+
return (await $`npm view ${name}@${version} version`.nothrow()).exitCode === 0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function publish(dir: string, name: string, version: string) {
|
|
15
|
+
if (process.platform !== "win32") await $`chmod -R 755 .`.cwd(dir)
|
|
16
|
+
if (await published(name, version)) {
|
|
17
|
+
console.log(`already published ${name}@${version}`)
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
await $`bun pm pack`.cwd(dir)
|
|
21
|
+
await $`npm publish *.tgz --access public --tag ${Script.channel}`.cwd(dir)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const binaries: Record<string, string> = {}
|
|
25
|
+
for (const filepath of new Bun.Glob("*/package.json").scanSync({ cwd: "./dist" })) {
|
|
26
|
+
const pkg = await Bun.file(`./dist/${filepath}`).json()
|
|
27
|
+
binaries[pkg.name] = pkg.version
|
|
28
|
+
}
|
|
29
|
+
console.log("binaries", binaries)
|
|
30
|
+
const version = Object.values(binaries)[0]
|
|
31
|
+
|
|
32
|
+
await $`mkdir -p ./dist/${pkg.name}`
|
|
33
|
+
await $`mkdir -p ./dist/${pkg.name}/bin`
|
|
34
|
+
await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
|
|
35
|
+
await Bun.file(`./dist/${pkg.name}/LICENSE`).write(await Bun.file("../../LICENSE").text())
|
|
36
|
+
|
|
37
|
+
// Create the bin shim that warns if postinstall hasn't run
|
|
38
|
+
await Bun.file(`./dist/${pkg.name}/bin/${pkg.name}.exe`).write(
|
|
39
|
+
[
|
|
40
|
+
`echo "Error: ${pkg.name}'s postinstall script was not run." >&2`,
|
|
41
|
+
'echo "" >&2',
|
|
42
|
+
'echo "This occurs when using --ignore-scripts during installation, or when using a" >&2',
|
|
43
|
+
'echo "package manager like pnpm that does not run postinstall scripts by default." >&2',
|
|
44
|
+
'echo "" >&2',
|
|
45
|
+
'echo "To fix this, run the postinstall script manually:" >&2',
|
|
46
|
+
`echo " cd node_modules/${pkg.name} && node postinstall.mjs" >&2`,
|
|
47
|
+
'echo "" >&2',
|
|
48
|
+
`echo "Or reinstall ${pkg.name} without the --ignore-scripts flag." >&2`,
|
|
49
|
+
"exit 1",
|
|
50
|
+
"",
|
|
51
|
+
].join("\n"),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
await Bun.file(`./dist/${pkg.name}/package.json`).write(
|
|
55
|
+
JSON.stringify(
|
|
56
|
+
{
|
|
57
|
+
name: pkg.name,
|
|
58
|
+
bin: {
|
|
59
|
+
[pkg.name]: `./bin/${pkg.name}.exe`,
|
|
60
|
+
},
|
|
61
|
+
scripts: {
|
|
62
|
+
postinstall: "node ./postinstall.mjs",
|
|
63
|
+
},
|
|
64
|
+
version: version,
|
|
65
|
+
license: pkg.license,
|
|
66
|
+
os: ["darwin", "linux", "win32"],
|
|
67
|
+
cpu: ["arm64", "x64"],
|
|
68
|
+
optionalDependencies: binaries,
|
|
69
|
+
},
|
|
70
|
+
null,
|
|
71
|
+
2,
|
|
72
|
+
),
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
// Publish all platform-specific packages in parallel, then the wrapper
|
|
76
|
+
const tasks = Object.entries(binaries).map(async ([name]) => {
|
|
77
|
+
await publish(`./dist/${name}`, name, binaries[name])
|
|
78
|
+
})
|
|
79
|
+
await Promise.all(tasks)
|
|
80
|
+
await publish(`./dist/${pkg.name}`, pkg.name, version)
|
|
81
|
+
|
|
82
|
+
console.log(`Published ${pkg.name}@${version}`)
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
// This script runs a separate OpenCode server to be used as a remote
|
|
4
|
+
// workspace, simulating a remote environment but all local to make
|
|
5
|
+
// debugger easier
|
|
6
|
+
//
|
|
7
|
+
// *Important*: make sure you add the debug workspace plugin first.
|
|
8
|
+
// In `.opencode/opencode.jsonc` in the root of this project add:
|
|
9
|
+
//
|
|
10
|
+
// "plugin": ["../packages/opencode/src/control-plane/dev/debug-workspace-plugin.ts"]
|
|
11
|
+
//
|
|
12
|
+
// Afterwards, run `./packages/opencode/script/run-workspace-server`
|
|
13
|
+
|
|
14
|
+
import { stat } from "node:fs/promises"
|
|
15
|
+
import { setTimeout as sleep } from "node:timers/promises"
|
|
16
|
+
|
|
17
|
+
const DEV_DATA_FILE = "/tmp/opencode-workspace-dev-data.json"
|
|
18
|
+
const RESTART_POLL_INTERVAL = 250
|
|
19
|
+
|
|
20
|
+
async function readData() {
|
|
21
|
+
return await Bun.file(DEV_DATA_FILE).json()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function readDataMtime() {
|
|
25
|
+
return await stat(DEV_DATA_FILE)
|
|
26
|
+
.then((info) => info.mtimeMs)
|
|
27
|
+
.catch((error) => {
|
|
28
|
+
if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
|
|
29
|
+
return undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
throw error
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function readSnapshot() {
|
|
37
|
+
while (true) {
|
|
38
|
+
try {
|
|
39
|
+
const before = await readDataMtime()
|
|
40
|
+
if (before === undefined) {
|
|
41
|
+
await sleep(RESTART_POLL_INTERVAL)
|
|
42
|
+
continue
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const data = await readData()
|
|
46
|
+
const after = await readDataMtime()
|
|
47
|
+
|
|
48
|
+
if (before === after) {
|
|
49
|
+
return { data, mtime: after }
|
|
50
|
+
}
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (typeof error === "object" && error && "code" in error && error.code === "ENOENT") {
|
|
53
|
+
await sleep(RESTART_POLL_INTERVAL)
|
|
54
|
+
continue
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
throw error
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function startDevServer(data: any) {
|
|
63
|
+
const env = Object.fromEntries(Object.entries(data.env ?? {}).filter(([, value]) => value !== undefined))
|
|
64
|
+
|
|
65
|
+
return Bun.spawn(["bun", "run", "dev", "serve", "--port", String(data.port), "--print-logs"], {
|
|
66
|
+
env: {
|
|
67
|
+
...process.env,
|
|
68
|
+
...env,
|
|
69
|
+
XDG_DATA_HOME: "/tmp/data",
|
|
70
|
+
},
|
|
71
|
+
stdin: "inherit",
|
|
72
|
+
stdout: "inherit",
|
|
73
|
+
stderr: "inherit",
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function waitForRestartSignal(mtime: number, signal: AbortSignal) {
|
|
78
|
+
while (!signal.aborted) {
|
|
79
|
+
await sleep(RESTART_POLL_INTERVAL)
|
|
80
|
+
if (signal.aborted) return false
|
|
81
|
+
if ((await readDataMtime()) !== mtime) return true
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return false
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
while (true) {
|
|
88
|
+
const { data, mtime } = await readSnapshot()
|
|
89
|
+
const proc = startDevServer(data)
|
|
90
|
+
const restartAbort = new AbortController()
|
|
91
|
+
|
|
92
|
+
const result = await Promise.race([
|
|
93
|
+
proc.exited.then((code) => ({ type: "exit" as const, code })),
|
|
94
|
+
waitForRestartSignal(mtime, restartAbort.signal).then((restart) => ({ type: "restart" as const, restart })),
|
|
95
|
+
])
|
|
96
|
+
|
|
97
|
+
restartAbort.abort()
|
|
98
|
+
|
|
99
|
+
if (result.type === "restart" && result.restart) {
|
|
100
|
+
proc.kill()
|
|
101
|
+
await proc.exited
|
|
102
|
+
continue
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
process.exit(result.code)
|
|
106
|
+
}
|
package/script/schema.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { Config } from "@/config/config"
|
|
4
|
+
import { ConfigV1 } from "@openfork-ai/core/v1/config/config"
|
|
5
|
+
import { TuiConfig } from "@openfork-ai/tui/config"
|
|
6
|
+
import { Schema } from "effect"
|
|
7
|
+
|
|
8
|
+
type JsonSchema = Record<string, unknown>
|
|
9
|
+
const MODEL_REF = "https://models.dev/model-schema.json#/$defs/Model"
|
|
10
|
+
|
|
11
|
+
function generateEffect(schema: Schema.Top) {
|
|
12
|
+
const document = Schema.toJsonSchemaDocument(schema)
|
|
13
|
+
const normalized = normalize({
|
|
14
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
15
|
+
...document.schema,
|
|
16
|
+
$defs: document.definitions,
|
|
17
|
+
})
|
|
18
|
+
if (!isRecord(normalized)) throw new Error("schema generator produced a non-object schema")
|
|
19
|
+
const restored = restoreModelRefs(normalized)
|
|
20
|
+
if (!isRecord(restored)) throw new Error("schema generator produced a non-object schema")
|
|
21
|
+
restored.allowComments = true
|
|
22
|
+
restored.allowTrailingCommas = true
|
|
23
|
+
return restored
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function normalize(value: unknown): unknown {
|
|
27
|
+
if (Array.isArray(value)) return value.map(normalize)
|
|
28
|
+
if (!isRecord(value)) return value
|
|
29
|
+
|
|
30
|
+
const schema = Object.fromEntries(Object.entries(value).map(([key, item]) => [key, normalize(item)]))
|
|
31
|
+
|
|
32
|
+
if (Array.isArray(schema.anyOf)) {
|
|
33
|
+
const anyOf = schema.anyOf.filter((item) => !isRecord(item) || item.type !== "null")
|
|
34
|
+
if (anyOf.length !== schema.anyOf.length) {
|
|
35
|
+
const { anyOf: _, ...rest } = schema
|
|
36
|
+
if (anyOf.length === 1 && isRecord(anyOf[0])) return normalize({ ...anyOf[0], ...rest })
|
|
37
|
+
return { ...rest, anyOf }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (Array.isArray(schema.allOf) && schema.allOf.length === 1 && isRecord(schema.allOf[0])) {
|
|
42
|
+
const { allOf: _, ...rest } = schema
|
|
43
|
+
return normalize({ ...schema.allOf[0], ...rest })
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (schema.type === "integer" && schema.maximum === undefined) {
|
|
47
|
+
return { ...schema, maximum: Number.MAX_SAFE_INTEGER }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return schema
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function restoreModelRefs(value: unknown, key?: string): unknown {
|
|
54
|
+
if (Array.isArray(value)) return value.map((item) => restoreModelRefs(item))
|
|
55
|
+
if (!isRecord(value)) return value
|
|
56
|
+
|
|
57
|
+
const schema = Object.fromEntries(Object.entries(value).map(([name, item]) => [name, restoreModelRefs(item, name)]))
|
|
58
|
+
if ((key === "model" || key === "small_model") && schema.type === "string") {
|
|
59
|
+
return { ...schema, $ref: MODEL_REF }
|
|
60
|
+
}
|
|
61
|
+
return schema
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function isRecord(value: unknown): value is JsonSchema {
|
|
65
|
+
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const configFile = process.argv[2]
|
|
69
|
+
const tuiFile = process.argv[3]
|
|
70
|
+
|
|
71
|
+
console.log(configFile)
|
|
72
|
+
await Bun.write(configFile, JSON.stringify(generateEffect(ConfigV1.Info), null, 2))
|
|
73
|
+
|
|
74
|
+
if (tuiFile) {
|
|
75
|
+
console.log(tuiFile)
|
|
76
|
+
await Bun.write(tuiFile, JSON.stringify(generateEffect(TuiConfig.Info), null, 2))
|
|
77
|
+
}
|
package/script/time.ts
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import * as path from "path"
|
|
3
|
+
import * as ts from "typescript"
|
|
4
|
+
|
|
5
|
+
const BASE_DIR = "/home/thdxr/dev/projects/anomalyco/opencode/packages/openfork"
|
|
6
|
+
|
|
7
|
+
// Get entry file from command line arg or use default
|
|
8
|
+
const ENTRY_FILE = process.argv[2] || "src/plugin/tui/runtime.ts"
|
|
9
|
+
|
|
10
|
+
const visited = new Set<string>()
|
|
11
|
+
|
|
12
|
+
function resolveImport(importPath: string, fromFile: string): string | null {
|
|
13
|
+
if (importPath.startsWith("@/")) {
|
|
14
|
+
return path.join(BASE_DIR, "src", importPath.slice(2))
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (importPath.startsWith("./") || importPath.startsWith("../")) {
|
|
18
|
+
const dir = path.dirname(fromFile)
|
|
19
|
+
return path.resolve(dir, importPath)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function isInternalImport(importPath: string): boolean {
|
|
26
|
+
return importPath.startsWith("@/") || importPath.startsWith("./") || importPath.startsWith("../")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function tryExtensions(filePath: string): Promise<string | null> {
|
|
30
|
+
const extensions = [".ts", ".tsx", ".js", ".jsx"]
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
const file = Bun.file(filePath)
|
|
34
|
+
const stat = await file.stat()
|
|
35
|
+
|
|
36
|
+
if (stat?.isDirectory()) {
|
|
37
|
+
for (const ext of extensions) {
|
|
38
|
+
const indexPath = path.join(filePath, "index" + ext)
|
|
39
|
+
const indexFile = Bun.file(indexPath)
|
|
40
|
+
if (await indexFile.exists()) return indexPath
|
|
41
|
+
}
|
|
42
|
+
return null
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// It's a file
|
|
46
|
+
return filePath
|
|
47
|
+
} catch {
|
|
48
|
+
// Path doesn't exist, try adding extensions
|
|
49
|
+
for (const ext of extensions) {
|
|
50
|
+
const withExt = filePath + ext
|
|
51
|
+
const extFile = Bun.file(withExt)
|
|
52
|
+
if (await extFile.exists()) return withExt
|
|
53
|
+
}
|
|
54
|
+
return null
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function extractImports(sourceFile: ts.SourceFile): string[] {
|
|
59
|
+
const imports: string[] = []
|
|
60
|
+
|
|
61
|
+
function visit(node: ts.Node) {
|
|
62
|
+
// import x from "path" or import { x } from "path"
|
|
63
|
+
if (ts.isImportDeclaration(node)) {
|
|
64
|
+
// Skip type-only imports
|
|
65
|
+
if (node.importClause?.isTypeOnly) return
|
|
66
|
+
|
|
67
|
+
const moduleSpec = node.moduleSpecifier
|
|
68
|
+
if (ts.isStringLiteral(moduleSpec)) {
|
|
69
|
+
imports.push(moduleSpec.text)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// export { x } from "path"
|
|
74
|
+
if (ts.isExportDeclaration(node) && node.moduleSpecifier) {
|
|
75
|
+
if (ts.isStringLiteral(node.moduleSpecifier)) {
|
|
76
|
+
imports.push(node.moduleSpecifier.text)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Dynamic import: import("path")
|
|
81
|
+
if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
|
82
|
+
const arg = node.arguments[0]
|
|
83
|
+
if (arg && ts.isStringLiteral(arg)) {
|
|
84
|
+
imports.push(arg.text)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
ts.forEachChild(node, visit)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
visit(sourceFile)
|
|
92
|
+
return imports
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function traceFile(filePath: string, depth = 0): Promise<void> {
|
|
96
|
+
const normalizedPath = path.relative(BASE_DIR, filePath)
|
|
97
|
+
|
|
98
|
+
if (visited.has(filePath)) {
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Only trace TypeScript/JavaScript files
|
|
103
|
+
if (!filePath.match(/\.(ts|tsx|js|jsx)$/)) {
|
|
104
|
+
return
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
visited.add(filePath)
|
|
108
|
+
console.log("\t".repeat(depth) + normalizedPath)
|
|
109
|
+
|
|
110
|
+
let content: string
|
|
111
|
+
try {
|
|
112
|
+
content = await Bun.file(filePath).text()
|
|
113
|
+
} catch {
|
|
114
|
+
return
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true)
|
|
118
|
+
|
|
119
|
+
const imports = extractImports(sourceFile)
|
|
120
|
+
const internalImports = imports.filter(isInternalImport)
|
|
121
|
+
const externalImports = imports.filter((imp) => !isInternalImport(imp))
|
|
122
|
+
|
|
123
|
+
// Print external imports
|
|
124
|
+
for (const imp of externalImports) {
|
|
125
|
+
console.log("\t".repeat(depth + 1) + `[ext] ${imp}`)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const imp of internalImports) {
|
|
129
|
+
const resolved = resolveImport(imp, filePath)
|
|
130
|
+
if (!resolved) continue
|
|
131
|
+
|
|
132
|
+
const actualPath = await tryExtensions(resolved)
|
|
133
|
+
if (!actualPath) continue
|
|
134
|
+
|
|
135
|
+
await traceFile(actualPath, depth + 1)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function main() {
|
|
140
|
+
const entryPath = path.join(BASE_DIR, ENTRY_FILE)
|
|
141
|
+
|
|
142
|
+
// Check if file exists
|
|
143
|
+
const file = Bun.file(entryPath)
|
|
144
|
+
if (!(await file.exists())) {
|
|
145
|
+
console.error(`File not found: ${ENTRY_FILE}`)
|
|
146
|
+
console.error(`Resolved to: ${entryPath}`)
|
|
147
|
+
process.exit(1)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
await traceFile(entryPath)
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
main().catch(console.error)
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# Error Boundaries Plan
|
|
2
|
+
|
|
3
|
+
Plan for removing `NamedError` as connective tissue while keeping public
|
|
4
|
+
wire contracts stable.
|
|
5
|
+
|
|
6
|
+
## Desired Shape
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
Domain/service error
|
|
10
|
+
Schema.TaggedErrorClass
|
|
11
|
+
- catchable with catchTag / catchTags
|
|
12
|
+
- appears in service method error type
|
|
13
|
+
- no HTTP status
|
|
14
|
+
- no toObject()
|
|
15
|
+
|
|
16
|
+
HTTP public error
|
|
17
|
+
Schema.ErrorClass / TaggedErrorClass with httpApiStatus
|
|
18
|
+
- endpoint-declared public contract
|
|
19
|
+
- owns legacy { name, data } only when that is the SDK wire shape
|
|
20
|
+
|
|
21
|
+
CLI/user rendering
|
|
22
|
+
FormatError and small format helpers
|
|
23
|
+
- converts domain errors to text
|
|
24
|
+
- preserves useful structured fields
|
|
25
|
+
|
|
26
|
+
Session/model-visible error
|
|
27
|
+
first-class session/message error schema or helper
|
|
28
|
+
- owns { name, data } event/message shape
|
|
29
|
+
- not a service error class
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The important rule: a service error should not also be the HTTP body, CLI
|
|
33
|
+
formatter, and session event body. Each seam adapts the error into the
|
|
34
|
+
shape it owns.
|
|
35
|
+
|
|
36
|
+
## Concrete Example: Provider Model Not Found
|
|
37
|
+
|
|
38
|
+
Before:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
export const ModelNotFoundError = NamedError.create("ProviderModelNotFoundError", {
|
|
42
|
+
providerID: ProviderID,
|
|
43
|
+
modelID: ModelID,
|
|
44
|
+
suggestions: Schema.optional(Schema.Array(Schema.String)),
|
|
45
|
+
})
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Problems:
|
|
49
|
+
|
|
50
|
+
- Throwing it inside `Effect.fn` made it behave like a defect unless a
|
|
51
|
+
compatibility bridge caught it.
|
|
52
|
+
- HTTP middleware knew that this one domain error should be a `400`.
|
|
53
|
+
- Callers read `.data.*`, which couples them to the legacy `{ name, data }`
|
|
54
|
+
wire shape.
|
|
55
|
+
|
|
56
|
+
After:
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
export class ModelNotFoundError extends Schema.TaggedErrorClass<ModelNotFoundError>()("ProviderModelNotFoundError", {
|
|
60
|
+
providerID: ProviderID,
|
|
61
|
+
modelID: ModelID,
|
|
62
|
+
suggestions: Schema.optional(Schema.Array(Schema.String)),
|
|
63
|
+
cause: Schema.optional(Schema.Defect),
|
|
64
|
+
}) {}
|
|
65
|
+
|
|
66
|
+
export interface Interface {
|
|
67
|
+
readonly getModel: (providerID: ProviderID, modelID: ModelID) => Effect.Effect<Model, ModelNotFoundError>
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Boundary adapters:
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
CLI
|
|
75
|
+
└─ FormatError sees _tag ProviderModelNotFoundError -> nice text
|
|
76
|
+
|
|
77
|
+
Session prompt
|
|
78
|
+
└─ catch ModelNotFoundError -> publish Session.Event.Error as message/session wire shape
|
|
79
|
+
|
|
80
|
+
HTTP route
|
|
81
|
+
└─ catch ModelNotFoundError -> declared BadRequest public API error when the endpoint needs it
|
|
82
|
+
|
|
83
|
+
HTTP middleware
|
|
84
|
+
└─ no Provider.ModelNotFoundError knowledge
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Refining Known Promise Failures
|
|
88
|
+
|
|
89
|
+
Use `EffectPromise.refineRejection(...)` when a Promise boundary can reject
|
|
90
|
+
with many unknown values, but only one or two rejection classes are expected
|
|
91
|
+
domain failures. Unknown rejections stay defects; the helper maps only known
|
|
92
|
+
rejection shapes to typed errors.
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
const language =
|
|
96
|
+
yield *
|
|
97
|
+
EffectPromise.refineRejection(
|
|
98
|
+
async () => loadFromProvider(),
|
|
99
|
+
(cause) => (cause instanceof NoSuchModelError ? new ModelNotFoundError({ providerID, modelID, cause }) : undefined),
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use this when the Promise can genuinely reject and most rejection values are
|
|
104
|
+
still defects for the current module. Use `Effect.tryPromise({ try, catch })`
|
|
105
|
+
when every rejection should become the same expected error type. Use
|
|
106
|
+
`Effect.promise(...)` only when rejection means a defect and you do not need
|
|
107
|
+
to refine known rejection classes.
|
|
108
|
+
|
|
109
|
+
## Helper Modules We Probably Want
|
|
110
|
+
|
|
111
|
+
Add helpers only when repeated call sites prove the seam is real.
|
|
112
|
+
|
|
113
|
+
### HTTP API Errors
|
|
114
|
+
|
|
115
|
+
Likely location: `src/server/routes/instance/httpapi/errors.ts`.
|
|
116
|
+
|
|
117
|
+
Purpose:
|
|
118
|
+
|
|
119
|
+
- construct public HTTP error bodies
|
|
120
|
+
- preserve legacy `{ name, data }` where needed
|
|
121
|
+
- attach `httpApiStatus`
|
|
122
|
+
|
|
123
|
+
Good helpers:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
notFound(message)
|
|
127
|
+
badRequest(message)
|
|
128
|
+
unknown()
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Avoid:
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
mapAnyDomainError(error)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
That recreates the giant middleware mapper problem.
|
|
138
|
+
|
|
139
|
+
### Session / Message Error Wire Helpers
|
|
140
|
+
|
|
141
|
+
Likely location: near `src/session/message-error.ts` or a new narrow
|
|
142
|
+
module such as `src/session/event-error.ts`.
|
|
143
|
+
|
|
144
|
+
Purpose:
|
|
145
|
+
|
|
146
|
+
- construct the `{ name, data }` shape used by `Session.Event.Error` and
|
|
147
|
+
assistant message errors
|
|
148
|
+
- replace `new NamedError.Unknown(...).toObject()` call sites
|
|
149
|
+
- keep model-visible error bodies separate from service/domain errors
|
|
150
|
+
|
|
151
|
+
Good helpers:
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
unknown(message)
|
|
155
|
+
agentNotFound(agent, available)
|
|
156
|
+
commandNotFound(command, available)
|
|
157
|
+
modelNotFound(error: Provider.ModelNotFoundError)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### CLI Formatters
|
|
161
|
+
|
|
162
|
+
Likely location: `src/cli/error.ts` until repetition demands domain-local
|
|
163
|
+
format helpers.
|
|
164
|
+
|
|
165
|
+
Purpose:
|
|
166
|
+
|
|
167
|
+
- produce human-readable terminal messages from typed errors
|
|
168
|
+
- support old `{ name, data }` shapes only while compatibility is needed
|
|
169
|
+
|
|
170
|
+
## Migration Queue
|
|
171
|
+
|
|
172
|
+
### Remove Domain Knowledge From HTTP Middleware
|
|
173
|
+
|
|
174
|
+
- [x] Storage not found no longer maps through defect fallback.
|
|
175
|
+
- [x] Worktree expected errors moved to typed errors.
|
|
176
|
+
- [x] Provider auth expected errors moved to typed errors.
|
|
177
|
+
- [x] Provider model not found no longer needs an HTTP middleware status
|
|
178
|
+
special case.
|
|
179
|
+
- [ ] Convert `Session.BusyError` and map it at route boundaries.
|
|
180
|
+
- [ ] Delete the broad `NamedError` middleware branch once no route relies
|
|
181
|
+
on defect-wrapped legacy domain errors.
|
|
182
|
+
- [ ] Keep one final unknown-defect fallback that logs `Cause.pretty(cause)`
|
|
183
|
+
and returns a safe `500` body.
|
|
184
|
+
|
|
185
|
+
### Remaining `NamedError.create(...)` Service Errors
|
|
186
|
+
|
|
187
|
+
These should become `Schema.TaggedErrorClass` when touched:
|
|
188
|
+
|
|
189
|
+
- [ ] `src/provider/provider.ts` — `ProviderInitError`.
|
|
190
|
+
- [ ] `src/storage/db.ts` — database `NotFoundError`.
|
|
191
|
+
- [ ] `src/mcp/index.ts` — `MCPFailed`.
|
|
192
|
+
- [ ] `src/skill/index.ts` — `SkillInvalidError`,
|
|
193
|
+
`SkillNameMismatchError`.
|
|
194
|
+
- [ ] `src/lsp/client.ts` — `LSPInitializeError`.
|
|
195
|
+
- [ ] `src/ide/index.ts` — install errors.
|
|
196
|
+
- [ ] `src/config/error.ts`, `src/config/config.ts`,
|
|
197
|
+
`src/config/markdown.ts` — config errors. These already render well
|
|
198
|
+
in the CLI, so migrate carefully and preserve diagnostics.
|
|
199
|
+
|
|
200
|
+
### Session / Message Wire Errors
|
|
201
|
+
|
|
202
|
+
These are not ordinary service errors. They mostly build `{ name, data }`
|
|
203
|
+
objects for model-visible/session-visible output.
|
|
204
|
+
|
|
205
|
+
- [ ] Add a first-class session/message error wire helper.
|
|
206
|
+
- [ ] Replace `new NamedError.Unknown(...).toObject()` in
|
|
207
|
+
`src/session/prompt.ts`.
|
|
208
|
+
- [ ] Replace `new NamedError.Unknown(...).toObject()` in config/skill/plugin
|
|
209
|
+
session event publishing.
|
|
210
|
+
- [ ] Move `src/session/message-error.ts` and `src/session/message-v2.ts`
|
|
211
|
+
away from `NamedError.create(...)` once the wire helper exists.
|
|
212
|
+
- [ ] Update retry/message tests to assert the wire schema/helper output,
|
|
213
|
+
not `NamedError` instances.
|
|
214
|
+
|
|
215
|
+
### CLI Rendering
|
|
216
|
+
|
|
217
|
+
- [x] Tagged config errors render with useful diagnostics.
|
|
218
|
+
- [x] Provider model not found renders from both old `{ name, data }` and
|
|
219
|
+
new `_tag` shapes.
|
|
220
|
+
- [ ] Add typed render cases as more `NamedError.create(...)` domains move
|
|
221
|
+
to `Schema.TaggedErrorClass`.
|
|
222
|
+
- [ ] Eventually remove old-shape compatibility branches when no callers can
|
|
223
|
+
produce them.
|
|
224
|
+
|
|
225
|
+
## PR Checklist
|
|
226
|
+
|
|
227
|
+
For each migrated error:
|
|
228
|
+
|
|
229
|
+
- [ ] Domain error is `Schema.TaggedErrorClass`.
|
|
230
|
+
- [ ] Service method exposes the typed error in its error channel.
|
|
231
|
+
- [ ] No service error has `toObject()` just for compatibility.
|
|
232
|
+
- [ ] CLI, HTTP, and session/message adapters each own their output shape.
|
|
233
|
+
- [ ] HTTP middleware gets smaller or stays unchanged.
|
|
234
|
+
- [ ] Focused tests cover the domain error and any public rendering/wire
|
|
235
|
+
shape touched by the PR.
|