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.
Files changed (602) hide show
  1. package/.turbo/turbo-typecheck.log +1 -0
  2. package/AGENTS.md +27 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +15 -0
  5. package/bin/nikcli +84 -0
  6. package/config.json +13 -0
  7. package/docs/tailscale-mobile/01-tailscale-setup.md +94 -0
  8. package/docs/tailscale-mobile/02-host-setup.md +115 -0
  9. package/docs/tailscale-mobile/03-phone-and-serve.md +134 -0
  10. package/docs/tailscale-mobile/README.md +59 -0
  11. package/examples/README.md +54 -0
  12. package/package.json +147 -0
  13. package/parsers-config.ts +253 -0
  14. package/script/build.ts +179 -0
  15. package/script/postinstall.mjs +125 -0
  16. package/script/publish-registries.ts +187 -0
  17. package/script/publish.ts +100 -0
  18. package/script/schema.ts +47 -0
  19. package/script/seed-e2e.ts +50 -0
  20. package/sequential-prancing-forest.md +373 -0
  21. package/src/acp/README.md +164 -0
  22. package/src/acp/agent.ts +1303 -0
  23. package/src/acp/session.ts +105 -0
  24. package/src/acp/types.ts +22 -0
  25. package/src/agent/agent.ts +528 -0
  26. package/src/agent/generate.txt +32 -0
  27. package/src/agent/prompt/compaction.txt +14 -0
  28. package/src/agent/prompt/explore.txt +18 -0
  29. package/src/agent/prompt/summary.txt +11 -0
  30. package/src/agent/prompt/title.txt +44 -0
  31. package/src/auth/index.ts +73 -0
  32. package/src/bun/index.ts +119 -0
  33. package/src/bun/registry.ts +54 -0
  34. package/src/bus/bus-event.ts +43 -0
  35. package/src/bus/global.ts +10 -0
  36. package/src/bus/index.ts +105 -0
  37. package/src/chatbot/handlers.ts +150 -0
  38. package/src/chatbot/index.ts +132 -0
  39. package/src/cli/bootstrap.ts +17 -0
  40. package/src/cli/cmd/acp.ts +69 -0
  41. package/src/cli/cmd/ads.ts +377 -0
  42. package/src/cli/cmd/agent.ts +259 -0
  43. package/src/cli/cmd/auth.ts +400 -0
  44. package/src/cli/cmd/chatbot.ts +420 -0
  45. package/src/cli/cmd/cmd.ts +7 -0
  46. package/src/cli/cmd/companion.ts +81 -0
  47. package/src/cli/cmd/connectors.ts +593 -0
  48. package/src/cli/cmd/debug/agent.ts +166 -0
  49. package/src/cli/cmd/debug/config.ts +16 -0
  50. package/src/cli/cmd/debug/file.ts +97 -0
  51. package/src/cli/cmd/debug/index.ts +48 -0
  52. package/src/cli/cmd/debug/lsp.ts +52 -0
  53. package/src/cli/cmd/debug/ripgrep.ts +87 -0
  54. package/src/cli/cmd/debug/scrap.ts +16 -0
  55. package/src/cli/cmd/debug/skill.ts +16 -0
  56. package/src/cli/cmd/debug/snapshot.ts +52 -0
  57. package/src/cli/cmd/export.ts +88 -0
  58. package/src/cli/cmd/generate.ts +38 -0
  59. package/src/cli/cmd/github.ts +412 -0
  60. package/src/cli/cmd/image-model.ts +128 -0
  61. package/src/cli/cmd/import.ts +201 -0
  62. package/src/cli/cmd/lovable.ts +128 -0
  63. package/src/cli/cmd/mcp.ts +738 -0
  64. package/src/cli/cmd/mobile.ts +223 -0
  65. package/src/cli/cmd/models.ts +77 -0
  66. package/src/cli/cmd/plug.ts +231 -0
  67. package/src/cli/cmd/pr.ts +104 -0
  68. package/src/cli/cmd/rag-model.ts +167 -0
  69. package/src/cli/cmd/remote.ts +416 -0
  70. package/src/cli/cmd/run.ts +589 -0
  71. package/src/cli/cmd/serve.ts +51 -0
  72. package/src/cli/cmd/session.ts +133 -0
  73. package/src/cli/cmd/speak-model.ts +204 -0
  74. package/src/cli/cmd/stats.ts +402 -0
  75. package/src/cli/cmd/tui/app.tsx +841 -0
  76. package/src/cli/cmd/tui/attach.ts +31 -0
  77. package/src/cli/cmd/tui/component/border.tsx +75 -0
  78. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  79. package/src/cli/cmd/tui/component/dialog-command.tsx +172 -0
  80. package/src/cli/cmd/tui/component/dialog-config.tsx +291 -0
  81. package/src/cli/cmd/tui/component/dialog-connectors.tsx +440 -0
  82. package/src/cli/cmd/tui/component/dialog-image-model.tsx +97 -0
  83. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  84. package/src/cli/cmd/tui/component/dialog-model.tsx +234 -0
  85. package/src/cli/cmd/tui/component/dialog-provider.tsx +260 -0
  86. package/src/cli/cmd/tui/component/dialog-rag-model.tsx +217 -0
  87. package/src/cli/cmd/tui/component/dialog-remote.tsx +489 -0
  88. package/src/cli/cmd/tui/component/dialog-session-list.tsx +170 -0
  89. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  90. package/src/cli/cmd/tui/component/dialog-settings/index.tsx +59 -0
  91. package/src/cli/cmd/tui/component/dialog-settings/prompt.tsx +40 -0
  92. package/src/cli/cmd/tui/component/dialog-settings/sidebar.tsx +39 -0
  93. package/src/cli/cmd/tui/component/dialog-settings/spinner.tsx +62 -0
  94. package/src/cli/cmd/tui/component/dialog-settings/ui.tsx +58 -0
  95. package/src/cli/cmd/tui/component/dialog-skills.tsx +117 -0
  96. package/src/cli/cmd/tui/component/dialog-speak-model.tsx +304 -0
  97. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  98. package/src/cli/cmd/tui/component/dialog-status.tsx +165 -0
  99. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  100. package/src/cli/cmd/tui/component/dialog-theme-create.tsx +717 -0
  101. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +52 -0
  102. package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +350 -0
  103. package/src/cli/cmd/tui/component/error-component.tsx +91 -0
  104. package/src/cli/cmd/tui/component/logo.tsx +103 -0
  105. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  106. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +669 -0
  107. package/src/cli/cmd/tui/component/prompt/frecency.tsx +89 -0
  108. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  109. package/src/cli/cmd/tui/component/prompt/index.tsx +2165 -0
  110. package/src/cli/cmd/tui/component/prompt/stash.tsx +63 -0
  111. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  112. package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
  113. package/src/cli/cmd/tui/component/table/markdown-table.tsx +267 -0
  114. package/src/cli/cmd/tui/component/table-db/db/connections.ts +75 -0
  115. package/src/cli/cmd/tui/component/table-db/db/db-connection.ts +223 -0
  116. package/src/cli/cmd/tui/component/table-db/db/db-preview.ts +202 -0
  117. package/src/cli/cmd/tui/component/table-db/db/factory.ts +77 -0
  118. package/src/cli/cmd/tui/component/table-db/db/index.ts +9 -0
  119. package/src/cli/cmd/tui/component/table-db/db/mysql-connection.ts +330 -0
  120. package/src/cli/cmd/tui/component/table-db/db/postgres-connection.ts +338 -0
  121. package/src/cli/cmd/tui/component/table-db/db/sqlite-connection.ts +302 -0
  122. package/src/cli/cmd/tui/component/table-db/db/types.ts +108 -0
  123. package/src/cli/cmd/tui/component/table-db/table/dbedit-hooks.ts +74 -0
  124. package/src/cli/cmd/tui/component/table-db/table/index.ts +15 -0
  125. package/src/cli/cmd/tui/component/table-db/table/table-events.ts +54 -0
  126. package/src/cli/cmd/tui/component/table-db/table/table-formatters.ts +191 -0
  127. package/src/cli/cmd/tui/component/table-db/table/table-hooks.ts +105 -0
  128. package/src/cli/cmd/tui/component/table-db/table/table-keyboard-handler.ts +255 -0
  129. package/src/cli/cmd/tui/component/table-db/table/table-layout-engine.ts +208 -0
  130. package/src/cli/cmd/tui/component/table-db/table/table-renderable.ts +486 -0
  131. package/src/cli/cmd/tui/component/table-db/table/table-selection-manager.ts +136 -0
  132. package/src/cli/cmd/tui/component/table-db/table/table-state.ts +198 -0
  133. package/src/cli/cmd/tui/component/table-db/table/types.ts +69 -0
  134. package/src/cli/cmd/tui/component/table-db/ui/db-visualizer.tsx +71 -0
  135. package/src/cli/cmd/tui/component/table-db/ui/index.ts +2 -0
  136. package/src/cli/cmd/tui/component/table-db/ui/table-renderer.ts +607 -0
  137. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  138. package/src/cli/cmd/tui/component/tips.tsx +195 -0
  139. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  140. package/src/cli/cmd/tui/context/args.tsx +14 -0
  141. package/src/cli/cmd/tui/context/directory.ts +13 -0
  142. package/src/cli/cmd/tui/context/exit.tsx +24 -0
  143. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  144. package/src/cli/cmd/tui/context/keybind.tsx +102 -0
  145. package/src/cli/cmd/tui/context/kv.tsx +52 -0
  146. package/src/cli/cmd/tui/context/local.tsx +458 -0
  147. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  148. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  149. package/src/cli/cmd/tui/context/route.tsx +54 -0
  150. package/src/cli/cmd/tui/context/sdk.tsx +128 -0
  151. package/src/cli/cmd/tui/context/server.tsx +8 -0
  152. package/src/cli/cmd/tui/context/sync.tsx +510 -0
  153. package/src/cli/cmd/tui/context/theme/abyss.json +233 -0
  154. package/src/cli/cmd/tui/context/theme/apple.json +235 -0
  155. package/src/cli/cmd/tui/context/theme/arctic.json +232 -0
  156. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  157. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  158. package/src/cli/cmd/tui/context/theme/ayuai.json +229 -0
  159. package/src/cli/cmd/tui/context/theme/blood.json +229 -0
  160. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  161. package/src/cli/cmd/tui/context/theme/catmoe.json +235 -0
  162. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  163. package/src/cli/cmd/tui/context/theme/catppuccin-latte.json +233 -0
  164. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  165. package/src/cli/cmd/tui/context/theme/catppuccin.json +259 -0
  166. package/src/cli/cmd/tui/context/theme/charcoal.json +230 -0
  167. package/src/cli/cmd/tui/context/theme/chromatic.json +235 -0
  168. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  169. package/src/cli/cmd/tui/context/theme/cosmic.json +234 -0
  170. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  171. package/src/cli/cmd/tui/context/theme/cyber.json +235 -0
  172. package/src/cli/cmd/tui/context/theme/dawnfox.json +229 -0
  173. package/src/cli/cmd/tui/context/theme/dimension.json +235 -0
  174. package/src/cli/cmd/tui/context/theme/dracula-official.json +222 -0
  175. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  176. package/src/cli/cmd/tui/context/theme/dream.json +235 -0
  177. package/src/cli/cmd/tui/context/theme/duo.json +235 -0
  178. package/src/cli/cmd/tui/context/theme/dusk.json +235 -0
  179. package/src/cli/cmd/tui/context/theme/ebony.json +232 -0
  180. package/src/cli/cmd/tui/context/theme/equilibrium.json +232 -0
  181. package/src/cli/cmd/tui/context/theme/ethereal.json +235 -0
  182. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  183. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  184. package/src/cli/cmd/tui/context/theme/fusion.json +235 -0
  185. package/src/cli/cmd/tui/context/theme/ghost.json +235 -0
  186. package/src/cli/cmd/tui/context/theme/github-dark.json +229 -0
  187. package/src/cli/cmd/tui/context/theme/github-dimmed.json +231 -0
  188. package/src/cli/cmd/tui/context/theme/github-light.json +229 -0
  189. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  190. package/src/cli/cmd/tui/context/theme/glass.json +235 -0
  191. package/src/cli/cmd/tui/context/theme/gold.json +235 -0
  192. package/src/cli/cmd/tui/context/theme/gone.json +234 -0
  193. package/src/cli/cmd/tui/context/theme/greyscale.json +229 -0
  194. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  195. package/src/cli/cmd/tui/context/theme/hacker.json +229 -0
  196. package/src/cli/cmd/tui/context/theme/holo.json +235 -0
  197. package/src/cli/cmd/tui/context/theme/ink.json +235 -0
  198. package/src/cli/cmd/tui/context/theme/jet.json +233 -0
  199. package/src/cli/cmd/tui/context/theme/kanagawa.json +227 -0
  200. package/src/cli/cmd/tui/context/theme/lavender.json +236 -0
  201. package/src/cli/cmd/tui/context/theme/lightph.json +235 -0
  202. package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
  203. package/src/cli/cmd/tui/context/theme/material-ocean.json +230 -0
  204. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  205. package/src/cli/cmd/tui/context/theme/matrix.json +227 -0
  206. package/src/cli/cmd/tui/context/theme/mercury.json +245 -0
  207. package/src/cli/cmd/tui/context/theme/midnight.json +235 -0
  208. package/src/cli/cmd/tui/context/theme/modern.json +235 -0
  209. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  210. package/src/cli/cmd/tui/context/theme/muted.json +229 -0
  211. package/src/cli/cmd/tui/context/theme/neon.json +229 -0
  212. package/src/cli/cmd/tui/context/theme/neonfusion.json +235 -0
  213. package/src/cli/cmd/tui/context/theme/neutral.json +235 -0
  214. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  215. package/src/cli/cmd/tui/context/theme/nikcli.json +245 -0
  216. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  217. package/src/cli/cmd/tui/context/theme/nordic.json +235 -0
  218. package/src/cli/cmd/tui/context/theme/nova.json +235 -0
  219. package/src/cli/cmd/tui/context/theme/obsidian.json +234 -0
  220. package/src/cli/cmd/tui/context/theme/one-dark.json +231 -0
  221. package/src/cli/cmd/tui/context/theme/one-pro.json +229 -0
  222. package/src/cli/cmd/tui/context/theme/onyx.json +233 -0
  223. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  224. package/src/cli/cmd/tui/context/theme/osaka-jade.json +240 -0
  225. package/src/cli/cmd/tui/context/theme/oxocarbon.json +229 -0
  226. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  227. package/src/cli/cmd/tui/context/theme/poimandres.json +230 -0
  228. package/src/cli/cmd/tui/context/theme/prism.json +235 -0
  229. package/src/cli/cmd/tui/context/theme/radiant.json +235 -0
  230. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  231. package/src/cli/cmd/tui/context/theme/shadow.json +235 -0
  232. package/src/cli/cmd/tui/context/theme/silicon.json +235 -0
  233. package/src/cli/cmd/tui/context/theme/slate.json +233 -0
  234. package/src/cli/cmd/tui/context/theme/soft.json +235 -0
  235. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  236. package/src/cli/cmd/tui/context/theme/spectrum.json +235 -0
  237. package/src/cli/cmd/tui/context/theme/starlight.json +233 -0
  238. package/src/cli/cmd/tui/context/theme/sunrise.json +235 -0
  239. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  240. package/src/cli/cmd/tui/context/theme/tech.json +235 -0
  241. package/src/cli/cmd/tui/context/theme/tokyonight-storm.json +245 -0
  242. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  243. package/src/cli/cmd/tui/context/theme/vapor.json +235 -0
  244. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  245. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  246. package/src/cli/cmd/tui/context/theme/vivid.json +232 -0
  247. package/src/cli/cmd/tui/context/theme/void.json +235 -0
  248. package/src/cli/cmd/tui/context/theme/vscode.json +235 -0
  249. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  250. package/src/cli/cmd/tui/context/theme/zinc.json +236 -0
  251. package/src/cli/cmd/tui/context/theme.tsx +1303 -0
  252. package/src/cli/cmd/tui/event.ts +48 -0
  253. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +152 -0
  254. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +50 -0
  255. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +63 -0
  256. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  257. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  258. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  259. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
  260. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
  261. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +288 -0
  262. package/src/cli/cmd/tui/plugin/api.tsx +407 -0
  263. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  264. package/src/cli/cmd/tui/plugin/internal.ts +25 -0
  265. package/src/cli/cmd/tui/plugin/runtime.ts +1048 -0
  266. package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
  267. package/src/cli/cmd/tui/routes/home.tsx +153 -0
  268. package/src/cli/cmd/tui/routes/session/dbedit.tsx +474 -0
  269. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +65 -0
  270. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +110 -0
  271. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +105 -0
  272. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  273. package/src/cli/cmd/tui/routes/session/footer.tsx +75 -0
  274. package/src/cli/cmd/tui/routes/session/header.tsx +177 -0
  275. package/src/cli/cmd/tui/routes/session/index.tsx +2280 -0
  276. package/src/cli/cmd/tui/routes/session/permission.tsx +540 -0
  277. package/src/cli/cmd/tui/routes/session/question.tsx +435 -0
  278. package/src/cli/cmd/tui/routes/session/sidebar.tsx +313 -0
  279. package/src/cli/cmd/tui/thread.ts +174 -0
  280. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  281. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  282. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +204 -0
  283. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  284. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +102 -0
  285. package/src/cli/cmd/tui/ui/dialog-select.tsx +389 -0
  286. package/src/cli/cmd/tui/ui/dialog.tsx +180 -0
  287. package/src/cli/cmd/tui/ui/link.tsx +34 -0
  288. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  289. package/src/cli/cmd/tui/ui/toast.tsx +138 -0
  290. package/src/cli/cmd/tui/util/clipboard.ts +154 -0
  291. package/src/cli/cmd/tui/util/editor.ts +32 -0
  292. package/src/cli/cmd/tui/util/signal.ts +7 -0
  293. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  294. package/src/cli/cmd/tui/util/transcript.ts +98 -0
  295. package/src/cli/cmd/tui/win32.ts +110 -0
  296. package/src/cli/cmd/tui/worker.ts +156 -0
  297. package/src/cli/cmd/uninstall.ts +357 -0
  298. package/src/cli/cmd/upgrade.ts +72 -0
  299. package/src/cli/cmd/web.ts +87 -0
  300. package/src/cli/cmd/workspace-serve.ts +16 -0
  301. package/src/cli/error.ts +57 -0
  302. package/src/cli/network.ts +55 -0
  303. package/src/cli/remote/index.ts +36 -0
  304. package/src/cli/remote/notifications.ts +104 -0
  305. package/src/cli/remote/qr-renderer.ts +86 -0
  306. package/src/cli/remote/remote-service.ts +757 -0
  307. package/src/cli/remote/session-manager.ts +284 -0
  308. package/src/cli/remote/subagent-hooks.ts +151 -0
  309. package/src/cli/remote/types.ts +121 -0
  310. package/src/cli/ui.ts +96 -0
  311. package/src/cli/upgrade.ts +25 -0
  312. package/src/command/index.ts +174 -0
  313. package/src/command/template/initialize.txt +10 -0
  314. package/src/command/template/review.txt +99 -0
  315. package/src/config/config.ts +1760 -0
  316. package/src/config/markdown.ts +88 -0
  317. package/src/config/migrate-tui-config.ts +155 -0
  318. package/src/config/paths.ts +174 -0
  319. package/src/config/tui-schema.ts +36 -0
  320. package/src/config/tui.ts +209 -0
  321. package/src/connectors/api/base.ts +75 -0
  322. package/src/connectors/api/figma.ts +103 -0
  323. package/src/connectors/api/github.ts +247 -0
  324. package/src/connectors/api/lovable.ts +126 -0
  325. package/src/connectors/api/slack.ts +137 -0
  326. package/src/connectors/auth.ts +68 -0
  327. package/src/connectors/cache.ts +119 -0
  328. package/src/connectors/credentials.ts +81 -0
  329. package/src/connectors/index.ts +202 -0
  330. package/src/connectors/registry.ts +358 -0
  331. package/src/docs/context.ts +120 -0
  332. package/src/docs/library.ts +189 -0
  333. package/src/env/index.ts +26 -0
  334. package/src/file/ignore.ts +83 -0
  335. package/src/file/index.ts +411 -0
  336. package/src/file/ripgrep.ts +402 -0
  337. package/src/file/time.ts +65 -0
  338. package/src/file/watcher.ts +127 -0
  339. package/src/flag/flag.ts +128 -0
  340. package/src/format/formatter.ts +356 -0
  341. package/src/format/index.ts +137 -0
  342. package/src/global/index.ts +57 -0
  343. package/src/id/id.ts +83 -0
  344. package/src/ide/index.ts +76 -0
  345. package/src/index.ts +184 -0
  346. package/src/installation/index.ts +246 -0
  347. package/src/lsp/client.ts +250 -0
  348. package/src/lsp/index.ts +483 -0
  349. package/src/lsp/language.ts +119 -0
  350. package/src/lsp/server.ts +2046 -0
  351. package/src/mcp/auth.ts +121 -0
  352. package/src/mcp/index.ts +860 -0
  353. package/src/mcp/oauth-callback.ts +198 -0
  354. package/src/mcp/oauth-provider.ts +148 -0
  355. package/src/mobile/auth.ts +97 -0
  356. package/src/mobile/github-repo.ts +185 -0
  357. package/src/patch/index.ts +631 -0
  358. package/src/permission/arity.ts +150 -0
  359. package/src/permission/dbedit.ts +236 -0
  360. package/src/permission/index.ts +210 -0
  361. package/src/permission/next.ts +287 -0
  362. package/src/plugin/codex.ts +493 -0
  363. package/src/plugin/copilot.ts +261 -0
  364. package/src/plugin/index.ts +714 -0
  365. package/src/plugin/install.ts +379 -0
  366. package/src/plugin/meta.ts +165 -0
  367. package/src/plugin/shared.ts +188 -0
  368. package/src/project/bootstrap.ts +35 -0
  369. package/src/project/instance.ts +84 -0
  370. package/src/project/project.ts +373 -0
  371. package/src/project/state.ts +66 -0
  372. package/src/project/vcs.ts +76 -0
  373. package/src/prompt/stash-store.ts +93 -0
  374. package/src/provider/auth.ts +147 -0
  375. package/src/provider/models-macro.ts +22 -0
  376. package/src/provider/models.ts +216 -0
  377. package/src/provider/provider.ts +1483 -0
  378. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  379. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  380. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
  381. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  382. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  383. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  384. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  385. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  386. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1732 -0
  387. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  388. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  389. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  390. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  391. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  392. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  393. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  394. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  395. package/src/provider/transform.ts +828 -0
  396. package/src/pty/index.ts +241 -0
  397. package/src/question/index.ts +171 -0
  398. package/src/rag/chunk.ts +43 -0
  399. package/src/rag/embed.ts +179 -0
  400. package/src/rag/index.ts +376 -0
  401. package/src/rag/storage.ts +76 -0
  402. package/src/scheduler/index.ts +61 -0
  403. package/src/server/error.ts +36 -0
  404. package/src/server/event.ts +7 -0
  405. package/src/server/mdns.ts +59 -0
  406. package/src/server/routes/chatbot.ts +205 -0
  407. package/src/server/routes/companion.ts +729 -0
  408. package/src/server/routes/config.ts +92 -0
  409. package/src/server/routes/connectors.ts +121 -0
  410. package/src/server/routes/dbedit.ts +76 -0
  411. package/src/server/routes/experimental.ts +210 -0
  412. package/src/server/routes/file.ts +197 -0
  413. package/src/server/routes/global.ts +135 -0
  414. package/src/server/routes/mcp.ts +225 -0
  415. package/src/server/routes/mobile.ts +2044 -0
  416. package/src/server/routes/permission.ts +68 -0
  417. package/src/server/routes/project.ts +82 -0
  418. package/src/server/routes/provider.ts +235 -0
  419. package/src/server/routes/pty.ts +169 -0
  420. package/src/server/routes/question.ts +98 -0
  421. package/src/server/routes/session.ts +968 -0
  422. package/src/server/routes/tui.ts +379 -0
  423. package/src/server/routes/workspace.ts +104 -0
  424. package/src/server/server.ts +761 -0
  425. package/src/server/ssh.ts +207 -0
  426. package/src/session/auth.ts +402 -0
  427. package/src/session/compaction.ts +253 -0
  428. package/src/session/generate.ts +38 -0
  429. package/src/session/index.ts +598 -0
  430. package/src/session/llm.ts +273 -0
  431. package/src/session/message-v2.ts +836 -0
  432. package/src/session/message.ts +189 -0
  433. package/src/session/processor.ts +408 -0
  434. package/src/session/prompt/anthropic-20250930.txt +165 -0
  435. package/src/session/prompt/anthropic.txt +105 -0
  436. package/src/session/prompt/anthropic_spoof.txt +1 -0
  437. package/src/session/prompt/beast.txt +147 -0
  438. package/src/session/prompt/build-switch.txt +5 -0
  439. package/src/session/prompt/codex_header.txt +79 -0
  440. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  441. package/src/session/prompt/gemini.txt +155 -0
  442. package/src/session/prompt/max-steps.txt +16 -0
  443. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  444. package/src/session/prompt/plan.txt +25 -0
  445. package/src/session/prompt/qwen.txt +108 -0
  446. package/src/session/prompt.ts +1942 -0
  447. package/src/session/retry.ts +90 -0
  448. package/src/session/revert.ts +120 -0
  449. package/src/session/stats.ts +404 -0
  450. package/src/session/status.ts +84 -0
  451. package/src/session/summary.ts +184 -0
  452. package/src/session/system.ts +195 -0
  453. package/src/session/toast.tsx +105 -0
  454. package/src/session/todo.ts +258 -0
  455. package/src/session/uninstall.ts +357 -0
  456. package/src/share/share-next.ts +421 -0
  457. package/src/share/share.ts +92 -0
  458. package/src/shell/shell.ts +65 -0
  459. package/src/skill/index.ts +1 -0
  460. package/src/skill/skill.ts +232 -0
  461. package/src/snapshot/index.ts +297 -0
  462. package/src/storage/storage.ts +227 -0
  463. package/src/tool/apply_patch.ts +288 -0
  464. package/src/tool/apply_patch.txt +33 -0
  465. package/src/tool/bash.ts +252 -0
  466. package/src/tool/bash.txt +115 -0
  467. package/src/tool/batch.ts +175 -0
  468. package/src/tool/batch.txt +24 -0
  469. package/src/tool/codesearch.ts +132 -0
  470. package/src/tool/codesearch.txt +12 -0
  471. package/src/tool/context_collect.ts +152 -0
  472. package/src/tool/context_collect.txt +9 -0
  473. package/src/tool/context_diagnostics.ts +81 -0
  474. package/src/tool/context_diagnostics.txt +5 -0
  475. package/src/tool/context_related.ts +117 -0
  476. package/src/tool/context_related.txt +5 -0
  477. package/src/tool/context_search.ts +108 -0
  478. package/src/tool/context_search.txt +8 -0
  479. package/src/tool/db-diff.ts +434 -0
  480. package/src/tool/db-table.txt +15 -0
  481. package/src/tool/docs_add.ts +50 -0
  482. package/src/tool/docs_add.txt +5 -0
  483. package/src/tool/docs_context.ts +56 -0
  484. package/src/tool/docs_context.txt +4 -0
  485. package/src/tool/docs_gap_report.ts +79 -0
  486. package/src/tool/docs_gap_report.txt +7 -0
  487. package/src/tool/docs_load.ts +41 -0
  488. package/src/tool/docs_load.txt +4 -0
  489. package/src/tool/docs_request.ts +129 -0
  490. package/src/tool/docs_request.txt +7 -0
  491. package/src/tool/docs_search.ts +51 -0
  492. package/src/tool/docs_search.txt +6 -0
  493. package/src/tool/docs_unload.ts +38 -0
  494. package/src/tool/docs_unload.txt +5 -0
  495. package/src/tool/edit.ts +614 -0
  496. package/src/tool/edit.txt +10 -0
  497. package/src/tool/external-directory.ts +32 -0
  498. package/src/tool/generate_image.ts +174 -0
  499. package/src/tool/generate_image.txt +12 -0
  500. package/src/tool/glob.ts +79 -0
  501. package/src/tool/glob.txt +6 -0
  502. package/src/tool/grep.ts +153 -0
  503. package/src/tool/grep.txt +8 -0
  504. package/src/tool/invalid.ts +17 -0
  505. package/src/tool/ls.ts +116 -0
  506. package/src/tool/ls.txt +1 -0
  507. package/src/tool/lsp.ts +96 -0
  508. package/src/tool/lsp.txt +19 -0
  509. package/src/tool/memory_search.ts +141 -0
  510. package/src/tool/memory_search.txt +8 -0
  511. package/src/tool/multiedit.ts +46 -0
  512. package/src/tool/multiedit.txt +41 -0
  513. package/src/tool/plan-enter.txt +14 -0
  514. package/src/tool/plan-exit.txt +13 -0
  515. package/src/tool/plan.ts +130 -0
  516. package/src/tool/question.ts +33 -0
  517. package/src/tool/question.txt +10 -0
  518. package/src/tool/rag_index.ts +77 -0
  519. package/src/tool/rag_index.txt +10 -0
  520. package/src/tool/rag_reset.ts +26 -0
  521. package/src/tool/rag_reset.txt +4 -0
  522. package/src/tool/rag_search.ts +62 -0
  523. package/src/tool/rag_search.txt +6 -0
  524. package/src/tool/rag_status.ts +45 -0
  525. package/src/tool/rag_status.txt +4 -0
  526. package/src/tool/read.ts +203 -0
  527. package/src/tool/read.txt +12 -0
  528. package/src/tool/registry.ts +214 -0
  529. package/src/tool/skill.ts +169 -0
  530. package/src/tool/skill.txt +3 -0
  531. package/src/tool/smart_docs.ts +74 -0
  532. package/src/tool/smart_docs.txt +7 -0
  533. package/src/tool/speak/elevenlabs.ts +201 -0
  534. package/src/tool/speak/openrouter.ts +240 -0
  535. package/src/tool/speak/provider.ts +83 -0
  536. package/src/tool/speak.ts +440 -0
  537. package/src/tool/task.ts +194 -0
  538. package/src/tool/task.txt +60 -0
  539. package/src/tool/todo.ts +53 -0
  540. package/src/tool/todoread.txt +14 -0
  541. package/src/tool/todowrite.txt +167 -0
  542. package/src/tool/tool.ts +87 -0
  543. package/src/tool/tree.ts +218 -0
  544. package/src/tool/tree.txt +8 -0
  545. package/src/tool/truncation.ts +106 -0
  546. package/src/tool/use-connector.ts +47 -0
  547. package/src/tool/voice.ts +188 -0
  548. package/src/tool/webfetch.ts +205 -0
  549. package/src/tool/webfetch.txt +13 -0
  550. package/src/tool/websearch.ts +150 -0
  551. package/src/tool/websearch.txt +14 -0
  552. package/src/tool/write.ts +80 -0
  553. package/src/tool/write.txt +8 -0
  554. package/src/util/archive.ts +16 -0
  555. package/src/util/color.ts +19 -0
  556. package/src/util/context.ts +25 -0
  557. package/src/util/defer.ts +12 -0
  558. package/src/util/error.ts +77 -0
  559. package/src/util/eventloop.ts +20 -0
  560. package/src/util/filesystem.ts +125 -0
  561. package/src/util/flock.ts +329 -0
  562. package/src/util/fn.ts +11 -0
  563. package/src/util/format.ts +20 -0
  564. package/src/util/hash.ts +7 -0
  565. package/src/util/iife.ts +3 -0
  566. package/src/util/keybind.ts +103 -0
  567. package/src/util/lazy.ts +18 -0
  568. package/src/util/locale.ts +81 -0
  569. package/src/util/lock.ts +98 -0
  570. package/src/util/log.ts +180 -0
  571. package/src/util/network.ts +9 -0
  572. package/src/util/process.ts +15 -0
  573. package/src/util/queue.ts +32 -0
  574. package/src/util/record.ts +3 -0
  575. package/src/util/rpc.ts +66 -0
  576. package/src/util/scrap.ts +10 -0
  577. package/src/util/signal.ts +12 -0
  578. package/src/util/timeout.ts +14 -0
  579. package/src/util/token.ts +7 -0
  580. package/src/util/wildcard.ts +56 -0
  581. package/src/workspace/adaptors/index.ts +271 -0
  582. package/src/workspace/adaptors/types.ts +14 -0
  583. package/src/workspace/adaptors/worktree.ts +31 -0
  584. package/src/workspace/config.ts +19 -0
  585. package/src/workspace/index.ts +223 -0
  586. package/src/workspace/session-proxy-middleware.ts +97 -0
  587. package/src/workspace/sse.ts +66 -0
  588. package/src/workspace/workspace-context.ts +23 -0
  589. package/src/workspace/workspace-server/routes.ts +33 -0
  590. package/src/workspace/workspace-server/server.ts +47 -0
  591. package/src/worktree/index.ts +487 -0
  592. package/sst-env.d.ts +10 -0
  593. package/test/benchmark.test.ts +121 -0
  594. package/test/build-optimizations.test.ts +124 -0
  595. package/test/id-benchmark.test.ts +132 -0
  596. package/test/optimizations.test.ts +302 -0
  597. package/test/preload.ts +1 -0
  598. package/test/solidjs-benchmark.test.ts +262 -0
  599. package/test/solidjs-optimizations.test.ts +259 -0
  600. package/test/tui-benchmark.test.ts +230 -0
  601. package/test/wildcard-benchmark.test.ts +180 -0
  602. package/tsconfig.json +26 -0
