@toolkit-cli/toolkode 1.3.7
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 +69 -0
- package/BUN_SHELL_MIGRATION_PLAN.md +136 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/opencode +179 -0
- package/bin/toolkode +17 -0
- package/bin/toolkode.cjs +190 -0
- package/bunfig.toml +7 -0
- package/drizzle.config.ts +10 -0
- package/git +0 -0
- package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
- package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
- package/migration/20260211171708_add_project_commands/migration.sql +1 -0
- package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
- package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
- package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
- package/migration/20260225215848_workspace/migration.sql +7 -0
- package/migration/20260225215848_workspace/snapshot.json +959 -0
- package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
- package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
- package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
- package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
- package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
- package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
- package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
- package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
- package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
- package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
- package/migration/20260323234822_events/migration.sql +13 -0
- package/migration/20260323234822_events/snapshot.json +1271 -0
- package/package.json +160 -0
- package/parsers-config.ts +290 -0
- package/script/build-node.ts +54 -0
- package/script/build.ts +276 -0
- package/script/check-migrations.ts +16 -0
- package/script/postinstall.mjs +131 -0
- package/script/publish.ts +181 -0
- package/script/schema.ts +63 -0
- package/script/seed-e2e.ts +60 -0
- package/script/upgrade-opentui.ts +64 -0
- package/specs/effect-migration.md +293 -0
- package/specs/tui-plugins.md +389 -0
- package/src/account/account.sql.ts +39 -0
- package/src/account/index.ts +397 -0
- package/src/account/repo.ts +163 -0
- package/src/account/schema.ts +91 -0
- package/src/acp/README.md +174 -0
- package/src/acp/agent.ts +1743 -0
- package/src/acp/session.ts +116 -0
- package/src/acp/types.ts +24 -0
- package/src/agent/agent.ts +418 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +14 -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/auth/index.ts +115 -0
- package/src/bun/index.ts +128 -0
- package/src/bun/registry.ts +50 -0
- package/src/bus/bus-event.ts +40 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +184 -0
- package/src/channel/index.ts +231 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/account.ts +257 -0
- package/src/cli/cmd/acp.ts +70 -0
- package/src/cli/cmd/agent.ts +245 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/db.ts +119 -0
- package/src/cli/cmd/debug/agent.ts +167 -0
- package/src/cli/cmd/debug/config.ts +16 -0
- package/src/cli/cmd/debug/file.ts +97 -0
- package/src/cli/cmd/debug/index.ts +48 -0
- package/src/cli/cmd/debug/lsp.ts +53 -0
- package/src/cli/cmd/debug/ripgrep.ts +87 -0
- package/src/cli/cmd/debug/scrap.ts +16 -0
- package/src/cli/cmd/debug/skill.ts +16 -0
- package/src/cli/cmd/debug/snapshot.ts +52 -0
- package/src/cli/cmd/export.ts +89 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +1646 -0
- package/src/cli/cmd/import.ts +207 -0
- package/src/cli/cmd/mcp.ts +754 -0
- package/src/cli/cmd/models.ts +78 -0
- package/src/cli/cmd/plug.ts +231 -0
- package/src/cli/cmd/pr.ts +127 -0
- package/src/cli/cmd/providers.ts +482 -0
- package/src/cli/cmd/run.ts +738 -0
- package/src/cli/cmd/serve.ts +42 -0
- package/src/cli/cmd/session.ts +159 -0
- package/src/cli/cmd/stats.ts +410 -0
- package/src/cli/cmd/tui/app.tsx +1255 -0
- package/src/cli/cmd/tui/attach.ts +88 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +171 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +264 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +334 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +108 -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 +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/dialog-variant.tsx +29 -0
- package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +320 -0
- package/src/cli/cmd/tui/component/error-component.tsx +91 -0
- package/src/cli/cmd/tui/component/logo.tsx +86 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +667 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1353 -0
- package/src/cli/cmd/tui/component/prompt/part.ts +16 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -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/textarea-keybindings.ts +73 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/component/workspace/dialog-session-list.tsx +151 -0
- package/src/cli/cmd/tui/context/args.tsx +15 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +60 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +105 -0
- package/src/cli/cmd/tui/context/kv.tsx +52 -0
- package/src/cli/cmd/tui/context/local.tsx +406 -0
- package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -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 +128 -0
- package/src/cli/cmd/tui/context/sync.tsx +504 -0
- package/src/cli/cmd/tui/context/theme/amber.json +245 -0
- package/src/cli/cmd/tui/context/theme/amiga.json +245 -0
- package/src/cli/cmd/tui/context/theme/atari.json +245 -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/borland.json +245 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/commodore.json +245 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dos-edit.json +245 -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/gnu.json +245 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/hacker.json +245 -0
- package/src/cli/cmd/tui/context/theme/irix.json +245 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
- package/src/cli/cmd/tui/context/theme/mac84.json +245 -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/norton.json +245 -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/osaka-jade.json +93 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/pine.json +245 -0
- package/src/cli/cmd/tui/context/theme/retrowave.json +245 -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/toolkode.json +245 -0
- package/src/cli/cmd/tui/context/theme/tron.json +245 -0
- package/src/cli/cmd/tui/context/theme/ubuntu.json +245 -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/vt100.json +245 -0
- package/src/cli/cmd/tui/context/theme/xcode.json +245 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1288 -0
- package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
- package/src/cli/cmd/tui/event.ts +49 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +152 -0
- package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +50 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/agents-panel.tsx +95 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/btw-panel.tsx +105 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/commands-panel.tsx +40 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +63 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/git-panel.tsx +36 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/loop-panel.tsx +124 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/session-panel.tsx +48 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +270 -0
- package/src/cli/cmd/tui/plugin/api.tsx +420 -0
- package/src/cli/cmd/tui/plugin/index.ts +3 -0
- package/src/cli/cmd/tui/plugin/internal.ts +37 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +967 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
- package/src/cli/cmd/tui/routes/home.tsx +173 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +65 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +110 -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 +2229 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +685 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +467 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +72 -0
- package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +131 -0
- package/src/cli/cmd/tui/thread.ts +232 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +59 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +89 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +208 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +40 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +106 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +402 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +192 -0
- package/src/cli/cmd/tui/ui/link.tsx +28 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +100 -0
- package/src/cli/cmd/tui/util/clipboard.ts +192 -0
- package/src/cli/cmd/tui/util/editor.ts +37 -0
- package/src/cli/cmd/tui/util/selection.ts +25 -0
- package/src/cli/cmd/tui/util/signal.ts +7 -0
- package/src/cli/cmd/tui/util/terminal.ts +114 -0
- package/src/cli/cmd/tui/util/transcript.ts +98 -0
- package/src/cli/cmd/tui/win32.ts +129 -0
- package/src/cli/cmd/tui/worker.ts +204 -0
- package/src/cli/cmd/uninstall.ts +353 -0
- package/src/cli/cmd/upgrade.ts +73 -0
- package/src/cli/cmd/web.ts +81 -0
- package/src/cli/effect/prompt.ts +25 -0
- package/src/cli/error.ts +46 -0
- package/src/cli/logo.ts +7 -0
- package/src/cli/network.ts +60 -0
- package/src/cli/ui.ts +116 -0
- package/src/cli/upgrade.ts +31 -0
- package/src/command/index.ts +195 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +101 -0
- package/src/config/config.ts +1693 -0
- package/src/config/markdown.ts +99 -0
- package/src/config/migrate-tui-config.ts +155 -0
- package/src/config/paths.ts +174 -0
- package/src/config/tui-schema.ts +36 -0
- package/src/config/tui.ts +212 -0
- package/src/control-plane/adaptors/index.ts +20 -0
- package/src/control-plane/adaptors/worktree.ts +38 -0
- package/src/control-plane/schema.ts +17 -0
- package/src/control-plane/sse.ts +66 -0
- package/src/control-plane/types.ts +21 -0
- package/src/control-plane/workspace.sql.ts +17 -0
- package/src/control-plane/workspace.ts +154 -0
- package/src/cron/index.ts +241 -0
- package/src/cron/parse.ts +189 -0
- package/src/effect/cross-spawn-spawner.ts +479 -0
- package/src/effect/instance-registry.ts +12 -0
- package/src/effect/instance-state.ts +47 -0
- package/src/effect/run-service.ts +19 -0
- package/src/env/index.ts +28 -0
- package/src/file/ignore.ts +82 -0
- package/src/file/index.ts +693 -0
- package/src/file/protected.ts +59 -0
- package/src/file/ripgrep.ts +376 -0
- package/src/file/time.ts +128 -0
- package/src/file/watcher.ts +171 -0
- package/src/filesystem/index.ts +226 -0
- package/src/flag/flag.ts +157 -0
- package/src/format/formatter.ts +396 -0
- package/src/format/index.ts +199 -0
- package/src/global/index.ts +54 -0
- package/src/hooks/index.ts +302 -0
- package/src/id/id.ts +85 -0
- package/src/ide/index.ts +74 -0
- package/src/index.ts +243 -0
- package/src/installation/index.ts +363 -0
- package/src/lsp/client.ts +252 -0
- package/src/lsp/index.ts +558 -0
- package/src/lsp/language.ts +120 -0
- package/src/lsp/launch.ts +21 -0
- package/src/lsp/server.ts +2093 -0
- package/src/mcp/auth.ts +181 -0
- package/src/mcp/index.ts +926 -0
- package/src/mcp/oauth-callback.ts +215 -0
- package/src/mcp/oauth-provider.ts +185 -0
- package/src/node.ts +1 -0
- package/src/patch/index.ts +680 -0
- package/src/permission/arity.ts +163 -0
- package/src/permission/evaluate.ts +15 -0
- package/src/permission/index.ts +322 -0
- package/src/permission/schema.ts +17 -0
- package/src/plugin/codex.ts +628 -0
- package/src/plugin/copilot.ts +343 -0
- package/src/plugin/index.ts +331 -0
- package/src/plugin/install.ts +384 -0
- package/src/plugin/meta.ts +165 -0
- package/src/plugin/shared.ts +172 -0
- package/src/project/bootstrap.ts +31 -0
- package/src/project/instance.ts +167 -0
- package/src/project/project.sql.ts +16 -0
- package/src/project/project.ts +519 -0
- package/src/project/schema.ts +16 -0
- package/src/project/state.ts +70 -0
- package/src/project/vcs.ts +124 -0
- package/src/provider/auth.ts +252 -0
- package/src/provider/error.ts +197 -0
- package/src/provider/models.ts +138 -0
- package/src/provider/provider.ts +1593 -0
- package/src/provider/schema.ts +39 -0
- package/src/provider/sdk/copilot/README.md +5 -0
- package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
- package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
- package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
- package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
- package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
- package/src/provider/sdk/copilot/index.ts +2 -0
- package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
- package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
- package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
- package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
- package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
- package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1769 -0
- package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
- package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
- package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
- package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
- package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
- package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
- package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
- package/src/provider/toolkit-manifest.ts +110 -0
- package/src/provider/transform.ts +1045 -0
- package/src/pty/index.ts +397 -0
- package/src/pty/schema.ts +17 -0
- package/src/question/index.ts +221 -0
- package/src/question/schema.ts +17 -0
- package/src/server/error.ts +36 -0
- package/src/server/event.ts +7 -0
- package/src/server/instance.ts +285 -0
- package/src/server/mdns.ts +60 -0
- package/src/server/middleware.ts +29 -0
- package/src/server/projectors.ts +28 -0
- package/src/server/router.ts +99 -0
- package/src/server/routes/config.ts +92 -0
- package/src/server/routes/event.ts +83 -0
- package/src/server/routes/experimental.ts +271 -0
- package/src/server/routes/file.ts +197 -0
- package/src/server/routes/global.ts +339 -0
- package/src/server/routes/mcp.ts +225 -0
- package/src/server/routes/permission.ts +69 -0
- package/src/server/routes/project.ts +118 -0
- package/src/server/routes/provider.ts +171 -0
- package/src/server/routes/pty.ts +211 -0
- package/src/server/routes/question.ts +99 -0
- package/src/server/routes/session.ts +1031 -0
- package/src/server/routes/tui.ts +379 -0
- package/src/server/routes/workspace.ts +94 -0
- package/src/server/server.ts +312 -0
- package/src/session/compaction.ts +424 -0
- package/src/session/index.ts +882 -0
- package/src/session/instruction.ts +321 -0
- package/src/session/llm.ts +341 -0
- package/src/session/message-v2.ts +1030 -0
- package/src/session/message.ts +191 -0
- package/src/session/overflow.ts +22 -0
- package/src/session/processor.ts +554 -0
- package/src/session/projectors.ts +135 -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 +108 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/gpt.txt +107 -0
- package/src/session/prompt/max-steps.txt +16 -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 +2058 -0
- package/src/session/retry.ts +106 -0
- package/src/session/revert.ts +138 -0
- package/src/session/schema.ts +38 -0
- package/src/session/session.sql.ts +103 -0
- package/src/session/status.ts +102 -0
- package/src/session/summary.ts +170 -0
- package/src/session/system.ts +74 -0
- package/src/session/todo.ts +57 -0
- package/src/share/share-next.ts +288 -0
- package/src/share/share.sql.ts +13 -0
- package/src/shell/shell.ts +73 -0
- package/src/skill/discovery.ts +116 -0
- package/src/skill/index.ts +284 -0
- package/src/skills-marketplace/index.ts +305 -0
- package/src/snapshot/index.ts +489 -0
- package/src/sql.d.ts +4 -0
- package/src/storage/db.bun.ts +8 -0
- package/src/storage/db.node.ts +8 -0
- package/src/storage/db.ts +177 -0
- package/src/storage/json-migration.ts +425 -0
- package/src/storage/schema.sql.ts +10 -0
- package/src/storage/schema.ts +5 -0
- package/src/storage/storage.ts +217 -0
- package/src/sync/README.md +179 -0
- package/src/sync/event.sql.ts +16 -0
- package/src/sync/index.ts +263 -0
- package/src/sync/schema.ts +14 -0
- package/src/team/index.ts +428 -0
- package/src/tool/apply_patch.ts +281 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/bash.ts +271 -0
- package/src/tool/bash.txt +115 -0
- package/src/tool/batch.ts +183 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +132 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/cron-create.ts +54 -0
- package/src/tool/cron-create.txt +16 -0
- package/src/tool/cron-delete.ts +29 -0
- package/src/tool/cron-delete.txt +1 -0
- package/src/tool/cron-list.ts +41 -0
- package/src/tool/cron-list.txt +1 -0
- package/src/tool/edit.ts +667 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +32 -0
- package/src/tool/glob.ts +78 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +156 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +121 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp.ts +97 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/plan-enter.txt +14 -0
- package/src/tool/plan-exit.txt +13 -0
- package/src/tool/plan.ts +131 -0
- package/src/tool/question.ts +33 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/read.ts +293 -0
- package/src/tool/read.txt +14 -0
- package/src/tool/registry.ts +232 -0
- package/src/tool/schema.ts +17 -0
- package/src/tool/send-message.ts +59 -0
- package/src/tool/send-message.txt +7 -0
- package/src/tool/skill.ts +105 -0
- package/src/tool/task.ts +230 -0
- package/src/tool/task.txt +62 -0
- package/src/tool/team.ts +235 -0
- package/src/tool/team.txt +22 -0
- package/src/tool/todo.ts +31 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +90 -0
- package/src/tool/truncate.ts +144 -0
- package/src/tool/truncation-dir.ts +4 -0
- package/src/tool/webfetch.ts +206 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +150 -0
- package/src/tool/websearch.txt +14 -0
- package/src/tool/write.ts +84 -0
- package/src/tool/write.txt +8 -0
- package/src/util/abort.ts +35 -0
- package/src/util/archive.ts +17 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/data-url.ts +9 -0
- package/src/util/defer.ts +12 -0
- package/src/util/effect-http-client.ts +11 -0
- package/src/util/effect-zod.ts +98 -0
- package/src/util/error.ts +77 -0
- package/src/util/filesystem.ts +203 -0
- package/src/util/flock.ts +333 -0
- package/src/util/fn.ts +21 -0
- package/src/util/format.ts +20 -0
- package/src/util/git.ts +35 -0
- package/src/util/glob.ts +34 -0
- package/src/util/hash.ts +7 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +103 -0
- package/src/util/lazy.ts +23 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +182 -0
- package/src/util/network.ts +9 -0
- package/src/util/process.ts +172 -0
- package/src/util/queue.ts +32 -0
- package/src/util/record.ts +3 -0
- package/src/util/rpc.ts +66 -0
- package/src/util/schema.ts +53 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/update-schema.ts +13 -0
- package/src/util/which.ts +14 -0
- package/src/util/wildcard.ts +59 -0
- package/src/worktree/index.ts +638 -0
- package/sst-env.d.ts +10 -0
- package/test/AGENTS.md +81 -0
- package/test/account/repo.test.ts +326 -0
- package/test/account/service.test.ts +282 -0
- package/test/acp/agent-interface.test.ts +51 -0
- package/test/acp/event-subscription.test.ts +685 -0
- package/test/agent/agent.test.ts +717 -0
- package/test/auth/auth.test.ts +58 -0
- package/test/bun.test.ts +53 -0
- package/test/bus/bus-effect.test.ts +164 -0
- package/test/bus/bus-integration.test.ts +87 -0
- package/test/bus/bus.test.ts +219 -0
- package/test/cli/account.test.ts +26 -0
- package/test/cli/cmd/tui/prompt-part.test.ts +47 -0
- package/test/cli/github-action.test.ts +198 -0
- package/test/cli/github-remote.test.ts +80 -0
- package/test/cli/import.test.ts +54 -0
- package/test/cli/plugin-auth-picker.test.ts +120 -0
- package/test/cli/tui/keybind-plugin.test.ts +90 -0
- package/test/cli/tui/plugin-add.test.ts +61 -0
- package/test/cli/tui/plugin-install.test.ts +95 -0
- package/test/cli/tui/plugin-lifecycle.test.ts +225 -0
- package/test/cli/tui/plugin-loader-entrypoint.test.ts +189 -0
- package/test/cli/tui/plugin-loader-pure.test.ts +71 -0
- package/test/cli/tui/plugin-loader.test.ts +563 -0
- package/test/cli/tui/plugin-toggle.test.ts +157 -0
- package/test/cli/tui/theme-store.test.ts +51 -0
- package/test/cli/tui/thread.test.ts +128 -0
- package/test/cli/tui/transcript.test.ts +322 -0
- package/test/config/agent-color.test.ts +71 -0
- package/test/config/config.test.ts +2187 -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/markdown.test.ts +228 -0
- package/test/config/tui.test.ts +667 -0
- package/test/control-plane/sse.test.ts +56 -0
- package/test/effect/cross-spawn-spawner.test.ts +402 -0
- package/test/effect/instance-state.test.ts +384 -0
- package/test/effect/run-service.test.ts +46 -0
- package/test/file/fsmonitor.test.ts +62 -0
- package/test/file/ignore.test.ts +10 -0
- package/test/file/index.test.ts +946 -0
- package/test/file/path-traversal.test.ts +198 -0
- package/test/file/ripgrep.test.ts +54 -0
- package/test/file/time.test.ts +354 -0
- package/test/file/watcher.test.ts +247 -0
- package/test/filesystem/filesystem.test.ts +319 -0
- package/test/fixture/db.ts +11 -0
- package/test/fixture/fixture.test.ts +26 -0
- package/test/fixture/fixture.ts +141 -0
- package/test/fixture/flock-worker.ts +72 -0
- package/test/fixture/lsp/fake-lsp-server.js +77 -0
- package/test/fixture/plug-worker.ts +93 -0
- package/test/fixture/plugin-meta-worker.ts +26 -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 +335 -0
- package/test/fixture/tui-runtime.ts +34 -0
- package/test/format/format.test.ts +179 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/installation/installation.test.ts +151 -0
- package/test/keybind.test.ts +421 -0
- package/test/lib/effect.ts +37 -0
- package/test/lib/filesystem.ts +10 -0
- package/test/lsp/client.test.ts +95 -0
- package/test/lsp/index.test.ts +55 -0
- package/test/lsp/launch.test.ts +22 -0
- package/test/lsp/lifecycle.test.ts +147 -0
- package/test/mcp/headers.test.ts +153 -0
- package/test/mcp/lifecycle.test.ts +750 -0
- package/test/mcp/oauth-auto-connect.test.ts +199 -0
- package/test/mcp/oauth-browser.test.ts +249 -0
- package/test/memory/abort-leak.test.ts +137 -0
- package/test/patch/patch.test.ts +348 -0
- package/test/permission/arity.test.ts +33 -0
- package/test/permission/next.test.ts +1148 -0
- package/test/permission-task.test.ts +323 -0
- package/test/plugin/auth-override.test.ts +74 -0
- package/test/plugin/codex.test.ts +123 -0
- package/test/plugin/install-concurrency.test.ts +134 -0
- package/test/plugin/install.test.ts +504 -0
- package/test/plugin/loader-shared.test.ts +625 -0
- package/test/plugin/meta.test.ts +137 -0
- package/test/plugin/trigger.test.ts +111 -0
- package/test/preload.ts +90 -0
- package/test/project/migrate-global.test.ts +140 -0
- package/test/project/project.test.ts +459 -0
- package/test/project/state.test.ts +115 -0
- package/test/project/vcs.test.ts +116 -0
- package/test/project/worktree-remove.test.ts +96 -0
- package/test/project/worktree.test.ts +173 -0
- package/test/provider/amazon-bedrock.test.ts +447 -0
- package/test/provider/copilot/convert-to-copilot-messages.test.ts +523 -0
- package/test/provider/copilot/copilot-chat-model.test.ts +592 -0
- package/test/provider/gitlab-duo.test.ts +412 -0
- package/test/provider/provider.test.ts +2284 -0
- package/test/provider/transform.test.ts +2758 -0
- package/test/pty/pty-output-isolation.test.ts +141 -0
- package/test/pty/pty-session.test.ts +92 -0
- package/test/question/question.test.ts +453 -0
- package/test/server/global-session-list.test.ts +89 -0
- package/test/server/project-init-git.test.ts +121 -0
- package/test/server/session-list.test.ts +90 -0
- package/test/server/session-messages.test.ts +132 -0
- package/test/server/session-select.test.ts +78 -0
- package/test/session/compaction.test.ts +1094 -0
- package/test/session/instruction.test.ts +170 -0
- package/test/session/llm.test.ts +882 -0
- package/test/session/message-v2.test.ts +957 -0
- package/test/session/messages-pagination.test.ts +115 -0
- package/test/session/processor-effect.test.ts +838 -0
- package/test/session/prompt.test.ts +518 -0
- package/test/session/retry.test.ts +232 -0
- package/test/session/revert-compact.test.ts +286 -0
- package/test/session/session.test.ts +142 -0
- package/test/session/structured-output-integration.test.ts +233 -0
- package/test/session/structured-output.test.ts +391 -0
- package/test/session/system.test.ts +59 -0
- package/test/share/share-next.test.ts +76 -0
- package/test/skill/discovery.test.ts +116 -0
- package/test/skill/skill.test.ts +392 -0
- package/test/snapshot/snapshot.test.ts +1235 -0
- package/test/storage/db.test.ts +14 -0
- package/test/storage/json-migration.test.ts +849 -0
- package/test/sync/index.test.ts +191 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/apply_patch.test.ts +567 -0
- package/test/tool/bash.test.ts +403 -0
- package/test/tool/edit.test.ts +681 -0
- package/test/tool/external-directory.test.ts +128 -0
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +38413 -0
- package/test/tool/grep.test.ts +111 -0
- package/test/tool/question.test.ts +108 -0
- package/test/tool/read.test.ts +509 -0
- package/test/tool/registry.test.ts +126 -0
- package/test/tool/skill.test.ts +167 -0
- package/test/tool/task.test.ts +49 -0
- package/test/tool/truncation.test.ts +161 -0
- package/test/tool/webfetch.test.ts +101 -0
- package/test/tool/write.test.ts +353 -0
- package/test/util/data-url.test.ts +14 -0
- package/test/util/effect-zod.test.ts +61 -0
- package/test/util/error.test.ts +38 -0
- package/test/util/filesystem.test.ts +558 -0
- package/test/util/flock.test.ts +383 -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/lock.test.ts +72 -0
- package/test/util/module.test.ts +59 -0
- package/test/util/process.test.ts +128 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/which.test.ts +100 -0
- package/test/util/wildcard.test.ts +90 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# TUI plugins
|
|
2
|
+
|
|
3
|
+
Technical reference for the current TUI plugin system.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
- TUI plugin config lives in `tui.json`.
|
|
8
|
+
- Author package entrypoint is `@toolkode.com/plugin/tui`.
|
|
9
|
+
- Internal plugins load inside the CLI app the same way external TUI plugins do.
|
|
10
|
+
- Package plugins can be installed from CLI or TUI.
|
|
11
|
+
- v1 plugin modules are target-exclusive: a module can export `server` or `tui`, never both.
|
|
12
|
+
- Server runtime keeps v0 legacy fallback (function exports / enumerated exports) after v1 parsing.
|
|
13
|
+
|
|
14
|
+
## TUI config
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"$schema": "https://toolkode.com/tui.json",
|
|
21
|
+
"theme": "smoke-theme",
|
|
22
|
+
"plugin": ["@acme/opencode-plugin@1.2.3", ["./plugins/demo.tsx", { "label": "demo" }]],
|
|
23
|
+
"plugin_enabled": {
|
|
24
|
+
"acme.demo": false
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- `plugin` entries can be either a string spec or `[spec, options]`.
|
|
30
|
+
- Plugin specs can be npm specs, `file://` URLs, relative paths, or absolute paths.
|
|
31
|
+
- Relative path specs are resolved relative to the config file that declared them.
|
|
32
|
+
- A file module listed in `tui.json` must be a TUI module (`default export { id?, tui }`) and must not export `server`.
|
|
33
|
+
- Duplicate npm plugins are deduped by package name; higher-precedence config wins.
|
|
34
|
+
- Duplicate file plugins are deduped by exact resolved file spec. This happens while merging config, before plugin modules are loaded.
|
|
35
|
+
- `plugin_enabled` is keyed by plugin id, not by plugin spec.
|
|
36
|
+
- For file plugins, that id must come from the plugin module's exported `id`. For npm plugins, it is the exported `id` or the package name if `id` is omitted.
|
|
37
|
+
- Plugins are enabled by default. `plugin_enabled` is only for explicit overrides, usually to disable a plugin with `false`.
|
|
38
|
+
- `plugin_enabled` is merged across config layers.
|
|
39
|
+
- Runtime enable/disable state is also stored in KV under `plugin_enabled`; that KV state overrides config on startup.
|
|
40
|
+
|
|
41
|
+
## Author package shape
|
|
42
|
+
|
|
43
|
+
Package entrypoint:
|
|
44
|
+
|
|
45
|
+
- Import types from `@toolkode.com/plugin/tui`.
|
|
46
|
+
- `@toolkode.com/plugin` exports `./tui` and declares optional peer deps on `@opentui/core` and `@opentui/solid`.
|
|
47
|
+
|
|
48
|
+
Minimal module shape:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
/** @jsxImportSource @opentui/solid */
|
|
52
|
+
import type { TuiPlugin, TuiPluginModule } from "@toolkode.com/plugin/tui"
|
|
53
|
+
|
|
54
|
+
const tui: TuiPlugin = async (api, options, meta) => {
|
|
55
|
+
api.command.register(() => [
|
|
56
|
+
{
|
|
57
|
+
title: "Demo",
|
|
58
|
+
value: "demo.open",
|
|
59
|
+
onSelect: () => api.route.navigate("demo"),
|
|
60
|
+
},
|
|
61
|
+
])
|
|
62
|
+
|
|
63
|
+
api.route.register([
|
|
64
|
+
{
|
|
65
|
+
name: "demo",
|
|
66
|
+
render: () => (
|
|
67
|
+
<box>
|
|
68
|
+
<text>demo</text>
|
|
69
|
+
</box>
|
|
70
|
+
),
|
|
71
|
+
},
|
|
72
|
+
])
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const plugin: TuiPluginModule & { id: string } = {
|
|
76
|
+
id: "acme.demo",
|
|
77
|
+
tui,
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export default plugin
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- Loader only reads the module default export object. Named exports are ignored.
|
|
84
|
+
- TUI shape is `default export { id?, tui }`; including `server` is rejected.
|
|
85
|
+
- A single module cannot export both `server` and `tui`.
|
|
86
|
+
- `tui` signature is `(api, options, meta) => Promise<void>`.
|
|
87
|
+
- If package `exports` contains `./tui`, the loader resolves that entrypoint. Otherwise it uses the resolved package target.
|
|
88
|
+
- If a package supports both server and TUI, use separate files and package `exports` (`./server` and `./tui`) so each target resolves to a target-only module.
|
|
89
|
+
- File/path plugins must export a non-empty `id`.
|
|
90
|
+
- npm plugins may omit `id`; package `name` is used.
|
|
91
|
+
- Runtime identity is the resolved plugin id. Later plugins with the same id are rejected, including collisions with internal plugin ids.
|
|
92
|
+
- If a path spec points at a directory, that directory must have `package.json` with `main`.
|
|
93
|
+
- There is no directory auto-discovery for TUI plugins; they must be listed in `tui.json`.
|
|
94
|
+
|
|
95
|
+
## Package manifest and install
|
|
96
|
+
|
|
97
|
+
Package manifest is read from `package.json` field `oc-plugin`.
|
|
98
|
+
|
|
99
|
+
Example:
|
|
100
|
+
|
|
101
|
+
```json
|
|
102
|
+
{
|
|
103
|
+
"name": "@acme/opencode-plugin",
|
|
104
|
+
"type": "module",
|
|
105
|
+
"main": "./dist/index.js",
|
|
106
|
+
"engines": {
|
|
107
|
+
"opencode": "^1.0.0"
|
|
108
|
+
},
|
|
109
|
+
"oc-plugin": [
|
|
110
|
+
["server", { "custom": true }],
|
|
111
|
+
["tui", { "compact": true }]
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Version compatibility
|
|
117
|
+
|
|
118
|
+
npm plugins can declare a version compatibility range in `package.json` using the standard `engines` field:
|
|
119
|
+
|
|
120
|
+
```json
|
|
121
|
+
{
|
|
122
|
+
"engines": {
|
|
123
|
+
"opencode": "^1.0.0"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- The value is a semver range checked against the running Toolkode version.
|
|
129
|
+
- If the range is not satisfied, the plugin is skipped with a warning and a session error.
|
|
130
|
+
- If `engines.opencode` is absent, no check is performed (backward compatible).
|
|
131
|
+
- File plugins are never checked; only npm package plugins are validated.
|
|
132
|
+
|
|
133
|
+
- Install flow is shared by CLI and TUI in `src/plugin/install.ts`.
|
|
134
|
+
- Shared helpers are `installPlugin`, `readPluginManifest`, and `patchPluginConfig`.
|
|
135
|
+
- `opencode plugin <module>` and TUI install both run install → manifest read → config patch.
|
|
136
|
+
- Alias: `opencode plug <module>`.
|
|
137
|
+
- `-g` / `--global` writes into the global config dir.
|
|
138
|
+
- Local installs resolve target dir inside `patchPluginConfig`.
|
|
139
|
+
- For local scope, path is `<worktree>/.opencode` only when VCS is git and `worktree !== "/"`; otherwise `<directory>/.opencode`.
|
|
140
|
+
- Root-worktree fallback (`worktree === "/"` uses `<directory>/.opencode`) is covered by regression tests.
|
|
141
|
+
- `patchPluginConfig` applies all declared manifest targets (`server` and/or `tui`) in one call.
|
|
142
|
+
- `patchPluginConfig` returns structured result unions (`ok`, `code`, fields by error kind) instead of custom thrown errors.
|
|
143
|
+
- `patchPluginConfig` serializes per-target config writes with `Flock.acquire(...)`.
|
|
144
|
+
- `patchPluginConfig` uses targeted `jsonc-parser` edits, so existing JSONC comments are preserved when plugin entries are added or replaced.
|
|
145
|
+
- Without `--force`, an already-configured npm package name is a no-op.
|
|
146
|
+
- With `--force`, replacement matches by package name. If the existing row is `[spec, options]`, those tuple options are kept.
|
|
147
|
+
- Tuple targets in `oc-plugin` provide default options written into config.
|
|
148
|
+
- A package can target `server`, `tui`, or both.
|
|
149
|
+
- If a package targets both, each target must still resolve to a separate target-only module. Do not export `{ server, tui }` from one module.
|
|
150
|
+
- There is no uninstall, list, or update CLI command for external plugins.
|
|
151
|
+
- Local file plugins are configured directly in `tui.json`.
|
|
152
|
+
|
|
153
|
+
When `plugin` entries exist in a writable `.opencode` dir or `OPENCODE_CONFIG_DIR`, Toolkode installs `@toolkode.com/plugin` into that dir and writes:
|
|
154
|
+
|
|
155
|
+
- `package.json`
|
|
156
|
+
- `bun.lock`
|
|
157
|
+
- `node_modules/`
|
|
158
|
+
- `.gitignore`
|
|
159
|
+
|
|
160
|
+
That is what makes local config-scoped plugins able to import `@toolkode.com/plugin/tui`.
|
|
161
|
+
|
|
162
|
+
## TUI plugin API
|
|
163
|
+
|
|
164
|
+
Top-level API groups exposed to `tui(api, options, meta)`:
|
|
165
|
+
|
|
166
|
+
- `api.app.version`
|
|
167
|
+
- `api.command.register(cb)` / `api.command.trigger(value)`
|
|
168
|
+
- `api.route.register(routes)` / `api.route.navigate(name, params?)` / `api.route.current`
|
|
169
|
+
- `api.ui.Dialog`, `DialogAlert`, `DialogConfirm`, `DialogPrompt`, `DialogSelect`, `Prompt`, `ui.toast`, `ui.dialog`
|
|
170
|
+
- `api.keybind.match`, `print`, `create`
|
|
171
|
+
- `api.tuiConfig`
|
|
172
|
+
- `api.kv.get`, `set`, `ready`
|
|
173
|
+
- `api.state`
|
|
174
|
+
- `api.theme.current`, `selected`, `has`, `set`, `install`, `mode`, `ready`
|
|
175
|
+
- `api.client`, `api.scopedClient(workspaceID?)`, `api.workspace.current()`, `api.workspace.set(workspaceID?)`
|
|
176
|
+
- `api.event.on(type, handler)`
|
|
177
|
+
- `api.renderer`
|
|
178
|
+
- `api.slots.register(plugin)`
|
|
179
|
+
- `api.plugins.list()`, `activate(id)`, `deactivate(id)`, `add(spec)`, `install(spec, options?)`
|
|
180
|
+
- `api.lifecycle.signal`, `api.lifecycle.onDispose(fn)`
|
|
181
|
+
|
|
182
|
+
### Commands
|
|
183
|
+
|
|
184
|
+
`api.command.register` returns an unregister function. Command rows support:
|
|
185
|
+
|
|
186
|
+
- `title`, `value`
|
|
187
|
+
- `description`, `category`
|
|
188
|
+
- `keybind`
|
|
189
|
+
- `suggested`, `hidden`, `enabled`
|
|
190
|
+
- `slash: { name, aliases? }`
|
|
191
|
+
- `onSelect`
|
|
192
|
+
|
|
193
|
+
Command behavior:
|
|
194
|
+
|
|
195
|
+
- Registrations are reactive.
|
|
196
|
+
- Later registrations win for duplicate `value` and for keybind handling.
|
|
197
|
+
- Hidden commands are removed from the command dialog and slash list, but still respond to keybinds and `command.trigger(value)` if `enabled !== false`.
|
|
198
|
+
|
|
199
|
+
### Routes
|
|
200
|
+
|
|
201
|
+
- Reserved route names: `home` and `session`.
|
|
202
|
+
- Any other name is treated as a plugin route.
|
|
203
|
+
- `api.route.current` returns one of:
|
|
204
|
+
- `{ name: "home" }`
|
|
205
|
+
- `{ name: "session", params: { sessionID, initialPrompt? } }`
|
|
206
|
+
- `{ name: string, params?: Record<string, unknown> }`
|
|
207
|
+
- `api.route.navigate("session", params)` only uses `params.sessionID`. It cannot set `initialPrompt`.
|
|
208
|
+
- If multiple plugins register the same route name, the last registered route wins.
|
|
209
|
+
- Unknown plugin routes render a fallback screen with a `go home` action.
|
|
210
|
+
|
|
211
|
+
### Dialogs and toast
|
|
212
|
+
|
|
213
|
+
- `ui.Dialog` is the base dialog wrapper.
|
|
214
|
+
- `ui.DialogAlert`, `ui.DialogConfirm`, `ui.DialogPrompt`, `ui.DialogSelect` are built-in dialog components.
|
|
215
|
+
- `ui.Prompt` renders the same prompt component used by the host app.
|
|
216
|
+
- `ui.toast(...)` shows a toast.
|
|
217
|
+
- `ui.dialog` exposes the host dialog stack:
|
|
218
|
+
- `replace(render, onClose?)`
|
|
219
|
+
- `clear()`
|
|
220
|
+
- `setSize("medium" | "large" | "xlarge")`
|
|
221
|
+
- readonly `size`, `depth`, `open`
|
|
222
|
+
|
|
223
|
+
### Keybinds
|
|
224
|
+
|
|
225
|
+
- `api.keybind.match(key, evt)` and `print(key)` use the host keybind parser/printer.
|
|
226
|
+
- `api.keybind.create(defaults, overrides?)` builds a plugin-local keybind set.
|
|
227
|
+
- Only missing, blank, or non-string overrides are ignored. Key syntax is not validated.
|
|
228
|
+
- Returned keybind set exposes `all`, `get(name)`, `match(name, evt)`, `print(name)`.
|
|
229
|
+
|
|
230
|
+
### KV, state, client, events
|
|
231
|
+
|
|
232
|
+
- `api.kv` is the shared app KV store backed by `state/kv.json`. It is not plugin-namespaced.
|
|
233
|
+
- `api.kv` exposes `ready`.
|
|
234
|
+
- `api.tuiConfig` and `api.state` are live host objects/getters, not frozen snapshots.
|
|
235
|
+
- `api.state` exposes synced TUI state:
|
|
236
|
+
- `ready`
|
|
237
|
+
- `config`
|
|
238
|
+
- `provider`
|
|
239
|
+
- `path.{state,config,worktree,directory}`
|
|
240
|
+
- `vcs?.branch`
|
|
241
|
+
- `workspace.list()` / `workspace.get(workspaceID)`
|
|
242
|
+
- `session.count()`
|
|
243
|
+
- `session.diff(sessionID)`
|
|
244
|
+
- `session.todo(sessionID)`
|
|
245
|
+
- `session.messages(sessionID)`
|
|
246
|
+
- `session.status(sessionID)`
|
|
247
|
+
- `session.permission(sessionID)`
|
|
248
|
+
- `session.question(sessionID)`
|
|
249
|
+
- `part(messageID)`
|
|
250
|
+
- `lsp()`
|
|
251
|
+
- `mcp()`
|
|
252
|
+
- `api.client` always reflects the current runtime client.
|
|
253
|
+
- `api.scopedClient(workspaceID?)` creates or reuses a client bound to a workspace.
|
|
254
|
+
- `api.workspace.set(...)` rebinds the active workspace; `api.client` follows that rebind.
|
|
255
|
+
- `api.event.on(type, handler)` subscribes to the TUI event stream and returns an unsubscribe function.
|
|
256
|
+
- `api.renderer` exposes the raw `CliRenderer`.
|
|
257
|
+
|
|
258
|
+
### Theme
|
|
259
|
+
|
|
260
|
+
- `api.theme.current` exposes the resolved current theme tokens.
|
|
261
|
+
- `api.theme.selected` is the selected theme name.
|
|
262
|
+
- `api.theme.has(name)` checks for an installed theme.
|
|
263
|
+
- `api.theme.set(name)` switches theme and returns `boolean`.
|
|
264
|
+
- `api.theme.mode()` returns `"dark" | "light"`.
|
|
265
|
+
- `api.theme.install(jsonPath)` installs a theme JSON file.
|
|
266
|
+
- `api.theme.ready` reports theme readiness.
|
|
267
|
+
|
|
268
|
+
Theme install behavior:
|
|
269
|
+
|
|
270
|
+
- Relative theme paths are resolved from the plugin root.
|
|
271
|
+
- Theme name is the JSON basename.
|
|
272
|
+
- Install is skipped if that theme name already exists.
|
|
273
|
+
- Local plugins persist installed themes under the local `.opencode/themes` area near the plugin config source.
|
|
274
|
+
- Global plugins persist installed themes under the global `themes` dir.
|
|
275
|
+
- Invalid or unreadable theme files are ignored.
|
|
276
|
+
|
|
277
|
+
### Slots
|
|
278
|
+
|
|
279
|
+
Current host slot names:
|
|
280
|
+
|
|
281
|
+
- `app`
|
|
282
|
+
- `home_logo`
|
|
283
|
+
- `home_prompt` with props `{ workspace_id? }`
|
|
284
|
+
- `home_bottom`
|
|
285
|
+
- `sidebar_title` with props `{ session_id, title, share_url? }`
|
|
286
|
+
- `sidebar_content` with props `{ session_id }`
|
|
287
|
+
- `sidebar_footer` with props `{ session_id }`
|
|
288
|
+
|
|
289
|
+
Slot notes:
|
|
290
|
+
|
|
291
|
+
- Slot context currently exposes only `theme`.
|
|
292
|
+
- `api.slots.register(plugin)` returns the host-assigned slot plugin id.
|
|
293
|
+
- `api.slots.register(plugin)` does not return an unregister function.
|
|
294
|
+
- Returned ids are `pluginId`, `pluginId:1`, `pluginId:2`, and so on.
|
|
295
|
+
- Plugin-provided `id` is not allowed.
|
|
296
|
+
- The current host renders `home_logo` and `home_prompt` with `replace`, `sidebar_title` and `sidebar_footer` with `single_winner`, and `app`, `home_bottom`, and `sidebar_content` with the slot library default mode.
|
|
297
|
+
- Plugins cannot define new slot names in this branch.
|
|
298
|
+
|
|
299
|
+
### Plugin control and lifecycle
|
|
300
|
+
|
|
301
|
+
- `api.plugins.list()` returns `{ id, source, spec, target, enabled, active }[]`.
|
|
302
|
+
- `enabled` is the persisted desired state. `active` means the plugin is currently initialized.
|
|
303
|
+
- `api.plugins.activate(id)` sets `enabled=true`, persists it into KV, and initializes the plugin.
|
|
304
|
+
- `api.plugins.deactivate(id)` sets `enabled=false`, persists it into KV, and disposes the plugin scope.
|
|
305
|
+
- `api.plugins.add(spec)` trims the input and returns `false` for an empty string.
|
|
306
|
+
- `api.plugins.add(spec)` treats the input as the runtime plugin spec and loads it without re-reading `tui.json`.
|
|
307
|
+
- `api.plugins.add(spec)` no-ops when that resolved spec (or resolved plugin id) is already loaded.
|
|
308
|
+
- `api.plugins.add(spec)` assumes enabled and always attempts initialization (it does not consult config/KV enable state).
|
|
309
|
+
- `api.plugins.install(spec, { global? })` runs install -> manifest read -> config patch using the same helper flow as CLI install.
|
|
310
|
+
- `api.plugins.install(...)` returns either `{ ok: false, message, missing? }` or `{ ok: true, dir, tui }`.
|
|
311
|
+
- `api.plugins.install(...)` does not load plugins into the current session. Call `api.plugins.add(spec)` to load after install.
|
|
312
|
+
- For packages that declare a tuple `tui` target in `oc-plugin`, `api.plugins.install(...)` stages those tuple options so a following `api.plugins.add(spec)` uses them.
|
|
313
|
+
- If activation fails, the plugin can remain `enabled=true` and `active=false`.
|
|
314
|
+
- `api.lifecycle.signal` is aborted before cleanup runs.
|
|
315
|
+
- `api.lifecycle.onDispose(fn)` registers cleanup and returns an unregister function.
|
|
316
|
+
|
|
317
|
+
## Plugin metadata
|
|
318
|
+
|
|
319
|
+
`meta` passed to `tui(api, options, meta)` contains:
|
|
320
|
+
|
|
321
|
+
- `state`: `first | updated | same`
|
|
322
|
+
- `id`, `source`, `spec`, `target`
|
|
323
|
+
- npm-only fields when available: `requested`, `version`
|
|
324
|
+
- file-only field when available: `modified`
|
|
325
|
+
- `first_time`, `last_time`, `time_changed`, `load_count`, `fingerprint`
|
|
326
|
+
|
|
327
|
+
Metadata is persisted by plugin id.
|
|
328
|
+
|
|
329
|
+
- File plugin fingerprint is `target|modified`.
|
|
330
|
+
- npm plugin fingerprint is `target|requested|version`.
|
|
331
|
+
- Internal plugins get synthetic metadata with `state: "same"`.
|
|
332
|
+
|
|
333
|
+
## Runtime behavior
|
|
334
|
+
|
|
335
|
+
- Internal TUI plugins load first.
|
|
336
|
+
- External TUI plugins load from `tuiConfig.plugin`.
|
|
337
|
+
- `--pure` / `OPENCODE_PURE` skips external TUI plugins only.
|
|
338
|
+
- External plugin resolution and import are parallel.
|
|
339
|
+
- External plugin activation is sequential to keep command, route, and side-effect order deterministic.
|
|
340
|
+
- File plugins that fail initially are retried once after waiting for config dependency installation.
|
|
341
|
+
- Runtime add uses the same external loader path, including the file-plugin retry after dependency wait.
|
|
342
|
+
- Runtime add skips duplicates by resolved spec and returns `true` when the spec is already loaded.
|
|
343
|
+
- Runtime install and runtime add are separate operations.
|
|
344
|
+
- Plugin init failure rolls back that plugin's tracked registrations and loading continues.
|
|
345
|
+
- TUI runtime tracks and disposes:
|
|
346
|
+
- command registrations
|
|
347
|
+
- route registrations
|
|
348
|
+
- event subscriptions
|
|
349
|
+
- slot registrations
|
|
350
|
+
- explicit `lifecycle.onDispose(...)` handlers
|
|
351
|
+
- Cleanup runs in reverse order.
|
|
352
|
+
- Cleanup is awaited.
|
|
353
|
+
- Total cleanup budget per plugin is 5 seconds; timeout/error is logged and shutdown continues.
|
|
354
|
+
|
|
355
|
+
## Built-in plugins
|
|
356
|
+
|
|
357
|
+
- `internal:home-tips`
|
|
358
|
+
- `internal:sidebar-context`
|
|
359
|
+
- `internal:sidebar-mcp`
|
|
360
|
+
- `internal:sidebar-lsp`
|
|
361
|
+
- `internal:sidebar-todo`
|
|
362
|
+
- `internal:sidebar-files`
|
|
363
|
+
- `internal:sidebar-footer`
|
|
364
|
+
- `internal:plugin-manager`
|
|
365
|
+
|
|
366
|
+
Sidebar content order is currently: context `100`, mcp `200`, lsp `300`, todo `400`, files `500`.
|
|
367
|
+
|
|
368
|
+
The plugin manager is exposed as a command with title `Plugins` and value `plugins.list`.
|
|
369
|
+
|
|
370
|
+
- Keybind name is `plugin_manager`.
|
|
371
|
+
- Default keybind is `none`.
|
|
372
|
+
- It lists both internal and external plugins.
|
|
373
|
+
- It toggles based on `active`.
|
|
374
|
+
- Its own row is disabled only inside the manager dialog.
|
|
375
|
+
- It also exposes command `plugins.install` with title `Install plugin`.
|
|
376
|
+
- Inside the Plugins dialog, key `shift+i` opens the install prompt.
|
|
377
|
+
- Install prompt asks for npm package name.
|
|
378
|
+
- Scope defaults to local, and `tab` toggles local/global.
|
|
379
|
+
- Install is blocked until `api.state.path.directory` is available; current guard message is `Paths are still syncing. Try again in a moment.`.
|
|
380
|
+
- Manager install uses `api.plugins.install(spec, { global })`.
|
|
381
|
+
- If the installed package has no `tui` target (`tui=false`), manager reports that and does not expect a runtime load.
|
|
382
|
+
- If install reports `tui=true`, manager then calls `api.plugins.add(spec)`.
|
|
383
|
+
- If runtime add fails, TUI shows a warning and restart remains the fallback.
|
|
384
|
+
|
|
385
|
+
## Current in-repo examples
|
|
386
|
+
|
|
387
|
+
- Local smoke plugin: `.opencode/plugins/tui-smoke.tsx`
|
|
388
|
+
- Local smoke config: `.opencode/tui.json`
|
|
389
|
+
- Local smoke theme: `.opencode/plugins/smoke-theme.json`
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { sqliteTable, text, integer, primaryKey } from "drizzle-orm/sqlite-core"
|
|
2
|
+
|
|
3
|
+
import { type AccessToken, type AccountID, type OrgID, type RefreshToken } from "./schema"
|
|
4
|
+
import { Timestamps } from "../storage/schema.sql"
|
|
5
|
+
|
|
6
|
+
export const AccountTable = sqliteTable("account", {
|
|
7
|
+
id: text().$type<AccountID>().primaryKey(),
|
|
8
|
+
email: text().notNull(),
|
|
9
|
+
url: text().notNull(),
|
|
10
|
+
access_token: text().$type<AccessToken>().notNull(),
|
|
11
|
+
refresh_token: text().$type<RefreshToken>().notNull(),
|
|
12
|
+
token_expiry: integer(),
|
|
13
|
+
...Timestamps,
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
export const AccountStateTable = sqliteTable("account_state", {
|
|
17
|
+
id: integer().primaryKey(),
|
|
18
|
+
active_account_id: text()
|
|
19
|
+
.$type<AccountID>()
|
|
20
|
+
.references(() => AccountTable.id, { onDelete: "set null" }),
|
|
21
|
+
active_org_id: text().$type<OrgID>(),
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
// LEGACY
|
|
25
|
+
export const ControlAccountTable = sqliteTable(
|
|
26
|
+
"control_account",
|
|
27
|
+
{
|
|
28
|
+
email: text().notNull(),
|
|
29
|
+
url: text().notNull(),
|
|
30
|
+
access_token: text().$type<AccessToken>().notNull(),
|
|
31
|
+
refresh_token: text().$type<RefreshToken>().notNull(),
|
|
32
|
+
token_expiry: integer(),
|
|
33
|
+
active: integer({ mode: "boolean" })
|
|
34
|
+
.notNull()
|
|
35
|
+
.$default(() => false),
|
|
36
|
+
...Timestamps,
|
|
37
|
+
},
|
|
38
|
+
(table) => [primaryKey({ columns: [table.email, table.url] })],
|
|
39
|
+
)
|