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,18 @@
|
|
|
1
|
+
You are a file search specialist. You excel at thoroughly navigating and exploring codebases.
|
|
2
|
+
|
|
3
|
+
Your strengths:
|
|
4
|
+
- Rapidly finding files using glob patterns
|
|
5
|
+
- Searching code and text with powerful regex patterns
|
|
6
|
+
- Reading and analyzing file contents
|
|
7
|
+
|
|
8
|
+
Guidelines:
|
|
9
|
+
- Use Glob for broad file pattern matching
|
|
10
|
+
- Use Grep for searching file contents with regex
|
|
11
|
+
- Use Read when you know the specific file path you need to read
|
|
12
|
+
- Use Bash for file operations like copying, moving, or listing directory contents
|
|
13
|
+
- Adapt your search approach based on the thoroughness level specified by the caller
|
|
14
|
+
- Return file paths as absolute paths in your final response
|
|
15
|
+
- For clear communication, avoid using emojis
|
|
16
|
+
- Do not create any files, or run bash commands that modify the user's system state in any way
|
|
17
|
+
|
|
18
|
+
Complete the user's search request efficiently and report your findings clearly.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Summarize what was done in this conversation. Write like a pull request description.
|
|
2
|
+
|
|
3
|
+
Rules:
|
|
4
|
+
- 2-3 sentences max
|
|
5
|
+
- Describe the changes made, not the process
|
|
6
|
+
- Do not mention running tests, builds, or other validation steps
|
|
7
|
+
- Do not explain what the user asked for
|
|
8
|
+
- Write in first person (I added..., I fixed...)
|
|
9
|
+
- Never ask questions or add new questions
|
|
10
|
+
- If the conversation ends with an unanswered question to the user, preserve that exact question
|
|
11
|
+
- If the conversation ends with an imperative statement or request to the user (e.g. "Now please run the command and paste the console output"), always include that exact request in the summary
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
You are a title generator. You output ONLY a thread title. Nothing else.
|
|
2
|
+
|
|
3
|
+
<task>
|
|
4
|
+
Generate a brief title that would help the user find this conversation later.
|
|
5
|
+
|
|
6
|
+
Follow all rules in <rules>
|
|
7
|
+
Use the <examples> so you know what a good title looks like.
|
|
8
|
+
Your output must be:
|
|
9
|
+
- A single line
|
|
10
|
+
- ≤50 characters
|
|
11
|
+
- No explanations
|
|
12
|
+
</task>
|
|
13
|
+
|
|
14
|
+
<rules>
|
|
15
|
+
- you MUST use the same language as the user message you are summarizing
|
|
16
|
+
- Title must be grammatically correct and read naturally - no word salad
|
|
17
|
+
- Never include tool names in the title (e.g. "read tool", "bash tool", "edit tool")
|
|
18
|
+
- Focus on the main topic or question the user needs to retrieve
|
|
19
|
+
- Vary your phrasing - avoid repetitive patterns like always starting with "Analyzing"
|
|
20
|
+
- When a file is mentioned, focus on WHAT the user wants to do WITH the file, not just that they shared it
|
|
21
|
+
- Keep exact: technical terms, numbers, filenames, HTTP codes
|
|
22
|
+
- Remove: the, this, my, a, an
|
|
23
|
+
- Never assume tech stack
|
|
24
|
+
- Never use tools
|
|
25
|
+
- NEVER respond to questions, just generate a title for the conversation
|
|
26
|
+
- The title should NEVER include "summarizing" or "generating" when generating a title
|
|
27
|
+
- DO NOT SAY YOU CANNOT GENERATE A TITLE OR COMPLAIN ABOUT THE INPUT
|
|
28
|
+
- Always output something meaningful, even if the input is minimal.
|
|
29
|
+
- If the user message is short or conversational (e.g. "hello", "lol", "what's up", "hey"):
|
|
30
|
+
→ create a title that reflects the user's tone or intent (such as Greeting, Quick check-in, Light chat, Intro message, etc.)
|
|
31
|
+
</rules>
|
|
32
|
+
|
|
33
|
+
<examples>
|
|
34
|
+
"debug 500 errors in production" → Debugging production 500 errors
|
|
35
|
+
"refactor user service" → Refactoring user service
|
|
36
|
+
"why is app.js failing" → app.js failure investigation
|
|
37
|
+
"implement rate limiting" → Rate limiting implementation
|
|
38
|
+
"how do I connect postgres to my API" → Postgres API connection
|
|
39
|
+
"best practices for React hooks" → React hooks best practices
|
|
40
|
+
"@src/auth.ts can you add refresh token support" → Auth refresh token support
|
|
41
|
+
"@utils/parser.ts this is broken" → Parser bug fix
|
|
42
|
+
"look at @config.json" → Config review
|
|
43
|
+
"@App.tsx add dark mode toggle" → Dark mode toggle in App
|
|
44
|
+
</examples>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import path from "path"
|
|
2
|
+
import { Global } from "../global"
|
|
3
|
+
import fs from "fs/promises"
|
|
4
|
+
import z from "zod"
|
|
5
|
+
|
|
6
|
+
export const OAUTH_DUMMY_KEY = "nikcli-oauth-dummy-key"
|
|
7
|
+
|
|
8
|
+
export namespace Auth {
|
|
9
|
+
export const Oauth = z
|
|
10
|
+
.object({
|
|
11
|
+
type: z.literal("oauth"),
|
|
12
|
+
refresh: z.string(),
|
|
13
|
+
access: z.string(),
|
|
14
|
+
expires: z.number(),
|
|
15
|
+
accountId: z.string().optional(),
|
|
16
|
+
enterpriseUrl: z.string().optional(),
|
|
17
|
+
})
|
|
18
|
+
.meta({ ref: "OAuth" })
|
|
19
|
+
|
|
20
|
+
export const Api = z
|
|
21
|
+
.object({
|
|
22
|
+
type: z.literal("api"),
|
|
23
|
+
key: z.string(),
|
|
24
|
+
})
|
|
25
|
+
.meta({ ref: "ApiAuth" })
|
|
26
|
+
|
|
27
|
+
export const WellKnown = z
|
|
28
|
+
.object({
|
|
29
|
+
type: z.literal("wellknown"),
|
|
30
|
+
key: z.string(),
|
|
31
|
+
token: z.string(),
|
|
32
|
+
})
|
|
33
|
+
.meta({ ref: "WellKnownAuth" })
|
|
34
|
+
|
|
35
|
+
export const Info = z.discriminatedUnion("type", [Oauth, Api, WellKnown]).meta({ ref: "Auth" })
|
|
36
|
+
export type Info = z.infer<typeof Info>
|
|
37
|
+
|
|
38
|
+
const filepath = path.join(Global.Path.data, "auth.json")
|
|
39
|
+
|
|
40
|
+
export async function get(providerID: string) {
|
|
41
|
+
const auth = await all()
|
|
42
|
+
return auth[providerID]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export async function all(): Promise<Record<string, Info>> {
|
|
46
|
+
const file = Bun.file(filepath)
|
|
47
|
+
const data = await file.json().catch(() => ({}) as Record<string, unknown>)
|
|
48
|
+
return Object.entries(data).reduce(
|
|
49
|
+
(acc, [key, value]) => {
|
|
50
|
+
const parsed = Info.safeParse(value)
|
|
51
|
+
if (!parsed.success) return acc
|
|
52
|
+
acc[key] = parsed.data
|
|
53
|
+
return acc
|
|
54
|
+
},
|
|
55
|
+
{} as Record<string, Info>,
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function set(key: string, info: Info) {
|
|
60
|
+
const file = Bun.file(filepath)
|
|
61
|
+
const data = await all()
|
|
62
|
+
await Bun.write(file, JSON.stringify({ ...data, [key]: info }, null, 2))
|
|
63
|
+
await fs.chmod(file.name!, 0o600)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export async function remove(key: string) {
|
|
67
|
+
const file = Bun.file(filepath)
|
|
68
|
+
const data = await all()
|
|
69
|
+
delete data[key]
|
|
70
|
+
await Bun.write(file, JSON.stringify(data, null, 2))
|
|
71
|
+
await fs.chmod(file.name!, 0o600)
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/bun/index.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Global } from "../global"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
import path from "path"
|
|
5
|
+
import { Filesystem } from "../util/filesystem"
|
|
6
|
+
import { NamedError } from "@nikcli-ai/util/error"
|
|
7
|
+
import { readableStreamToText } from "bun"
|
|
8
|
+
import { createRequire } from "module"
|
|
9
|
+
import { Lock } from "../util/lock"
|
|
10
|
+
import { proxied } from "../util/network"
|
|
11
|
+
|
|
12
|
+
export namespace BunProc {
|
|
13
|
+
const log = Log.create({ service: "bun" })
|
|
14
|
+
const req = createRequire(import.meta.url)
|
|
15
|
+
|
|
16
|
+
export async function run(cmd: string[], options?: Bun.SpawnOptions.OptionsObject<any, any, any>) {
|
|
17
|
+
log.info("running", {
|
|
18
|
+
cmd: [which(), ...cmd],
|
|
19
|
+
...options,
|
|
20
|
+
})
|
|
21
|
+
const result = Bun.spawn([which(), ...cmd], {
|
|
22
|
+
...options,
|
|
23
|
+
stdout: "pipe",
|
|
24
|
+
stderr: "pipe",
|
|
25
|
+
env: {
|
|
26
|
+
...process.env,
|
|
27
|
+
...options?.env,
|
|
28
|
+
BUN_BE_BUN: "1",
|
|
29
|
+
},
|
|
30
|
+
})
|
|
31
|
+
const code = await result.exited
|
|
32
|
+
const stdout = result.stdout
|
|
33
|
+
? typeof result.stdout === "number"
|
|
34
|
+
? result.stdout
|
|
35
|
+
: await readableStreamToText(result.stdout)
|
|
36
|
+
: undefined
|
|
37
|
+
const stderr = result.stderr
|
|
38
|
+
? typeof result.stderr === "number"
|
|
39
|
+
? result.stderr
|
|
40
|
+
: await readableStreamToText(result.stderr)
|
|
41
|
+
: undefined
|
|
42
|
+
log.info("done", {
|
|
43
|
+
code,
|
|
44
|
+
stdout,
|
|
45
|
+
stderr,
|
|
46
|
+
})
|
|
47
|
+
if (code !== 0) {
|
|
48
|
+
throw new Error(`Command failed with exit code ${result.exitCode}`)
|
|
49
|
+
}
|
|
50
|
+
return result
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function which() {
|
|
54
|
+
return process.execPath
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const InstallFailedError = NamedError.create(
|
|
58
|
+
"BunInstallFailedError",
|
|
59
|
+
z.object({
|
|
60
|
+
pkg: z.string(),
|
|
61
|
+
version: z.string(),
|
|
62
|
+
}),
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
export async function install(pkg: string, version = "latest") {
|
|
66
|
+
using _ = await Lock.write("bun-install")
|
|
67
|
+
|
|
68
|
+
const mod = path.join(Global.Path.cache, "node_modules", pkg)
|
|
69
|
+
const pkgjson = Bun.file(path.join(Global.Path.cache, "package.json"))
|
|
70
|
+
const parsed = await pkgjson.json().catch(async () => {
|
|
71
|
+
const result = { dependencies: {} }
|
|
72
|
+
await Bun.write(pkgjson.name!, JSON.stringify(result, null, 2))
|
|
73
|
+
return result
|
|
74
|
+
})
|
|
75
|
+
const dependencies = parsed.dependencies ?? {}
|
|
76
|
+
if (!parsed.dependencies) parsed.dependencies = dependencies
|
|
77
|
+
const modExists = await Filesystem.exists(mod)
|
|
78
|
+
if (dependencies[pkg] === version && modExists) return mod
|
|
79
|
+
|
|
80
|
+
const args = [
|
|
81
|
+
"add",
|
|
82
|
+
"--force",
|
|
83
|
+
"--exact",
|
|
84
|
+
...(proxied() ? ["--no-cache"] : []),
|
|
85
|
+
"--cwd",
|
|
86
|
+
Global.Path.cache,
|
|
87
|
+
pkg + "@" + version,
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
log.info("installing package using Bun's default registry resolution", {
|
|
91
|
+
pkg,
|
|
92
|
+
version,
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
await BunProc.run(args, {
|
|
96
|
+
cwd: Global.Path.cache,
|
|
97
|
+
}).catch((e) => {
|
|
98
|
+
throw new InstallFailedError(
|
|
99
|
+
{ pkg, version },
|
|
100
|
+
{
|
|
101
|
+
cause: e,
|
|
102
|
+
},
|
|
103
|
+
)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
let resolvedVersion = version
|
|
107
|
+
if (version === "latest") {
|
|
108
|
+
const installedPkgJson = Bun.file(path.join(mod, "package.json"))
|
|
109
|
+
const installedPkg = await installedPkgJson.json().catch(() => null)
|
|
110
|
+
if (installedPkg?.version) {
|
|
111
|
+
resolvedVersion = installedPkg.version
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
parsed.dependencies[pkg] = resolvedVersion
|
|
116
|
+
await Bun.write(pkgjson.name!, JSON.stringify(parsed, null, 2))
|
|
117
|
+
return mod
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import semver from "semver"
|
|
2
|
+
import { readableStreamToText } from "bun"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
import { online } from "@/util/network"
|
|
5
|
+
|
|
6
|
+
export namespace PackageRegistry {
|
|
7
|
+
const log = Log.create({ service: "bun" })
|
|
8
|
+
|
|
9
|
+
function which() {
|
|
10
|
+
return process.execPath
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function info(pkg: string, field: string, cwd?: string): Promise<string | null> {
|
|
14
|
+
if (!online()) {
|
|
15
|
+
log.debug("offline, skipping bun info", { pkg, field })
|
|
16
|
+
return null
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const proc = Bun.spawn([which(), "info", pkg, field], {
|
|
20
|
+
cwd,
|
|
21
|
+
stdout: "pipe",
|
|
22
|
+
stderr: "pipe",
|
|
23
|
+
env: {
|
|
24
|
+
...process.env,
|
|
25
|
+
BUN_BE_BUN: "1",
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const code = await proc.exited
|
|
30
|
+
if (code !== 0) {
|
|
31
|
+
const stderr = proc.stderr ? await readableStreamToText(proc.stderr) : ""
|
|
32
|
+
log.warn("bun info failed", { pkg, field, code, stderr })
|
|
33
|
+
return null
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const stdout = proc.stdout ? await readableStreamToText(proc.stdout) : ""
|
|
37
|
+
const value = stdout.trim()
|
|
38
|
+
if (!value) return null
|
|
39
|
+
return value
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function isOutdated(pkg: string, cachedVersion: string, cwd?: string): Promise<boolean> {
|
|
43
|
+
const latestVersion = await info(pkg, "version", cwd)
|
|
44
|
+
if (!latestVersion) {
|
|
45
|
+
log.warn("Failed to resolve latest version, using cached", { pkg, cachedVersion })
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const isRange = /[\s^~*xX<>|=]/.test(cachedVersion)
|
|
50
|
+
if (isRange) return !semver.satisfies(latestVersion, cachedVersion)
|
|
51
|
+
|
|
52
|
+
return semver.lt(cachedVersion, latestVersion)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import type { ZodType } from "zod"
|
|
3
|
+
import { Log } from "../util/log"
|
|
4
|
+
|
|
5
|
+
export namespace BusEvent {
|
|
6
|
+
const log = Log.create({ service: "event" })
|
|
7
|
+
|
|
8
|
+
export type Definition = ReturnType<typeof define>
|
|
9
|
+
|
|
10
|
+
const registry = new Map<string, Definition>()
|
|
11
|
+
|
|
12
|
+
export function define<Type extends string, Properties extends ZodType>(type: Type, properties: Properties) {
|
|
13
|
+
const result = {
|
|
14
|
+
type,
|
|
15
|
+
properties,
|
|
16
|
+
}
|
|
17
|
+
registry.set(type, result)
|
|
18
|
+
return result
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function payloads() {
|
|
22
|
+
return z
|
|
23
|
+
.discriminatedUnion(
|
|
24
|
+
"type",
|
|
25
|
+
registry
|
|
26
|
+
.entries()
|
|
27
|
+
.map(([type, def]) => {
|
|
28
|
+
return z
|
|
29
|
+
.object({
|
|
30
|
+
type: z.literal(type),
|
|
31
|
+
properties: def.properties,
|
|
32
|
+
})
|
|
33
|
+
.meta({
|
|
34
|
+
ref: "Event" + "." + def.type,
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
.toArray() as any,
|
|
38
|
+
)
|
|
39
|
+
.meta({
|
|
40
|
+
ref: "Event",
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/bus/index.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import z from "zod"
|
|
2
|
+
import { Log } from "../util/log"
|
|
3
|
+
import { Instance } from "../project/instance"
|
|
4
|
+
import { BusEvent } from "./bus-event"
|
|
5
|
+
import { GlobalBus } from "./global"
|
|
6
|
+
|
|
7
|
+
export namespace Bus {
|
|
8
|
+
const log = Log.create({ service: "bus" })
|
|
9
|
+
type Subscription = (event: any) => void
|
|
10
|
+
|
|
11
|
+
export const InstanceDisposed = BusEvent.define(
|
|
12
|
+
"server.instance.disposed",
|
|
13
|
+
z.object({
|
|
14
|
+
directory: z.string(),
|
|
15
|
+
}),
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
const state = Instance.state(
|
|
19
|
+
() => {
|
|
20
|
+
const subscriptions = new Map<any, Subscription[]>()
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
subscriptions,
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
async (entry) => {
|
|
27
|
+
const wildcard = entry.subscriptions.get("*")
|
|
28
|
+
if (!wildcard) return
|
|
29
|
+
const event = {
|
|
30
|
+
type: InstanceDisposed.type,
|
|
31
|
+
properties: {
|
|
32
|
+
directory: Instance.directory,
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
for (const sub of [...wildcard]) {
|
|
36
|
+
sub(event)
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
export async function publish<Definition extends BusEvent.Definition>(
|
|
42
|
+
def: Definition,
|
|
43
|
+
properties: z.output<Definition["properties"]>,
|
|
44
|
+
) {
|
|
45
|
+
const payload = {
|
|
46
|
+
type: def.type,
|
|
47
|
+
properties,
|
|
48
|
+
}
|
|
49
|
+
log.info("publishing", {
|
|
50
|
+
type: def.type,
|
|
51
|
+
})
|
|
52
|
+
const pending = []
|
|
53
|
+
for (const key of [def.type, "*"]) {
|
|
54
|
+
const match = state().subscriptions.get(key)
|
|
55
|
+
for (const sub of match ?? []) {
|
|
56
|
+
pending.push(sub(payload))
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
GlobalBus.emit("event", {
|
|
60
|
+
directory: Instance.directory,
|
|
61
|
+
payload,
|
|
62
|
+
})
|
|
63
|
+
return Promise.all(pending)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function subscribe<Definition extends BusEvent.Definition>(
|
|
67
|
+
def: Definition,
|
|
68
|
+
callback: (event: { type: Definition["type"]; properties: z.infer<Definition["properties"]> }) => void,
|
|
69
|
+
) {
|
|
70
|
+
return raw(def.type, callback)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function once<Definition extends BusEvent.Definition>(
|
|
74
|
+
def: Definition,
|
|
75
|
+
callback: (event: {
|
|
76
|
+
type: Definition["type"]
|
|
77
|
+
properties: z.infer<Definition["properties"]>
|
|
78
|
+
}) => "done" | undefined,
|
|
79
|
+
) {
|
|
80
|
+
const unsub = subscribe(def, (event) => {
|
|
81
|
+
if (callback(event)) unsub()
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function subscribeAll(callback: (event: any) => void) {
|
|
86
|
+
return raw("*", callback)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function raw(type: string, callback: (event: any) => void) {
|
|
90
|
+
log.info("subscribing", { type })
|
|
91
|
+
const subscriptions = state().subscriptions
|
|
92
|
+
let match = subscriptions.get(type) ?? []
|
|
93
|
+
match.push(callback)
|
|
94
|
+
subscriptions.set(type, match)
|
|
95
|
+
|
|
96
|
+
return () => {
|
|
97
|
+
log.info("unsubscribing", { type })
|
|
98
|
+
const match = subscriptions.get(type)
|
|
99
|
+
if (!match) return
|
|
100
|
+
const index = match.indexOf(callback)
|
|
101
|
+
if (index === -1) return
|
|
102
|
+
match.splice(index, 1)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { Chat, type Thread, type Message } from "chat"
|
|
2
|
+
import { ChatBot } from "./index"
|
|
3
|
+
import { streamText, type ModelMessage } from "ai"
|
|
4
|
+
import { Provider } from "../provider/provider"
|
|
5
|
+
import { Config } from "../config/config"
|
|
6
|
+
import { Log } from "../util/log"
|
|
7
|
+
import { SystemPrompt } from "../session/system"
|
|
8
|
+
import { Plugin } from "../plugin"
|
|
9
|
+
import { clone } from "remeda"
|
|
10
|
+
import { Instance } from "../project/instance"
|
|
11
|
+
|
|
12
|
+
const log = Log.create({ service: "chatbot-handlers" })
|
|
13
|
+
|
|
14
|
+
export namespace BotHandlers {
|
|
15
|
+
const DEFAULT_PROMPT = `You are nikcli, an AI coding assistant. You help users with software engineering tasks including writing code, debugging, answering questions, and more. Be concise and helpful.`
|
|
16
|
+
const registeredBots = new WeakSet<Chat>()
|
|
17
|
+
|
|
18
|
+
export async function handleMention(
|
|
19
|
+
thread: Thread,
|
|
20
|
+
message: Message,
|
|
21
|
+
opts?: {
|
|
22
|
+
prompt?: string
|
|
23
|
+
tools?: Record<string, any>
|
|
24
|
+
},
|
|
25
|
+
): Promise<void> {
|
|
26
|
+
await thread.subscribe()
|
|
27
|
+
|
|
28
|
+
const spinner = await thread.post("Thinking...")
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
const response = await generateResponse(message.text, opts?.prompt, opts?.tools)
|
|
32
|
+
|
|
33
|
+
await spinner.edit(response)
|
|
34
|
+
} catch (error) {
|
|
35
|
+
log.error("Error generating response", { error })
|
|
36
|
+
await spinner.edit("Sorry, I encountered an error processing your request.")
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function handleMessage(
|
|
41
|
+
thread: Thread,
|
|
42
|
+
message: Message,
|
|
43
|
+
opts?: {
|
|
44
|
+
prompt?: string
|
|
45
|
+
tools?: Record<string, any>
|
|
46
|
+
},
|
|
47
|
+
): Promise<void> {
|
|
48
|
+
if (!message.isMention) return
|
|
49
|
+
|
|
50
|
+
await thread.startTyping()
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
const response = await generateResponse(message.text, opts?.prompt, opts?.tools)
|
|
54
|
+
|
|
55
|
+
await thread.post(response)
|
|
56
|
+
} catch (error) {
|
|
57
|
+
log.error("Error generating response", { error })
|
|
58
|
+
await thread.post("Sorry, I encountered an error processing your request.")
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function generateResponse(
|
|
63
|
+
userMessage: string,
|
|
64
|
+
customPrompt?: string,
|
|
65
|
+
customTools?: Record<string, any>,
|
|
66
|
+
): Promise<string> {
|
|
67
|
+
const modelInfo = await Provider.defaultModel()
|
|
68
|
+
const model = await Provider.getModel(modelInfo.providerID, modelInfo.modelID)
|
|
69
|
+
|
|
70
|
+
const language = await Provider.getLanguage(model)
|
|
71
|
+
|
|
72
|
+
const sessionID = `chatbot-${Date.now()}`
|
|
73
|
+
|
|
74
|
+
// Build system parts array for plugin transformation (mirrors llm.ts pattern)
|
|
75
|
+
const systemParts = [...SystemPrompt.header(model.providerID), customPrompt || DEFAULT_PROMPT].filter(Boolean)
|
|
76
|
+
|
|
77
|
+
const original = clone(systemParts)
|
|
78
|
+
await Plugin.trigger("experimental.chat.system.transform", { sessionID }, { system: systemParts })
|
|
79
|
+
if (systemParts.length === 0) {
|
|
80
|
+
systemParts.push(...original)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const messages: ModelMessage[] = [{ role: "user", content: userMessage }]
|
|
84
|
+
|
|
85
|
+
const result = await streamText({
|
|
86
|
+
model: language,
|
|
87
|
+
system: systemParts.join("\n"),
|
|
88
|
+
messages,
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
let fullResponse = ""
|
|
92
|
+
for await (const chunk of result.textStream) {
|
|
93
|
+
fullResponse += chunk
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return fullResponse
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export function registerAiHandler(bot: Chat, opts?: { prompt?: string; tools?: Record<string, any> }): void {
|
|
100
|
+
if (registeredBots.has(bot)) return
|
|
101
|
+
|
|
102
|
+
// Capture the current Instance directory so async handlers can re-establish context
|
|
103
|
+
const directory = Instance.directory
|
|
104
|
+
|
|
105
|
+
ChatBot.registerMentionHandler(bot, async (thread, message) => {
|
|
106
|
+
await Instance.provide({
|
|
107
|
+
directory,
|
|
108
|
+
fn: () => handleMention(thread, message, opts),
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
ChatBot.registerMessageHandler(bot, async (thread, message) => {
|
|
113
|
+
await Instance.provide({
|
|
114
|
+
directory,
|
|
115
|
+
fn: () => handleMessage(thread, message, opts),
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
log.info("AI handler registered for bot")
|
|
120
|
+
registeredBots.add(bot)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export async function ensureAiBot(name: string, config: Config.Connector): Promise<Chat | null> {
|
|
124
|
+
const bot = await ChatBot.createBot(name, config)
|
|
125
|
+
if (!bot) return null
|
|
126
|
+
registerAiHandler(bot)
|
|
127
|
+
return bot
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export async function initializeAllBots(): Promise<void> {
|
|
131
|
+
const config = await Config.get()
|
|
132
|
+
const connectors = config.connectors ?? {}
|
|
133
|
+
|
|
134
|
+
for (const [name, connector] of Object.entries(connectors)) {
|
|
135
|
+
if (typeof connector !== "object" || connector === null) continue
|
|
136
|
+
if (!("type" in connector)) continue
|
|
137
|
+
if (!["discord", "slack", "teams", "gchat", "linear", "github"].includes(connector.type)) continue
|
|
138
|
+
if (connector.enabled === false) continue
|
|
139
|
+
|
|
140
|
+
try {
|
|
141
|
+
const bot = await ensureAiBot(name, connector as Config.Connector)
|
|
142
|
+
if (bot) {
|
|
143
|
+
log.info("Bot initialized with AI handler", { name, platform: connector.type })
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
log.error("Failed to initialize bot", { name, error })
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|