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,30 @@
|
|
|
1
|
+
# Effect loose ends
|
|
2
|
+
|
|
3
|
+
Small follow-ups that do not fit neatly into the main facade, route, tool, or schema migration checklists.
|
|
4
|
+
|
|
5
|
+
## Config / TUI
|
|
6
|
+
|
|
7
|
+
- [ ] `cli/cmd/tui/config/tui.ts` - finish the internal Effect migration.
|
|
8
|
+
Keep the current precedence and migration semantics intact while converting the remaining internal async helpers (`loadState`, `mergeFile`, `loadFile`, `load`) to `Effect.gen(...)` / `Effect.fn(...)`.
|
|
9
|
+
- [ ] `cli/cmd/tui/config/tui.ts` callers - once the internal service is stable, migrate plain async callers to use `TuiConfig.Service` directly where that actually simplifies the code.
|
|
10
|
+
Likely first callers: `cli/cmd/tui/attach.ts`, `cli/cmd/tui/thread.ts`, `cli/cmd/tui/plugin/runtime.ts`.
|
|
11
|
+
- [x] `env/index.ts` - already uses `InstanceState.make(...)`.
|
|
12
|
+
|
|
13
|
+
## ConfigPaths
|
|
14
|
+
|
|
15
|
+
- [ ] `config/paths.ts` - split pure helpers from effectful helpers.
|
|
16
|
+
Keep `fileInDirectory(...)` as a plain function.
|
|
17
|
+
- [ ] `config/paths.ts` - add a `ConfigPaths.Service` for the effectful operations so callers do not inherit `FSUtil.Service` directly.
|
|
18
|
+
Initial service surface should cover:
|
|
19
|
+
- `projectFiles(...)`
|
|
20
|
+
- `directories(...)`
|
|
21
|
+
- `readFile(...)`
|
|
22
|
+
- `parseText(...)`
|
|
23
|
+
- [ ] `config/config.ts` - switch internal config loading from `Effect.promise(() => ConfigPaths.*(...))` to `yield* paths.*(...)` once the service exists.
|
|
24
|
+
- [ ] `cli/cmd/tui/config/tui.ts` - switch TUI config loading from async `ConfigPaths.*` wrappers to the `ConfigPaths.Service` once that service exists.
|
|
25
|
+
- [ ] `cli/cmd/tui/config/tui-migrate.ts` - decide whether to leave this as a plain async module using wrapper functions or effectify it fully after `ConfigPaths.Service` lands.
|
|
26
|
+
|
|
27
|
+
## Notes
|
|
28
|
+
|
|
29
|
+
- Prefer small, semantics-preserving config migrations. Config precedence, legacy key migration, and plugin origin tracking are easy to break accidentally.
|
|
30
|
+
- When changing config loading internals, rerun the config and TUI suites first before broad package sweeps.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Effect Migration Patterns
|
|
2
|
+
|
|
3
|
+
This is the compact reference for moving code toward the current Effect
|
|
4
|
+
shape. The high-level roadmap is [`todo.md`](./todo.md); examples and
|
|
5
|
+
rules are in [`guide.md`](./guide.md).
|
|
6
|
+
|
|
7
|
+
## Default Shape
|
|
8
|
+
|
|
9
|
+
- Service methods return `Effect`.
|
|
10
|
+
- Service methods are named with `Effect.fn("Domain.method")`.
|
|
11
|
+
- Expected failures are typed errors on the error channel.
|
|
12
|
+
- Dependencies are yielded once at layer construction and closed over by
|
|
13
|
+
methods.
|
|
14
|
+
- `defaultLayer` wires production dependencies; tests can use open layers
|
|
15
|
+
when replacing dependencies.
|
|
16
|
+
|
|
17
|
+
## Instance State
|
|
18
|
+
|
|
19
|
+
Use `InstanceState` for per-directory state, subscriptions, scoped
|
|
20
|
+
background work, and per-instance cleanup.
|
|
21
|
+
|
|
22
|
+
Do not add ad hoc `started` flags on top of `InstanceState`; the scoped
|
|
23
|
+
cache handles run-once and concurrent deduplication.
|
|
24
|
+
|
|
25
|
+
## Runtime Boundaries
|
|
26
|
+
|
|
27
|
+
Prefer `AppRuntime` for crossing from non-Effect code into the shared app
|
|
28
|
+
layer.
|
|
29
|
+
|
|
30
|
+
`makeRuntime(...)` exists for intentional service-local boundaries and
|
|
31
|
+
legacy facades. Do not add new service-local runtimes unless the service is
|
|
32
|
+
genuinely outside `AppLayer`.
|
|
33
|
+
|
|
34
|
+
## Platform Edges
|
|
35
|
+
|
|
36
|
+
- Use `FSUtil.Service` instead of raw filesystem APIs in
|
|
37
|
+
effectified services.
|
|
38
|
+
- Use `AppProcess.Service` instead of raw process wrappers.
|
|
39
|
+
- Use `HttpClient.HttpClient` instead of raw `fetch` in Effect code.
|
|
40
|
+
- Use `Effect.cached` for shared in-flight work.
|
|
41
|
+
- Use `Effect.callback` for callback APIs.
|
|
42
|
+
|
|
43
|
+
## Tests During Migration
|
|
44
|
+
|
|
45
|
+
When migrating code, migrate touched tests toward
|
|
46
|
+
[`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md):
|
|
47
|
+
|
|
48
|
+
- `testEffect(...)`
|
|
49
|
+
- `it.effect`, `it.live`, or `it.instance`
|
|
50
|
+
- explicit layers for behavior changes
|
|
51
|
+
- deterministic waits instead of sleeps
|
|
52
|
+
- no mutable env/global flags after layers are built
|
|
53
|
+
|
|
54
|
+
## Migration Checklist
|
|
55
|
+
|
|
56
|
+
- [ ] The code has a single Effect body instead of Promise wrappers around
|
|
57
|
+
service calls.
|
|
58
|
+
- [ ] Expected failures are typed errors, not thrown exceptions or defects.
|
|
59
|
+
- [ ] Layer requirements are explicit.
|
|
60
|
+
- [ ] Tests use Effect-aware fixtures and focused layers.
|
|
61
|
+
- [ ] Public behavior and wire shapes are preserved unless intentionally
|
|
62
|
+
changed.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# HTTP Route Patterns
|
|
2
|
+
|
|
3
|
+
Current guidance for `packages/openfork/src/server/routes/instance/httpapi`.
|
|
4
|
+
|
|
5
|
+
## Handler Shape
|
|
6
|
+
|
|
7
|
+
Use `HttpApiBuilder.group(...)` for normal JSON and streaming HTTP API
|
|
8
|
+
endpoints. Yield stable services once while building the handler layer,
|
|
9
|
+
then close over those services in endpoint implementations.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) =>
|
|
13
|
+
Effect.gen(function* () {
|
|
14
|
+
const session = yield* Session.Service
|
|
15
|
+
|
|
16
|
+
return handlers.handle("list", () => session.list())
|
|
17
|
+
}),
|
|
18
|
+
)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Use raw `HttpRouter` only for routes that do not fit the request/response
|
|
22
|
+
HttpApi model, such as WebSocket upgrades or catch-all fallback routes.
|
|
23
|
+
|
|
24
|
+
Do not rebuild stable layers inside request handlers. Provide stable
|
|
25
|
+
services at the route/layer boundary and use request-level provisioning
|
|
26
|
+
only for request-derived context.
|
|
27
|
+
|
|
28
|
+
## Error Boundaries
|
|
29
|
+
|
|
30
|
+
Expected service errors should be mapped at the handler boundary to
|
|
31
|
+
endpoint-declared public HTTP errors. Keep one-off mappings inline. Extract
|
|
32
|
+
small helpers when the same mapping repeats.
|
|
33
|
+
|
|
34
|
+
Generic middleware should not become a domain-error mapper. It should
|
|
35
|
+
handle cross-cutting concerns and final unknown-defect fallback.
|
|
36
|
+
|
|
37
|
+
Public JSON errors should be explicit schema contracts declared on each
|
|
38
|
+
endpoint or group. Built-in `HttpApiError.*` is fine only when its generated
|
|
39
|
+
body is intentionally the public wire shape.
|
|
40
|
+
|
|
41
|
+
Preserve existing `{ name, data }` error bodies until a deliberate breaking
|
|
42
|
+
API change.
|
|
43
|
+
|
|
44
|
+
## OpenAPI Compatibility
|
|
45
|
+
|
|
46
|
+
`public.ts` still owns SDK/OpenAPI compatibility transforms. Shrink those
|
|
47
|
+
transforms by tightening source schemas one workaround at a time.
|
|
48
|
+
|
|
49
|
+
When an OpenAPI-visible source schema changes:
|
|
50
|
+
|
|
51
|
+
- verify the generated SDK diff is intentional
|
|
52
|
+
- preserve legacy compatibility unless the PR explicitly changes it
|
|
53
|
+
- prefer source-schema fixes over new post-processing rules
|
|
54
|
+
|
|
55
|
+
## Checklist For Route PRs
|
|
56
|
+
|
|
57
|
+
- [ ] Stable services are yielded at handler-layer construction.
|
|
58
|
+
- [ ] Expected domain errors are translated at the route boundary.
|
|
59
|
+
- [ ] Endpoint/group error schemas describe the public body and status.
|
|
60
|
+
- [ ] Middleware does not gain new domain-specific name checks.
|
|
61
|
+
- [ ] Raw routes are used only when HttpApi is the wrong abstraction.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Schema Migration
|
|
2
|
+
|
|
3
|
+
Use Effect Schema as the source of truth for domain models, DTOs, IDs,
|
|
4
|
+
inputs, outputs, and typed errors.
|
|
5
|
+
|
|
6
|
+
This is guidance, not an inventory. Do not use this file to track which
|
|
7
|
+
schema modules are complete; verify current state with `git grep` before
|
|
8
|
+
starting a migration.
|
|
9
|
+
|
|
10
|
+
## Preferred Shapes
|
|
11
|
+
|
|
12
|
+
Use `Schema.Class` for exported data objects with a clear domain identity:
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
export class Info extends Schema.Class<Info>("Foo.Info")({
|
|
16
|
+
id: FooID,
|
|
17
|
+
name: Schema.String,
|
|
18
|
+
enabled: Schema.Boolean,
|
|
19
|
+
}) {}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Use `Schema.Struct` for local shapes and simple nested objects:
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
const Payload = Schema.Struct({
|
|
26
|
+
id: FooID,
|
|
27
|
+
value: Schema.String,
|
|
28
|
+
})
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Use `Schema.TaggedErrorClass` for expected domain errors:
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
export class NotFoundError extends Schema.TaggedErrorClass<NotFoundError>()("FooNotFoundError", {
|
|
35
|
+
id: FooID,
|
|
36
|
+
}) {}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Use branded schema-backed IDs for single-value domain identifiers.
|
|
40
|
+
|
|
41
|
+
## Boundary Rule
|
|
42
|
+
|
|
43
|
+
Effect Schema should own the type. Boundaries should consume Effect Schema
|
|
44
|
+
directly or use narrow boundary-specific helpers. Avoid reintroducing a
|
|
45
|
+
generic Effect Schema -> Zod bridge.
|
|
46
|
+
|
|
47
|
+
Current intentional boundaries:
|
|
48
|
+
|
|
49
|
+
- Public plugin tools still expose Zod through `tool.schema = z`.
|
|
50
|
+
- Tool parameters use tool-specific JSON Schema helpers.
|
|
51
|
+
- Public config and TUI schema generation goes through the schema script.
|
|
52
|
+
- AI SDK object generation uses Standard Schema / JSON Schema helpers.
|
|
53
|
+
|
|
54
|
+
When Zod must stay temporarily, leave a short note explaining the boundary
|
|
55
|
+
or compatibility reason.
|
|
56
|
+
|
|
57
|
+
## Refinements
|
|
58
|
+
|
|
59
|
+
Reuse named refinements instead of re-spelling constraints:
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
const PositiveInt = Schema.Number.check(Schema.isInt()).check(Schema.isGreaterThan(0))
|
|
63
|
+
const NonNegativeInt = Schema.Number.check(Schema.isInt()).check(Schema.isGreaterThanOrEqualTo(0))
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Prefer domain-named leaf schemas when the name improves callers or error
|
|
67
|
+
messages. Avoid adding brands purely for novelty.
|
|
68
|
+
|
|
69
|
+
## Migration Order
|
|
70
|
+
|
|
71
|
+
For a domain that still has mixed schemas:
|
|
72
|
+
|
|
73
|
+
1. Shared leaf models and branded IDs.
|
|
74
|
+
2. Exported `Info`, `Input`, `Output`, and event payload types.
|
|
75
|
+
3. Expected domain errors.
|
|
76
|
+
4. Service-local internal models.
|
|
77
|
+
5. HTTP/tool/AI boundary validators.
|
|
78
|
+
|
|
79
|
+
Keep public wire shapes stable unless the PR is explicitly a breaking API
|
|
80
|
+
change.
|
|
81
|
+
|
|
82
|
+
## Checklist For A PR
|
|
83
|
+
|
|
84
|
+
- [ ] There is one schema source of truth for each migrated type.
|
|
85
|
+
- [ ] Remaining Zod is an intentional boundary choice.
|
|
86
|
+
- [ ] Public JSON/OpenAPI output is unchanged or intentionally updated.
|
|
87
|
+
- [ ] Derived helpers are narrow and boundary-specific.
|
|
88
|
+
- [ ] Tests assert behavior, not duplicated schema implementation details.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Server Package Extraction
|
|
2
|
+
|
|
3
|
+
Practical reference for a future `packages/server` split after the openfork
|
|
4
|
+
server moved to the Effect HttpApi backend.
|
|
5
|
+
|
|
6
|
+
## Current State
|
|
7
|
+
|
|
8
|
+
- The server still lives in `packages/openfork`.
|
|
9
|
+
- The runtime and app layer are centralized in `src/effect/app-runtime.ts` and
|
|
10
|
+
`src/effect/run-service.ts`.
|
|
11
|
+
- The route tree lives under `src/server/routes/instance/httpapi` and is hosted
|
|
12
|
+
from `src/server/server.ts`.
|
|
13
|
+
- OpenAPI generation is based on the HttpApi contract plus compatibility
|
|
14
|
+
translation in `src/server/routes/instance/httpapi/public.ts`.
|
|
15
|
+
- There is no standalone `packages/server` workspace yet.
|
|
16
|
+
|
|
17
|
+
## Future State
|
|
18
|
+
|
|
19
|
+
Target package layout:
|
|
20
|
+
|
|
21
|
+
- `packages/core` - shared domain services and schemas
|
|
22
|
+
- `packages/server` - HTTP contracts, handlers, OpenAPI generation, and an
|
|
23
|
+
embeddable server API
|
|
24
|
+
- `packages/cli` - TUI and CLI entrypoints
|
|
25
|
+
- `packages/sdk` - generated from the server OpenAPI spec
|
|
26
|
+
- `packages/plugin` - plugin authoring surface
|
|
27
|
+
|
|
28
|
+
## Extraction Rule
|
|
29
|
+
|
|
30
|
+
Do not create a package cycle.
|
|
31
|
+
|
|
32
|
+
Until enough shared service code lives outside `packages/openfork`, a future
|
|
33
|
+
`packages/server` should either:
|
|
34
|
+
|
|
35
|
+
- own pure HttpApi contracts only, or
|
|
36
|
+
- accept host-provided services/layers/callbacks from `packages/openfork`
|
|
37
|
+
|
|
38
|
+
It should not import `packages/openfork` services while `packages/openfork`
|
|
39
|
+
imports it to host routes.
|
|
40
|
+
|
|
41
|
+
## Suggested PR Sequence
|
|
42
|
+
|
|
43
|
+
1. Keep shrinking OpenAPI compatibility shims in `httpapi/public.ts`.
|
|
44
|
+
2. Move stable domain schemas into shared packages only when they no longer
|
|
45
|
+
depend on openfork-local runtime modules.
|
|
46
|
+
3. Extract pure HttpApi contract modules into `packages/server` once the contract
|
|
47
|
+
can compile without importing `packages/openfork` implementation details.
|
|
48
|
+
4. Extract handler factories after their service dependencies can be supplied by
|
|
49
|
+
a host layer instead of imported directly.
|
|
50
|
+
5. Move server hosting last, after package ownership is clear.
|
|
51
|
+
|
|
52
|
+
## Non-Goals
|
|
53
|
+
|
|
54
|
+
- Do not revive the old dual-backend migration shape.
|
|
55
|
+
- Do not split server hosting before service dependencies have a clean package
|
|
56
|
+
boundary.
|
|
57
|
+
- Do not switch SDK generation to a new package until generated output is known
|
|
58
|
+
to remain compatible.
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Effect TODO
|
|
2
|
+
|
|
3
|
+
Short roadmap for Effect cleanup in `packages/openfork`.
|
|
4
|
+
|
|
5
|
+
Current patterns and examples live in [`guide.md`](./guide.md). Error
|
|
6
|
+
boundary migration details live in
|
|
7
|
+
[`error-boundaries-plan.md`](./error-boundaries-plan.md). Test migration rules live in
|
|
8
|
+
[`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md).
|
|
9
|
+
Older deep-dive notes in this directory may still be useful, but treat
|
|
10
|
+
this roadmap and the guide as the current entry points.
|
|
11
|
+
|
|
12
|
+
This is a planning map, not a verified inventory. Before starting a task,
|
|
13
|
+
re-run a targeted `git grep` from current `dev` and update this file if
|
|
14
|
+
the inventory changed.
|
|
15
|
+
|
|
16
|
+
## Priorities
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
P0 ERR + RENDER + HTTP
|
|
20
|
+
Make expected failures typed, render them well, and stop relying on
|
|
21
|
+
generic HTTP error guesswork.
|
|
22
|
+
|
|
23
|
+
P1 TEST
|
|
24
|
+
Convert touched tests to the ideal Effect test patterns from the guide.
|
|
25
|
+
|
|
26
|
+
P2 RF
|
|
27
|
+
Move mutable runtime flags into typed runtime/config services.
|
|
28
|
+
|
|
29
|
+
P3 GLOBAL
|
|
30
|
+
Make global paths explicit and remove import-time side effects.
|
|
31
|
+
|
|
32
|
+
P4 INST + BRIDGE
|
|
33
|
+
Remove ambient Instance coupling while keeping Promise/callback interop.
|
|
34
|
+
|
|
35
|
+
P5 PROC + FS
|
|
36
|
+
Replace raw process/filesystem edges with typed Effect services.
|
|
37
|
+
|
|
38
|
+
P6 OA
|
|
39
|
+
Shrink OpenAPI compatibility shims as source schemas improve.
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Work Paths
|
|
43
|
+
|
|
44
|
+
- `ERR` Typed errors — replace legacy `NamedError.create(...)` and
|
|
45
|
+
`Effect.die(...)` for expected service failures with
|
|
46
|
+
`Schema.TaggedErrorClass` errors on the Effect error channel.
|
|
47
|
+
Shrinks: [`NamedError`](../../../core/src/util/error.ts) usage.
|
|
48
|
+
- `RENDER` User-visible error rendering — preserve structured typed-error
|
|
49
|
+
details at CLI, HTTP, and tool boundaries.
|
|
50
|
+
Shrinks: opaque `Error: Name` rendering.
|
|
51
|
+
- `HTTP` HTTP route cleanup — make route errors explicit instead of
|
|
52
|
+
relying on generic middleware to guess status/body from error names.
|
|
53
|
+
Shrinks: [`middleware/error.ts`](../../src/server/routes/instance/httpapi/middleware/error.ts)
|
|
54
|
+
and route-level compatibility shims.
|
|
55
|
+
- `TEST` Effect test migration — use `testEffect`, `it.live`, and
|
|
56
|
+
`it.instance` with explicit layers.
|
|
57
|
+
Shrinks: Promise-style tests, sleeps, mutable global test flags.
|
|
58
|
+
- `RF` RuntimeFlags / Flag deletion — move mutable
|
|
59
|
+
[`Flag`](../../../core/src/flag/flag.ts) reads into typed runtime/config
|
|
60
|
+
services.
|
|
61
|
+
Shrinks: [`flag.ts`](../../../core/src/flag/flag.ts),
|
|
62
|
+
[`test/fixture/flag.ts`](../../test/fixture/flag.ts).
|
|
63
|
+
- `GLOBAL` Global paths / import side effects — make global path state
|
|
64
|
+
explicit and testable instead of mutable module state.
|
|
65
|
+
Shrinks: [`global.ts`](../../../core/src/global.ts) import-time side
|
|
66
|
+
effects, mutable `Global.Path` overrides, and its `Flag` dependency.
|
|
67
|
+
- `INST` Instance context — keep project context explicit through Effect refs
|
|
68
|
+
and bridge boundaries.
|
|
69
|
+
- `BRIDGE` Promise/callback interop — keep bridge helpers, but reduce
|
|
70
|
+
legacy ALS coupling.
|
|
71
|
+
Shrinks: ad hoc Promise/callback re-entry code.
|
|
72
|
+
- `PROC` AppProcess migration — prefer `AppProcess.Service` over raw
|
|
73
|
+
process wrappers.
|
|
74
|
+
Shrinks: direct spawn callsites and legacy process helpers.
|
|
75
|
+
- `FS` FSUtil migration — prefer `FSUtil.Service` over raw
|
|
76
|
+
filesystem APIs.
|
|
77
|
+
Shrinks: direct `fs` / `Bun.file` service callsites where inappropriate.
|
|
78
|
+
- `RT` Runtime/facade cleanup — remove service-local `makeRuntime`
|
|
79
|
+
facades when not intentional.
|
|
80
|
+
Shrinks: async facade exports around services and
|
|
81
|
+
[`run-service.ts`](../../src/effect/run-service.ts) usage.
|
|
82
|
+
- `OA` OpenAPI compatibility — tighten source schemas instead of
|
|
83
|
+
post-processing generated OpenAPI.
|
|
84
|
+
Shrinks: schema workaround blocks in
|
|
85
|
+
[`public.ts`](../../src/server/routes/instance/httpapi/public.ts).
|
|
86
|
+
|
|
87
|
+
## P0: Errors, Rendering, And HTTP
|
|
88
|
+
|
|
89
|
+
This should be the next big cleanup theme. The codebase is moving toward
|
|
90
|
+
typed Effect failures, but the user-facing boundaries still leak old
|
|
91
|
+
shapes and sometimes collapse rich errors into opaque strings.
|
|
92
|
+
|
|
93
|
+
### Problems
|
|
94
|
+
|
|
95
|
+
- Some expected service failures still use `NamedError.create(...)` or
|
|
96
|
+
collapse to `Effect.die(...)`. The storage/worktree/provider-auth
|
|
97
|
+
conversions are done; an inventory sweep is needed for the rest.
|
|
98
|
+
- HTTP error middleware still guesses status codes from error names —
|
|
99
|
+
some entries (e.g. storage `NotFound`, provider auth) can now be
|
|
100
|
+
removed, but the middleware overall has not shrunk.
|
|
101
|
+
- Route handlers and route groups do not consistently declare the public
|
|
102
|
+
error body they intend to expose.
|
|
103
|
+
- Repeated route error translations do not yet have a clear home: some
|
|
104
|
+
should stay inline, some deserve tiny shared mapper helpers.
|
|
105
|
+
|
|
106
|
+
### Target Shape
|
|
107
|
+
|
|
108
|
+
- Services define expected failures with `Schema.TaggedErrorClass`.
|
|
109
|
+
- Services export an `Error` union and include it in method return types.
|
|
110
|
+
- Expected failures stay on the Effect error channel.
|
|
111
|
+
- `Effect.die(...)` is reserved for defects: bugs, impossible states,
|
|
112
|
+
violated invariants, or final unknown-boundary fallbacks.
|
|
113
|
+
- Inside `Effect.gen` / `Effect.fn`, use `yield* new MyError(...)` for
|
|
114
|
+
direct expected failures.
|
|
115
|
+
- Domain services do not import HTTP status codes, `HttpApiError`, or
|
|
116
|
+
route-specific error schemas.
|
|
117
|
+
- HTTP route groups make their public error contracts obvious.
|
|
118
|
+
- Handlers map service errors to declared HTTP errors at the boundary.
|
|
119
|
+
- Shared mapper helpers are only for repeated translations, not a giant
|
|
120
|
+
central registry of every domain error.
|
|
121
|
+
- Generic HTTP middleware should shrink; it should not accumulate more
|
|
122
|
+
name-based domain knowledge.
|
|
123
|
+
|
|
124
|
+
### Recently completed
|
|
125
|
+
|
|
126
|
+
- [x] `RENDER-1` CLI tagged config error rendering (#27256, tests #27257).
|
|
127
|
+
- [x] `ERR-1` [`storage/storage.ts`](../../src/storage/storage.ts) typed
|
|
128
|
+
`NotFoundError` (#27265) and removal of the server defect fallback
|
|
129
|
+
(#27287).
|
|
130
|
+
- [x] `ERR-2` [`worktree/index.ts`](../../src/worktree/index.ts) typed
|
|
131
|
+
errors (#27296).
|
|
132
|
+
- [x] `ERR-3` [`provider/auth.ts`](../../src/provider/auth.ts) typed
|
|
133
|
+
validation/oauth errors (#27301).
|
|
134
|
+
- [x] `HTTP-1` Unknown-500 details no longer leaked (#27251); follow-up
|
|
135
|
+
to stop exposing named defects (#27471).
|
|
136
|
+
- [x] Session message reads typed and made effectful (#27269, #27275,
|
|
137
|
+
#27280, #27291).
|
|
138
|
+
- [x] Session HTTP error contracts tightened (#27308); busy-session
|
|
139
|
+
mapping centralized (#27375, #27473).
|
|
140
|
+
- [x] Provider init (#27484) and LSP init (#27494) errors typed.
|
|
141
|
+
|
|
142
|
+
### First PR Candidates
|
|
143
|
+
|
|
144
|
+
- [ ] `HTTP-2` Audit one route group for explicit error contracts and
|
|
145
|
+
decide which mappings stay inline vs. shared helper.
|
|
146
|
+
- [ ] `ERR-4` Sweep remaining `NamedError.create(...)` and
|
|
147
|
+
`Effect.die(...)` callsites for expected failures — re-run `git
|
|
148
|
+
grep` to build a current inventory.
|
|
149
|
+
- [ ] `RENDER-2` Audit CLI and TUI surfaces for any remaining opaque
|
|
150
|
+
`Error: Name` rendering of typed errors.
|
|
151
|
+
|
|
152
|
+
## P1: Tests
|
|
153
|
+
|
|
154
|
+
When touching tests, migrate them toward the ideal patterns in
|
|
155
|
+
[`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md):
|
|
156
|
+
|
|
157
|
+
- Use `testEffect(...)` with explicit layers.
|
|
158
|
+
- Prefer `it.instance(...)` for service tests that need an instance.
|
|
159
|
+
- Prefer `it.live(...)` for real timers, filesystem mtimes, child
|
|
160
|
+
processes, git, locks, or other live integration behavior.
|
|
161
|
+
- Avoid sleeps; wait on real events or deterministic state transitions.
|
|
162
|
+
- Do not mutate `process.env` or mutable globals after layers are built.
|
|
163
|
+
- Use explicit layer variants, such as `RuntimeFlags.layer(...)`, for
|
|
164
|
+
behavior changes.
|
|
165
|
+
|
|
166
|
+
## P2: RuntimeFlags / Flag Deletion
|
|
167
|
+
|
|
168
|
+
Recently completed:
|
|
169
|
+
|
|
170
|
+
- [x] Plugin/pure-mode flags moved to RuntimeFlags.
|
|
171
|
+
- [x] Tool visibility flags moved to RuntimeFlags.
|
|
172
|
+
- [x] Built-in websearch provider selection uses the same runtime flags as
|
|
173
|
+
tool visibility.
|
|
174
|
+
- [x] Removed global default-plugin disabling from test preload.
|
|
175
|
+
- [x] `RF-1` Reference reads routed through runtime flags (#27318).
|
|
176
|
+
- [x] `RF-2` Plan-mode prompt read routed through runtime flags (#27320).
|
|
177
|
+
- [x] `RF-3` Event-system reads routed through runtime flags (#27323).
|
|
178
|
+
- [x] `RF-4` Workspaces reads routed through runtime flags for session
|
|
179
|
+
(#27335), sync (#27336), and control-plane (#27337).
|
|
180
|
+
- [x] LLM client (#27368) and installation client (#27369) routed
|
|
181
|
+
through runtime flags.
|
|
182
|
+
- [x] TUI plugin runtime flags simplified (#27506).
|
|
183
|
+
- [x] Background-subagents flag moved to RuntimeFlags, then removed
|
|
184
|
+
(`refactor(task): use runtime flag for background subagents`,
|
|
185
|
+
`refactor(flags): remove background subagents flag`).
|
|
186
|
+
|
|
187
|
+
Remaining cleanup:
|
|
188
|
+
|
|
189
|
+
- [ ] Sweep lingering `Flag.*` reads — many CLI/TUI/config/observability
|
|
190
|
+
callsites still import [`flag.ts`](../../../core/src/flag/flag.ts).
|
|
191
|
+
Decide per-callsite whether to route through RuntimeFlags, accept
|
|
192
|
+
as legitimate env/config boundary, or migrate to typed `Config`.
|
|
193
|
+
- [ ] Delete [`test/fixture/flag.ts`](../../test/fixture/flag.ts) once
|
|
194
|
+
tests no longer mutate `Flag`.
|
|
195
|
+
- [ ] Delete [`flag.ts`](../../../core/src/flag/flag.ts) once no packages
|
|
196
|
+
import it.
|
|
197
|
+
|
|
198
|
+
## P3: Global Paths
|
|
199
|
+
|
|
200
|
+
[`global.ts`](../../../core/src/global.ts) is real connective tissue, not
|
|
201
|
+
just cosmetic ugliness. It currently mixes path calculation, import-time
|
|
202
|
+
directory creation, `Flock` setup, mutable exported `Path` state, and a
|
|
203
|
+
`Flag` dependency.
|
|
204
|
+
|
|
205
|
+
Problems to reduce:
|
|
206
|
+
|
|
207
|
+
- Importing the module creates directories.
|
|
208
|
+
- Tests override `Global.Path` by mutating exported module state.
|
|
209
|
+
- Most callers use `Global.Path` directly instead of the Effect service.
|
|
210
|
+
- `Global.make()` still reads mutable `Flag.OPENCODE_CONFIG_DIR`.
|
|
211
|
+
|
|
212
|
+
Next PR candidates:
|
|
213
|
+
|
|
214
|
+
- [ ] Replace mutable `Global.Path` test overrides with explicit test
|
|
215
|
+
layers or scoped helpers.
|
|
216
|
+
- [ ] Move directory creation and `Flock` setup behind an explicit init
|
|
217
|
+
boundary where possible.
|
|
218
|
+
- [ ] Remove the `Flag` dependency from global path resolution.
|
|
219
|
+
|
|
220
|
+
## P4: Instance And Bridge
|
|
221
|
+
|
|
222
|
+
Instance context migration is complete for the legacy sync shim. Promise and callback interop continues through [`effect/bridge.ts`](../../src/effect/bridge.ts).
|
|
223
|
+
|
|
224
|
+
Current rules:
|
|
225
|
+
|
|
226
|
+
- Effect services read instance data from `InstanceRef`, `WorkspaceRef`, `InstanceState`, or explicit arguments.
|
|
227
|
+
- Plain JavaScript callback boundaries use `EffectBridge` or explicit context arguments.
|
|
228
|
+
- Runtime entrypoints must provide refs explicitly when they are instance-scoped.
|
|
229
|
+
|
|
230
|
+
## Lower Priority Tracks
|
|
231
|
+
|
|
232
|
+
- `PROC` / `FS` — continue AppProcess and FSUtil migrations as
|
|
233
|
+
focused PRs when touching relevant files.
|
|
234
|
+
- `RT` — remove service-local runtime facades only when they are not an
|
|
235
|
+
intentional boundary.
|
|
236
|
+
- `OA` — shrink [`public.ts`](../../src/server/routes/instance/httpapi/public.ts)
|
|
237
|
+
by tightening source schemas one workaround at a time.
|
|
238
|
+
- `fetch` → `HttpClient` — migrate raw fetch callsites when the caller is
|
|
239
|
+
already effectful or being effectified.
|
|
240
|
+
- `Tools` — remaining tool cleanup is narrow: `webfetch` HTML extraction
|
|
241
|
+
and `shell` raw stream/promise edges.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Tool migration
|
|
2
|
+
|
|
3
|
+
Practical reference for the current tool-migration state in `packages/openfork`.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
`Tool.Def.execute` and `Tool.Info.init` already return `Effect` on this branch, and the built-in tool surface is now largely on the target shape.
|
|
8
|
+
|
|
9
|
+
The current exported tools in `src/tool` all use `Tool.define(...)` with Effect-based initialization, and nearly all of them already build their tool body with `Effect.gen(...)` and `Effect.fn(...)`.
|
|
10
|
+
|
|
11
|
+
So the remaining work is no longer "convert tools to Effect at all". The remaining work is mostly:
|
|
12
|
+
|
|
13
|
+
1. remove Promise and raw platform bridges inside individual tool bodies
|
|
14
|
+
2. swap tool internals to Effect-native services like `FSUtil`, `HttpClient`, and `ChildProcessSpawner`
|
|
15
|
+
3. keep tests and callers aligned with `yield* info.init()` and real service graphs
|
|
16
|
+
|
|
17
|
+
## Current shape
|
|
18
|
+
|
|
19
|
+
`Tool.define(...)` is already the Effect-native helper here.
|
|
20
|
+
|
|
21
|
+
- `init` is an `Effect`
|
|
22
|
+
- `info.init()` returns an `Effect`
|
|
23
|
+
- `execute(...)` returns an `Effect`
|
|
24
|
+
|
|
25
|
+
That means a tool does not need a separate `Tool.defineEffect(...)` helper to count as migrated. A tool is effectively migrated when its init and execute path stay Effect-native, even if some internals still bridge to Promise-based or raw APIs.
|
|
26
|
+
|
|
27
|
+
## Tests
|
|
28
|
+
|
|
29
|
+
Tool tests should use the existing Effect helpers in `packages/openfork/test/lib/effect.ts`:
|
|
30
|
+
|
|
31
|
+
- Use `testEffect(...)` / `it.live(...)` instead of creating fake local wrappers around effectful tools.
|
|
32
|
+
- Yield the real tool export, then initialize it: `const info = yield* ReadTool`, `const tool = yield* info.init()`.
|
|
33
|
+
- Run tests inside a real instance with `provideTmpdirInstance(...)` or `provideInstance(tmpdirScoped(...))` so instance-scoped services resolve exactly as they do in production.
|
|
34
|
+
|
|
35
|
+
This keeps tool tests aligned with the production service graph and makes follow-up cleanup mostly mechanical.
|
|
36
|
+
|
|
37
|
+
## Exported tools
|
|
38
|
+
|
|
39
|
+
These exported tool definitions currently use `Tool.define(...)` in `src/tool`:
|
|
40
|
+
|
|
41
|
+
- [x] `apply_patch.ts`
|
|
42
|
+
- [x] `bash.ts`
|
|
43
|
+
- [x] `edit.ts`
|
|
44
|
+
- [x] `glob.ts`
|
|
45
|
+
- [x] `grep.ts`
|
|
46
|
+
- [x] `invalid.ts`
|
|
47
|
+
- [x] `lsp.ts`
|
|
48
|
+
- [x] `plan.ts`
|
|
49
|
+
- [x] `question.ts`
|
|
50
|
+
- [x] `read.ts`
|
|
51
|
+
- [x] `skill.ts`
|
|
52
|
+
- [x] `task.ts`
|
|
53
|
+
- [x] `todo.ts`
|
|
54
|
+
- [x] `webfetch.ts`
|
|
55
|
+
- [x] `websearch.ts`
|
|
56
|
+
- [x] `write.ts`
|
|
57
|
+
|
|
58
|
+
Notes:
|
|
59
|
+
|
|
60
|
+
- There is no current `ls.ts` tool file on this branch.
|
|
61
|
+
- `truncate.ts` is an Effect service used by tools, not a tool definition itself.
|
|
62
|
+
- `mcp-exa.ts`, `external-directory.ts`, and `schema.ts` are support modules, not standalone tool definitions.
|
|
63
|
+
|
|
64
|
+
## Follow-up cleanup
|
|
65
|
+
|
|
66
|
+
Most exported tools are already on the intended Effect-native shape. The remaining cleanup is narrower than the old checklist implied.
|
|
67
|
+
|
|
68
|
+
Current spot cleanups worth tracking:
|
|
69
|
+
|
|
70
|
+
- [x] `read.ts` — streams through `FSUtil.Service.stream` with `Stream.splitLines`; the legacy Node stream / `readline` helper is gone
|
|
71
|
+
- [ ] `bash.ts` — already uses Effect child-process primitives; only keep tracking shell-specific platform bridges and parser/loading details as they come up
|
|
72
|
+
- [ ] `webfetch.ts` — already uses `HttpClient`; remaining work is limited to smaller boundary helpers like HTML text extraction
|
|
73
|
+
- [ ] `file/ripgrep.ts` — adjacent to tool migration; still has raw fs/process usage that affects `grep.ts` and file-search routes
|
|
74
|
+
- [x] `patch/index.ts` — apply path now returns `Effect` over `FSUtil.Service`; the parser and chunk replacer stay pure
|
|
75
|
+
|
|
76
|
+
Notable items that are already effectively on the target path and do not need separate migration bullets right now:
|
|
77
|
+
|
|
78
|
+
- `apply_patch.ts`
|
|
79
|
+
- `grep.ts`
|
|
80
|
+
- `write.ts`
|
|
81
|
+
- `websearch.ts`
|
|
82
|
+
- `edit.ts`
|
|
83
|
+
|
|
84
|
+
## Filesystem notes
|
|
85
|
+
|
|
86
|
+
Current raw fs users that still appear relevant here:
|
|
87
|
+
|
|
88
|
+
- `file/ripgrep.ts` — `fs/promises`
|