nikcli 0.0.6
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/.turbo/turbo-typecheck.log +1 -0
- package/AGENTS.md +27 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/nikcli +84 -0
- package/config.json +13 -0
- package/docs/tailscale-mobile/01-tailscale-setup.md +94 -0
- package/docs/tailscale-mobile/02-host-setup.md +115 -0
- package/docs/tailscale-mobile/03-phone-and-serve.md +134 -0
- package/docs/tailscale-mobile/README.md +59 -0
- package/examples/README.md +54 -0
- package/package.json +147 -0
- package/parsers-config.ts +253 -0
- package/script/build.ts +179 -0
- package/script/postinstall.mjs +125 -0
- package/script/publish-registries.ts +187 -0
- package/script/publish.ts +100 -0
- package/script/schema.ts +47 -0
- package/script/seed-e2e.ts +50 -0
- package/sequential-prancing-forest.md +373 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1303 -0
- package/src/acp/session.ts +105 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +528 -0
- package/src/agent/generate.txt +32 -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 +73 -0
- package/src/bun/index.ts +119 -0
- package/src/bun/registry.ts +54 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/chatbot/handlers.ts +150 -0
- package/src/chatbot/index.ts +132 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/acp.ts +69 -0
- package/src/cli/cmd/ads.ts +377 -0
- package/src/cli/cmd/agent.ts +259 -0
- package/src/cli/cmd/auth.ts +400 -0
- package/src/cli/cmd/chatbot.ts +420 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/companion.ts +81 -0
- package/src/cli/cmd/connectors.ts +593 -0
- package/src/cli/cmd/debug/agent.ts +166 -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 +52 -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 +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +412 -0
- package/src/cli/cmd/image-model.ts +128 -0
- package/src/cli/cmd/import.ts +201 -0
- package/src/cli/cmd/lovable.ts +128 -0
- package/src/cli/cmd/mcp.ts +738 -0
- package/src/cli/cmd/mobile.ts +223 -0
- package/src/cli/cmd/models.ts +77 -0
- package/src/cli/cmd/plug.ts +231 -0
- package/src/cli/cmd/pr.ts +104 -0
- package/src/cli/cmd/rag-model.ts +167 -0
- package/src/cli/cmd/remote.ts +416 -0
- package/src/cli/cmd/run.ts +589 -0
- package/src/cli/cmd/serve.ts +51 -0
- package/src/cli/cmd/session.ts +133 -0
- package/src/cli/cmd/speak-model.ts +204 -0
- package/src/cli/cmd/stats.ts +402 -0
- package/src/cli/cmd/tui/app.tsx +841 -0
- package/src/cli/cmd/tui/attach.ts +31 -0
- package/src/cli/cmd/tui/component/border.tsx +75 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +172 -0
- package/src/cli/cmd/tui/component/dialog-config.tsx +291 -0
- package/src/cli/cmd/tui/component/dialog-connectors.tsx +440 -0
- package/src/cli/cmd/tui/component/dialog-image-model.tsx +97 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +260 -0
- package/src/cli/cmd/tui/component/dialog-rag-model.tsx +217 -0
- package/src/cli/cmd/tui/component/dialog-remote.tsx +489 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +170 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-settings/index.tsx +59 -0
- package/src/cli/cmd/tui/component/dialog-settings/prompt.tsx +40 -0
- package/src/cli/cmd/tui/component/dialog-settings/sidebar.tsx +39 -0
- package/src/cli/cmd/tui/component/dialog-settings/spinner.tsx +62 -0
- package/src/cli/cmd/tui/component/dialog-settings/ui.tsx +58 -0
- package/src/cli/cmd/tui/component/dialog-skills.tsx +117 -0
- package/src/cli/cmd/tui/component/dialog-speak-model.tsx +304 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +165 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-create.tsx +717 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +52 -0
- package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +350 -0
- package/src/cli/cmd/tui/component/error-component.tsx +91 -0
- package/src/cli/cmd/tui/component/logo.tsx +103 -0
- package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +669 -0
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +2165 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +63 -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/table/markdown-table.tsx +267 -0
- package/src/cli/cmd/tui/component/table-db/db/connections.ts +75 -0
- package/src/cli/cmd/tui/component/table-db/db/db-connection.ts +223 -0
- package/src/cli/cmd/tui/component/table-db/db/db-preview.ts +202 -0
- package/src/cli/cmd/tui/component/table-db/db/factory.ts +77 -0
- package/src/cli/cmd/tui/component/table-db/db/index.ts +9 -0
- package/src/cli/cmd/tui/component/table-db/db/mysql-connection.ts +330 -0
- package/src/cli/cmd/tui/component/table-db/db/postgres-connection.ts +338 -0
- package/src/cli/cmd/tui/component/table-db/db/sqlite-connection.ts +302 -0
- package/src/cli/cmd/tui/component/table-db/db/types.ts +108 -0
- package/src/cli/cmd/tui/component/table-db/table/dbedit-hooks.ts +74 -0
- package/src/cli/cmd/tui/component/table-db/table/index.ts +15 -0
- package/src/cli/cmd/tui/component/table-db/table/table-events.ts +54 -0
- package/src/cli/cmd/tui/component/table-db/table/table-formatters.ts +191 -0
- package/src/cli/cmd/tui/component/table-db/table/table-hooks.ts +105 -0
- package/src/cli/cmd/tui/component/table-db/table/table-keyboard-handler.ts +255 -0
- package/src/cli/cmd/tui/component/table-db/table/table-layout-engine.ts +208 -0
- package/src/cli/cmd/tui/component/table-db/table/table-renderable.ts +486 -0
- package/src/cli/cmd/tui/component/table-db/table/table-selection-manager.ts +136 -0
- package/src/cli/cmd/tui/component/table-db/table/table-state.ts +198 -0
- package/src/cli/cmd/tui/component/table-db/table/types.ts +69 -0
- package/src/cli/cmd/tui/component/table-db/ui/db-visualizer.tsx +71 -0
- package/src/cli/cmd/tui/component/table-db/ui/index.ts +2 -0
- package/src/cli/cmd/tui/component/table-db/ui/table-renderer.ts +607 -0
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
- package/src/cli/cmd/tui/component/tips.tsx +195 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +24 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +102 -0
- package/src/cli/cmd/tui/context/kv.tsx +52 -0
- package/src/cli/cmd/tui/context/local.tsx +458 -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 +54 -0
- package/src/cli/cmd/tui/context/sdk.tsx +128 -0
- package/src/cli/cmd/tui/context/server.tsx +8 -0
- package/src/cli/cmd/tui/context/sync.tsx +510 -0
- package/src/cli/cmd/tui/context/theme/abyss.json +233 -0
- package/src/cli/cmd/tui/context/theme/apple.json +235 -0
- package/src/cli/cmd/tui/context/theme/arctic.json +232 -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/ayuai.json +229 -0
- package/src/cli/cmd/tui/context/theme/blood.json +229 -0
- package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
- package/src/cli/cmd/tui/context/theme/catmoe.json +235 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-latte.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +259 -0
- package/src/cli/cmd/tui/context/theme/charcoal.json +230 -0
- package/src/cli/cmd/tui/context/theme/chromatic.json +235 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cosmic.json +234 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/cyber.json +235 -0
- package/src/cli/cmd/tui/context/theme/dawnfox.json +229 -0
- package/src/cli/cmd/tui/context/theme/dimension.json +235 -0
- package/src/cli/cmd/tui/context/theme/dracula-official.json +222 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/dream.json +235 -0
- package/src/cli/cmd/tui/context/theme/duo.json +235 -0
- package/src/cli/cmd/tui/context/theme/dusk.json +235 -0
- package/src/cli/cmd/tui/context/theme/ebony.json +232 -0
- package/src/cli/cmd/tui/context/theme/equilibrium.json +232 -0
- package/src/cli/cmd/tui/context/theme/ethereal.json +235 -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/fusion.json +235 -0
- package/src/cli/cmd/tui/context/theme/ghost.json +235 -0
- package/src/cli/cmd/tui/context/theme/github-dark.json +229 -0
- package/src/cli/cmd/tui/context/theme/github-dimmed.json +231 -0
- package/src/cli/cmd/tui/context/theme/github-light.json +229 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/glass.json +235 -0
- package/src/cli/cmd/tui/context/theme/gold.json +235 -0
- package/src/cli/cmd/tui/context/theme/gone.json +234 -0
- package/src/cli/cmd/tui/context/theme/greyscale.json +229 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
- package/src/cli/cmd/tui/context/theme/hacker.json +229 -0
- package/src/cli/cmd/tui/context/theme/holo.json +235 -0
- package/src/cli/cmd/tui/context/theme/ink.json +235 -0
- package/src/cli/cmd/tui/context/theme/jet.json +233 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +227 -0
- package/src/cli/cmd/tui/context/theme/lavender.json +236 -0
- package/src/cli/cmd/tui/context/theme/lightph.json +235 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
- package/src/cli/cmd/tui/context/theme/material-ocean.json +230 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +227 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +245 -0
- package/src/cli/cmd/tui/context/theme/midnight.json +235 -0
- package/src/cli/cmd/tui/context/theme/modern.json +235 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/muted.json +229 -0
- package/src/cli/cmd/tui/context/theme/neon.json +229 -0
- package/src/cli/cmd/tui/context/theme/neonfusion.json +235 -0
- package/src/cli/cmd/tui/context/theme/neutral.json +235 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nikcli.json +245 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/nordic.json +235 -0
- package/src/cli/cmd/tui/context/theme/nova.json +235 -0
- package/src/cli/cmd/tui/context/theme/obsidian.json +234 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +231 -0
- package/src/cli/cmd/tui/context/theme/one-pro.json +229 -0
- package/src/cli/cmd/tui/context/theme/onyx.json +233 -0
- package/src/cli/cmd/tui/context/theme/orng.json +249 -0
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +240 -0
- package/src/cli/cmd/tui/context/theme/oxocarbon.json +229 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/poimandres.json +230 -0
- package/src/cli/cmd/tui/context/theme/prism.json +235 -0
- package/src/cli/cmd/tui/context/theme/radiant.json +235 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/shadow.json +235 -0
- package/src/cli/cmd/tui/context/theme/silicon.json +235 -0
- package/src/cli/cmd/tui/context/theme/slate.json +233 -0
- package/src/cli/cmd/tui/context/theme/soft.json +235 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/spectrum.json +235 -0
- package/src/cli/cmd/tui/context/theme/starlight.json +233 -0
- package/src/cli/cmd/tui/context/theme/sunrise.json +235 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tech.json +235 -0
- package/src/cli/cmd/tui/context/theme/tokyonight-storm.json +245 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vapor.json +235 -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/vivid.json +232 -0
- package/src/cli/cmd/tui/context/theme/void.json +235 -0
- package/src/cli/cmd/tui/context/theme/vscode.json +235 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme/zinc.json +236 -0
- package/src/cli/cmd/tui/context/theme.tsx +1303 -0
- package/src/cli/cmd/tui/event.ts +48 -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/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/lsp.tsx +66 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
- package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
- package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +288 -0
- package/src/cli/cmd/tui/plugin/api.tsx +407 -0
- package/src/cli/cmd/tui/plugin/index.ts +3 -0
- package/src/cli/cmd/tui/plugin/internal.ts +25 -0
- package/src/cli/cmd/tui/plugin/runtime.ts +1048 -0
- package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
- package/src/cli/cmd/tui/routes/home.tsx +153 -0
- package/src/cli/cmd/tui/routes/session/dbedit.tsx +474 -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 +105 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +75 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +177 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +2280 -0
- package/src/cli/cmd/tui/routes/session/permission.tsx +540 -0
- package/src/cli/cmd/tui/routes/session/question.tsx +435 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +313 -0
- package/src/cli/cmd/tui/thread.ts +174 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +102 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +389 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +180 -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 +138 -0
- package/src/cli/cmd/tui/util/clipboard.ts +154 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -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 +110 -0
- package/src/cli/cmd/tui/worker.ts +156 -0
- package/src/cli/cmd/uninstall.ts +357 -0
- package/src/cli/cmd/upgrade.ts +72 -0
- package/src/cli/cmd/web.ts +87 -0
- package/src/cli/cmd/workspace-serve.ts +16 -0
- package/src/cli/error.ts +57 -0
- package/src/cli/network.ts +55 -0
- package/src/cli/remote/index.ts +36 -0
- package/src/cli/remote/notifications.ts +104 -0
- package/src/cli/remote/qr-renderer.ts +86 -0
- package/src/cli/remote/remote-service.ts +757 -0
- package/src/cli/remote/session-manager.ts +284 -0
- package/src/cli/remote/subagent-hooks.ts +151 -0
- package/src/cli/remote/types.ts +121 -0
- package/src/cli/ui.ts +96 -0
- package/src/cli/upgrade.ts +25 -0
- package/src/command/index.ts +174 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +99 -0
- package/src/config/config.ts +1760 -0
- package/src/config/markdown.ts +88 -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 +209 -0
- package/src/connectors/api/base.ts +75 -0
- package/src/connectors/api/figma.ts +103 -0
- package/src/connectors/api/github.ts +247 -0
- package/src/connectors/api/lovable.ts +126 -0
- package/src/connectors/api/slack.ts +137 -0
- package/src/connectors/auth.ts +68 -0
- package/src/connectors/cache.ts +119 -0
- package/src/connectors/credentials.ts +81 -0
- package/src/connectors/index.ts +202 -0
- package/src/connectors/registry.ts +358 -0
- package/src/docs/context.ts +120 -0
- package/src/docs/library.ts +189 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +411 -0
- package/src/file/ripgrep.ts +402 -0
- package/src/file/time.ts +65 -0
- package/src/file/watcher.ts +127 -0
- package/src/flag/flag.ts +128 -0
- package/src/format/formatter.ts +356 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +57 -0
- package/src/id/id.ts +83 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +184 -0
- package/src/installation/index.ts +246 -0
- package/src/lsp/client.ts +250 -0
- package/src/lsp/index.ts +483 -0
- package/src/lsp/language.ts +119 -0
- package/src/lsp/server.ts +2046 -0
- package/src/mcp/auth.ts +121 -0
- package/src/mcp/index.ts +860 -0
- package/src/mcp/oauth-callback.ts +198 -0
- package/src/mcp/oauth-provider.ts +148 -0
- package/src/mobile/auth.ts +97 -0
- package/src/mobile/github-repo.ts +185 -0
- package/src/patch/index.ts +631 -0
- package/src/permission/arity.ts +150 -0
- package/src/permission/dbedit.ts +236 -0
- package/src/permission/index.ts +210 -0
- package/src/permission/next.ts +287 -0
- package/src/plugin/codex.ts +493 -0
- package/src/plugin/copilot.ts +261 -0
- package/src/plugin/index.ts +714 -0
- package/src/plugin/install.ts +379 -0
- package/src/plugin/meta.ts +165 -0
- package/src/plugin/shared.ts +188 -0
- package/src/project/bootstrap.ts +35 -0
- package/src/project/instance.ts +84 -0
- package/src/project/project.ts +373 -0
- package/src/project/state.ts +66 -0
- package/src/project/vcs.ts +76 -0
- package/src/prompt/stash-store.ts +93 -0
- package/src/provider/auth.ts +147 -0
- package/src/provider/models-macro.ts +22 -0
- package/src/provider/models.ts +216 -0
- package/src/provider/provider.ts +1483 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +828 -0
- package/src/pty/index.ts +241 -0
- package/src/question/index.ts +171 -0
- package/src/rag/chunk.ts +43 -0
- package/src/rag/embed.ts +179 -0
- package/src/rag/index.ts +376 -0
- package/src/rag/storage.ts +76 -0
- package/src/scheduler/index.ts +61 -0
- package/src/server/error.ts +36 -0
- package/src/server/event.ts +7 -0
- package/src/server/mdns.ts +59 -0
- package/src/server/routes/chatbot.ts +205 -0
- package/src/server/routes/companion.ts +729 -0
- package/src/server/routes/config.ts +92 -0
- package/src/server/routes/connectors.ts +121 -0
- package/src/server/routes/dbedit.ts +76 -0
- package/src/server/routes/experimental.ts +210 -0
- package/src/server/routes/file.ts +197 -0
- package/src/server/routes/global.ts +135 -0
- package/src/server/routes/mcp.ts +225 -0
- package/src/server/routes/mobile.ts +2044 -0
- package/src/server/routes/permission.ts +68 -0
- package/src/server/routes/project.ts +82 -0
- package/src/server/routes/provider.ts +235 -0
- package/src/server/routes/pty.ts +169 -0
- package/src/server/routes/question.ts +98 -0
- package/src/server/routes/session.ts +968 -0
- package/src/server/routes/tui.ts +379 -0
- package/src/server/routes/workspace.ts +104 -0
- package/src/server/server.ts +761 -0
- package/src/server/ssh.ts +207 -0
- package/src/session/auth.ts +402 -0
- package/src/session/compaction.ts +253 -0
- package/src/session/generate.ts +38 -0
- package/src/session/index.ts +598 -0
- package/src/session/llm.ts +273 -0
- package/src/session/message-v2.ts +836 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +408 -0
- package/src/session/prompt/anthropic-20250930.txt +165 -0
- package/src/session/prompt/anthropic.txt +105 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex_header.txt +79 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/gemini.txt +155 -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 +25 -0
- package/src/session/prompt/qwen.txt +108 -0
- package/src/session/prompt.ts +1942 -0
- package/src/session/retry.ts +90 -0
- package/src/session/revert.ts +120 -0
- package/src/session/stats.ts +404 -0
- package/src/session/status.ts +84 -0
- package/src/session/summary.ts +184 -0
- package/src/session/system.ts +195 -0
- package/src/session/toast.tsx +105 -0
- package/src/session/todo.ts +258 -0
- package/src/session/uninstall.ts +357 -0
- package/src/share/share-next.ts +421 -0
- package/src/share/share.ts +92 -0
- package/src/shell/shell.ts +65 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +232 -0
- package/src/snapshot/index.ts +297 -0
- package/src/storage/storage.ts +227 -0
- package/src/tool/apply_patch.ts +288 -0
- package/src/tool/apply_patch.txt +33 -0
- package/src/tool/bash.ts +252 -0
- package/src/tool/bash.txt +115 -0
- package/src/tool/batch.ts +175 -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/context_collect.ts +152 -0
- package/src/tool/context_collect.txt +9 -0
- package/src/tool/context_diagnostics.ts +81 -0
- package/src/tool/context_diagnostics.txt +5 -0
- package/src/tool/context_related.ts +117 -0
- package/src/tool/context_related.txt +5 -0
- package/src/tool/context_search.ts +108 -0
- package/src/tool/context_search.txt +8 -0
- package/src/tool/db-diff.ts +434 -0
- package/src/tool/db-table.txt +15 -0
- package/src/tool/docs_add.ts +50 -0
- package/src/tool/docs_add.txt +5 -0
- package/src/tool/docs_context.ts +56 -0
- package/src/tool/docs_context.txt +4 -0
- package/src/tool/docs_gap_report.ts +79 -0
- package/src/tool/docs_gap_report.txt +7 -0
- package/src/tool/docs_load.ts +41 -0
- package/src/tool/docs_load.txt +4 -0
- package/src/tool/docs_request.ts +129 -0
- package/src/tool/docs_request.txt +7 -0
- package/src/tool/docs_search.ts +51 -0
- package/src/tool/docs_search.txt +6 -0
- package/src/tool/docs_unload.ts +38 -0
- package/src/tool/docs_unload.txt +5 -0
- package/src/tool/edit.ts +614 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/external-directory.ts +32 -0
- package/src/tool/generate_image.ts +174 -0
- package/src/tool/generate_image.txt +12 -0
- package/src/tool/glob.ts +79 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +153 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +116 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp.ts +96 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/memory_search.ts +141 -0
- package/src/tool/memory_search.txt +8 -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 +130 -0
- package/src/tool/question.ts +33 -0
- package/src/tool/question.txt +10 -0
- package/src/tool/rag_index.ts +77 -0
- package/src/tool/rag_index.txt +10 -0
- package/src/tool/rag_reset.ts +26 -0
- package/src/tool/rag_reset.txt +4 -0
- package/src/tool/rag_search.ts +62 -0
- package/src/tool/rag_search.txt +6 -0
- package/src/tool/rag_status.ts +45 -0
- package/src/tool/rag_status.txt +4 -0
- package/src/tool/read.ts +203 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +214 -0
- package/src/tool/skill.ts +169 -0
- package/src/tool/skill.txt +3 -0
- package/src/tool/smart_docs.ts +74 -0
- package/src/tool/smart_docs.txt +7 -0
- package/src/tool/speak/elevenlabs.ts +201 -0
- package/src/tool/speak/openrouter.ts +240 -0
- package/src/tool/speak/provider.ts +83 -0
- package/src/tool/speak.ts +440 -0
- package/src/tool/task.ts +194 -0
- package/src/tool/task.txt +60 -0
- package/src/tool/todo.ts +53 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +87 -0
- package/src/tool/tree.ts +218 -0
- package/src/tool/tree.txt +8 -0
- package/src/tool/truncation.ts +106 -0
- package/src/tool/use-connector.ts +47 -0
- package/src/tool/voice.ts +188 -0
- package/src/tool/webfetch.ts +205 -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 +80 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/error.ts +77 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +125 -0
- package/src/util/flock.ts +329 -0
- package/src/util/fn.ts +11 -0
- package/src/util/format.ts +20 -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 +18 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/network.ts +9 -0
- package/src/util/process.ts +15 -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/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/wildcard.ts +56 -0
- package/src/workspace/adaptors/index.ts +271 -0
- package/src/workspace/adaptors/types.ts +14 -0
- package/src/workspace/adaptors/worktree.ts +31 -0
- package/src/workspace/config.ts +19 -0
- package/src/workspace/index.ts +223 -0
- package/src/workspace/session-proxy-middleware.ts +97 -0
- package/src/workspace/sse.ts +66 -0
- package/src/workspace/workspace-context.ts +23 -0
- package/src/workspace/workspace-server/routes.ts +33 -0
- package/src/workspace/workspace-server/server.ts +47 -0
- package/src/worktree/index.ts +487 -0
- package/sst-env.d.ts +10 -0
- package/test/benchmark.test.ts +121 -0
- package/test/build-optimizations.test.ts +124 -0
- package/test/id-benchmark.test.ts +132 -0
- package/test/optimizations.test.ts +302 -0
- package/test/preload.ts +1 -0
- package/test/solidjs-benchmark.test.ts +262 -0
- package/test/solidjs-optimizations.test.ts +259 -0
- package/test/tui-benchmark.test.ts +230 -0
- package/test/wildcard-benchmark.test.ts +180 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./generate_image.txt"
|
|
4
|
+
import { Config } from "@/config/config"
|
|
5
|
+
import { Provider } from "@/provider/provider"
|
|
6
|
+
import { ProviderTransform } from "@/provider/transform"
|
|
7
|
+
import { experimental_generateImage } from "ai"
|
|
8
|
+
import { Identifier } from "@/id/id"
|
|
9
|
+
import type { MessageV2 } from "@/session/message-v2"
|
|
10
|
+
import { Installation } from "@/installation"
|
|
11
|
+
import os from "os"
|
|
12
|
+
import { Instance } from "@/project/instance"
|
|
13
|
+
import { Flag } from "@/flag/flag"
|
|
14
|
+
|
|
15
|
+
const GPT_IMAGE_LATEST = {
|
|
16
|
+
provider: "openrouter",
|
|
17
|
+
model: "openai/gpt-5-image",
|
|
18
|
+
} as const
|
|
19
|
+
|
|
20
|
+
const NANOBANANA_LATEST = {
|
|
21
|
+
provider: "openrouter",
|
|
22
|
+
model: "google/nano-banana-pro-2.5",
|
|
23
|
+
} as const
|
|
24
|
+
|
|
25
|
+
function extFromMime(mime: string): string {
|
|
26
|
+
switch (mime) {
|
|
27
|
+
case "image/png":
|
|
28
|
+
return ".png"
|
|
29
|
+
case "image/jpeg":
|
|
30
|
+
return ".jpg"
|
|
31
|
+
case "image/webp":
|
|
32
|
+
return ".webp"
|
|
33
|
+
default:
|
|
34
|
+
return ""
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function buildRequestHeaders(input: {
|
|
39
|
+
model: Provider.Model
|
|
40
|
+
sessionID: string
|
|
41
|
+
messageID: string
|
|
42
|
+
}): Record<string, string> {
|
|
43
|
+
if (input.model.providerID.startsWith("nikcli")) {
|
|
44
|
+
return {
|
|
45
|
+
"x-nikcli-project": Instance.project.id,
|
|
46
|
+
"x-nikcli-session": input.sessionID,
|
|
47
|
+
"x-nikcli-request": input.messageID,
|
|
48
|
+
"x-nikcli-client": Flag.NIKCLI_CLIENT,
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
"User-Agent": `nikcli/${Installation.VERSION} (${os.platform()} ${os.release()}; ${os.arch()})`,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const parameters = z
|
|
58
|
+
.object({
|
|
59
|
+
prompt: z.string().describe("Text prompt for image generation"),
|
|
60
|
+
generator: z.enum(["gpt_image", "nanobanana"]).optional().describe("Preset image generator to use (optional)"),
|
|
61
|
+
provider: z.string().optional().describe("Provider ID to use (overrides config/preset)"),
|
|
62
|
+
model: z.string().optional().describe("Image model ID to use (overrides config/preset)"),
|
|
63
|
+
n: z.number().int().min(1).max(4).optional().describe("Number of images to generate (default: 1)"),
|
|
64
|
+
size: z
|
|
65
|
+
.string()
|
|
66
|
+
.regex(/^\d+x\d+$/, "size must be in the format {width}x{height}")
|
|
67
|
+
.optional()
|
|
68
|
+
.describe('Image size in the format "{width}x{height}" (optional)'),
|
|
69
|
+
aspectRatio: z
|
|
70
|
+
.string()
|
|
71
|
+
.regex(/^\d+:\d+$/, "aspectRatio must be in the format {width}:{height}")
|
|
72
|
+
.optional()
|
|
73
|
+
.describe('Image aspect ratio in the format "{width}:{height}" (optional)'),
|
|
74
|
+
seed: z.number().int().optional().describe("Deterministic seed (optional)"),
|
|
75
|
+
providerOptions: z
|
|
76
|
+
.record(z.string(), z.any())
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Provider-specific options passed through to the underlying image API (optional)"),
|
|
79
|
+
})
|
|
80
|
+
.superRefine((val, ctx) => {
|
|
81
|
+
if (val.size && val.aspectRatio) {
|
|
82
|
+
ctx.addIssue({
|
|
83
|
+
code: z.ZodIssueCode.custom,
|
|
84
|
+
message: "Provide either size or aspectRatio, not both.",
|
|
85
|
+
path: ["aspectRatio"],
|
|
86
|
+
})
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
export const GenerateImageTool = Tool.define("generate_image", {
|
|
91
|
+
description: DESCRIPTION,
|
|
92
|
+
parameters,
|
|
93
|
+
async execute(params, ctx) {
|
|
94
|
+
const config = await Config.get()
|
|
95
|
+
|
|
96
|
+
const preset = params.generator === "nanobanana" ? NANOBANANA_LATEST : GPT_IMAGE_LATEST
|
|
97
|
+
const configured = params.generator ? undefined : config.image
|
|
98
|
+
|
|
99
|
+
const providerID =
|
|
100
|
+
params.provider ?? (params.generator ? preset.provider : configured?.provider) ?? GPT_IMAGE_LATEST.provider
|
|
101
|
+
const modelID = params.model ?? (params.generator ? preset.model : configured?.model) ?? GPT_IMAGE_LATEST.model
|
|
102
|
+
|
|
103
|
+
await ctx.ask({
|
|
104
|
+
permission: "generate_image",
|
|
105
|
+
patterns: [`${providerID}/${modelID}`],
|
|
106
|
+
always: ["*"],
|
|
107
|
+
metadata: {
|
|
108
|
+
provider: providerID,
|
|
109
|
+
model: modelID,
|
|
110
|
+
generator: params.generator,
|
|
111
|
+
n: params.n,
|
|
112
|
+
size: params.size,
|
|
113
|
+
aspectRatio: params.aspectRatio,
|
|
114
|
+
seed: params.seed,
|
|
115
|
+
},
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
const model = await Provider.getModel(providerID, modelID)
|
|
119
|
+
const imageModel = await Provider.getImageModel(model)
|
|
120
|
+
|
|
121
|
+
const providerOptions = params.providerOptions
|
|
122
|
+
? ProviderTransform.providerOptions(model, params.providerOptions)
|
|
123
|
+
: undefined
|
|
124
|
+
|
|
125
|
+
const result = await experimental_generateImage({
|
|
126
|
+
model: imageModel,
|
|
127
|
+
prompt: params.prompt,
|
|
128
|
+
n: params.n ?? 1,
|
|
129
|
+
size: params.size as any,
|
|
130
|
+
aspectRatio: params.aspectRatio as any,
|
|
131
|
+
seed: params.seed,
|
|
132
|
+
providerOptions,
|
|
133
|
+
abortSignal: ctx.abort,
|
|
134
|
+
headers: buildRequestHeaders({ model, sessionID: ctx.sessionID, messageID: ctx.messageID }),
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
const attachments: MessageV2.FilePart[] = result.images.map((image, index) => {
|
|
138
|
+
const ext = extFromMime(image.mediaType)
|
|
139
|
+
const filename = `generated-${index + 1}${ext}`
|
|
140
|
+
return {
|
|
141
|
+
id: Identifier.ascending("part"),
|
|
142
|
+
sessionID: ctx.sessionID,
|
|
143
|
+
messageID: ctx.messageID,
|
|
144
|
+
type: "file",
|
|
145
|
+
mime: image.mediaType,
|
|
146
|
+
url: `data:${image.mediaType};base64,${image.base64}`,
|
|
147
|
+
filename,
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
const warnings = result.warnings?.length ? result.warnings : undefined
|
|
152
|
+
|
|
153
|
+
const lines = [
|
|
154
|
+
`Generated ${result.images.length} image(s) using ${providerID}/${modelID}.`,
|
|
155
|
+
params.size ? `Size: ${params.size}` : undefined,
|
|
156
|
+
params.aspectRatio ? `Aspect ratio: ${params.aspectRatio}` : undefined,
|
|
157
|
+
params.seed !== undefined ? `Seed: ${params.seed}` : undefined,
|
|
158
|
+
warnings ? `Warnings: ${warnings.map((w) => w.type).join(", ")}` : undefined,
|
|
159
|
+
].filter(Boolean)
|
|
160
|
+
|
|
161
|
+
return {
|
|
162
|
+
title: "Generate image",
|
|
163
|
+
output: lines.join("\n"),
|
|
164
|
+
attachments,
|
|
165
|
+
metadata: {
|
|
166
|
+
provider: providerID,
|
|
167
|
+
model: modelID,
|
|
168
|
+
generator: params.generator,
|
|
169
|
+
count: result.images.length,
|
|
170
|
+
warnings,
|
|
171
|
+
},
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
})
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Generate an image from a text prompt using an image model (e.g. GPT Image or Nano Banana).
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
- prompt: text prompt for image generation
|
|
5
|
+
- generator: preset image generator (optional)
|
|
6
|
+
- provider: provider ID override (optional)
|
|
7
|
+
- model: model ID override (optional)
|
|
8
|
+
- n: number of images to generate (default: 1)
|
|
9
|
+
- size: output size in "{width}x{height}" (optional)
|
|
10
|
+
- aspectRatio: output aspect ratio in "{width}:{height}" (optional)
|
|
11
|
+
- seed: deterministic seed (optional)
|
|
12
|
+
- providerOptions: provider-specific options passed through to the underlying API (optional)
|
package/src/tool/glob.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import path from "path"
|
|
3
|
+
import { Tool } from "./tool"
|
|
4
|
+
import DESCRIPTION from "./glob.txt"
|
|
5
|
+
import { Ripgrep } from "../file/ripgrep"
|
|
6
|
+
import { Instance } from "../project/instance"
|
|
7
|
+
import { assertExternalDirectory } from "./external-directory"
|
|
8
|
+
|
|
9
|
+
export const GlobTool = Tool.define("glob", {
|
|
10
|
+
description: DESCRIPTION,
|
|
11
|
+
parameters: z.object({
|
|
12
|
+
pattern: z.string().describe("The glob pattern to match files against"),
|
|
13
|
+
path: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe(
|
|
17
|
+
`The directory to search in. If not specified, the current working directory will be used. IMPORTANT: Omit this field to use the default directory. DO NOT enter "undefined" or "null" - simply omit it for the default behavior. Must be a valid directory path if provided.`,
|
|
18
|
+
),
|
|
19
|
+
}),
|
|
20
|
+
async execute(params, ctx) {
|
|
21
|
+
await ctx.ask({
|
|
22
|
+
permission: "glob",
|
|
23
|
+
patterns: [params.pattern],
|
|
24
|
+
always: ["*"],
|
|
25
|
+
metadata: {
|
|
26
|
+
pattern: params.pattern,
|
|
27
|
+
path: params.path,
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
let search = params.path ?? Instance.directory
|
|
32
|
+
search = path.isAbsolute(search) ? search : path.resolve(Instance.directory, search)
|
|
33
|
+
await assertExternalDirectory(ctx, search, { kind: "directory" })
|
|
34
|
+
|
|
35
|
+
const limit = 100
|
|
36
|
+
const files = []
|
|
37
|
+
let truncated = false
|
|
38
|
+
for await (const file of Ripgrep.files({
|
|
39
|
+
cwd: search,
|
|
40
|
+
glob: [params.pattern],
|
|
41
|
+
})) {
|
|
42
|
+
if (files.length >= limit) {
|
|
43
|
+
truncated = true
|
|
44
|
+
break
|
|
45
|
+
}
|
|
46
|
+
const full = path.resolve(search, file)
|
|
47
|
+
const stats = await Bun.file(full)
|
|
48
|
+
.stat()
|
|
49
|
+
.then((x) => x.mtime.getTime())
|
|
50
|
+
.catch(() => 0)
|
|
51
|
+
files.push({
|
|
52
|
+
path: full,
|
|
53
|
+
mtime: stats,
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
files.sort((a, b) => b.mtime - a.mtime)
|
|
57
|
+
|
|
58
|
+
const output = []
|
|
59
|
+
if (files.length === 0) output.push("No files found")
|
|
60
|
+
if (files.length > 0) {
|
|
61
|
+
output.push(...files.map((f) => f.path))
|
|
62
|
+
if (truncated) {
|
|
63
|
+
output.push("")
|
|
64
|
+
output.push(
|
|
65
|
+
`(Results are truncated: showing first ${limit} results. Consider using a more specific path or pattern.)`,
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
title: path.relative(Instance.worktree, search),
|
|
72
|
+
metadata: {
|
|
73
|
+
count: files.length,
|
|
74
|
+
truncated,
|
|
75
|
+
},
|
|
76
|
+
output: output.join("\n"),
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
})
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
- Fast file pattern matching tool that works with any codebase size
|
|
2
|
+
- Supports glob patterns like "**/*.js" or "src/**/*.ts"
|
|
3
|
+
- Returns matching file paths sorted by modification time
|
|
4
|
+
- Use this tool when you need to find files by name patterns
|
|
5
|
+
- When you are doing an open-ended search that may require multiple rounds of globbing and grepping, use the Task tool instead
|
|
6
|
+
- You have the capability to call multiple tools in a single response. It is always better to speculatively perform multiple searches as a batch that are potentially useful.
|
package/src/tool/grep.ts
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import { Ripgrep } from "../file/ripgrep"
|
|
4
|
+
|
|
5
|
+
import DESCRIPTION from "./grep.txt"
|
|
6
|
+
import { Instance } from "../project/instance"
|
|
7
|
+
import path from "path"
|
|
8
|
+
import { assertExternalDirectory } from "./external-directory"
|
|
9
|
+
|
|
10
|
+
const MAX_LINE_LENGTH = 2000
|
|
11
|
+
|
|
12
|
+
export const GrepTool = Tool.define("grep", {
|
|
13
|
+
description: DESCRIPTION,
|
|
14
|
+
parameters: z.object({
|
|
15
|
+
pattern: z.string().describe("The regex pattern to search for in file contents"),
|
|
16
|
+
path: z.string().optional().describe("The directory to search in. Defaults to the current working directory."),
|
|
17
|
+
include: z.string().optional().describe('File pattern to include in the search (e.g. "*.js", "*.{ts,tsx}")'),
|
|
18
|
+
}),
|
|
19
|
+
async execute(params, ctx) {
|
|
20
|
+
if (!params.pattern) {
|
|
21
|
+
throw new Error("pattern is required")
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
await ctx.ask({
|
|
25
|
+
permission: "grep",
|
|
26
|
+
patterns: [params.pattern],
|
|
27
|
+
always: ["*"],
|
|
28
|
+
metadata: {
|
|
29
|
+
pattern: params.pattern,
|
|
30
|
+
path: params.path,
|
|
31
|
+
include: params.include,
|
|
32
|
+
},
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
let searchPath = params.path ?? Instance.directory
|
|
36
|
+
searchPath = path.isAbsolute(searchPath) ? searchPath : path.resolve(Instance.directory, searchPath)
|
|
37
|
+
await assertExternalDirectory(ctx, searchPath, { kind: "directory" })
|
|
38
|
+
|
|
39
|
+
const rgPath = await Ripgrep.filepath()
|
|
40
|
+
const args = [
|
|
41
|
+
"-nH",
|
|
42
|
+
"--hidden",
|
|
43
|
+
"--follow",
|
|
44
|
+
"--no-messages",
|
|
45
|
+
"--field-match-separator=|",
|
|
46
|
+
"--regexp",
|
|
47
|
+
params.pattern,
|
|
48
|
+
]
|
|
49
|
+
if (params.include) {
|
|
50
|
+
args.push("--glob", params.include)
|
|
51
|
+
}
|
|
52
|
+
args.push(searchPath)
|
|
53
|
+
|
|
54
|
+
const proc = Bun.spawn([rgPath, ...args], {
|
|
55
|
+
stdout: "pipe",
|
|
56
|
+
stderr: "pipe",
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
const output = await new Response(proc.stdout).text()
|
|
60
|
+
const errorOutput = await new Response(proc.stderr).text()
|
|
61
|
+
const exitCode = await proc.exited
|
|
62
|
+
|
|
63
|
+
if (exitCode === 1 || (exitCode === 2 && !output.trim())) {
|
|
64
|
+
return {
|
|
65
|
+
title: params.pattern,
|
|
66
|
+
metadata: { matches: 0, truncated: false },
|
|
67
|
+
output: "No files found",
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (exitCode !== 0 && exitCode !== 2) {
|
|
72
|
+
throw new Error(`ripgrep failed: ${errorOutput}`)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const hasErrors = exitCode === 2
|
|
76
|
+
|
|
77
|
+
const lines = output.trim().split(/\r?\n/)
|
|
78
|
+
const matches = []
|
|
79
|
+
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
if (!line) continue
|
|
82
|
+
|
|
83
|
+
const [filePath, lineNumStr, ...lineTextParts] = line.split("|")
|
|
84
|
+
if (!filePath || !lineNumStr || lineTextParts.length === 0) continue
|
|
85
|
+
|
|
86
|
+
const lineNum = parseInt(lineNumStr, 10)
|
|
87
|
+
const lineText = lineTextParts.join("|")
|
|
88
|
+
|
|
89
|
+
const file = Bun.file(filePath)
|
|
90
|
+
const stats = await file.stat().catch(() => null)
|
|
91
|
+
if (!stats) continue
|
|
92
|
+
|
|
93
|
+
matches.push({
|
|
94
|
+
path: filePath,
|
|
95
|
+
modTime: stats.mtime.getTime(),
|
|
96
|
+
lineNum,
|
|
97
|
+
lineText,
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
matches.sort((a, b) => b.modTime - a.modTime)
|
|
102
|
+
|
|
103
|
+
const limit = 100
|
|
104
|
+
const truncated = matches.length > limit
|
|
105
|
+
const finalMatches = truncated ? matches.slice(0, limit) : matches
|
|
106
|
+
|
|
107
|
+
if (finalMatches.length === 0) {
|
|
108
|
+
return {
|
|
109
|
+
title: params.pattern,
|
|
110
|
+
metadata: { matches: 0, truncated: false },
|
|
111
|
+
output: "No files found",
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const totalMatches = matches.length
|
|
116
|
+
const outputLines = [`Found ${totalMatches}${truncated ? ` (showing first ${limit})` : ""} matches`]
|
|
117
|
+
|
|
118
|
+
let currentFile = ""
|
|
119
|
+
for (const match of finalMatches) {
|
|
120
|
+
if (currentFile !== match.path) {
|
|
121
|
+
if (currentFile !== "") {
|
|
122
|
+
outputLines.push("")
|
|
123
|
+
}
|
|
124
|
+
currentFile = match.path
|
|
125
|
+
outputLines.push(`${match.path}:`)
|
|
126
|
+
}
|
|
127
|
+
const truncatedLineText =
|
|
128
|
+
match.lineText.length > MAX_LINE_LENGTH ? match.lineText.substring(0, MAX_LINE_LENGTH) + "..." : match.lineText
|
|
129
|
+
outputLines.push(` Line ${match.lineNum}: ${truncatedLineText}`)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (truncated) {
|
|
133
|
+
outputLines.push("")
|
|
134
|
+
outputLines.push(
|
|
135
|
+
`(Results truncated: showing ${limit} of ${totalMatches} matches (${totalMatches - limit} hidden). Consider using a more specific path or pattern.)`,
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (hasErrors) {
|
|
140
|
+
outputLines.push("")
|
|
141
|
+
outputLines.push("(Some paths were inaccessible and skipped)")
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
title: params.pattern,
|
|
146
|
+
metadata: {
|
|
147
|
+
matches: totalMatches,
|
|
148
|
+
truncated,
|
|
149
|
+
},
|
|
150
|
+
output: outputLines.join("\n"),
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
})
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
- Fast content search tool that works with any codebase size
|
|
2
|
+
- Searches file contents using regular expressions
|
|
3
|
+
- Supports full regex syntax (eg. "log.*Error", "function\s+\w+", etc.)
|
|
4
|
+
- Filter files by pattern with the include parameter (eg. "*.js", "*.{ts,tsx}")
|
|
5
|
+
- Returns file paths and line numbers with at least one match sorted by modification time
|
|
6
|
+
- Use this tool when you need to find files containing specific patterns
|
|
7
|
+
- If you need to identify/count the number of matches within files, use the Bash tool with `rg` (ripgrep) directly. Do NOT use `grep`.
|
|
8
|
+
- When you are doing an open-ended search that may require multiple rounds of globbing and grepping, use the Task tool instead
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
|
|
4
|
+
export const InvalidTool = Tool.define("invalid", {
|
|
5
|
+
description: "Do not use",
|
|
6
|
+
parameters: z.object({
|
|
7
|
+
tool: z.string(),
|
|
8
|
+
error: z.string(),
|
|
9
|
+
}),
|
|
10
|
+
async execute(params) {
|
|
11
|
+
return {
|
|
12
|
+
title: "Invalid Tool",
|
|
13
|
+
output: `The arguments provided to the tool are invalid: ${params.error}`,
|
|
14
|
+
metadata: {},
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
})
|
package/src/tool/ls.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import * as path from "path"
|
|
4
|
+
import DESCRIPTION from "./ls.txt"
|
|
5
|
+
import { Instance } from "../project/instance"
|
|
6
|
+
import { Ripgrep } from "../file/ripgrep"
|
|
7
|
+
import { assertExternalDirectory } from "./external-directory"
|
|
8
|
+
|
|
9
|
+
export const IGNORE_PATTERNS = [
|
|
10
|
+
"node_modules/",
|
|
11
|
+
"__pycache__/",
|
|
12
|
+
".git/",
|
|
13
|
+
"dist/",
|
|
14
|
+
"build/",
|
|
15
|
+
"target/",
|
|
16
|
+
"vendor/",
|
|
17
|
+
"bin/",
|
|
18
|
+
"obj/",
|
|
19
|
+
".idea/",
|
|
20
|
+
".vscode/",
|
|
21
|
+
".zig-cache/",
|
|
22
|
+
"zig-out",
|
|
23
|
+
".coverage",
|
|
24
|
+
"coverage/",
|
|
25
|
+
"vendor/",
|
|
26
|
+
"tmp/",
|
|
27
|
+
"temp/",
|
|
28
|
+
".cache/",
|
|
29
|
+
"cache/",
|
|
30
|
+
"logs/",
|
|
31
|
+
".venv/",
|
|
32
|
+
"venv/",
|
|
33
|
+
"env/",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
const LIMIT = 100
|
|
37
|
+
|
|
38
|
+
export const ListTool = Tool.define("list", {
|
|
39
|
+
description: DESCRIPTION,
|
|
40
|
+
parameters: z.object({
|
|
41
|
+
path: z.string().describe("The absolute path to the directory to list (must be absolute, not relative)").optional(),
|
|
42
|
+
ignore: z.array(z.string()).describe("List of glob patterns to ignore").optional(),
|
|
43
|
+
}),
|
|
44
|
+
async execute(params, ctx) {
|
|
45
|
+
const searchPath = path.resolve(Instance.directory, params.path || ".")
|
|
46
|
+
await assertExternalDirectory(ctx, searchPath, { kind: "directory" })
|
|
47
|
+
|
|
48
|
+
await ctx.ask({
|
|
49
|
+
permission: "list",
|
|
50
|
+
patterns: [searchPath],
|
|
51
|
+
always: ["*"],
|
|
52
|
+
metadata: {
|
|
53
|
+
path: searchPath,
|
|
54
|
+
},
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const ignoreGlobs = IGNORE_PATTERNS.map((p) => `!${p}*`).concat(params.ignore?.map((p) => `!${p}`) || [])
|
|
58
|
+
const files = []
|
|
59
|
+
for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs })) {
|
|
60
|
+
files.push(file)
|
|
61
|
+
if (files.length >= LIMIT) break
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const dirs = new Set<string>()
|
|
65
|
+
const filesByDir = new Map<string, string[]>()
|
|
66
|
+
|
|
67
|
+
for (const file of files) {
|
|
68
|
+
const dir = path.dirname(file)
|
|
69
|
+
const parts = dir === "." ? [] : dir.split("/")
|
|
70
|
+
|
|
71
|
+
for (let i = 0; i <= parts.length; i++) {
|
|
72
|
+
const dirPath = i === 0 ? "." : parts.slice(0, i).join("/")
|
|
73
|
+
dirs.add(dirPath)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!filesByDir.has(dir)) filesByDir.set(dir, [])
|
|
77
|
+
filesByDir.get(dir)!.push(path.basename(file))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function renderDir(dirPath: string, depth: number): string {
|
|
81
|
+
const indent = " ".repeat(depth)
|
|
82
|
+
let output = ""
|
|
83
|
+
|
|
84
|
+
if (depth > 0) {
|
|
85
|
+
output += `${indent}${path.basename(dirPath)}/\n`
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const childIndent = " ".repeat(depth + 1)
|
|
89
|
+
const children = Array.from(dirs)
|
|
90
|
+
.filter((d) => path.dirname(d) === dirPath && d !== dirPath)
|
|
91
|
+
.sort()
|
|
92
|
+
|
|
93
|
+
for (const child of children) {
|
|
94
|
+
output += renderDir(child, depth + 1)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const files = filesByDir.get(dirPath) || []
|
|
98
|
+
for (const file of files.sort()) {
|
|
99
|
+
output += `${childIndent}${file}\n`
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return output
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const output = `${searchPath}/\n` + renderDir(".", 0)
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
title: path.relative(Instance.worktree, searchPath),
|
|
109
|
+
metadata: {
|
|
110
|
+
count: files.length,
|
|
111
|
+
truncated: files.length >= LIMIT,
|
|
112
|
+
},
|
|
113
|
+
output,
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
})
|
package/src/tool/ls.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Lists files and directories in a given path. The path parameter must be absolute; omit it to use the current workspace directory. You can optionally provide an array of glob patterns to ignore with the ignore parameter. You should generally prefer the Glob and Grep tools, if you know which directories to search.
|
package/src/tool/lsp.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import path from "path"
|
|
4
|
+
import { LSP } from "../lsp"
|
|
5
|
+
import DESCRIPTION from "./lsp.txt"
|
|
6
|
+
import { Instance } from "../project/instance"
|
|
7
|
+
import { pathToFileURL } from "url"
|
|
8
|
+
import { assertExternalDirectory } from "./external-directory"
|
|
9
|
+
|
|
10
|
+
const operations = [
|
|
11
|
+
"goToDefinition",
|
|
12
|
+
"findReferences",
|
|
13
|
+
"hover",
|
|
14
|
+
"documentSymbol",
|
|
15
|
+
"workspaceSymbol",
|
|
16
|
+
"goToImplementation",
|
|
17
|
+
"prepareCallHierarchy",
|
|
18
|
+
"incomingCalls",
|
|
19
|
+
"outgoingCalls",
|
|
20
|
+
] as const
|
|
21
|
+
|
|
22
|
+
export const LspTool = Tool.define("lsp", {
|
|
23
|
+
description: DESCRIPTION,
|
|
24
|
+
parameters: z.object({
|
|
25
|
+
operation: z.enum(operations).describe("The LSP operation to perform"),
|
|
26
|
+
filePath: z.string().describe("The absolute or relative path to the file"),
|
|
27
|
+
line: z.number().int().min(1).describe("The line number (1-based, as shown in editors)"),
|
|
28
|
+
character: z.number().int().min(1).describe("The character offset (1-based, as shown in editors)"),
|
|
29
|
+
}),
|
|
30
|
+
execute: async (args, ctx) => {
|
|
31
|
+
const file = path.isAbsolute(args.filePath) ? args.filePath : path.join(Instance.directory, args.filePath)
|
|
32
|
+
await assertExternalDirectory(ctx, file)
|
|
33
|
+
|
|
34
|
+
await ctx.ask({
|
|
35
|
+
permission: "lsp",
|
|
36
|
+
patterns: ["*"],
|
|
37
|
+
always: ["*"],
|
|
38
|
+
metadata: {},
|
|
39
|
+
})
|
|
40
|
+
const uri = pathToFileURL(file).href
|
|
41
|
+
const position = {
|
|
42
|
+
file,
|
|
43
|
+
line: args.line - 1,
|
|
44
|
+
character: args.character - 1,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const relPath = path.relative(Instance.worktree, file)
|
|
48
|
+
const title = `${args.operation} ${relPath}:${args.line}:${args.character}`
|
|
49
|
+
|
|
50
|
+
const exists = await Bun.file(file).exists()
|
|
51
|
+
if (!exists) {
|
|
52
|
+
throw new Error(`File not found: ${file}`)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const available = await LSP.hasClients(file)
|
|
56
|
+
if (!available) {
|
|
57
|
+
throw new Error("No LSP server available for this file type.")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
await LSP.touchFile(file, true)
|
|
61
|
+
|
|
62
|
+
const result: unknown[] = await (async () => {
|
|
63
|
+
switch (args.operation) {
|
|
64
|
+
case "goToDefinition":
|
|
65
|
+
return LSP.definition(position)
|
|
66
|
+
case "findReferences":
|
|
67
|
+
return LSP.references(position)
|
|
68
|
+
case "hover":
|
|
69
|
+
return LSP.hover(position)
|
|
70
|
+
case "documentSymbol":
|
|
71
|
+
return LSP.documentSymbol(uri)
|
|
72
|
+
case "workspaceSymbol":
|
|
73
|
+
return LSP.workspaceSymbol("")
|
|
74
|
+
case "goToImplementation":
|
|
75
|
+
return LSP.implementation(position)
|
|
76
|
+
case "prepareCallHierarchy":
|
|
77
|
+
return LSP.prepareCallHierarchy(position)
|
|
78
|
+
case "incomingCalls":
|
|
79
|
+
return LSP.incomingCalls(position)
|
|
80
|
+
case "outgoingCalls":
|
|
81
|
+
return LSP.outgoingCalls(position)
|
|
82
|
+
}
|
|
83
|
+
})()
|
|
84
|
+
|
|
85
|
+
const output = (() => {
|
|
86
|
+
if (result.length === 0) return `No results found for ${args.operation}`
|
|
87
|
+
return JSON.stringify(result, null, 2)
|
|
88
|
+
})()
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
title,
|
|
92
|
+
metadata: { result },
|
|
93
|
+
output,
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
})
|
package/src/tool/lsp.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Interact with Language Server Protocol (LSP) servers to get code intelligence features.
|
|
2
|
+
|
|
3
|
+
Supported operations:
|
|
4
|
+
- goToDefinition: Find where a symbol is defined
|
|
5
|
+
- findReferences: Find all references to a symbol
|
|
6
|
+
- hover: Get hover information (documentation, type info) for a symbol
|
|
7
|
+
- documentSymbol: Get all symbols (functions, classes, variables) in a document
|
|
8
|
+
- workspaceSymbol: Search for symbols across the entire workspace
|
|
9
|
+
- goToImplementation: Find implementations of an interface or abstract method
|
|
10
|
+
- prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)
|
|
11
|
+
- incomingCalls: Find all functions/methods that call the function at a position
|
|
12
|
+
- outgoingCalls: Find all functions/methods called by the function at a position
|
|
13
|
+
|
|
14
|
+
All operations require:
|
|
15
|
+
- filePath: The file to operate on
|
|
16
|
+
- line: The line number (1-based, as shown in editors)
|
|
17
|
+
- character: The character offset (1-based, as shown in editors)
|
|
18
|
+
|
|
19
|
+
Note: LSP servers must be configured for the file type. If no server is available, an error will be returned.
|