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,141 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./memory_search.txt"
|
|
4
|
+
import { Storage } from "@/storage/storage"
|
|
5
|
+
import { Instance } from "@/project/instance"
|
|
6
|
+
import { MessageV2 } from "@/session/message-v2"
|
|
7
|
+
|
|
8
|
+
const parameters = z.object({
|
|
9
|
+
query: z.string().describe("Search query"),
|
|
10
|
+
limit: z.number().int().min(1).max(50).optional().describe("Maximum results"),
|
|
11
|
+
sessionId: z.string().optional().describe("Restrict to a single session"),
|
|
12
|
+
maxSessions: z.number().int().min(1).max(50).optional().describe("Maximum sessions to scan"),
|
|
13
|
+
maxMessages: z.number().int().min(1).max(500).optional().describe("Maximum messages to scan"),
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
type Result = {
|
|
17
|
+
sessionID: string
|
|
18
|
+
messageID: string
|
|
19
|
+
score: number
|
|
20
|
+
role: string
|
|
21
|
+
snippet: string
|
|
22
|
+
time: number
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const MemorySearchTool = Tool.define<typeof parameters, { count: number }>("memory_search", {
|
|
26
|
+
description: DESCRIPTION,
|
|
27
|
+
parameters,
|
|
28
|
+
async execute(params, ctx) {
|
|
29
|
+
const limit = params.limit ?? 10
|
|
30
|
+
const maxSessions = params.maxSessions ?? 10
|
|
31
|
+
const maxMessages = params.maxMessages ?? 200
|
|
32
|
+
const terms = splitTerms(params.query)
|
|
33
|
+
|
|
34
|
+
await ctx.ask({
|
|
35
|
+
permission: "memory_search",
|
|
36
|
+
patterns: [params.query],
|
|
37
|
+
always: ["*"],
|
|
38
|
+
metadata: {
|
|
39
|
+
query: params.query,
|
|
40
|
+
limit,
|
|
41
|
+
sessionId: params.sessionId,
|
|
42
|
+
maxSessions,
|
|
43
|
+
maxMessages,
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
if (terms.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
title: "Memory search",
|
|
50
|
+
output: "No search terms provided.",
|
|
51
|
+
metadata: { count: 0 },
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sessions = await collectSessions(params.sessionId, maxSessions)
|
|
56
|
+
const results: Result[] = []
|
|
57
|
+
const counter = { value: 0 }
|
|
58
|
+
|
|
59
|
+
for (const sessionID of sessions) {
|
|
60
|
+
if (results.length >= limit) break
|
|
61
|
+
for await (const msg of MessageV2.stream(sessionID)) {
|
|
62
|
+
if (results.length >= limit) break
|
|
63
|
+
if (counter.value >= maxMessages) break
|
|
64
|
+
counter.value += 1
|
|
65
|
+
|
|
66
|
+
for (const part of msg.parts) {
|
|
67
|
+
if (part.type !== "text") continue
|
|
68
|
+
if (part.ignored) continue
|
|
69
|
+
const score = scoreText(part.text, terms)
|
|
70
|
+
if (score <= 0) continue
|
|
71
|
+
results.push({
|
|
72
|
+
sessionID: msg.info.sessionID,
|
|
73
|
+
messageID: msg.info.id,
|
|
74
|
+
score,
|
|
75
|
+
role: msg.info.role,
|
|
76
|
+
snippet: makeSnippet(part.text, terms),
|
|
77
|
+
time: msg.info.time.created,
|
|
78
|
+
})
|
|
79
|
+
if (results.length >= limit) break
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (results.length === 0) {
|
|
85
|
+
return {
|
|
86
|
+
title: "Memory search",
|
|
87
|
+
output: "No matches found.",
|
|
88
|
+
metadata: { count: 0 },
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
results.sort((a, b) => b.score - a.score || b.time - a.time)
|
|
93
|
+
|
|
94
|
+
const lines = results.slice(0, limit).map((item) => {
|
|
95
|
+
const score = item.score.toFixed(2)
|
|
96
|
+
return `- [${score}] ${item.role} ${item.sessionID} ${item.messageID}: ${item.snippet}`
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
title: "Memory search",
|
|
101
|
+
output: lines.join("\n"),
|
|
102
|
+
metadata: { count: results.length },
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
function splitTerms(query: string) {
|
|
108
|
+
return query
|
|
109
|
+
.toLowerCase()
|
|
110
|
+
.replace(/[^a-z0-9\s]/g, " ")
|
|
111
|
+
.split(/\s+/)
|
|
112
|
+
.filter(Boolean)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function scoreText(text: string, terms: string[]) {
|
|
116
|
+
const lower = text.toLowerCase()
|
|
117
|
+
const hits = terms.reduce((sum, term) => sum + (lower.includes(term) ? 1 : 0), 0)
|
|
118
|
+
if (hits === 0) return 0
|
|
119
|
+
return hits / terms.length
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function makeSnippet(text: string, terms: string[]) {
|
|
123
|
+
const lower = text.toLowerCase()
|
|
124
|
+
const indexes = terms
|
|
125
|
+
.map((term) => lower.indexOf(term))
|
|
126
|
+
.filter((value) => value >= 0)
|
|
127
|
+
.sort((a, b) => a - b)
|
|
128
|
+
const idx = indexes[0]
|
|
129
|
+
if (idx === undefined) return text.slice(0, 180).replace(/\s+/g, " ").trim()
|
|
130
|
+
const start = Math.max(0, idx - 80)
|
|
131
|
+
const end = Math.min(text.length, idx + 120)
|
|
132
|
+
return text.slice(start, end).replace(/\s+/g, " ").trim()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function collectSessions(sessionId: string | undefined, max: number) {
|
|
136
|
+
if (sessionId) return [sessionId]
|
|
137
|
+
const project = Instance.project
|
|
138
|
+
const items = await Storage.list(["session", project.id])
|
|
139
|
+
const ids = items.map((item) => item[item.length - 1]).filter(Boolean)
|
|
140
|
+
return ids.slice(0, max)
|
|
141
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
Search past session messages for a query.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
- query: search phrase
|
|
5
|
+
- limit: maximum results (default: 10)
|
|
6
|
+
- sessionId: restrict to a session
|
|
7
|
+
- maxSessions: maximum sessions to scan (default: 10)
|
|
8
|
+
- maxMessages: maximum messages to scan (default: 200)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import { EditTool } from "./edit"
|
|
4
|
+
import DESCRIPTION from "./multiedit.txt"
|
|
5
|
+
import path from "path"
|
|
6
|
+
import { Instance } from "../project/instance"
|
|
7
|
+
|
|
8
|
+
export const MultiEditTool = Tool.define("multiedit", {
|
|
9
|
+
description: DESCRIPTION,
|
|
10
|
+
parameters: z.object({
|
|
11
|
+
filePath: z.string().describe("The absolute path to the file to modify"),
|
|
12
|
+
edits: z
|
|
13
|
+
.array(
|
|
14
|
+
z.object({
|
|
15
|
+
filePath: z.string().describe("The absolute path to the file to modify"),
|
|
16
|
+
oldString: z.string().describe("The text to replace"),
|
|
17
|
+
newString: z.string().describe("The text to replace it with (must be different from oldString)"),
|
|
18
|
+
replaceAll: z.boolean().optional().describe("Replace all occurrences of oldString (default false)"),
|
|
19
|
+
}),
|
|
20
|
+
)
|
|
21
|
+
.describe("Array of edit operations to perform sequentially on the file"),
|
|
22
|
+
}),
|
|
23
|
+
async execute(params, ctx) {
|
|
24
|
+
const tool = await EditTool.init()
|
|
25
|
+
const results = []
|
|
26
|
+
for (const [, edit] of params.edits.entries()) {
|
|
27
|
+
const result = await tool.execute(
|
|
28
|
+
{
|
|
29
|
+
filePath: params.filePath,
|
|
30
|
+
oldString: edit.oldString,
|
|
31
|
+
newString: edit.newString,
|
|
32
|
+
replaceAll: edit.replaceAll,
|
|
33
|
+
},
|
|
34
|
+
ctx,
|
|
35
|
+
)
|
|
36
|
+
results.push(result)
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
title: path.relative(Instance.worktree, params.filePath),
|
|
40
|
+
metadata: {
|
|
41
|
+
results: results.map((r) => r.metadata),
|
|
42
|
+
},
|
|
43
|
+
output: results.at(-1)!.output,
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
})
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
This is a tool for making multiple edits to a single file in one operation. It is built on top of the Edit tool and allows you to perform multiple find-and-replace operations efficiently. Prefer this tool over the Edit tool when you need to make multiple edits to the same file.
|
|
2
|
+
|
|
3
|
+
Before using this tool:
|
|
4
|
+
|
|
5
|
+
1. Use the Read tool to understand the file's contents and context
|
|
6
|
+
2. Verify the directory path is correct
|
|
7
|
+
|
|
8
|
+
To make multiple file edits, provide the following:
|
|
9
|
+
1. file_path: The absolute path to the file to modify (must be absolute, not relative)
|
|
10
|
+
2. edits: An array of edit operations to perform, where each edit contains:
|
|
11
|
+
- oldString: The text to replace (must match the file contents exactly, including all whitespace and indentation)
|
|
12
|
+
- newString: The edited text to replace the oldString
|
|
13
|
+
- replaceAll: Replace all occurrences of oldString. This parameter is optional and defaults to false.
|
|
14
|
+
|
|
15
|
+
IMPORTANT:
|
|
16
|
+
- All edits are applied in sequence, in the order they are provided
|
|
17
|
+
- Each edit operates on the result of the previous edit
|
|
18
|
+
- All edits must be valid for the operation to succeed - if any edit fails, none will be applied
|
|
19
|
+
- This tool is ideal when you need to make several changes to different parts of the same file
|
|
20
|
+
|
|
21
|
+
CRITICAL REQUIREMENTS:
|
|
22
|
+
1. All edits follow the same requirements as the single Edit tool
|
|
23
|
+
2. The edits are atomic - either all succeed or none are applied
|
|
24
|
+
3. Plan your edits carefully to avoid conflicts between sequential operations
|
|
25
|
+
|
|
26
|
+
WARNING:
|
|
27
|
+
- The tool will fail if edits.oldString doesn't match the file contents exactly (including whitespace)
|
|
28
|
+
- The tool will fail if edits.oldString and edits.newString are the same
|
|
29
|
+
- Since edits are applied in sequence, ensure that earlier edits don't affect the text that later edits are trying to find
|
|
30
|
+
|
|
31
|
+
When making edits:
|
|
32
|
+
- Ensure all edits result in idiomatic, correct code
|
|
33
|
+
- Do not leave the code in a broken state
|
|
34
|
+
- Always use absolute file paths (starting with /)
|
|
35
|
+
- Only use emojis if the user explicitly requests it. Avoid adding emojis to files unless asked.
|
|
36
|
+
- Use replaceAll for replacing and renaming strings across the file. This parameter is useful if you want to rename a variable for instance.
|
|
37
|
+
|
|
38
|
+
If you want to create a new file, use:
|
|
39
|
+
- A new file path, including dir name if needed
|
|
40
|
+
- First edit: empty oldString and the new file's contents as newString
|
|
41
|
+
- Subsequent edits: normal edit operations on the created content
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Use this tool to suggest switching to plan agent when the user's request would benefit from planning before implementation.
|
|
2
|
+
|
|
3
|
+
If they explicitly mention wanting to create a plan ALWAYS call this tool first.
|
|
4
|
+
|
|
5
|
+
This tool will ask the user if they want to switch to plan agent.
|
|
6
|
+
|
|
7
|
+
Call this tool when:
|
|
8
|
+
- The user's request is complex and would benefit from planning first
|
|
9
|
+
- You want to research and design before making changes
|
|
10
|
+
- The task involves multiple files or significant architectural decisions
|
|
11
|
+
|
|
12
|
+
Do NOT call this tool:
|
|
13
|
+
- For simple, straightforward tasks
|
|
14
|
+
- When the user explicitly wants immediate implementation
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Use this tool when you have completed the planning phase and are ready to exit plan agent.
|
|
2
|
+
|
|
3
|
+
This tool will ask the user if they want to switch to build agent to start implementing the plan.
|
|
4
|
+
|
|
5
|
+
Call this tool:
|
|
6
|
+
- After you have written a complete plan to the plan file
|
|
7
|
+
- After you have clarified any questions with the user
|
|
8
|
+
- When you are confident the plan is ready for implementation
|
|
9
|
+
|
|
10
|
+
Do NOT call this tool:
|
|
11
|
+
- Before you have created or finalized the plan
|
|
12
|
+
- If you still have unanswered questions about the implementation
|
|
13
|
+
- If the user has indicated they want to continue planning
|
package/src/tool/plan.ts
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import path from "path"
|
|
3
|
+
import { Tool } from "./tool"
|
|
4
|
+
import { Question } from "../question"
|
|
5
|
+
import { Session } from "../session"
|
|
6
|
+
import { MessageV2 } from "../session/message-v2"
|
|
7
|
+
import { Identifier } from "../id/id"
|
|
8
|
+
import { Provider } from "../provider/provider"
|
|
9
|
+
import { Instance } from "../project/instance"
|
|
10
|
+
import EXIT_DESCRIPTION from "./plan-exit.txt"
|
|
11
|
+
import ENTER_DESCRIPTION from "./plan-enter.txt"
|
|
12
|
+
|
|
13
|
+
async function getLastModel(sessionID: string) {
|
|
14
|
+
for await (const item of MessageV2.stream(sessionID)) {
|
|
15
|
+
if (item.info.role === "user" && item.info.model) return item.info.model
|
|
16
|
+
}
|
|
17
|
+
return Provider.defaultModel()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const PlanExitTool = Tool.define("plan_exit", {
|
|
21
|
+
description: EXIT_DESCRIPTION,
|
|
22
|
+
parameters: z.object({}),
|
|
23
|
+
async execute(_params, ctx) {
|
|
24
|
+
const session = await Session.get(ctx.sessionID)
|
|
25
|
+
const plan = path.relative(Instance.worktree, Session.plan(session))
|
|
26
|
+
const answers = await Question.ask({
|
|
27
|
+
sessionID: ctx.sessionID,
|
|
28
|
+
questions: [
|
|
29
|
+
{
|
|
30
|
+
question: `Plan at ${plan} is complete. Would you like to switch to the build agent and start implementing?`,
|
|
31
|
+
header: "Build Agent",
|
|
32
|
+
custom: false,
|
|
33
|
+
options: [
|
|
34
|
+
{ label: "Yes", description: "Switch to build agent and start implementing the plan" },
|
|
35
|
+
{ label: "No", description: "Stay with plan agent to continue refining the plan" },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined,
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const answer = answers[0]?.[0]
|
|
43
|
+
if (answer === "No") throw new Question.RejectedError()
|
|
44
|
+
|
|
45
|
+
const model = await getLastModel(ctx.sessionID)
|
|
46
|
+
|
|
47
|
+
const userMsg: MessageV2.User = {
|
|
48
|
+
id: Identifier.ascending("message"),
|
|
49
|
+
sessionID: ctx.sessionID,
|
|
50
|
+
role: "user",
|
|
51
|
+
time: {
|
|
52
|
+
created: Date.now(),
|
|
53
|
+
},
|
|
54
|
+
agent: "build",
|
|
55
|
+
model,
|
|
56
|
+
}
|
|
57
|
+
await Session.updateMessage(userMsg)
|
|
58
|
+
await Session.updatePart({
|
|
59
|
+
id: Identifier.ascending("part"),
|
|
60
|
+
messageID: userMsg.id,
|
|
61
|
+
sessionID: ctx.sessionID,
|
|
62
|
+
type: "text",
|
|
63
|
+
text: `The plan at ${plan} has been approved, you can now edit files. Execute the plan`,
|
|
64
|
+
synthetic: true,
|
|
65
|
+
} satisfies MessageV2.TextPart)
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
title: "Switching to build agent",
|
|
69
|
+
output: "User approved switching to build agent. Wait for further instructions.",
|
|
70
|
+
metadata: {},
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
export const PlanEnterTool = Tool.define("plan_enter", {
|
|
76
|
+
description: ENTER_DESCRIPTION,
|
|
77
|
+
parameters: z.object({}),
|
|
78
|
+
async execute(_params, ctx) {
|
|
79
|
+
const session = await Session.get(ctx.sessionID)
|
|
80
|
+
const plan = path.relative(Instance.worktree, Session.plan(session))
|
|
81
|
+
|
|
82
|
+
const answers = await Question.ask({
|
|
83
|
+
sessionID: ctx.sessionID,
|
|
84
|
+
questions: [
|
|
85
|
+
{
|
|
86
|
+
question: `Would you like to switch to the plan agent and create a plan saved to ${plan}?`,
|
|
87
|
+
header: "Plan Mode",
|
|
88
|
+
custom: false,
|
|
89
|
+
options: [
|
|
90
|
+
{ label: "Yes", description: "Switch to plan agent for research and planning" },
|
|
91
|
+
{ label: "No", description: "Stay with build agent to continue making changes" },
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const answer = answers[0]?.[0]
|
|
99
|
+
|
|
100
|
+
if (answer === "No") throw new Question.RejectedError()
|
|
101
|
+
|
|
102
|
+
const model = await getLastModel(ctx.sessionID)
|
|
103
|
+
|
|
104
|
+
const userMsg: MessageV2.User = {
|
|
105
|
+
id: Identifier.ascending("message"),
|
|
106
|
+
sessionID: ctx.sessionID,
|
|
107
|
+
role: "user",
|
|
108
|
+
time: {
|
|
109
|
+
created: Date.now(),
|
|
110
|
+
},
|
|
111
|
+
agent: "plan",
|
|
112
|
+
model,
|
|
113
|
+
}
|
|
114
|
+
await Session.updateMessage(userMsg)
|
|
115
|
+
await Session.updatePart({
|
|
116
|
+
id: Identifier.ascending("part"),
|
|
117
|
+
messageID: userMsg.id,
|
|
118
|
+
sessionID: ctx.sessionID,
|
|
119
|
+
type: "text",
|
|
120
|
+
text: "User has requested to enter plan mode. Switch to plan mode and begin planning.",
|
|
121
|
+
synthetic: true,
|
|
122
|
+
} satisfies MessageV2.TextPart)
|
|
123
|
+
|
|
124
|
+
return {
|
|
125
|
+
title: "Switching to plan agent",
|
|
126
|
+
output: `User confirmed to switch to plan mode. A new message has been created to switch you to plan mode. The plan file will be at ${plan}. Begin planning.`,
|
|
127
|
+
metadata: {},
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import { Question } from "../question"
|
|
4
|
+
import DESCRIPTION from "./question.txt"
|
|
5
|
+
|
|
6
|
+
export const QuestionTool = Tool.define("question", {
|
|
7
|
+
description: DESCRIPTION,
|
|
8
|
+
parameters: z.object({
|
|
9
|
+
questions: z.array(Question.Info.omit({ custom: true })).describe("Questions to ask"),
|
|
10
|
+
}),
|
|
11
|
+
async execute(params, ctx) {
|
|
12
|
+
const answers = await Question.ask({
|
|
13
|
+
sessionID: ctx.sessionID,
|
|
14
|
+
questions: params.questions,
|
|
15
|
+
tool: ctx.callID ? { messageID: ctx.messageID, callID: ctx.callID } : undefined,
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
function format(answer: Question.Answer | undefined) {
|
|
19
|
+
if (!answer?.length) return "Unanswered"
|
|
20
|
+
return answer.join(", ")
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const formatted = params.questions.map((q, i) => `"${q.question}"="${format(answers[i])}"`).join(", ")
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
title: `Asked ${params.questions.length} question${params.questions.length > 1 ? "s" : ""}`,
|
|
27
|
+
output: `User has answered your questions: ${formatted}. You can now continue with the user's answers in mind.`,
|
|
28
|
+
metadata: {
|
|
29
|
+
answers,
|
|
30
|
+
},
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
})
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Use this tool when you need to ask the user questions during execution. This allows you to:
|
|
2
|
+
1. Gather user preferences or requirements
|
|
3
|
+
2. Clarify ambiguous instructions
|
|
4
|
+
3. Get decisions on implementation choices as you work
|
|
5
|
+
4. Offer choices to the user about what direction to take.
|
|
6
|
+
|
|
7
|
+
Usage notes:
|
|
8
|
+
- When `custom` is enabled (default), a "Type your own answer" option is added automatically; don't include "Other" or catch-all options
|
|
9
|
+
- Answers are returned as arrays of labels; set `multiple: true` to allow selecting more than one
|
|
10
|
+
- If you recommend a specific option, make that the first option in the list and add "(Recommended)" at the end of the label
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./rag_index.txt"
|
|
4
|
+
import { Rag } from "@/rag"
|
|
5
|
+
import { Instance } from "@/project/instance"
|
|
6
|
+
import path from "path"
|
|
7
|
+
import { assertExternalDirectory } from "./external-directory"
|
|
8
|
+
|
|
9
|
+
const parameters = z.object({
|
|
10
|
+
paths: z.array(z.string()).optional().describe("Files or directories to index"),
|
|
11
|
+
chunkLines: z.number().int().min(20).max(500).optional().describe("Lines per chunk"),
|
|
12
|
+
maxFiles: z.number().int().min(1).max(2000).optional().describe("Maximum files to index"),
|
|
13
|
+
maxChunks: z.number().int().min(1).max(20000).optional().describe("Maximum chunks to store"),
|
|
14
|
+
maxFileBytes: z.number().int().min(1).optional().describe("Maximum file size in bytes"),
|
|
15
|
+
model: z.string().optional().describe("Embedding model (default: openai/text-embedding-3-small)"),
|
|
16
|
+
provider: z.string().optional().describe("Embedding provider (default: openrouter)"),
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export const RagIndexTool = Tool.define("rag_index", {
|
|
20
|
+
description: DESCRIPTION,
|
|
21
|
+
parameters,
|
|
22
|
+
async execute(params, ctx) {
|
|
23
|
+
const base = Instance.worktree === "/" ? Instance.directory : Instance.worktree
|
|
24
|
+
const root = path.join(base, ".nikcli")
|
|
25
|
+
|
|
26
|
+
await ctx.ask({
|
|
27
|
+
permission: "rag_index",
|
|
28
|
+
patterns: [root],
|
|
29
|
+
always: ["*"],
|
|
30
|
+
metadata: {
|
|
31
|
+
root,
|
|
32
|
+
paths: params.paths,
|
|
33
|
+
chunkLines: params.chunkLines,
|
|
34
|
+
maxFiles: params.maxFiles,
|
|
35
|
+
maxChunks: params.maxChunks,
|
|
36
|
+
maxFileBytes: params.maxFileBytes,
|
|
37
|
+
model: params.model,
|
|
38
|
+
},
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
await assertExternalDirectory(ctx, root, { kind: "directory" })
|
|
42
|
+
|
|
43
|
+
const result = await Rag.index({
|
|
44
|
+
paths: params.paths,
|
|
45
|
+
chunkLines: params.chunkLines,
|
|
46
|
+
maxFiles: params.maxFiles,
|
|
47
|
+
maxChunks: params.maxChunks,
|
|
48
|
+
maxFileBytes: params.maxFileBytes,
|
|
49
|
+
model: params.model,
|
|
50
|
+
provider: params.provider,
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
const output = [
|
|
54
|
+
`Index path: ${result.path}`,
|
|
55
|
+
`Model: ${result.model}`,
|
|
56
|
+
`Files: ${result.files}`,
|
|
57
|
+
`Chunks: ${result.chunks}`,
|
|
58
|
+
`Indexed chunks: ${result.indexed}`,
|
|
59
|
+
`Skipped files: ${result.skipped}`,
|
|
60
|
+
`Kept files: ${result.kept}`,
|
|
61
|
+
].join("\n")
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
title: "RAG index",
|
|
65
|
+
output,
|
|
66
|
+
metadata: {
|
|
67
|
+
path: result.path,
|
|
68
|
+
files: result.files,
|
|
69
|
+
chunks: result.chunks,
|
|
70
|
+
model: result.model,
|
|
71
|
+
indexed: result.indexed,
|
|
72
|
+
skipped: result.skipped,
|
|
73
|
+
kept: result.kept,
|
|
74
|
+
},
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
})
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Build a semantic RAG index for the current project.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
- paths: files or directories to index
|
|
5
|
+
- chunkLines: lines per chunk (default: 200)
|
|
6
|
+
- maxFiles: maximum files to index (default: 200)
|
|
7
|
+
- maxChunks: maximum chunks to store (default: 5000)
|
|
8
|
+
- maxFileBytes: maximum file size in bytes (default: 1000000)
|
|
9
|
+
- model: embedding model (must be configured via nikcli rag-model)
|
|
10
|
+
- provider: embedding provider (must be configured via nikcli rag-model)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./rag_reset.txt"
|
|
4
|
+
import { Rag } from "@/rag"
|
|
5
|
+
|
|
6
|
+
const parameters = z.object({})
|
|
7
|
+
|
|
8
|
+
export const RagResetTool = Tool.define("rag_reset", {
|
|
9
|
+
description: DESCRIPTION,
|
|
10
|
+
parameters,
|
|
11
|
+
async execute(_params, ctx) {
|
|
12
|
+
await ctx.ask({
|
|
13
|
+
permission: "rag_reset",
|
|
14
|
+
patterns: ["*"],
|
|
15
|
+
always: ["*"],
|
|
16
|
+
metadata: {},
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const result = await Rag.reset()
|
|
20
|
+
return {
|
|
21
|
+
title: "RAG reset",
|
|
22
|
+
output: `Removed RAG index at ${result.path}`,
|
|
23
|
+
metadata: { path: result.path },
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
})
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./rag_search.txt"
|
|
4
|
+
import { Rag } from "@/rag"
|
|
5
|
+
|
|
6
|
+
const parameters = z.object({
|
|
7
|
+
query: z.string().describe("Semantic search query"),
|
|
8
|
+
limit: z.number().int().min(1).max(50).optional().describe("Maximum results"),
|
|
9
|
+
minScore: z.number().min(0).max(1).optional().describe("Minimum similarity score"),
|
|
10
|
+
provider: z.string().optional().describe("Embedding provider"),
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
export const RagSearchTool = Tool.define("rag_search", {
|
|
14
|
+
description: DESCRIPTION,
|
|
15
|
+
parameters,
|
|
16
|
+
async execute(params, ctx) {
|
|
17
|
+
await ctx.ask({
|
|
18
|
+
permission: "rag_search",
|
|
19
|
+
patterns: [params.query],
|
|
20
|
+
always: ["*"],
|
|
21
|
+
metadata: {
|
|
22
|
+
query: params.query,
|
|
23
|
+
limit: params.limit,
|
|
24
|
+
minScore: params.minScore,
|
|
25
|
+
},
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
const result = await Rag.search({
|
|
29
|
+
query: params.query,
|
|
30
|
+
limit: params.limit,
|
|
31
|
+
minScore: params.minScore,
|
|
32
|
+
provider: params.provider,
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
if (!result.ready) {
|
|
36
|
+
return {
|
|
37
|
+
title: "RAG search",
|
|
38
|
+
output: "RAG index not found. Run rag_index first.",
|
|
39
|
+
metadata: { count: 0 },
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (result.results.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
title: "RAG search",
|
|
46
|
+
output: "No semantic matches found.",
|
|
47
|
+
metadata: { count: 0 },
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const lines = result.results.map((item) => {
|
|
52
|
+
const score = item.score.toFixed(3)
|
|
53
|
+
return `- [${score}] ${item.file}:${item.start}-${item.end} ${item.snippet}`
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
title: "RAG search",
|
|
58
|
+
output: lines.join("\n"),
|
|
59
|
+
metadata: { count: result.results.length },
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
})
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Tool } from "./tool"
|
|
3
|
+
import DESCRIPTION from "./rag_status.txt"
|
|
4
|
+
import { Rag } from "@/rag"
|
|
5
|
+
|
|
6
|
+
const parameters = z.object({})
|
|
7
|
+
|
|
8
|
+
export const RagStatusTool = Tool.define("rag_status", {
|
|
9
|
+
description: DESCRIPTION,
|
|
10
|
+
parameters,
|
|
11
|
+
async execute(_params, ctx) {
|
|
12
|
+
await ctx.ask({
|
|
13
|
+
permission: "rag_status",
|
|
14
|
+
patterns: ["*"],
|
|
15
|
+
always: ["*"],
|
|
16
|
+
metadata: {},
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
const status = await Rag.status()
|
|
20
|
+
if (!status.ready) {
|
|
21
|
+
return {
|
|
22
|
+
title: "RAG status",
|
|
23
|
+
output: `No RAG index found at ${status.path}`,
|
|
24
|
+
metadata: { ready: false },
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const state = status.state
|
|
29
|
+
const output = [
|
|
30
|
+
`Index path: ${status.path}`,
|
|
31
|
+
state?.model ? `Model: ${state.model}` : "",
|
|
32
|
+
state?.files !== undefined ? `Files: ${state.files}` : "",
|
|
33
|
+
state?.chunks !== undefined ? `Chunks: ${state.chunks}` : "",
|
|
34
|
+
state?.updated ? `Updated: ${new Date(state.updated).toISOString()}` : "",
|
|
35
|
+
]
|
|
36
|
+
.filter(Boolean)
|
|
37
|
+
.join("\n")
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
title: "RAG status",
|
|
41
|
+
output,
|
|
42
|
+
metadata: { ready: true },
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
})
|