@@ -0,0 +1,4 @@
1
+ Show RAG index status.
2
+
3
+ Usage:
4
+ - no parameters
@@ -0,0 +1,203 @@
1
+ import z from "zod"
2
+ import * as fs from "fs"
3
+ import * as path from "path"
4
+ import { Tool } from "./tool"
5
+ import { LSP } from "../lsp"
6
+ import { FileTime } from "../file/time"
7
+ import DESCRIPTION from "./read.txt"
8
+ import { Instance } from "../project/instance"
9
+ import { Identifier } from "../id/id"
10
+ import { assertExternalDirectory } from "./external-directory"
11
+
12
+ const DEFAULT_READ_LIMIT = 2000
13
+ const MAX_LINE_LENGTH = 2000
14
+ const MAX_BYTES = 50 * 1024
15
+
16
+ export const ReadTool = Tool.define("read", {
17
+ description: DESCRIPTION,
18
+ parameters: z.object({
19
+ filePath: z.string().describe("The absolute path to the file or directory to read"),
20
+ offset: z.coerce.number().describe("The line number to start reading from (1-indexed)").optional(),
21
+ limit: z.coerce.number().describe("The maximum number of lines to read (defaults to 2000)").optional(),
22
+ }),
23
+ async execute(params, ctx) {
24
+ if (params.offset !== undefined && params.offset < 1) {
25
+ throw new Error("offset must be greater than or equal to 1")
26
+ }
27
+ let filepath = params.filePath
28
+ if (!path.isAbsolute(filepath)) {
29
+ filepath = path.join(process.cwd(), filepath)
30
+ }
31
+ const title = path.relative(Instance.worktree, filepath)
32
+
33
+ await assertExternalDirectory(ctx, filepath, {
34
+ bypass: Boolean(ctx.extra?.["bypassCwdCheck"]),
35
+ })
36
+
37
+ await ctx.ask({
38
+ permission: "read",
39
+ patterns: [filepath],
40
+ always: ["*"],
41
+ metadata: {},
42
+ })
43
+
44
+ const file = Bun.file(filepath)
45
+ if (!(await file.exists())) {
46
+ const dir = path.dirname(filepath)
47
+ const base = path.basename(filepath)
48
+
49
+ const dirEntries = fs.readdirSync(dir)
50
+ const suggestions = dirEntries
51
+ .filter(
52
+ (entry) =>
53
+ entry.toLowerCase().includes(base.toLowerCase()) || base.toLowerCase().includes(entry.toLowerCase()),
54
+ )
55
+ .map((entry) => path.join(dir, entry))
56
+ .slice(0, 3)
57
+
58
+ if (suggestions.length > 0) {
59
+ throw new Error(`File not found: ${filepath}\n\nDid you mean one of these?\n${suggestions.join("\n")}`)
60
+ }
61
+
62
+ throw new Error(`File not found: ${filepath}`)
63
+ }
64
+
65
+ const isImage =
66
+ file.type.startsWith("image/") && file.type !== "image/svg+xml" && file.type !== "image/vnd.fastbidsheet"
67
+ const isPdf = file.type === "application/pdf"
68
+ if (isImage || isPdf) {
69
+ const mime = file.type
70
+ const msg = `${isImage ? "Image" : "PDF"} read successfully`
71
+ return {
72
+ title,
73
+ output: msg,
74
+ metadata: {
75
+ preview: msg,
76
+ truncated: false,
77
+ },
78
+ attachments: [
79
+ {
80
+ id: Identifier.ascending("part"),
81
+ sessionID: ctx.sessionID,
82
+ messageID: ctx.messageID,
83
+ type: "file",
84
+ mime,
85
+ url: `data:${mime};base64,${Buffer.from(await file.bytes()).toString("base64")}`,
86
+ },
87
+ ],
88
+ }
89
+ }
90
+
91
+ const isBinary = await isBinaryFile(filepath, file)
92
+ if (isBinary) throw new Error(`Cannot read binary file: ${filepath}`)
93
+
94
+ const limit = params.limit ?? DEFAULT_READ_LIMIT
95
+ const offset = params.offset ?? 1
96
+ const start = offset - 1
97
+ const lines = await file.text().then((text) => text.split("\n"))
98
+ if (start >= lines.length) throw new Error(`Offset ${offset} is out of range for this file (${lines.length} lines)`)
99
+
100
+ const raw: string[] = []
101
+ let bytes = 0
102
+ let truncatedByBytes = false
103
+ for (let i = start; i < Math.min(lines.length, start + limit); i++) {
104
+ const line = lines[i].length > MAX_LINE_LENGTH ? lines[i].substring(0, MAX_LINE_LENGTH) + "..." : lines[i]
105
+ const size = Buffer.byteLength(line, "utf-8") + (raw.length > 0 ? 1 : 0)
106
+ if (bytes + size > MAX_BYTES) {
107
+ truncatedByBytes = true
108
+ break
109
+ }
110
+ raw.push(line)
111
+ bytes += size
112
+ }
113
+
114
+ const content = raw.map((line, index) => {
115
+ return `${index + offset}: ${line}`
116
+ })
117
+ const preview = raw.slice(0, 20).join("\n")
118
+
119
+ let output = "<file>\n"
120
+ output += content.join("\n")
121
+
122
+ const totalLines = lines.length
123
+ const lastReadLine = offset + raw.length - 1
124
+ const hasMoreLines = totalLines > lastReadLine
125
+ const truncated = hasMoreLines || truncatedByBytes
126
+
127
+ if (truncatedByBytes) {
128
+ output += `\n\n(Output truncated at ${MAX_BYTES} bytes. Use 'offset' parameter to read beyond line ${lastReadLine})`
129
+ } else if (hasMoreLines) {
130
+ output += `\n\n(File has more lines. Use 'offset' parameter to read beyond line ${lastReadLine})`
131
+ } else {
132
+ output += `\n\n(End of file - total ${totalLines} lines)`
133
+ }
134
+ output += "\n</file>"
135
+
136
+ LSP.touchFile(filepath, false)
137
+ FileTime.read(ctx.sessionID, filepath)
138
+
139
+ return {
140
+ title,
141
+ output,
142
+ metadata: {
143
+ preview,
144
+ truncated,
145
+ },
146
+ }
147
+ },
148
+ })
149
+
150
+ async function isBinaryFile(filepath: string, file: Bun.BunFile): Promise<boolean> {
151
+ const ext = path.extname(filepath).toLowerCase()
152
+ switch (ext) {
153
+ case ".zip":
154
+ case ".tar":
155
+ case ".gz":
156
+ case ".exe":
157
+ case ".dll":
158
+ case ".so":
159
+ case ".class":
160
+ case ".jar":
161
+ case ".war":
162
+ case ".7z":
163
+ case ".doc":
164
+ case ".docx":
165
+ case ".xls":
166
+ case ".xlsx":
167
+ case ".ppt":
168
+ case ".pptx":
169
+ case ".odt":
170
+ case ".ods":
171
+ case ".odp":
172
+ case ".bin":
173
+ case ".dat":
174
+ case ".obj":
175
+ case ".o":
176
+ case ".a":
177
+ case ".lib":
178
+ case ".wasm":
179
+ case ".pyc":
180
+ case ".pyo":
181
+ return true
182
+ default:
183
+ break
184
+ }
185
+
186
+ const stat = await file.stat()
187
+ const fileSize = stat.size
188
+ if (fileSize === 0) return false
189
+
190
+ const bufferSize = Math.min(4096, fileSize)
191
+ const buffer = await file.arrayBuffer()
192
+ if (buffer.byteLength === 0) return false
193
+ const bytes = new Uint8Array(buffer.slice(0, bufferSize))
194
+
195
+ let nonPrintableCount = 0
196
+ for (let i = 0; i < bytes.length; i++) {
197
+ if (bytes[i] === 0) return true
198
+ if (bytes[i] < 9 || (bytes[i] > 13 && bytes[i] < 32)) {
199
+ nonPrintableCount++
200
+ }
201
+ }
202
+ return nonPrintableCount / bytes.length > 0.3
203
+ }
@@ -0,0 +1,12 @@
1
+ Reads a file from the local filesystem. You can access any file directly by using this tool.
2
+ Assume this tool is able to read all files on the machine. If the User provides a path to a file assume that path is valid. It is okay to read a file that does not exist; an error will be returned.
3
+
4
+ Usage:
5
+ - The filePath parameter must be an absolute path, not a relative path
6
+ - By default, it reads up to 2000 lines starting from the beginning of the file
7
+ - You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters
8
+ - Any lines longer than 2000 characters will be truncated
9
+ - Results are returned using cat -n format, with line numbers starting at 1
10
+ - You have the capability to call multiple tools in a single response. It is always better to speculatively read multiple files as a batch that are potentially useful.
11
+ - If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.
12
+ - You can read image files using this tool.
@@ -0,0 +1,214 @@
1
+ import { plugin } from "bun"
2
+ import { QuestionTool } from "./question"
3
+ import { BashTool } from "./bash"
4
+ import { EditTool } from "./edit"
5
+ import { GlobTool } from "./glob"
6
+ import { GrepTool } from "./grep"
7
+ import { BatchTool } from "./batch"
8
+ import { ReadTool } from "./read"
9
+ import { TaskTool } from "./task"
10
+ import { TodoWriteTool, TodoReadTool } from "./todo"
11
+ import { WebFetchTool } from "./webfetch"
12
+ import { WriteTool } from "./write"
13
+ import { InvalidTool } from "./invalid"
14
+ import { SkillTool } from "./skill"
15
+ import type { Agent } from "../agent/agent"
16
+ import { Tool } from "./tool"
17
+ import { Instance } from "../project/instance"
18
+ import { Config } from "../config/config"
19
+ import path from "path"
20
+ import { type ToolDefinition } from "@nikcli-ai/plugin"
21
+ import z from "zod"
22
+ import { Plugin } from "../plugin"
23
+ import { WebSearchTool } from "./websearch"
24
+ import { CodeSearchTool } from "./codesearch"
25
+ import { TreeTool } from "./tree"
26
+ import { DocsAddTool } from "./docs_add"
27
+ import { DocsSearchTool } from "./docs_search"
28
+ import { DocsLoadTool } from "./docs_load"
29
+ import { DocsUnloadTool } from "./docs_unload"
30
+ import { DocsContextTool } from "./docs_context"
31
+ import { DocsRequestTool } from "./docs_request"
32
+ import { DocsGapReportTool } from "./docs_gap_report"
33
+ import { SmartDocsTool } from "./smart_docs"
34
+ import { ContextCollectTool } from "./context_collect"
35
+ import { ContextSearchTool } from "./context_search"
36
+ import { ContextRelatedTool } from "./context_related"
37
+ import { ContextDiagnosticsTool } from "./context_diagnostics"
38
+ import { MemorySearchTool } from "./memory_search"
39
+ import { RagIndexTool } from "./rag_index"
40
+ import { RagSearchTool } from "./rag_search"
41
+ import { RagStatusTool } from "./rag_status"
42
+ import { RagResetTool } from "./rag_reset"
43
+ import { GenerateImageTool } from "./generate_image"
44
+ import { Flag } from "@/flag/flag"
45
+ import { Log } from "@/util/log"
46
+ import { LspTool } from "./lsp"
47
+ import { Truncate } from "./truncation"
48
+ import { PlanExitTool, PlanEnterTool } from "./plan"
49
+ import { ApplyPatchTool } from "./apply_patch"
50
+ import { UseConnectorTool } from "./use-connector"
51
+ import { SpeakTool } from "./speak"
52
+
53
+ const _toolDir = import.meta.dir
54
+
55
+ plugin({
56
+ name: "nikcli-plugin-resolver",
57
+ setup(build) {
58
+ build.onResolve({ filter: /^@nikcli-ai\/plugin/ }, (args) => {
59
+ try {
60
+ return { path: Bun.resolveSync(args.path, _toolDir) }
61
+ } catch {
62
+ return undefined
63
+ }
64
+ })
65
+ },
66
+ })
67
+
68
+ export namespace ToolRegistry {
69
+ const log = Log.create({ service: "tool.registry" })
70
+
71
+ export const state = Instance.state(async () => {
72
+ const custom = [] as Tool.Info[]
73
+ const glob = new Bun.Glob("{tool,tools}/*.{js,ts}")
74
+
75
+ for (const dir of await Config.directories()) {
76
+ for await (const match of glob.scan({
77
+ cwd: dir,
78
+ absolute: true,
79
+ followSymlinks: true,
80
+ dot: true,
81
+ })) {
82
+ const namespace = path.basename(match, path.extname(match))
83
+ const mod = await import(match)
84
+ for (const [id, def] of Object.entries<ToolDefinition>(mod)) {
85
+ custom.push(fromPlugin(id === "default" ? namespace : `${namespace}_${id}`, def))
86
+ }
87
+ }
88
+ }
89
+
90
+ const plugins = await Plugin.list()
91
+ for (const plugin of plugins) {
92
+ for (const [id, def] of Object.entries(plugin.tool ?? {})) {
93
+ custom.push(fromPlugin(id, def))
94
+ }
95
+ }
96
+
97
+ return { custom }
98
+ })
99
+
100
+ function fromPlugin(id: string, def: ToolDefinition): Tool.Info {
101
+ return {
102
+ id,
103
+ init: async (initCtx) => ({
104
+ parameters: z.object(def.args),
105
+ description: def.description,
106
+ execute: async (args, ctx) => {
107
+ const result = await def.execute(args as any, ctx)
108
+ const out = await Truncate.output(result, {}, initCtx?.agent)
109
+ return {
110
+ title: "",
111
+ output: out.truncated ? out.content : result,
112
+ metadata: { truncated: out.truncated, outputPath: out.truncated ? out.outputPath : undefined },
113
+ }
114
+ },
115
+ }),
116
+ }
117
+ }
118
+
119
+ export async function register(tool: Tool.Info) {
120
+ const { custom } = await state()
121
+ const idx = custom.findIndex((t) => t.id === tool.id)
122
+ if (idx >= 0) {
123
+ custom.splice(idx, 1, tool)
124
+ return
125
+ }
126
+ custom.push(tool)
127
+ }
128
+
129
+ async function all(): Promise<Tool.Info[]> {
130
+ const custom = await state().then((x) => x.custom)
131
+ const config = await Config.get()
132
+
133
+ return [
134
+ InvalidTool,
135
+ ...(["app", "cli", "desktop"].includes(Flag.NIKCLI_CLIENT) ? [QuestionTool] : []),
136
+ BashTool,
137
+ ReadTool,
138
+ TreeTool,
139
+ GlobTool,
140
+ GrepTool,
141
+ EditTool,
142
+ WriteTool,
143
+ TaskTool,
144
+ DocsAddTool,
145
+ DocsSearchTool,
146
+ DocsLoadTool,
147
+ DocsUnloadTool,
148
+ DocsContextTool,
149
+ DocsRequestTool,
150
+ DocsGapReportTool,
151
+ SmartDocsTool,
152
+ ContextCollectTool,
153
+ ContextSearchTool,
154
+ ContextRelatedTool,
155
+ ContextDiagnosticsTool,
156
+ MemorySearchTool,
157
+ RagIndexTool,
158
+ RagSearchTool,
159
+ RagStatusTool,
160
+ RagResetTool,
161
+ GenerateImageTool,
162
+ WebFetchTool,
163
+ TodoWriteTool,
164
+ TodoReadTool,
165
+ WebSearchTool,
166
+ CodeSearchTool,
167
+ SkillTool,
168
+ ApplyPatchTool,
169
+ ...(Flag.NIKCLI_EXPERIMENTAL_LSP_TOOL ? [LspTool] : []),
170
+ ...(config.experimental?.batch_tool === true ? [BatchTool] : []),
171
+ ...(Flag.NIKCLI_EXPERIMENTAL_PLAN_MODE && Flag.NIKCLI_CLIENT === "cli" ? [PlanExitTool, PlanEnterTool] : []),
172
+ UseConnectorTool,
173
+ SpeakTool,
174
+ ...custom,
175
+ ]
176
+ }
177
+
178
+ export async function ids() {
179
+ return all().then((x) => x.map((t) => t.id))
180
+ }
181
+
182
+ export async function tools(
183
+ model: {
184
+ providerID: string
185
+ modelID: string
186
+ },
187
+ agent?: Agent.Info,
188
+ ) {
189
+ const tools = await all()
190
+ const result = await Promise.all(
191
+ tools
192
+ .filter((t) => {
193
+ if (t.id === "codesearch" || t.id === "websearch") {
194
+ return model.providerID === "nikcli" || Flag.NIKCLI_ENABLE_EXA
195
+ }
196
+
197
+ const usePatch =
198
+ model.modelID.includes("gpt-") && !model.modelID.includes("oss") && !model.modelID.includes("gpt-4")
199
+ if (t.id === "apply_patch") return usePatch
200
+ if (t.id === "edit" || t.id === "write") return !usePatch
201
+
202
+ return true
203
+ })
204
+ .map(async (t) => {
205
+ using _ = log.time(t.id)
206
+ return {
207
+ id: t.id,
208
+ ...(await t.init({ agent })),
209
+ }
210
+ }),
211
+ )
212
+ return result
213
+ }
214
+ }
@@ -0,0 +1,169 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import { Skill } from "../skill"
4
+ import { PermissionNext } from "../permission/next"
5
+ import { Session } from "../session"
6
+
7
+ export const SkillTool = Tool.define("skill", async (ctx) => {
8
+ const allSkills = await Skill.all()
9
+
10
+ const agent = ctx?.agent
11
+ const accessibleSkills = agent
12
+ ? allSkills.filter((skill) => {
13
+ const rule = PermissionNext.evaluate("skill", skill.name, agent.permission)
14
+ return rule.action !== "deny"
15
+ })
16
+ : allSkills
17
+
18
+ const description =
19
+ accessibleSkills.length === 0
20
+ ? "Load a skill to get detailed instructions for a specific task. No skills are currently available."
21
+ : [
22
+ "Load a skill to get detailed instructions for a specific task.",
23
+ "Skills provide specialized knowledge and step-by-step guidance.",
24
+ "Use this when a task matches an available skill's description.",
25
+ "Only the skills listed here are available:",
26
+ "<available_skills>",
27
+ ...accessibleSkills.flatMap((skill) =>
28
+ [
29
+ ` <skill>`,
30
+ ` <name>${skill.name}</name>`,
31
+ ` <description>${skill.description}</description>`,
32
+ skill.category ? ` <category>${skill.category}</category>` : null,
33
+ skill.tags?.length ? ` <tags>${skill.tags.join(", ")}</tags>` : null,
34
+ ].filter(Boolean),
35
+ ),
36
+ "</available_skills>",
37
+ ].join(" ")
38
+
39
+ const examples = accessibleSkills
40
+ .map((skill) => `'${skill.name}'`)
41
+ .slice(0, 3)
42
+ .join(", ")
43
+ const hint = examples.length > 0 ? ` (e.g., ${examples}, ...)` : ""
44
+
45
+ const parameters = z.object({
46
+ name: z.string().optional().describe(`The skill identifier from available_skills${hint}`),
47
+ search: z.string().optional().describe("Filter skills by name or description"),
48
+ category: z.string().optional().describe("Filter skills by category"),
49
+ tags: z.string().optional().describe("Filter by comma-separated tags"),
50
+ })
51
+
52
+ return {
53
+ description,
54
+ parameters,
55
+ formatValidationError(error) {
56
+ const formattedErrors = error.issues
57
+ .map((issue) => {
58
+ const path = issue.path.length > 0 ? `${issue.path.join(".")}: ` : ""
59
+ return ` - ${path}${issue.message}`
60
+ })
61
+ .join("\n")
62
+ return `Invalid parameters for skill tool:\n${formattedErrors}`
63
+ },
64
+ async execute(
65
+ params: z.infer<typeof parameters>,
66
+ ctx: Tool.Context,
67
+ ): Promise<{ title: string; output: string; metadata: Record<string, any> }> {
68
+ let skills = accessibleSkills
69
+
70
+ if (params.search) {
71
+ const searchLower = params.search.toLowerCase()
72
+ skills = skills.filter((s) =>
73
+ [s.name, s.description, s.category ?? "", ...(s.tags ?? [])].some((value) =>
74
+ value.toLowerCase().includes(searchLower),
75
+ ),
76
+ )
77
+ }
78
+
79
+ if (params.category) {
80
+ skills = skills.filter((s) => s.category === params.category)
81
+ }
82
+
83
+ if (params.tags) {
84
+ const tagList = params.tags.split(",").map((t) => t.trim().toLowerCase())
85
+ skills = skills.filter((s) => s.tags?.some((t) => tagList.includes(t.toLowerCase())))
86
+ }
87
+
88
+ if (params.name) {
89
+ const resolved = await Skill.resolve(params.name, accessibleSkills)
90
+ if (!resolved.skill) {
91
+ const suggestions = resolved.suggestions.join(", ")
92
+ const available = accessibleSkills.map((skill) => skill.name).join(", ")
93
+ const hint = suggestions ? ` Did you mean: ${suggestions}?` : ""
94
+ throw new Error(`Skill "${params.name}" not found.${hint} Available skills: ${available || "none"}`)
95
+ }
96
+
97
+ await ctx.ask({
98
+ permission: "skill",
99
+ patterns: [resolved.skill.name],
100
+ always: [resolved.skill.name],
101
+ metadata: {},
102
+ })
103
+
104
+ const loaded = await Skill.load(resolved.skill.name)
105
+ if (!loaded) {
106
+ throw new Error(`Skill "${resolved.skill.name}" could not be loaded.`)
107
+ }
108
+
109
+ if (ctx.sessionID) {
110
+ await Session.update(ctx.sessionID, (draft) => {
111
+ const next = new Set(draft.skills ?? [])
112
+ next.add(loaded.name)
113
+ draft.skills = [...next]
114
+ })
115
+ }
116
+
117
+ const dir = loaded.dir
118
+
119
+ const meta = [
120
+ `**Slash command**: /${Skill.commandName(loaded.name)}`,
121
+ `**Base directory**: ${dir}`,
122
+ loaded.category ? `**Category**: ${loaded.category}` : null,
123
+ loaded.tags?.length ? `**Tags**: ${loaded.tags.join(", ")}` : null,
124
+ loaded.version ? `**Version**: ${loaded.version}` : null,
125
+ ].filter(Boolean)
126
+
127
+ const output = [`## Skill: ${loaded.name}`, "", meta.join("\n"), "", loaded.content].join("\n")
128
+
129
+ return {
130
+ title: `Loaded skill: ${loaded.name}`,
131
+ output,
132
+ metadata: {
133
+ name: loaded.name,
134
+ dir,
135
+ category: loaded.category,
136
+ tags: loaded.tags,
137
+ version: loaded.version,
138
+ command: Skill.commandName(loaded.name),
139
+ },
140
+ }
141
+ }
142
+
143
+ if (skills.length === 0) {
144
+ return {
145
+ title: "No skills found",
146
+ output: "No skills match the specified filters.",
147
+ metadata: { count: 0 },
148
+ }
149
+ }
150
+
151
+ return {
152
+ title: `Found ${skills.length} skill(s)`,
153
+ output: [
154
+ "## Matching Skills",
155
+ "",
156
+ ...skills.map((s) => `- **${s.name}**: ${s.description}${s.category ? ` (${s.category})` : ""}`),
157
+ ].join("\n"),
158
+ metadata: {
159
+ count: skills.length,
160
+ skills: skills.map((s) => ({
161
+ name: s.name,
162
+ category: s.category,
163
+ tags: s.tags,
164
+ })),
165
+ },
166
+ }
167
+ },
168
+ }
169
+ })
@@ -0,0 +1,3 @@
1
+ Load a skill to get detailed instructions for a specific task.
2
+
3
+ Skills provide specialized knowledge and step-by-step guidance. Use this when a task matches an available skill's description.
@@ -0,0 +1,74 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import DESCRIPTION from "./smart_docs.txt"
4
+ import { searchDocs } from "@/docs/library"
5
+ import { getContextSummary, loadDocs } from "@/docs/context"
6
+
7
+ const parameters = z.object({
8
+ query: z.string().describe("Search query"),
9
+ category: z.string().optional().describe("Optional category filter"),
10
+ limit: z.number().int().min(1).max(20).optional().describe("Result limit"),
11
+ autoLoad: z.boolean().optional().describe("Load matching docs into context"),
12
+ })
13
+
14
+ export const SmartDocsTool = Tool.define("smart_docs", {
15
+ description: DESCRIPTION,
16
+ parameters,
17
+ async execute(params, ctx) {
18
+ const limit = params.limit ?? 5
19
+ const autoLoad = params.autoLoad ?? true
20
+
21
+ await ctx.ask({
22
+ permission: "smart_docs",
23
+ patterns: [params.query],
24
+ always: ["*"],
25
+ metadata: {
26
+ query: params.query,
27
+ category: params.category,
28
+ limit,
29
+ autoLoad,
30
+ },
31
+ })
32
+
33
+ const results = await searchDocs(params.query, params.category, limit)
34
+ if (results.length === 0) {
35
+ return {
36
+ title: `Smart docs: ${params.query}`,
37
+ output: "No documentation matches found.",
38
+ metadata: { count: 0 },
39
+ }
40
+ }
41
+
42
+ const lines = results.map((result) => {
43
+ const score = result.score.toFixed(2)
44
+ const snippet = result.snippet.replace(/\s+/g, " ").trim()
45
+ return `- ${result.entry.title} (id: ${result.entry.id}, score: ${score})\n ${snippet}`
46
+ })
47
+
48
+ if (!autoLoad) {
49
+ return {
50
+ title: `Smart docs: ${params.query}`,
51
+ output: lines.join("\n"),
52
+ metadata: { count: results.length },
53
+ }
54
+ }
55
+
56
+ const ids = results.map((item) => item.entry.id)
57
+ const loaded = await loadDocs(ids)
58
+ const summary = await getContextSummary()
59
+ const details = [
60
+ `Loaded docs: ${loaded.loaded.length}`,
61
+ loaded.missing.length > 0 ? `Missing: ${loaded.missing.join(", ")}` : "",
62
+ ]
63
+ .filter(Boolean)
64
+ .join("\n")
65
+
66
+ const output = [lines.join("\n"), "", details, "", summary].filter(Boolean).join("\n")
67
+
68
+ return {
69
+ title: `Smart docs: ${params.query}`,
70
+ output,
71
+ metadata: { count: results.length },
72
+ }
73
+ },
74
+ })
@@ -0,0 +1,7 @@
1
+ Search documentation and optionally load results into context.
2
+
3
+ Usage:
4
+ - query: search phrase
5
+ - category: optional category filter
6
+ - limit: maximum results (default: 5)
7
+ - autoLoad: load matches into docs context (default: true)