orynacode-ai 1.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +131 -0
- package/BUN_SHELL_MIGRATION_PLAN.md +136 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/orynacode +199 -0
- package/bunfig.toml +7 -0
- package/git +0 -0
- package/migration/20260511173437_session-metadata/migration.sql +1 -0
- package/migration/20260511173437_session-metadata/snapshot.json +1500 -0
- package/package.json +155 -0
- package/parsers-config.ts +386 -0
- package/script/bench-search.ts +115 -0
- package/script/bench-test-suite.ts +52 -0
- package/script/build.ts +244 -0
- package/script/generate.ts +14 -0
- package/script/httpapi-exercise.ts +1 -0
- package/script/postinstall.mjs +189 -0
- package/script/profile-test-files.ts +42 -0
- package/script/publish.ts +213 -0
- package/script/run-workspace-server +106 -0
- package/script/schema.ts +77 -0
- package/script/time.ts +6 -0
- package/script/trace-imports.ts +153 -0
- package/specs/effect/error-boundaries-plan.md +235 -0
- package/specs/effect/errors.md +207 -0
- package/specs/effect/facades.md +218 -0
- package/specs/effect/guide.md +247 -0
- package/specs/effect/instance-context.md +13 -0
- package/specs/effect/loose-ends.md +30 -0
- package/specs/effect/migration.md +62 -0
- package/specs/effect/routes.md +61 -0
- package/specs/effect/schema.md +88 -0
- package/specs/effect/server-package.md +58 -0
- package/specs/effect/todo.md +241 -0
- package/specs/effect/tools.md +88 -0
- package/specs/openapi-translation-cleanup.md +204 -0
- package/specs/tui-plugins.md +544 -0
- package/specs/v2/api.ts +67 -0
- package/specs/v2/message-shape.md +136 -0
- package/specs/v2/notifications.md +13 -0
- package/specs/v2/tui-command-shim.md +67 -0
- package/src/account/account.ts +459 -0
- package/src/account/repo.ts +170 -0
- package/src/account/schema.ts +99 -0
- package/src/account/url.ts +8 -0
- package/src/acp/agent.ts +95 -0
- package/src/acp/config-option.ts +203 -0
- package/src/acp/content.ts +250 -0
- package/src/acp/directory.ts +210 -0
- package/src/acp/error.ts +90 -0
- package/src/acp/event.ts +344 -0
- package/src/acp/permission.ts +145 -0
- package/src/acp/profile.ts +42 -0
- package/src/acp/service.ts +1062 -0
- package/src/acp/session.ts +231 -0
- package/src/acp/tool.ts +317 -0
- package/src/acp/usage.ts +239 -0
- package/src/agent/agent.ts +433 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +9 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +11 -0
- package/src/agent/prompt/title.txt +44 -0
- package/src/agent/subagent-permissions.ts +35 -0
- package/src/audio.d.ts +14 -0
- package/src/auth/index.ts +96 -0
- package/src/background/job.ts +36 -0
- package/src/bus/global.ts +22 -0
- package/src/cli/bootstrap.ts +11 -0
- package/src/cli/cmd/account.ts +264 -0
- package/src/cli/cmd/acp.ts +76 -0
- package/src/cli/cmd/agent.ts +259 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/db.ts +62 -0
- package/src/cli/cmd/debug/agent.handler.ts +193 -0
- package/src/cli/cmd/debug/agent.ts +27 -0
- package/src/cli/cmd/debug/config.ts +14 -0
- package/src/cli/cmd/debug/file.ts +87 -0
- package/src/cli/cmd/debug/index.ts +87 -0
- package/src/cli/cmd/debug/lsp.ts +51 -0
- package/src/cli/cmd/debug/ripgrep.ts +99 -0
- package/src/cli/cmd/debug/scrap.ts +18 -0
- package/src/cli/cmd/debug/skill.ts +15 -0
- package/src/cli/cmd/debug/snapshot.ts +50 -0
- package/src/cli/cmd/debug/startup.ts +11 -0
- package/src/cli/cmd/debug/v2.ts +46 -0
- package/src/cli/cmd/export.ts +292 -0
- package/src/cli/cmd/generate.ts +54 -0
- package/src/cli/cmd/github.handler.ts +1593 -0
- package/src/cli/cmd/github.shared.ts +30 -0
- package/src/cli/cmd/github.ts +42 -0
- package/src/cli/cmd/import.ts +224 -0
- package/src/cli/cmd/mcp.ts +846 -0
- package/src/cli/cmd/models.ts +66 -0
- package/src/cli/cmd/plug.ts +230 -0
- package/src/cli/cmd/pr.ts +115 -0
- package/src/cli/cmd/prompt-display.ts +48 -0
- package/src/cli/cmd/providers.ts +506 -0
- package/src/cli/cmd/run/demo.ts +1274 -0
- package/src/cli/cmd/run/entry.body.ts +194 -0
- package/src/cli/cmd/run/footer.command.tsx +899 -0
- package/src/cli/cmd/run/footer.menu.tsx +306 -0
- package/src/cli/cmd/run/footer.permission.tsx +475 -0
- package/src/cli/cmd/run/footer.prompt.tsx +1207 -0
- package/src/cli/cmd/run/footer.question.tsx +579 -0
- package/src/cli/cmd/run/footer.subagent.tsx +171 -0
- package/src/cli/cmd/run/footer.ts +1092 -0
- package/src/cli/cmd/run/footer.view.tsx +935 -0
- package/src/cli/cmd/run/otel.ts +117 -0
- package/src/cli/cmd/run/permission.shared.ts +256 -0
- package/src/cli/cmd/run/prompt.shared.ts +147 -0
- package/src/cli/cmd/run/question.shared.ts +340 -0
- package/src/cli/cmd/run/runtime.boot.ts +210 -0
- package/src/cli/cmd/run/runtime.lifecycle.ts +369 -0
- package/src/cli/cmd/run/runtime.queue.ts +347 -0
- package/src/cli/cmd/run/runtime.shared.ts +17 -0
- package/src/cli/cmd/run/runtime.stdin.ts +37 -0
- package/src/cli/cmd/run/runtime.ts +879 -0
- package/src/cli/cmd/run/scrollback.shared.ts +92 -0
- package/src/cli/cmd/run/scrollback.surface.ts +435 -0
- package/src/cli/cmd/run/scrollback.writer.tsx +335 -0
- package/src/cli/cmd/run/session-data.ts +1113 -0
- package/src/cli/cmd/run/session-replay.ts +301 -0
- package/src/cli/cmd/run/session.shared.ts +196 -0
- package/src/cli/cmd/run/splash.ts +310 -0
- package/src/cli/cmd/run/stream.transport.ts +1465 -0
- package/src/cli/cmd/run/stream.ts +175 -0
- package/src/cli/cmd/run/subagent-data.ts +844 -0
- package/src/cli/cmd/run/theme.ts +603 -0
- package/src/cli/cmd/run/tool.ts +1489 -0
- package/src/cli/cmd/run/trace.ts +94 -0
- package/src/cli/cmd/run/types.ts +342 -0
- package/src/cli/cmd/run/variant.shared.ts +215 -0
- package/src/cli/cmd/run.ts +879 -0
- package/src/cli/cmd/serve.ts +24 -0
- package/src/cli/cmd/session.ts +147 -0
- package/src/cli/cmd/stats.ts +393 -0
- package/src/cli/cmd/tui/app.tsx +1113 -0
- package/src/cli/cmd/tui/attach.ts +103 -0
- package/src/cli/cmd/tui/attention.ts +262 -0
- package/src/cli/cmd/tui/component/bg-pulse-render.ts +436 -0
- package/src/cli/cmd/tui/component/bg-pulse.tsx +99 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/command-palette.tsx +79 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-console-org.tsx +103 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +85 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +185 -0
- package/src/cli/cmd/tui/component/dialog-move-session.tsx +240 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +687 -0
- package/src/cli/cmd/tui/component/dialog-retry-action.tsx +160 -0
- package/src/cli/cmd/tui/component/dialog-session-delete-failed.tsx +99 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +318 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-skill.tsx +36 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +168 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +47 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/dialog-variant.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-workspace-create.tsx +313 -0
- package/src/cli/cmd/tui/component/dialog-workspace-file-changes.tsx +144 -0
- package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +112 -0
- package/src/cli/cmd/tui/component/dialog-workspace-unavailable.tsx +69 -0
- package/src/cli/cmd/tui/component/error-component.tsx +81 -0
- package/src/cli/cmd/tui/component/logo.tsx +885 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +799 -0
- package/src/cli/cmd/tui/component/prompt/cwd.ts +0 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +117 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1725 -0
- package/src/cli/cmd/tui/component/prompt/move.tsx +192 -0
- package/src/cli/cmd/tui/component/prompt/part.ts +31 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/prompt/traits.ts +35 -0
- package/src/cli/cmd/tui/component/prompt/workspace.tsx +137 -0
- package/src/cli/cmd/tui/component/spinner.tsx +24 -0
- package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/component/use-connected.tsx +9 -0
- package/src/cli/cmd/tui/component/workspace-label.tsx +19 -0
- package/src/cli/cmd/tui/config/cwd.ts +5 -0
- package/src/cli/cmd/tui/config/keybind.ts +467 -0
- package/src/cli/cmd/tui/config/tui-migrate.ts +154 -0
- package/src/cli/cmd/tui/config/tui-schema.ts +88 -0
- package/src/cli/cmd/tui/config/tui.ts +308 -0
- package/src/cli/cmd/tui/context/agent.tsx +11 -0
- package/src/cli/cmd/tui/context/aggregate-failures.ts +51 -0
- package/src/cli/cmd/tui/context/args.tsx +15 -0
- package/src/cli/cmd/tui/context/directory.ts +15 -0
- package/src/cli/cmd/tui/context/editor-zed.ts +287 -0
- package/src/cli/cmd/tui/context/editor.ts +469 -0
- package/src/cli/cmd/tui/context/event.ts +38 -0
- package/src/cli/cmd/tui/context/exit.tsx +42 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/kv.tsx +76 -0
- package/src/cli/cmd/tui/context/local.tsx +510 -0
- package/src/cli/cmd/tui/context/path-format.tsx +39 -0
- package/src/cli/cmd/tui/context/project.tsx +111 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +52 -0
- package/src/cli/cmd/tui/context/sdk.tsx +142 -0
- package/src/cli/cmd/tui/context/sync-v2.tsx +447 -0
- package/src/cli/cmd/tui/context/sync.tsx +628 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +230 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +225 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +234 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/opencode.json +245 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/oryna.json +95 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1341 -0
- package/src/cli/cmd/tui/context/thinking.ts +67 -0
- package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
- package/src/cli/cmd/tui/event.ts +53 -0
- package/src/cli/cmd/tui/feature-plugins/home/footer.tsx +98 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +288 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +59 -0
- package/src/cli/cmd/tui/feature-plugins/session/dialog.tsx +356 -0
- package/src/cli/cmd/tui/feature-plugins/session/index.tsx +32 -0
- package/src/cli/cmd/tui/feature-plugins/session/preview-pane.tsx +288 -0
- package/src/cli/cmd/tui/feature-plugins/session/util.tsx +54 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +65 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +70 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +96 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +65 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +97 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +49 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree-utils.ts +232 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-file-tree.tsx +162 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer-ui.tsx +103 -0
- package/src/cli/cmd/tui/feature-plugins/system/diff-viewer.tsx +1058 -0
- package/src/cli/cmd/tui/feature-plugins/system/notifications.ts +94 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +269 -0
- package/src/cli/cmd/tui/feature-plugins/system/session-v2.tsx +1184 -0
- package/src/cli/cmd/tui/feature-plugins/system/which-key.tsx +608 -0
- package/src/cli/cmd/tui/keymap.tsx +283 -0
- package/src/cli/cmd/tui/layer.ts +6 -0
- package/src/cli/cmd/tui/plugin/api.tsx +390 -0
- package/src/cli/cmd/tui/plugin/command-shim.ts +109 -0
- package/src/cli/cmd/tui/plugin/internal.ts +42 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +1131 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +60 -0
- package/src/cli/cmd/tui/routes/home/session-destination.tsx +39 -0
- package/src/cli/cmd/tui/routes/home.tsx +149 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +76 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +108 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +2629 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +729 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +514 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +102 -0
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +132 -0
- package/src/cli/cmd/tui/thread.ts +264 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +66 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +108 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +217 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +40 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +126 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +712 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +218 -0
- package/src/cli/cmd/tui/ui/link.tsx +34 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +102 -0
- package/src/cli/cmd/tui/util/audio.ts +58 -0
- package/src/cli/cmd/tui/util/clipboard.ts +181 -0
- package/src/cli/cmd/tui/util/collapse-tool-output.ts +19 -0
- package/src/cli/cmd/tui/util/editor.ts +43 -0
- package/src/cli/cmd/tui/util/layout.ts +25 -0
- package/src/cli/cmd/tui/util/model.ts +23 -0
- package/src/cli/cmd/tui/util/provider-origin.ts +7 -0
- package/src/cli/cmd/tui/util/revert-diff.ts +18 -0
- package/src/cli/cmd/tui/util/scroll.ts +25 -0
- package/src/cli/cmd/tui/util/selection.ts +73 -0
- package/src/cli/cmd/tui/util/signal.ts +41 -0
- package/src/cli/cmd/tui/util/transcript.ts +112 -0
- package/src/cli/cmd/tui/validate-session.ts +29 -0
- package/src/cli/cmd/tui/win32.ts +130 -0
- package/src/cli/cmd/tui/worker.ts +99 -0
- package/src/cli/cmd/uninstall.ts +353 -0
- package/src/cli/cmd/upgrade.ts +74 -0
- package/src/cli/cmd/web.ts +84 -0
- package/src/cli/effect/prompt.ts +37 -0
- package/src/cli/effect-cmd.ts +96 -0
- package/src/cli/error.ts +118 -0
- package/src/cli/heap.ts +59 -0
- package/src/cli/logo.ts +21 -0
- package/src/cli/network.ts +64 -0
- package/src/cli/ui.ts +132 -0
- package/src/cli/upgrade.ts +53 -0
- package/src/command/index.ts +181 -0
- package/src/command/template/initialize.txt +66 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/agent.ts +68 -0
- package/src/config/command.ts +45 -0
- package/src/config/config.ts +679 -0
- package/src/config/entry-name.ts +19 -0
- package/src/config/managed.ts +77 -0
- package/src/config/markdown.ts +36 -0
- package/src/config/parse.ts +79 -0
- package/src/config/paths.ts +45 -0
- package/src/config/plugin.ts +79 -0
- package/src/config/reference.ts +48 -0
- package/src/config/variable.ts +91 -0
- package/src/control-plane/adapters/index.ts +41 -0
- package/src/control-plane/adapters/worktree.ts +96 -0
- package/src/control-plane/dev/README.md +19 -0
- package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
- package/src/control-plane/types.ts +59 -0
- package/src/control-plane/util.ts +39 -0
- package/src/control-plane/workspace-adapter-runtime.ts +51 -0
- package/src/control-plane/workspace-context.ts +26 -0
- package/src/control-plane/workspace.ts +1075 -0
- package/src/effect/app-runtime.ts +133 -0
- package/src/effect/bootstrap-runtime.ts +23 -0
- package/src/effect/bridge.ts +84 -0
- package/src/effect/config-service.ts +67 -0
- package/src/effect/instance-ref.ts +11 -0
- package/src/effect/instance-registry.ts +12 -0
- package/src/effect/instance-state.ts +72 -0
- package/src/effect/promise.ts +17 -0
- package/src/effect/run-service.ts +47 -0
- package/src/effect/runner.ts +217 -0
- package/src/effect/runtime-flags.ts +76 -0
- package/src/env/index.ts +40 -0
- package/src/event-v2-bridge.ts +76 -0
- package/src/format/formatter.ts +404 -0
- package/src/format/index.ts +212 -0
- package/src/git/index.ts +347 -0
- package/src/id/id.ts +80 -0
- package/src/ide/index.ts +70 -0
- package/src/image/image.ts +177 -0
- package/src/index.ts +208 -0
- package/src/installation/index.ts +349 -0
- package/src/lsp/client.ts +686 -0
- package/src/lsp/diagnostic.ts +29 -0
- package/src/lsp/language.ts +121 -0
- package/src/lsp/launch.ts +21 -0
- package/src/lsp/lsp.ts +517 -0
- package/src/lsp/server.ts +2064 -0
- package/src/markdown.d.ts +4 -0
- package/src/mcp/auth.ts +171 -0
- package/src/mcp/index.ts +982 -0
- package/src/mcp/oauth-callback.ts +232 -0
- package/src/mcp/oauth-provider.ts +217 -0
- package/src/node.ts +5 -0
- package/src/oryna/agent.ts +112 -0
- package/src/oryna/reply-service.ts +8 -0
- package/src/patch/index.ts +689 -0
- package/src/permission/arity.ts +163 -0
- package/src/permission/evaluate.ts +1 -0
- package/src/permission/index.ts +230 -0
- package/src/plugin/azure.ts +26 -0
- package/src/plugin/cloudflare.ts +76 -0
- package/src/plugin/digitalocean.ts +391 -0
- package/src/plugin/github-copilot/copilot.ts +417 -0
- package/src/plugin/github-copilot/models.ts +246 -0
- package/src/plugin/index.ts +323 -0
- package/src/plugin/install.ts +439 -0
- package/src/plugin/loader.ts +237 -0
- package/src/plugin/meta.ts +188 -0
- package/src/plugin/openai/README.md +31 -0
- package/src/plugin/openai/codex.ts +647 -0
- package/src/plugin/openai/ws-pool.ts +290 -0
- package/src/plugin/openai/ws.ts +381 -0
- package/src/plugin/oryna.ts +349 -0
- package/src/plugin/shared.ts +323 -0
- package/src/plugin/xai.ts +742 -0
- package/src/project/bootstrap-service.ts +9 -0
- package/src/project/bootstrap.ts +80 -0
- package/src/project/instance-context.ts +24 -0
- package/src/project/instance-layer.ts +11 -0
- package/src/project/instance-runtime.ts +16 -0
- package/src/project/instance-store.ts +207 -0
- package/src/project/project.ts +520 -0
- package/src/project/vcs.ts +435 -0
- package/src/provider/auth.ts +230 -0
- package/src/provider/error.ts +188 -0
- package/src/provider/model-status.ts +8 -0
- package/src/provider/provider.ts +2009 -0
- package/src/provider/transform.ts +1363 -0
- package/src/pty-preparation.ts +30 -0
- package/src/question/index.ts +229 -0
- package/src/question/schema.ts +10 -0
- package/src/reference/reference.ts +239 -0
- package/src/reference/repository-cache.ts +320 -0
- package/src/server/auth.ts +48 -0
- package/src/server/cors.ts +34 -0
- package/src/server/event.ts +13 -0
- package/src/server/global-lifecycle.ts +37 -0
- package/src/server/init-projectors.ts +3 -0
- package/src/server/mdns.ts +60 -0
- package/src/server/projectors.ts +1 -0
- package/src/server/proxy-util.ts +48 -0
- package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
- package/src/server/routes/instance/httpapi/api.ts +78 -0
- package/src/server/routes/instance/httpapi/errors.ts +193 -0
- package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
- package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
- package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
- package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
- package/src/server/routes/instance/httpapi/groups/file.ts +172 -0
- package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
- package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
- package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
- package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
- package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +88 -0
- package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
- package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
- package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
- package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
- package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
- package/src/server/routes/instance/httpapi/groups/session.ts +462 -0
- package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
- package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
- package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
- package/src/server/routes/instance/httpapi/handlers/config.ts +151 -0
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
- package/src/server/routes/instance/httpapi/handlers/control.ts +40 -0
- package/src/server/routes/instance/httpapi/handlers/event.ts +102 -0
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
- package/src/server/routes/instance/httpapi/handlers/file.ts +103 -0
- package/src/server/routes/instance/httpapi/handlers/global.ts +157 -0
- package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
- package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +157 -0
- package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
- package/src/server/routes/instance/httpapi/handlers/provider.ts +160 -0
- package/src/server/routes/instance/httpapi/handlers/pty.ts +258 -0
- package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +21 -0
- package/src/server/routes/instance/httpapi/handlers/session.ts +442 -0
- package/src/server/routes/instance/httpapi/handlers/sync.ts +95 -0
- package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
- package/src/server/routes/instance/httpapi/lifecycle.ts +57 -0
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +147 -0
- package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
- package/src/server/routes/instance/httpapi/middleware/error.ts +36 -0
- package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +42 -0
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
- package/src/server/routes/instance/httpapi/public.ts +535 -0
- package/src/server/routes/instance/httpapi/server.ts +277 -0
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
- package/src/server/server.ts +218 -0
- package/src/server/shared/fence.ts +68 -0
- package/src/server/shared/pty-ticket.ts +15 -0
- package/src/server/shared/public-ui.ts +12 -0
- package/src/server/shared/tui-control.ts +28 -0
- package/src/server/shared/ui.ts +108 -0
- package/src/server/shared/workspace-routing.ts +38 -0
- package/src/session/compaction.ts +609 -0
- package/src/session/instruction.ts +237 -0
- package/src/session/llm/AGENTS.md +90 -0
- package/src/session/llm/ai-sdk.ts +288 -0
- package/src/session/llm/native-request.ts +196 -0
- package/src/session/llm/native-runtime.ts +195 -0
- package/src/session/llm/request.ts +215 -0
- package/src/session/llm.ts +402 -0
- package/src/session/message-error.ts +14 -0
- package/src/session/message-v2.ts +745 -0
- package/src/session/message.ts +148 -0
- package/src/session/overflow.ts +34 -0
- package/src/session/processor.ts +1063 -0
- package/src/session/prompt/anthropic.txt +105 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex.txt +79 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/default.txt +95 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/gpt.txt +107 -0
- package/src/session/prompt/kimi.txt +95 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-mode.txt +70 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/session/prompt/plan.txt +26 -0
- package/src/session/prompt/reference.ts +72 -0
- package/src/session/prompt/trinity.txt +97 -0
- package/src/session/prompt.ts +1755 -0
- package/src/session/reminders.ts +92 -0
- package/src/session/retry.ts +201 -0
- package/src/session/revert.ts +153 -0
- package/src/session/run-state.ts +153 -0
- package/src/session/schema.ts +26 -0
- package/src/session/session.ts +1116 -0
- package/src/session/status.ts +94 -0
- package/src/session/summary.ts +162 -0
- package/src/session/system.ts +84 -0
- package/src/session/todo.ts +87 -0
- package/src/session/tools.ts +211 -0
- package/src/share/session.ts +58 -0
- package/src/share/share-next.ts +379 -0
- package/src/shell/shell.ts +215 -0
- package/src/skill/discovery.ts +115 -0
- package/src/skill/index.ts +357 -0
- package/src/snapshot/index.ts +759 -0
- package/src/sql.d.ts +4 -0
- package/src/storage/schema.ts +5 -0
- package/src/storage/storage.ts +329 -0
- package/src/sync/README.md +179 -0
- package/src/sync/schema.ts +11 -0
- package/src/temporary.ts +33 -0
- package/src/tool/apply_patch.ts +313 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/edit.ts +737 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +49 -0
- package/src/tool/glob.ts +84 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +140 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +21 -0
- package/src/tool/json-schema.ts +164 -0
- package/src/tool/lsp.ts +113 -0
- package/src/tool/lsp.txt +24 -0
- package/src/tool/mcp-websearch.ts +96 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +79 -0
- package/src/tool/question.ts +44 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read.ts +392 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/registry.ts +475 -0
- package/src/tool/reply.ts +29 -0
- package/src/tool/schema.ts +14 -0
- package/src/tool/shell/id.ts +19 -0
- package/src/tool/shell/prompt.ts +307 -0
- package/src/tool/shell/shell.txt +21 -0
- package/src/tool/shell.ts +660 -0
- package/src/tool/skill.ts +72 -0
- package/src/tool/skill.txt +5 -0
- package/src/tool/task.ts +338 -0
- package/src/tool/task.txt +19 -0
- package/src/tool/todo.ts +57 -0
- package/src/tool/todowrite.txt +44 -0
- package/src/tool/tool.ts +183 -0
- package/src/tool/truncate.ts +160 -0
- package/src/tool/truncation-dir.ts +4 -0
- package/src/tool/webfetch.ts +192 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +143 -0
- package/src/tool/websearch.txt +14 -0
- package/src/tool/write.ts +104 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +17 -0
- package/src/util/bom.ts +27 -0
- package/src/util/data-url.ts +9 -0
- package/src/util/defer.ts +10 -0
- package/src/util/effect-http-client.ts +11 -0
- package/src/util/error.ts +88 -0
- package/src/util/filesystem.ts +251 -0
- package/src/util/format.ts +20 -0
- package/src/util/iife.ts +3 -0
- package/src/util/lan-scan.ts +90 -0
- package/src/util/lazy.ts +20 -0
- package/src/util/local-context.ts +25 -0
- package/src/util/locale.ts +86 -0
- package/src/util/media.ts +26 -0
- package/src/util/process.ts +176 -0
- package/src/util/proxy-env.ts +72 -0
- package/src/util/queue.ts +32 -0
- package/src/util/record.ts +3 -0
- package/src/util/repository.ts +232 -0
- package/src/util/rpc.ts +66 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +13 -0
- package/src/util/token.ts +1 -0
- package/src/util/wildcard.ts +59 -0
- package/src/worktree/index.ts +645 -0
- package/sst-env.d.ts +10 -0
- package/test/AGENTS.md +204 -0
- package/test/EFFECT_TEST_MIGRATION.md +169 -0
- package/test/account/repo.test.ts +353 -0
- package/test/account/service.test.ts +453 -0
- package/test/acp/config-option.test.ts +229 -0
- package/test/acp/content.test.ts +201 -0
- package/test/acp/directory.test.ts +186 -0
- package/test/acp/error.test.ts +67 -0
- package/test/acp/event.test.ts +711 -0
- package/test/acp/permission.test.ts +273 -0
- package/test/acp/service-session.test.ts +1174 -0
- package/test/acp/session.test.ts +200 -0
- package/test/acp/tool.test.ts +210 -0
- package/test/acp/usage.test.ts +315 -0
- package/test/agent/agent.test.ts +710 -0
- package/test/agent/plan-mode-subagent-bypass.test.ts +213 -0
- package/test/agent/plugin-agent-regression.test.ts +62 -0
- package/test/auth/auth.test.ts +77 -0
- package/test/background/job.test.ts +243 -0
- package/test/cli/account.test.ts +30 -0
- package/test/cli/acp/acp-test-client.ts +97 -0
- package/test/cli/acp/config-options.test.ts +103 -0
- package/test/cli/acp/helpers.ts +96 -0
- package/test/cli/acp/initialize-auth.test.ts +61 -0
- package/test/cli/acp/lifecycle.test.ts +118 -0
- package/test/cli/acp/prompt-content.test.ts +97 -0
- package/test/cli/acp/skills.test.ts +38 -0
- package/test/cli/cmd/tui/aggregate-failures.test.ts +93 -0
- package/test/cli/cmd/tui/attention.test.ts +484 -0
- package/test/cli/cmd/tui/dialog-workspace-create.test.ts +28 -0
- package/test/cli/cmd/tui/model-options.test.ts +30 -0
- package/test/cli/cmd/tui/notifications.test.ts +267 -0
- package/test/cli/cmd/tui/prompt-history.test.ts +44 -0
- package/test/cli/cmd/tui/prompt-part.test.ts +77 -0
- package/test/cli/cmd/tui/prompt-traits.test.ts +29 -0
- package/test/cli/cmd/tui/provider-options.test.ts +29 -0
- package/test/cli/cmd/tui/sync-fixture.tsx +64 -0
- package/test/cli/cmd/tui/sync-live-hydration.test.tsx +278 -0
- package/test/cli/cmd/tui/sync-undefined-messages.test.tsx +47 -0
- package/test/cli/cmd/tui/sync.test.tsx +70 -0
- package/test/cli/effect-cmd-instance-als.test.ts +39 -0
- package/test/cli/error.test.ts +95 -0
- package/test/cli/github-action.test.ts +199 -0
- package/test/cli/github-remote.test.ts +90 -0
- package/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +631 -0
- package/test/cli/help/help-snapshots.test.ts +137 -0
- package/test/cli/import.test.ts +54 -0
- package/test/cli/mcp-add.test.ts +74 -0
- package/test/cli/plugin-auth-picker.test.ts +120 -0
- package/test/cli/run/entry.body.test.ts +536 -0
- package/test/cli/run/footer.menu.test.ts +43 -0
- package/test/cli/run/footer.view.test.tsx +927 -0
- package/test/cli/run/permission.shared.test.ts +144 -0
- package/test/cli/run/prompt.shared.test.ts +133 -0
- package/test/cli/run/question.shared.test.ts +115 -0
- package/test/cli/run/run-process.test.ts +84 -0
- package/test/cli/run/runtime.boot.test.ts +282 -0
- package/test/cli/run/runtime.queue.test.ts +465 -0
- package/test/cli/run/runtime.stdin.test.ts +71 -0
- package/test/cli/run/scrollback.surface.test.ts +1048 -0
- package/test/cli/run/session-data.test.ts +595 -0
- package/test/cli/run/session-replay.test.ts +456 -0
- package/test/cli/run/session.shared.test.ts +247 -0
- package/test/cli/run/stream.test.ts +56 -0
- package/test/cli/run/stream.transport.test.ts +2363 -0
- package/test/cli/run/subagent-data.test.ts +456 -0
- package/test/cli/run/theme.test.ts +152 -0
- package/test/cli/run/variant.shared.test.ts +217 -0
- package/test/cli/serve/serve-process.test.ts +61 -0
- package/test/cli/smokes/read-only.test.ts +115 -0
- package/test/cli/tui/__snapshots__/inline-tool-wrap-snapshot.test.tsx.snap +72 -0
- package/test/cli/tui/app-lifecycle.test.ts +261 -0
- package/test/cli/tui/dialog-prompt.test.tsx +146 -0
- package/test/cli/tui/diff-viewer-file-tree-utils.test.ts +323 -0
- package/test/cli/tui/diff-viewer-file-tree.test.tsx +197 -0
- package/test/cli/tui/diff-viewer.test.tsx +230 -0
- package/test/cli/tui/editor-context-zed.test.ts +384 -0
- package/test/cli/tui/editor-context.test.tsx +288 -0
- package/test/cli/tui/inline-tool-wrap-snapshot.test.tsx +232 -0
- package/test/cli/tui/keymap.test.tsx +136 -0
- package/test/cli/tui/plugin-add.test.ts +110 -0
- package/test/cli/tui/plugin-install.test.ts +87 -0
- package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
- package/test/cli/tui/plugin-loader-entrypoint.test.ts +485 -0
- package/test/cli/tui/plugin-loader-pure.test.ts +72 -0
- package/test/cli/tui/plugin-loader.test.ts +1332 -0
- package/test/cli/tui/plugin-toggle.test.ts +264 -0
- package/test/cli/tui/prompt-submit-race.test.ts +98 -0
- package/test/cli/tui/revert-diff.test.ts +35 -0
- package/test/cli/tui/slot-replace.test.tsx +50 -0
- package/test/cli/tui/sync-v2.test.tsx +558 -0
- package/test/cli/tui/theme-store.test.ts +76 -0
- package/test/cli/tui/thinking.test.ts +36 -0
- package/test/cli/tui/thread.test.ts +28 -0
- package/test/cli/tui/transcript.test.ts +426 -0
- package/test/cli/tui/use-event.test.tsx +145 -0
- package/test/config/agent-color.test.ts +47 -0
- package/test/config/config.test.ts +1991 -0
- package/test/config/entry-name.test.ts +57 -0
- package/test/config/fixtures/empty-frontmatter.md +4 -0
- package/test/config/fixtures/frontmatter.md +28 -0
- package/test/config/fixtures/markdown-header.md +11 -0
- package/test/config/fixtures/no-frontmatter.md +1 -0
- package/test/config/fixtures/weird-model-id.md +13 -0
- package/test/config/lsp.test.ts +69 -0
- package/test/config/markdown.test.ts +228 -0
- package/test/config/plugin.test.ts +0 -0
- package/test/config/tui.test.ts +878 -0
- package/test/control-plane/adapters.test.ts +71 -0
- package/test/control-plane/workspace.test.ts +1704 -0
- package/test/effect/app-runtime-logger.test.ts +105 -0
- package/test/effect/config-service.test.ts +65 -0
- package/test/effect/instance-state.test.ts +391 -0
- package/test/effect/run-service.test.ts +89 -0
- package/test/effect/runner.test.ts +514 -0
- package/test/effect/runtime-flags.test.ts +373 -0
- package/test/fake/account.ts +9 -0
- package/test/fake/auth.ts +8 -0
- package/test/fake/npm.ts +8 -0
- package/test/fake/provider.ts +82 -0
- package/test/fake/skill.ts +8 -0
- package/test/filesystem/filesystem.test.ts +319 -0
- package/test/fixture/agent-plugin.constants.ts +6 -0
- package/test/fixture/agent-plugin.ts +12 -0
- package/test/fixture/config.ts +23 -0
- package/test/fixture/db.ts +11 -0
- package/test/fixture/fixture.test.ts +26 -0
- package/test/fixture/fixture.ts +224 -0
- package/test/fixture/flag.ts +20 -0
- package/test/fixture/flock-worker.ts +72 -0
- package/test/fixture/lsp/fake-lsp-server.js +249 -0
- package/test/fixture/plug-worker.ts +93 -0
- package/test/fixture/plugin-meta-worker.ts +19 -0
- package/test/fixture/plugin.ts +10 -0
- package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
- package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
- package/test/fixture/skills/cloudflare/SKILL.md +211 -0
- package/test/fixture/skills/index.json +6 -0
- package/test/fixture/tui-plugin.ts +355 -0
- package/test/fixture/tui-runtime.ts +64 -0
- package/test/fixture/tui-sdk.ts +82 -0
- package/test/fixture/workspace.ts +30 -0
- package/test/fixtures/recordings/session/native-anthropic-tool-loop.json +49 -0
- package/test/fixtures/recordings/session/native-openai-oauth-tool-loop.json +45 -0
- package/test/fixtures/recordings/session/native-zen-tool-loop.json +49 -0
- package/test/format/format.test.ts +228 -0
- package/test/git/git.test.ts +178 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/image/fixtures/picture-5mb-base64.png +0 -0
- package/test/image/image.test.ts +123 -0
- package/test/installation/installation.test.ts +230 -0
- package/test/lib/cli-process.ts +459 -0
- package/test/lib/effect.ts +177 -0
- package/test/lib/filesystem.ts +10 -0
- package/test/lib/llm-server.ts +771 -0
- package/test/lib/snapshot.ts +73 -0
- package/test/lib/test-provider.ts +37 -0
- package/test/lib/websocket.ts +46 -0
- package/test/lsp/client.test.ts +493 -0
- package/test/lsp/index.test.ts +232 -0
- package/test/lsp/launch.test.ts +22 -0
- package/test/lsp/lifecycle.test.ts +160 -0
- package/test/mcp/auth.test.ts +78 -0
- package/test/mcp/headers.test.ts +126 -0
- package/test/mcp/lifecycle.test.ts +888 -0
- package/test/mcp/oauth-auto-connect.test.ts +236 -0
- package/test/mcp/oauth-browser.test.ts +228 -0
- package/test/mcp/oauth-callback.test.ts +34 -0
- package/test/mcp/oauth-provider.test.ts +61 -0
- package/test/patch/patch.test.ts +383 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/next.test.ts +1176 -0
- package/test/permission-task.test.ts +318 -0
- package/test/plugin/auth-override.test.ts +105 -0
- package/test/plugin/cloudflare.test.ts +68 -0
- package/test/plugin/codex.test.ts +247 -0
- package/test/plugin/github-copilot-models.test.ts +332 -0
- package/test/plugin/install-concurrency.test.ts +140 -0
- package/test/plugin/install.test.ts +570 -0
- package/test/plugin/loader-shared.test.ts +1303 -0
- package/test/plugin/meta.test.ts +137 -0
- package/test/plugin/openai-rollout.test.ts +17 -0
- package/test/plugin/openai-ws.test.ts +877 -0
- package/test/plugin/shared.test.ts +88 -0
- package/test/plugin/trigger.test.ts +120 -0
- package/test/plugin/workspace-adapter.test.ts +137 -0
- package/test/plugin/xai.test.ts +634 -0
- package/test/preload.ts +95 -0
- package/test/project/instance-bootstrap.test.ts +110 -0
- package/test/project/instance.test.ts +245 -0
- package/test/project/migrate-global.test.ts +170 -0
- package/test/project/project-directory.test.ts +169 -0
- package/test/project/project.test.ts +818 -0
- package/test/project/vcs.test.ts +336 -0
- package/test/project/worktree-remove.test.ts +126 -0
- package/test/project/worktree.test.ts +320 -0
- package/test/provider/amazon-bedrock.test.ts +360 -0
- package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
- package/test/provider/digitalocean.test.ts +123 -0
- package/test/provider/gitlab-duo.test.ts +412 -0
- package/test/provider/header-timeout.test.ts +233 -0
- package/test/provider/model-status.test.ts +61 -0
- package/test/provider/provider.test.ts +1793 -0
- package/test/provider/transform.test.ts +3937 -0
- package/test/pty/pty-shell.test.ts +102 -0
- package/test/question/question.test.ts +465 -0
- package/test/reference/reference.test.ts +310 -0
- package/test/server/AGENTS.md +15 -0
- package/test/server/auth.test.ts +59 -0
- package/test/server/global-bus.ts +31 -0
- package/test/server/global-session-list.test.ts +107 -0
- package/test/server/httpapi-authorization.test.ts +174 -0
- package/test/server/httpapi-compression.test.ts +154 -0
- package/test/server/httpapi-config.test.ts +113 -0
- package/test/server/httpapi-control-plane.test.ts +63 -0
- package/test/server/httpapi-cors-vary.test.ts +66 -0
- package/test/server/httpapi-cors.test.ts +122 -0
- package/test/server/httpapi-error-middleware.test.ts +96 -0
- package/test/server/httpapi-event.test.ts +97 -0
- package/test/server/httpapi-exercise/assertions.ts +64 -0
- package/test/server/httpapi-exercise/backend.ts +144 -0
- package/test/server/httpapi-exercise/dsl.ts +210 -0
- package/test/server/httpapi-exercise/environment.ts +40 -0
- package/test/server/httpapi-exercise/index.ts +1535 -0
- package/test/server/httpapi-exercise/report.ts +66 -0
- package/test/server/httpapi-exercise/routing.ts +96 -0
- package/test/server/httpapi-exercise/runner.ts +267 -0
- package/test/server/httpapi-exercise/runtime.ts +52 -0
- package/test/server/httpapi-exercise/types.ts +123 -0
- package/test/server/httpapi-experimental.test.ts +300 -0
- package/test/server/httpapi-file.test.ts +76 -0
- package/test/server/httpapi-global.test.ts +66 -0
- package/test/server/httpapi-instance-context.test.ts +347 -0
- package/test/server/httpapi-instance-route-auth.test.ts +84 -0
- package/test/server/httpapi-instance.test.ts +265 -0
- package/test/server/httpapi-layer.ts +33 -0
- package/test/server/httpapi-listen.test.ts +415 -0
- package/test/server/httpapi-mcp-oauth.test.ts +73 -0
- package/test/server/httpapi-mcp.test.ts +226 -0
- package/test/server/httpapi-mdns.test.ts +82 -0
- package/test/server/httpapi-promptasync-context.test.ts +222 -0
- package/test/server/httpapi-provider.test.ts +403 -0
- package/test/server/httpapi-pty.test.ts +275 -0
- package/test/server/httpapi-public-openapi.test.ts +297 -0
- package/test/server/httpapi-query-schema-drift.test.ts +330 -0
- package/test/server/httpapi-schema-error-body.test.ts +165 -0
- package/test/server/httpapi-sdk.test.ts +909 -0
- package/test/server/httpapi-session.test.ts +1013 -0
- package/test/server/httpapi-sync.test.ts +154 -0
- package/test/server/httpapi-ui.test.ts +456 -0
- package/test/server/httpapi-v2-location.test.ts +85 -0
- package/test/server/httpapi-workspace-routing.test.ts +554 -0
- package/test/server/httpapi-workspace.test.ts +515 -0
- package/test/server/negative-tokens-regression.test.ts +83 -0
- package/test/server/project-copy.test.ts +101 -0
- package/test/server/project-init-git.test.ts +117 -0
- package/test/server/proxy-util.test.ts +113 -0
- package/test/server/sdk-error-shape.test.ts +84 -0
- package/test/server/sdk-v1-smoke.test.ts +60 -0
- package/test/server/session-actions.test.ts +112 -0
- package/test/server/session-diff-missing-patch.test.ts +99 -0
- package/test/server/session-list.test.ts +314 -0
- package/test/server/session-messages.test.ts +182 -0
- package/test/server/session-select.test.ts +69 -0
- package/test/server/workspace-proxy.test.ts +181 -0
- package/test/server/workspace-routing.test.ts +94 -0
- package/test/server/worktree-endpoint-repro.test.ts +307 -0
- package/test/session/compaction.test.ts +1835 -0
- package/test/session/instruction.test.ts +256 -0
- package/test/session/llm-native-recorded.test.ts +433 -0
- package/test/session/llm-native.test.ts +760 -0
- package/test/session/llm.test.ts +1932 -0
- package/test/session/message-v2.test.ts +1661 -0
- package/test/session/messages-pagination.test.ts +1059 -0
- package/test/session/processor-effect.test.ts +1101 -0
- package/test/session/prompt.test.ts +2318 -0
- package/test/session/retry.test.ts +439 -0
- package/test/session/revert-compact.test.ts +642 -0
- package/test/session/schema-decoding.test.ts +313 -0
- package/test/session/session-schema.test.ts +78 -0
- package/test/session/session.test.ts +251 -0
- package/test/session/snapshot-tool-race.test.ts +280 -0
- package/test/session/structured-output-integration.test.ts +235 -0
- package/test/session/structured-output.test.ts +387 -0
- package/test/session/system.test.ts +84 -0
- package/test/share/share-next.test.ts +344 -0
- package/test/shell/shell.test.ts +99 -0
- package/test/skill/discovery.test.ts +139 -0
- package/test/skill/skill.test.ts +571 -0
- package/test/snapshot/snapshot.test.ts +1121 -0
- package/test/storage/storage.test.ts +296 -0
- package/test/storage/workspace-time-migration.test.ts +50 -0
- package/test/tool/__snapshots__/parameters.test.ts.snap +484 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/apply_patch.test.ts +533 -0
- package/test/tool/edit.test.ts +578 -0
- package/test/tool/external-directory.test.ts +155 -0
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +117299 -0
- package/test/tool/glob.test.ts +188 -0
- package/test/tool/grep.test.ts +266 -0
- package/test/tool/lsp.test.ts +181 -0
- package/test/tool/parameters.test.ts +293 -0
- package/test/tool/question.test.ts +138 -0
- package/test/tool/read.test.ts +654 -0
- package/test/tool/registry.test.ts +539 -0
- package/test/tool/shell.test.ts +1238 -0
- package/test/tool/skill.test.ts +132 -0
- package/test/tool/task.test.ts +901 -0
- package/test/tool/tool-define.test.ts +153 -0
- package/test/tool/truncation.test.ts +266 -0
- package/test/tool/webfetch.test.ts +113 -0
- package/test/tool/websearch.test.ts +99 -0
- package/test/tool/write.test.ts +276 -0
- package/test/util/data-url.test.ts +14 -0
- package/test/util/error.test.ts +64 -0
- package/test/util/filesystem.test.ts +656 -0
- package/test/util/format.test.ts +59 -0
- package/test/util/glob.test.ts +164 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/log.test.ts +77 -0
- package/test/util/module.test.ts +59 -0
- package/test/util/process.test.ts +128 -0
- package/test/util/repository.test.ts +93 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/wildcard.test.ts +90 -0
- package/test/v2/session-message-updater.test.ts +270 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Effect Guide
|
|
2
|
+
|
|
3
|
+
How we write Effect code in `packages/opencode`. The companion roadmap is
|
|
4
|
+
[`todo.md`](./todo.md).
|
|
5
|
+
|
|
6
|
+
This guide describes the preferred shape for new work and migrations. If a
|
|
7
|
+
legacy file differs, migrate it only when it is already in scope.
|
|
8
|
+
|
|
9
|
+
## Service Shape
|
|
10
|
+
|
|
11
|
+
Use one module per service: flat top-level exports, traced Effect methods,
|
|
12
|
+
explicit layers, and a self-reexport at the bottom.
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
export interface Interface {
|
|
16
|
+
readonly get: (id: FooID) => Effect.Effect<FooInfo, FooError>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class Service extends Context.Service<Service, Interface>()("@opencode/Foo") {}
|
|
20
|
+
|
|
21
|
+
export const layer = Layer.effect(
|
|
22
|
+
Service,
|
|
23
|
+
Effect.gen(function* () {
|
|
24
|
+
const state = yield* InstanceState.make<State>(Effect.fn("Foo.state")(() => Effect.succeed({})))
|
|
25
|
+
|
|
26
|
+
const get = Effect.fn("Foo.get")(function* (id: FooID) {
|
|
27
|
+
const s = yield* InstanceState.get(state)
|
|
28
|
+
return yield* loadFoo(s, id)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
return Service.of({ get })
|
|
32
|
+
}),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
export const defaultLayer = layer.pipe(Layer.provide(FooDep.defaultLayer))
|
|
36
|
+
|
|
37
|
+
export * as Foo from "./foo"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Rules:
|
|
41
|
+
|
|
42
|
+
- Do not use `export namespace Foo { ... }`.
|
|
43
|
+
- Use `Effect.fn("Foo.method")` for public service methods.
|
|
44
|
+
- Use `Effect.fnUntraced` for small internal helpers that do not need a
|
|
45
|
+
span.
|
|
46
|
+
- Keep helpers as non-exported top-level declarations in the same file.
|
|
47
|
+
- Self-reexport with `export * as Foo from "."` for `index.ts`, otherwise
|
|
48
|
+
`export * as Foo from "./foo"`.
|
|
49
|
+
- In `src/config`, keep the existing top-of-file self-export pattern.
|
|
50
|
+
|
|
51
|
+
## Runtime Boundaries
|
|
52
|
+
|
|
53
|
+
Most code should run through [`AppRuntime`](../../src/effect/app-runtime.ts).
|
|
54
|
+
It hosts `AppLayer`, shares the global `memoMap`, and restores the current
|
|
55
|
+
instance/workspace refs when crossing from non-Effect code.
|
|
56
|
+
|
|
57
|
+
Use `AppRuntime.runPromise(effect)` at app boundaries such as CLI commands,
|
|
58
|
+
HTTP handlers, or plain async adapters.
|
|
59
|
+
|
|
60
|
+
`makeRuntime(...)` still exists for a few intentional service-local
|
|
61
|
+
boundaries and migration leftovers. Do not add a new service-local runtime
|
|
62
|
+
unless the service truly cannot live in `AppLayer`.
|
|
63
|
+
|
|
64
|
+
## Runtime Flags
|
|
65
|
+
|
|
66
|
+
Read opencode runtime flags through
|
|
67
|
+
[`RuntimeFlags.Service`](../../src/effect/runtime-flags.ts), not through
|
|
68
|
+
mutable `Flag` or late `process.env` reads.
|
|
69
|
+
|
|
70
|
+
Tests should vary behavior with explicit layer variants:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
const it = testEffect(MyService.defaultLayer.pipe(Layer.provide(RuntimeFlags.layer({ experimentalReferences: true }))))
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Do not mutate `process.env` or `Flag` after services/layers are built.
|
|
77
|
+
|
|
78
|
+
## Per-Instance State
|
|
79
|
+
|
|
80
|
+
Use [`InstanceState`](../../src/effect/instance-state.ts) when two open
|
|
81
|
+
directories should not share one copy of a service's state. It is backed by
|
|
82
|
+
a `ScopedCache`, keyed by directory, and disposed automatically when an
|
|
83
|
+
instance is unloaded.
|
|
84
|
+
|
|
85
|
+
Put subscriptions, finalizers, and scoped background work inside the
|
|
86
|
+
`InstanceState.make(...)` initializer:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
const cache =
|
|
90
|
+
yield *
|
|
91
|
+
InstanceState.make<State>(
|
|
92
|
+
Effect.fn("Foo.state")(function* () {
|
|
93
|
+
const bus = yield* Bus.Service
|
|
94
|
+
|
|
95
|
+
yield* bus.subscribeAll().pipe(
|
|
96
|
+
Stream.runForEach((event) => handleEvent(event)),
|
|
97
|
+
Effect.forkScoped,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
yield* Effect.acquireRelease(openResource, closeResource)
|
|
101
|
+
|
|
102
|
+
return yield* loadInitialState()
|
|
103
|
+
}),
|
|
104
|
+
)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Do not add separate `started` flags on top of `InstanceState`. Let
|
|
108
|
+
`ScopedCache` handle run-once and deduplication.
|
|
109
|
+
|
|
110
|
+
To make `init()` non-blocking, fork at the caller/bootstrap boundary. Do
|
|
111
|
+
not fork inside `InstanceState.make(...)` just to return early with
|
|
112
|
+
partially initialized state.
|
|
113
|
+
|
|
114
|
+
## Errors
|
|
115
|
+
|
|
116
|
+
Expected domain failures belong on the Effect error channel. Defects are
|
|
117
|
+
for bugs, impossible states, and final unknown-boundary fallbacks.
|
|
118
|
+
|
|
119
|
+
```ts
|
|
120
|
+
export class SessionBusyError extends Schema.TaggedErrorClass<SessionBusyError>()("SessionBusyError", {
|
|
121
|
+
sessionID: SessionID,
|
|
122
|
+
message: Schema.String,
|
|
123
|
+
}) {}
|
|
124
|
+
|
|
125
|
+
export type Error = Storage.Error | SessionBusyError
|
|
126
|
+
|
|
127
|
+
export interface Interface {
|
|
128
|
+
readonly get: (id: SessionID) => Effect.Effect<Info, Error>
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Rules:
|
|
133
|
+
|
|
134
|
+
- Use `Schema.TaggedErrorClass` for new expected domain errors.
|
|
135
|
+
- Export a domain-level `Error` union from service modules.
|
|
136
|
+
- In `Effect.gen` / `Effect.fn`, prefer `yield* new MyError(...)` for
|
|
137
|
+
direct expected failures.
|
|
138
|
+
- Use `Schema.Defect` for unknown cause fields.
|
|
139
|
+
- Use `Effect.try(...)`, `Effect.tryPromise(...)`, `Effect.mapError`,
|
|
140
|
+
`Effect.catchTag`, and `Effect.catchTags` to translate external
|
|
141
|
+
failures into domain errors.
|
|
142
|
+
- Do not use `Effect.die(...)` for user, IO, validation, missing-resource,
|
|
143
|
+
auth, provider, or busy-state failures.
|
|
144
|
+
|
|
145
|
+
## HTTP Error Boundaries
|
|
146
|
+
|
|
147
|
+
Service modules stay HTTP-agnostic. They should not import HTTP status
|
|
148
|
+
codes, `HttpApiError`, `HttpServerResponse`, or route-specific error
|
|
149
|
+
schemas.
|
|
150
|
+
|
|
151
|
+
HTTP handlers translate service errors into endpoint-declared public error
|
|
152
|
+
schemas. Keep mappings inline when they are one-off; extract tiny shared
|
|
153
|
+
helpers only when the same translation repeats.
|
|
154
|
+
|
|
155
|
+
Do not turn generic middleware into a registry of domain errors. Middleware
|
|
156
|
+
should handle cross-cutting concerns and the final unknown-defect fallback.
|
|
157
|
+
|
|
158
|
+
Preserve legacy public wire shapes, such as `{ name, data }`, until a
|
|
159
|
+
deliberate breaking API change.
|
|
160
|
+
|
|
161
|
+
## Schemas
|
|
162
|
+
|
|
163
|
+
Use Effect Schema as the source of truth.
|
|
164
|
+
|
|
165
|
+
- Use `Schema.Class` for exported data objects with a clear identity.
|
|
166
|
+
- Use `Schema.Struct` for local shapes and simple nested objects.
|
|
167
|
+
- Use `Schema.brand` for single-value IDs.
|
|
168
|
+
- Reuse named refinements instead of re-spelling constraints.
|
|
169
|
+
- Prefer narrow boundary helpers over generic Schema-to-Zod bridges.
|
|
170
|
+
|
|
171
|
+
Intentional boundaries:
|
|
172
|
+
|
|
173
|
+
- Public plugin tools still expose Zod through `tool.schema = z`.
|
|
174
|
+
- Tool parameter JSON Schema is generated through tool-specific helpers.
|
|
175
|
+
- Public config and TUI schemas are generated through the schema script.
|
|
176
|
+
|
|
177
|
+
## Preferred Services
|
|
178
|
+
|
|
179
|
+
In effectified code, yield existing services instead of dropping to ad hoc
|
|
180
|
+
platform APIs.
|
|
181
|
+
|
|
182
|
+
- Use `FSUtil.Service` instead of raw `fs/promises` for app file IO.
|
|
183
|
+
- Use `AppProcess.Service` instead of direct `ChildProcessSpawner.spawn` or
|
|
184
|
+
legacy process helpers.
|
|
185
|
+
- Use `HttpClient.HttpClient` instead of raw `fetch` inside Effect code.
|
|
186
|
+
- Use `Path.Path`, `Config`, `Clock`, and `DateTime` when already inside
|
|
187
|
+
Effect.
|
|
188
|
+
- Use `Effect.callback` for callback-based APIs.
|
|
189
|
+
- Use `Effect.void` instead of `Effect.succeed(undefined)`.
|
|
190
|
+
- Use `Effect.cached` when concurrent callers should share one in-flight
|
|
191
|
+
computation.
|
|
192
|
+
|
|
193
|
+
For background loops, use `Effect.repeat` or `Effect.schedule` with
|
|
194
|
+
`Effect.forkScoped` in the owning layer/state scope.
|
|
195
|
+
|
|
196
|
+
## Promise And ALS Bridges
|
|
197
|
+
|
|
198
|
+
[`EffectBridge`](../../src/effect/bridge.ts) is the sanctioned helper for
|
|
199
|
+
Promise/callback interop that needs to preserve instance/workspace context.
|
|
200
|
+
It preserves explicit `InstanceRef` / `WorkspaceRef` context for effects run
|
|
201
|
+
through the bridge. Plain JS callbacks that need instance data should receive
|
|
202
|
+
that data explicitly.
|
|
203
|
+
|
|
204
|
+
## Testing
|
|
205
|
+
|
|
206
|
+
Detailed test migration rules live in
|
|
207
|
+
[`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md).
|
|
208
|
+
|
|
209
|
+
Core pattern:
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
const it = testEffect(Layer.mergeAll(MyService.defaultLayer))
|
|
213
|
+
|
|
214
|
+
describe("my service", () => {
|
|
215
|
+
it.instance("does the thing", () =>
|
|
216
|
+
Effect.gen(function* () {
|
|
217
|
+
const svc = yield* MyService.Service
|
|
218
|
+
expect(yield* svc.run()).toEqual("ok")
|
|
219
|
+
}),
|
|
220
|
+
)
|
|
221
|
+
})
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Rules:
|
|
225
|
+
|
|
226
|
+
- Use `it.effect(...)` for TestClock/TestConsole tests.
|
|
227
|
+
- Use `it.live(...)` for real timers, filesystem mtimes, child processes,
|
|
228
|
+
git, locks, or other live integration behavior.
|
|
229
|
+
- Use `it.instance(...)` for service tests that need a scoped instance.
|
|
230
|
+
- Prefer Effect-aware fixtures from `test/fixture/fixture.ts`.
|
|
231
|
+
- Avoid sleeps; wait for real events or deterministic state transitions.
|
|
232
|
+
- Avoid mutable `process.env`, `Flag`, or module-global changes after
|
|
233
|
+
layers are built.
|
|
234
|
+
- Use `Layer.mock` for partial service stubs.
|
|
235
|
+
- Avoid custom `ManagedRuntime`, `attach(...)`, or ad hoc `run(...)` test
|
|
236
|
+
wrappers.
|
|
237
|
+
|
|
238
|
+
## Verification
|
|
239
|
+
|
|
240
|
+
From `packages/opencode`:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
bun run typecheck
|
|
244
|
+
bun run test -- path/to/test.ts
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
Do not run tests from the repo root; the repo has a guard for that.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Instance Context
|
|
2
|
+
|
|
3
|
+
Instance selection is now Effect-provided context.
|
|
4
|
+
|
|
5
|
+
Use these APIs:
|
|
6
|
+
|
|
7
|
+
- `InstanceRef` for the current project context.
|
|
8
|
+
- `WorkspaceRef` for the current workspace id.
|
|
9
|
+
- `InstanceState.context` / `InstanceState.directory` inside Effect services that require an instance.
|
|
10
|
+
- `InstanceStore` at entry boundaries that need to load, reload, or dispose project contexts.
|
|
11
|
+
- `EffectBridge` for native, plugin, or plain JavaScript callback boundaries that need to re-enter Effect with captured refs.
|
|
12
|
+
|
|
13
|
+
Do not add new ambient instance globals. Promise and callback boundaries should either stay in Effect, use `EffectBridge`, or pass the required context explicitly.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Effect loose ends
|
|
2
|
+
|
|
3
|
+
Small follow-ups that do not fit neatly into the main facade, route, tool, or schema migration checklists.
|
|
4
|
+
|
|
5
|
+
## Config / TUI
|
|
6
|
+
|
|
7
|
+
- [ ] `cli/cmd/tui/config/tui.ts` - finish the internal Effect migration.
|
|
8
|
+
Keep the current precedence and migration semantics intact while converting the remaining internal async helpers (`loadState`, `mergeFile`, `loadFile`, `load`) to `Effect.gen(...)` / `Effect.fn(...)`.
|
|
9
|
+
- [ ] `cli/cmd/tui/config/tui.ts` callers - once the internal service is stable, migrate plain async callers to use `TuiConfig.Service` directly where that actually simplifies the code.
|
|
10
|
+
Likely first callers: `cli/cmd/tui/attach.ts`, `cli/cmd/tui/thread.ts`, `cli/cmd/tui/plugin/runtime.ts`.
|
|
11
|
+
- [x] `env/index.ts` - already uses `InstanceState.make(...)`.
|
|
12
|
+
|
|
13
|
+
## ConfigPaths
|
|
14
|
+
|
|
15
|
+
- [ ] `config/paths.ts` - split pure helpers from effectful helpers.
|
|
16
|
+
Keep `fileInDirectory(...)` as a plain function.
|
|
17
|
+
- [ ] `config/paths.ts` - add a `ConfigPaths.Service` for the effectful operations so callers do not inherit `FSUtil.Service` directly.
|
|
18
|
+
Initial service surface should cover:
|
|
19
|
+
- `projectFiles(...)`
|
|
20
|
+
- `directories(...)`
|
|
21
|
+
- `readFile(...)`
|
|
22
|
+
- `parseText(...)`
|
|
23
|
+
- [ ] `config/config.ts` - switch internal config loading from `Effect.promise(() => ConfigPaths.*(...))` to `yield* paths.*(...)` once the service exists.
|
|
24
|
+
- [ ] `cli/cmd/tui/config/tui.ts` - switch TUI config loading from async `ConfigPaths.*` wrappers to the `ConfigPaths.Service` once that service exists.
|
|
25
|
+
- [ ] `cli/cmd/tui/config/tui-migrate.ts` - decide whether to leave this as a plain async module using wrapper functions or effectify it fully after `ConfigPaths.Service` lands.
|
|
26
|
+
|
|
27
|
+
## Notes
|
|
28
|
+
|
|
29
|
+
- Prefer small, semantics-preserving config migrations. Config precedence, legacy key migration, and plugin origin tracking are easy to break accidentally.
|
|
30
|
+
- When changing config loading internals, rerun the config and TUI suites first before broad package sweeps.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Effect Migration Patterns
|
|
2
|
+
|
|
3
|
+
This is the compact reference for moving code toward the current Effect
|
|
4
|
+
shape. The high-level roadmap is [`todo.md`](./todo.md); examples and
|
|
5
|
+
rules are in [`guide.md`](./guide.md).
|
|
6
|
+
|
|
7
|
+
## Default Shape
|
|
8
|
+
|
|
9
|
+
- Service methods return `Effect`.
|
|
10
|
+
- Service methods are named with `Effect.fn("Domain.method")`.
|
|
11
|
+
- Expected failures are typed errors on the error channel.
|
|
12
|
+
- Dependencies are yielded once at layer construction and closed over by
|
|
13
|
+
methods.
|
|
14
|
+
- `defaultLayer` wires production dependencies; tests can use open layers
|
|
15
|
+
when replacing dependencies.
|
|
16
|
+
|
|
17
|
+
## Instance State
|
|
18
|
+
|
|
19
|
+
Use `InstanceState` for per-directory state, subscriptions, scoped
|
|
20
|
+
background work, and per-instance cleanup.
|
|
21
|
+
|
|
22
|
+
Do not add ad hoc `started` flags on top of `InstanceState`; the scoped
|
|
23
|
+
cache handles run-once and concurrent deduplication.
|
|
24
|
+
|
|
25
|
+
## Runtime Boundaries
|
|
26
|
+
|
|
27
|
+
Prefer `AppRuntime` for crossing from non-Effect code into the shared app
|
|
28
|
+
layer.
|
|
29
|
+
|
|
30
|
+
`makeRuntime(...)` exists for intentional service-local boundaries and
|
|
31
|
+
legacy facades. Do not add new service-local runtimes unless the service is
|
|
32
|
+
genuinely outside `AppLayer`.
|
|
33
|
+
|
|
34
|
+
## Platform Edges
|
|
35
|
+
|
|
36
|
+
- Use `FSUtil.Service` instead of raw filesystem APIs in
|
|
37
|
+
effectified services.
|
|
38
|
+
- Use `AppProcess.Service` instead of raw process wrappers.
|
|
39
|
+
- Use `HttpClient.HttpClient` instead of raw `fetch` in Effect code.
|
|
40
|
+
- Use `Effect.cached` for shared in-flight work.
|
|
41
|
+
- Use `Effect.callback` for callback APIs.
|
|
42
|
+
|
|
43
|
+
## Tests During Migration
|
|
44
|
+
|
|
45
|
+
When migrating code, migrate touched tests toward
|
|
46
|
+
[`test/EFFECT_TEST_MIGRATION.md`](../../test/EFFECT_TEST_MIGRATION.md):
|
|
47
|
+
|
|
48
|
+
- `testEffect(...)`
|
|
49
|
+
- `it.effect`, `it.live`, or `it.instance`
|
|
50
|
+
- explicit layers for behavior changes
|
|
51
|
+
- deterministic waits instead of sleeps
|
|
52
|
+
- no mutable env/global flags after layers are built
|
|
53
|
+
|
|
54
|
+
## Migration Checklist
|
|
55
|
+
|
|
56
|
+
- [ ] The code has a single Effect body instead of Promise wrappers around
|
|
57
|
+
service calls.
|
|
58
|
+
- [ ] Expected failures are typed errors, not thrown exceptions or defects.
|
|
59
|
+
- [ ] Layer requirements are explicit.
|
|
60
|
+
- [ ] Tests use Effect-aware fixtures and focused layers.
|
|
61
|
+
- [ ] Public behavior and wire shapes are preserved unless intentionally
|
|
62
|
+
changed.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# HTTP Route Patterns
|
|
2
|
+
|
|
3
|
+
Current guidance for `packages/opencode/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 opencode
|
|
4
|
+
server moved to the Effect HttpApi backend.
|
|
5
|
+
|
|
6
|
+
## Current State
|
|
7
|
+
|
|
8
|
+
- The server still lives in `packages/opencode`.
|
|
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/opencode`, a future
|
|
33
|
+
`packages/server` should either:
|
|
34
|
+
|
|
35
|
+
- own pure HttpApi contracts only, or
|
|
36
|
+
- accept host-provided services/layers/callbacks from `packages/opencode`
|
|
37
|
+
|
|
38
|
+
It should not import `packages/opencode` services while `packages/opencode`
|
|
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 opencode-local runtime modules.
|
|
46
|
+
3. Extract pure HttpApi contract modules into `packages/server` once the contract
|
|
47
|
+
can compile without importing `packages/opencode` 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.
|