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,174 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import DESCRIPTION from "./generate_image.txt"
4
+ import { Config } from "@/config/config"
5
+ import { Provider } from "@/provider/provider"
6
+ import { ProviderTransform } from "@/provider/transform"
7
+ import { experimental_generateImage } from "ai"
8
+ import { Identifier } from "@/id/id"
9
+ import type { MessageV2 } from "@/session/message-v2"
10
+ import { Installation } from "@/installation"
11
+ import os from "os"
12
+ import { Instance } from "@/project/instance"
13
+ import { Flag } from "@/flag/flag"
14
+
15
+ const GPT_IMAGE_LATEST = {
16
+ provider: "openrouter",
17
+ model: "openai/gpt-5-image",
18
+ } as const
19
+
20
+ const NANOBANANA_LATEST = {
21
+ provider: "openrouter",
22
+ model: "google/nano-banana-pro-2.5",
23
+ } as const
24
+
25
+ function extFromMime(mime: string): string {
26
+ switch (mime) {
27
+ case "image/png":
28
+ return ".png"
29
+ case "image/jpeg":
30
+ return ".jpg"
31
+ case "image/webp":
32
+ return ".webp"
33
+ default:
34
+ return ""
35
+ }
36
+ }
37
+
38
+ function buildRequestHeaders(input: {
39
+ model: Provider.Model
40
+ sessionID: string
41
+ messageID: string
42
+ }): Record<string, string> {
43
+ if (input.model.providerID.startsWith("nikcli")) {
44
+ return {
45
+ "x-nikcli-project": Instance.project.id,
46
+ "x-nikcli-session": input.sessionID,
47
+ "x-nikcli-request": input.messageID,
48
+ "x-nikcli-client": Flag.NIKCLI_CLIENT,
49
+ }
50
+ }
51
+
52
+ return {
53
+ "User-Agent": `nikcli/${Installation.VERSION} (${os.platform()} ${os.release()}; ${os.arch()})`,
54
+ }
55
+ }
56
+
57
+ const parameters = z
58
+ .object({
59
+ prompt: z.string().describe("Text prompt for image generation"),
60
+ generator: z.enum(["gpt_image", "nanobanana"]).optional().describe("Preset image generator to use (optional)"),
61
+ provider: z.string().optional().describe("Provider ID to use (overrides config/preset)"),
62
+ model: z.string().optional().describe("Image model ID to use (overrides config/preset)"),
63
+ n: z.number().int().min(1).max(4).optional().describe("Number of images to generate (default: 1)"),
64
+ size: z
65
+ .string()
66
+ .regex(/^\d+x\d+$/, "size must be in the format {width}x{height}")
67
+ .optional()
68
+ .describe('Image size in the format "{width}x{height}" (optional)'),
69
+ aspectRatio: z
70
+ .string()
71
+ .regex(/^\d+:\d+$/, "aspectRatio must be in the format {width}:{height}")
72
+ .optional()
73
+ .describe('Image aspect ratio in the format "{width}:{height}" (optional)'),
74
+ seed: z.number().int().optional().describe("Deterministic seed (optional)"),
75
+ providerOptions: z
76
+ .record(z.string(), z.any())
77
+ .optional()
78
+ .describe("Provider-specific options passed through to the underlying image API (optional)"),
79
+ })
80
+ .superRefine((val, ctx) => {
81
+ if (val.size && val.aspectRatio) {
82
+ ctx.addIssue({
83
+ code: z.ZodIssueCode.custom,
84
+ message: "Provide either size or aspectRatio, not both.",
85
+ path: ["aspectRatio"],
86
+ })
87
+ }
88
+ })
89
+
90
+ export const GenerateImageTool = Tool.define("generate_image", {
91
+ description: DESCRIPTION,
92
+ parameters,
93
+ async execute(params, ctx) {
94
+ const config = await Config.get()
95
+
96
+ const preset = params.generator === "nanobanana" ? NANOBANANA_LATEST : GPT_IMAGE_LATEST
97
+ const configured = params.generator ? undefined : config.image
98
+
99
+ const providerID =
100
+ params.provider ?? (params.generator ? preset.provider : configured?.provider) ?? GPT_IMAGE_LATEST.provider
101
+ const modelID = params.model ?? (params.generator ? preset.model : configured?.model) ?? GPT_IMAGE_LATEST.model
102
+
103
+ await ctx.ask({
104
+ permission: "generate_image",
105
+ patterns: [`${providerID}/${modelID}`],
106
+ always: ["*"],
107
+ metadata: {
108
+ provider: providerID,
109
+ model: modelID,
110
+ generator: params.generator,
111
+ n: params.n,
112
+ size: params.size,
113
+ aspectRatio: params.aspectRatio,
114
+ seed: params.seed,
115
+ },
116
+ })
117
+
118
+ const model = await Provider.getModel(providerID, modelID)
119
+ const imageModel = await Provider.getImageModel(model)
120
+
121
+ const providerOptions = params.providerOptions
122
+ ? ProviderTransform.providerOptions(model, params.providerOptions)
123
+ : undefined
124
+
125
+ const result = await experimental_generateImage({
126
+ model: imageModel,
127
+ prompt: params.prompt,
128
+ n: params.n ?? 1,
129
+ size: params.size as any,
130
+ aspectRatio: params.aspectRatio as any,
131
+ seed: params.seed,
132
+ providerOptions,
133
+ abortSignal: ctx.abort,
134
+ headers: buildRequestHeaders({ model, sessionID: ctx.sessionID, messageID: ctx.messageID }),
135
+ })
136
+
137
+ const attachments: MessageV2.FilePart[] = result.images.map((image, index) => {
138
+ const ext = extFromMime(image.mediaType)
139
+ const filename = `generated-${index + 1}${ext}`
140
+ return {
141
+ id: Identifier.ascending("part"),
142
+ sessionID: ctx.sessionID,
143
+ messageID: ctx.messageID,
144
+ type: "file",
145
+ mime: image.mediaType,
146
+ url: `data:${image.mediaType};base64,${image.base64}`,
147
+ filename,
148
+ }
149
+ })
150
+
151
+ const warnings = result.warnings?.length ? result.warnings : undefined
152
+
153
+ const lines = [
154
+ `Generated ${result.images.length} image(s) using ${providerID}/${modelID}.`,
155
+ params.size ? `Size: ${params.size}` : undefined,
156
+ params.aspectRatio ? `Aspect ratio: ${params.aspectRatio}` : undefined,
157
+ params.seed !== undefined ? `Seed: ${params.seed}` : undefined,
158
+ warnings ? `Warnings: ${warnings.map((w) => w.type).join(", ")}` : undefined,
159
+ ].filter(Boolean)
160
+
161
+ return {
162
+ title: "Generate image",
163
+ output: lines.join("\n"),
164
+ attachments,
165
+ metadata: {
166
+ provider: providerID,
167
+ model: modelID,
168
+ generator: params.generator,
169
+ count: result.images.length,
170
+ warnings,
171
+ },
172
+ }
173
+ },
174
+ })
@@ -0,0 +1,12 @@
1
+ Generate an image from a text prompt using an image model (e.g. GPT Image or Nano Banana).
2
+
3
+ Usage:
4
+ - prompt: text prompt for image generation
5
+ - generator: preset image generator (optional)
6
+ - provider: provider ID override (optional)
7
+ - model: model ID override (optional)
8
+ - n: number of images to generate (default: 1)
9
+ - size: output size in "{width}x{height}" (optional)
10
+ - aspectRatio: output aspect ratio in "{width}:{height}" (optional)
11
+ - seed: deterministic seed (optional)
12
+ - providerOptions: provider-specific options passed through to the underlying API (optional)
@@ -0,0 +1,79 @@
1
+ import z from "zod"
2
+ import path from "path"
3
+ import { Tool } from "./tool"
4
+ import DESCRIPTION from "./glob.txt"
5
+ import { Ripgrep } from "../file/ripgrep"
6
+ import { Instance } from "../project/instance"
7
+ import { assertExternalDirectory } from "./external-directory"
8
+
9
+ export const GlobTool = Tool.define("glob", {
10
+ description: DESCRIPTION,
11
+ parameters: z.object({
12
+ pattern: z.string().describe("The glob pattern to match files against"),
13
+ path: z
14
+ .string()
15
+ .optional()
16
+ .describe(
17
+ `The directory to search in. If not specified, the current working directory will be used. IMPORTANT: Omit this field to use the default directory. DO NOT enter "undefined" or "null" - simply omit it for the default behavior. Must be a valid directory path if provided.`,
18
+ ),
19
+ }),
20
+ async execute(params, ctx) {
21
+ await ctx.ask({
22
+ permission: "glob",
23
+ patterns: [params.pattern],
24
+ always: ["*"],
25
+ metadata: {
26
+ pattern: params.pattern,
27
+ path: params.path,
28
+ },
29
+ })
30
+
31
+ let search = params.path ?? Instance.directory
32
+ search = path.isAbsolute(search) ? search : path.resolve(Instance.directory, search)
33
+ await assertExternalDirectory(ctx, search, { kind: "directory" })
34
+
35
+ const limit = 100
36
+ const files = []
37
+ let truncated = false
38
+ for await (const file of Ripgrep.files({
39
+ cwd: search,
40
+ glob: [params.pattern],
41
+ })) {
42
+ if (files.length >= limit) {
43
+ truncated = true
44
+ break
45
+ }
46
+ const full = path.resolve(search, file)
47
+ const stats = await Bun.file(full)
48
+ .stat()
49
+ .then((x) => x.mtime.getTime())
50
+ .catch(() => 0)
51
+ files.push({
52
+ path: full,
53
+ mtime: stats,
54
+ })
55
+ }
56
+ files.sort((a, b) => b.mtime - a.mtime)
57
+
58
+ const output = []
59
+ if (files.length === 0) output.push("No files found")
60
+ if (files.length > 0) {
61
+ output.push(...files.map((f) => f.path))
62
+ if (truncated) {
63
+ output.push("")
64
+ output.push(
65
+ `(Results are truncated: showing first ${limit} results. Consider using a more specific path or pattern.)`,
66
+ )
67
+ }
68
+ }
69
+
70
+ return {
71
+ title: path.relative(Instance.worktree, search),
72
+ metadata: {
73
+ count: files.length,
74
+ truncated,
75
+ },
76
+ output: output.join("\n"),
77
+ }
78
+ },
79
+ })
@@ -0,0 +1,6 @@
1
+ - Fast file pattern matching tool that works with any codebase size
2
+ - Supports glob patterns like "**/*.js" or "src/**/*.ts"
3
+ - Returns matching file paths sorted by modification time
4
+ - Use this tool when you need to find files by name patterns
5
+ - When you are doing an open-ended search that may require multiple rounds of globbing and grepping, use the Task tool instead
6
+ - You have the capability to call multiple tools in a single response. It is always better to speculatively perform multiple searches as a batch that are potentially useful.
@@ -0,0 +1,153 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import { Ripgrep } from "../file/ripgrep"
4
+
5
+ import DESCRIPTION from "./grep.txt"
6
+ import { Instance } from "../project/instance"
7
+ import path from "path"
8
+ import { assertExternalDirectory } from "./external-directory"
9
+
10
+ const MAX_LINE_LENGTH = 2000
11
+
12
+ export const GrepTool = Tool.define("grep", {
13
+ description: DESCRIPTION,
14
+ parameters: z.object({
15
+ pattern: z.string().describe("The regex pattern to search for in file contents"),
16
+ path: z.string().optional().describe("The directory to search in. Defaults to the current working directory."),
17
+ include: z.string().optional().describe('File pattern to include in the search (e.g. "*.js", "*.{ts,tsx}")'),
18
+ }),
19
+ async execute(params, ctx) {
20
+ if (!params.pattern) {
21
+ throw new Error("pattern is required")
22
+ }
23
+
24
+ await ctx.ask({
25
+ permission: "grep",
26
+ patterns: [params.pattern],
27
+ always: ["*"],
28
+ metadata: {
29
+ pattern: params.pattern,
30
+ path: params.path,
31
+ include: params.include,
32
+ },
33
+ })
34
+
35
+ let searchPath = params.path ?? Instance.directory
36
+ searchPath = path.isAbsolute(searchPath) ? searchPath : path.resolve(Instance.directory, searchPath)
37
+ await assertExternalDirectory(ctx, searchPath, { kind: "directory" })
38
+
39
+ const rgPath = await Ripgrep.filepath()
40
+ const args = [
41
+ "-nH",
42
+ "--hidden",
43
+ "--follow",
44
+ "--no-messages",
45
+ "--field-match-separator=|",
46
+ "--regexp",
47
+ params.pattern,
48
+ ]
49
+ if (params.include) {
50
+ args.push("--glob", params.include)
51
+ }
52
+ args.push(searchPath)
53
+
54
+ const proc = Bun.spawn([rgPath, ...args], {
55
+ stdout: "pipe",
56
+ stderr: "pipe",
57
+ })
58
+
59
+ const output = await new Response(proc.stdout).text()
60
+ const errorOutput = await new Response(proc.stderr).text()
61
+ const exitCode = await proc.exited
62
+
63
+ if (exitCode === 1 || (exitCode === 2 && !output.trim())) {
64
+ return {
65
+ title: params.pattern,
66
+ metadata: { matches: 0, truncated: false },
67
+ output: "No files found",
68
+ }
69
+ }
70
+
71
+ if (exitCode !== 0 && exitCode !== 2) {
72
+ throw new Error(`ripgrep failed: ${errorOutput}`)
73
+ }
74
+
75
+ const hasErrors = exitCode === 2
76
+
77
+ const lines = output.trim().split(/\r?\n/)
78
+ const matches = []
79
+
80
+ for (const line of lines) {
81
+ if (!line) continue
82
+
83
+ const [filePath, lineNumStr, ...lineTextParts] = line.split("|")
84
+ if (!filePath || !lineNumStr || lineTextParts.length === 0) continue
85
+
86
+ const lineNum = parseInt(lineNumStr, 10)
87
+ const lineText = lineTextParts.join("|")
88
+
89
+ const file = Bun.file(filePath)
90
+ const stats = await file.stat().catch(() => null)
91
+ if (!stats) continue
92
+
93
+ matches.push({
94
+ path: filePath,
95
+ modTime: stats.mtime.getTime(),
96
+ lineNum,
97
+ lineText,
98
+ })
99
+ }
100
+
101
+ matches.sort((a, b) => b.modTime - a.modTime)
102
+
103
+ const limit = 100
104
+ const truncated = matches.length > limit
105
+ const finalMatches = truncated ? matches.slice(0, limit) : matches
106
+
107
+ if (finalMatches.length === 0) {
108
+ return {
109
+ title: params.pattern,
110
+ metadata: { matches: 0, truncated: false },
111
+ output: "No files found",
112
+ }
113
+ }
114
+
115
+ const totalMatches = matches.length
116
+ const outputLines = [`Found ${totalMatches}${truncated ? ` (showing first ${limit})` : ""} matches`]
117
+
118
+ let currentFile = ""
119
+ for (const match of finalMatches) {
120
+ if (currentFile !== match.path) {
121
+ if (currentFile !== "") {
122
+ outputLines.push("")
123
+ }
124
+ currentFile = match.path
125
+ outputLines.push(`${match.path}:`)
126
+ }
127
+ const truncatedLineText =
128
+ match.lineText.length > MAX_LINE_LENGTH ? match.lineText.substring(0, MAX_LINE_LENGTH) + "..." : match.lineText
129
+ outputLines.push(` Line ${match.lineNum}: ${truncatedLineText}`)
130
+ }
131
+
132
+ if (truncated) {
133
+ outputLines.push("")
134
+ outputLines.push(
135
+ `(Results truncated: showing ${limit} of ${totalMatches} matches (${totalMatches - limit} hidden). Consider using a more specific path or pattern.)`,
136
+ )
137
+ }
138
+
139
+ if (hasErrors) {
140
+ outputLines.push("")
141
+ outputLines.push("(Some paths were inaccessible and skipped)")
142
+ }
143
+
144
+ return {
145
+ title: params.pattern,
146
+ metadata: {
147
+ matches: totalMatches,
148
+ truncated,
149
+ },
150
+ output: outputLines.join("\n"),
151
+ }
152
+ },
153
+ })
@@ -0,0 +1,8 @@
1
+ - Fast content search tool that works with any codebase size
2
+ - Searches file contents using regular expressions
3
+ - Supports full regex syntax (eg. "log.*Error", "function\s+\w+", etc.)
4
+ - Filter files by pattern with the include parameter (eg. "*.js", "*.{ts,tsx}")
5
+ - Returns file paths and line numbers with at least one match sorted by modification time
6
+ - Use this tool when you need to find files containing specific patterns
7
+ - If you need to identify/count the number of matches within files, use the Bash tool with `rg` (ripgrep) directly. Do NOT use `grep`.
8
+ - When you are doing an open-ended search that may require multiple rounds of globbing and grepping, use the Task tool instead
@@ -0,0 +1,17 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+
4
+ export const InvalidTool = Tool.define("invalid", {
5
+ description: "Do not use",
6
+ parameters: z.object({
7
+ tool: z.string(),
8
+ error: z.string(),
9
+ }),
10
+ async execute(params) {
11
+ return {
12
+ title: "Invalid Tool",
13
+ output: `The arguments provided to the tool are invalid: ${params.error}`,
14
+ metadata: {},
15
+ }
16
+ },
17
+ })
package/src/tool/ls.ts ADDED
@@ -0,0 +1,116 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import * as path from "path"
4
+ import DESCRIPTION from "./ls.txt"
5
+ import { Instance } from "../project/instance"
6
+ import { Ripgrep } from "../file/ripgrep"
7
+ import { assertExternalDirectory } from "./external-directory"
8
+
9
+ export const IGNORE_PATTERNS = [
10
+ "node_modules/",
11
+ "__pycache__/",
12
+ ".git/",
13
+ "dist/",
14
+ "build/",
15
+ "target/",
16
+ "vendor/",
17
+ "bin/",
18
+ "obj/",
19
+ ".idea/",
20
+ ".vscode/",
21
+ ".zig-cache/",
22
+ "zig-out",
23
+ ".coverage",
24
+ "coverage/",
25
+ "vendor/",
26
+ "tmp/",
27
+ "temp/",
28
+ ".cache/",
29
+ "cache/",
30
+ "logs/",
31
+ ".venv/",
32
+ "venv/",
33
+ "env/",
34
+ ]
35
+
36
+ const LIMIT = 100
37
+
38
+ export const ListTool = Tool.define("list", {
39
+ description: DESCRIPTION,
40
+ parameters: z.object({
41
+ path: z.string().describe("The absolute path to the directory to list (must be absolute, not relative)").optional(),
42
+ ignore: z.array(z.string()).describe("List of glob patterns to ignore").optional(),
43
+ }),
44
+ async execute(params, ctx) {
45
+ const searchPath = path.resolve(Instance.directory, params.path || ".")
46
+ await assertExternalDirectory(ctx, searchPath, { kind: "directory" })
47
+
48
+ await ctx.ask({
49
+ permission: "list",
50
+ patterns: [searchPath],
51
+ always: ["*"],
52
+ metadata: {
53
+ path: searchPath,
54
+ },
55
+ })
56
+
57
+ const ignoreGlobs = IGNORE_PATTERNS.map((p) => `!${p}*`).concat(params.ignore?.map((p) => `!${p}`) || [])
58
+ const files = []
59
+ for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs })) {
60
+ files.push(file)
61
+ if (files.length >= LIMIT) break
62
+ }
63
+
64
+ const dirs = new Set<string>()
65
+ const filesByDir = new Map<string, string[]>()
66
+
67
+ for (const file of files) {
68
+ const dir = path.dirname(file)
69
+ const parts = dir === "." ? [] : dir.split("/")
70
+
71
+ for (let i = 0; i <= parts.length; i++) {
72
+ const dirPath = i === 0 ? "." : parts.slice(0, i).join("/")
73
+ dirs.add(dirPath)
74
+ }
75
+
76
+ if (!filesByDir.has(dir)) filesByDir.set(dir, [])
77
+ filesByDir.get(dir)!.push(path.basename(file))
78
+ }
79
+
80
+ function renderDir(dirPath: string, depth: number): string {
81
+ const indent = " ".repeat(depth)
82
+ let output = ""
83
+
84
+ if (depth > 0) {
85
+ output += `${indent}${path.basename(dirPath)}/\n`
86
+ }
87
+
88
+ const childIndent = " ".repeat(depth + 1)
89
+ const children = Array.from(dirs)
90
+ .filter((d) => path.dirname(d) === dirPath && d !== dirPath)
91
+ .sort()
92
+
93
+ for (const child of children) {
94
+ output += renderDir(child, depth + 1)
95
+ }
96
+
97
+ const files = filesByDir.get(dirPath) || []
98
+ for (const file of files.sort()) {
99
+ output += `${childIndent}${file}\n`
100
+ }
101
+
102
+ return output
103
+ }
104
+
105
+ const output = `${searchPath}/\n` + renderDir(".", 0)
106
+
107
+ return {
108
+ title: path.relative(Instance.worktree, searchPath),
109
+ metadata: {
110
+ count: files.length,
111
+ truncated: files.length >= LIMIT,
112
+ },
113
+ output,
114
+ }
115
+ },
116
+ })
@@ -0,0 +1 @@
1
+ Lists files and directories in a given path. The path parameter must be absolute; omit it to use the current workspace directory. You can optionally provide an array of glob patterns to ignore with the ignore parameter. You should generally prefer the Glob and Grep tools, if you know which directories to search.
@@ -0,0 +1,96 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import path from "path"
4
+ import { LSP } from "../lsp"
5
+ import DESCRIPTION from "./lsp.txt"
6
+ import { Instance } from "../project/instance"
7
+ import { pathToFileURL } from "url"
8
+ import { assertExternalDirectory } from "./external-directory"
9
+
10
+ const operations = [
11
+ "goToDefinition",
12
+ "findReferences",
13
+ "hover",
14
+ "documentSymbol",
15
+ "workspaceSymbol",
16
+ "goToImplementation",
17
+ "prepareCallHierarchy",
18
+ "incomingCalls",
19
+ "outgoingCalls",
20
+ ] as const
21
+
22
+ export const LspTool = Tool.define("lsp", {
23
+ description: DESCRIPTION,
24
+ parameters: z.object({
25
+ operation: z.enum(operations).describe("The LSP operation to perform"),
26
+ filePath: z.string().describe("The absolute or relative path to the file"),
27
+ line: z.number().int().min(1).describe("The line number (1-based, as shown in editors)"),
28
+ character: z.number().int().min(1).describe("The character offset (1-based, as shown in editors)"),
29
+ }),
30
+ execute: async (args, ctx) => {
31
+ const file = path.isAbsolute(args.filePath) ? args.filePath : path.join(Instance.directory, args.filePath)
32
+ await assertExternalDirectory(ctx, file)
33
+
34
+ await ctx.ask({
35
+ permission: "lsp",
36
+ patterns: ["*"],
37
+ always: ["*"],
38
+ metadata: {},
39
+ })
40
+ const uri = pathToFileURL(file).href
41
+ const position = {
42
+ file,
43
+ line: args.line - 1,
44
+ character: args.character - 1,
45
+ }
46
+
47
+ const relPath = path.relative(Instance.worktree, file)
48
+ const title = `${args.operation} ${relPath}:${args.line}:${args.character}`
49
+
50
+ const exists = await Bun.file(file).exists()
51
+ if (!exists) {
52
+ throw new Error(`File not found: ${file}`)
53
+ }
54
+
55
+ const available = await LSP.hasClients(file)
56
+ if (!available) {
57
+ throw new Error("No LSP server available for this file type.")
58
+ }
59
+
60
+ await LSP.touchFile(file, true)
61
+
62
+ const result: unknown[] = await (async () => {
63
+ switch (args.operation) {
64
+ case "goToDefinition":
65
+ return LSP.definition(position)
66
+ case "findReferences":
67
+ return LSP.references(position)
68
+ case "hover":
69
+ return LSP.hover(position)
70
+ case "documentSymbol":
71
+ return LSP.documentSymbol(uri)
72
+ case "workspaceSymbol":
73
+ return LSP.workspaceSymbol("")
74
+ case "goToImplementation":
75
+ return LSP.implementation(position)
76
+ case "prepareCallHierarchy":
77
+ return LSP.prepareCallHierarchy(position)
78
+ case "incomingCalls":
79
+ return LSP.incomingCalls(position)
80
+ case "outgoingCalls":
81
+ return LSP.outgoingCalls(position)
82
+ }
83
+ })()
84
+
85
+ const output = (() => {
86
+ if (result.length === 0) return `No results found for ${args.operation}`
87
+ return JSON.stringify(result, null, 2)
88
+ })()
89
+
90
+ return {
91
+ title,
92
+ metadata: { result },
93
+ output,
94
+ }
95
+ },
96
+ })
@@ -0,0 +1,19 @@
1
+ Interact with Language Server Protocol (LSP) servers to get code intelligence features.
2
+
3
+ Supported operations:
4
+ - goToDefinition: Find where a symbol is defined
5
+ - findReferences: Find all references to a symbol
6
+ - hover: Get hover information (documentation, type info) for a symbol
7
+ - documentSymbol: Get all symbols (functions, classes, variables) in a document
8
+ - workspaceSymbol: Search for symbols across the entire workspace
9
+ - goToImplementation: Find implementations of an interface or abstract method
10
+ - prepareCallHierarchy: Get call hierarchy item at a position (functions/methods)
11
+ - incomingCalls: Find all functions/methods that call the function at a position
12
+ - outgoingCalls: Find all functions/methods called by the function at a position
13
+
14
+ All operations require:
15
+ - filePath: The file to operate on
16
+ - line: The line number (1-based, as shown in editors)
17
+ - character: The character offset (1-based, as shown in editors)
18
+
19
+ Note: LSP servers must be configured for the file type. If no server is available, an error will be returned.