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,132 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import DESCRIPTION from "./codesearch.txt"
4
+
5
+ const API_CONFIG = {
6
+ BASE_URL: "https://mcp.exa.ai",
7
+ ENDPOINTS: {
8
+ CONTEXT: "/mcp",
9
+ },
10
+ } as const
11
+
12
+ interface McpCodeRequest {
13
+ jsonrpc: string
14
+ id: number
15
+ method: string
16
+ params: {
17
+ name: string
18
+ arguments: {
19
+ query: string
20
+ tokensNum: number
21
+ }
22
+ }
23
+ }
24
+
25
+ interface McpCodeResponse {
26
+ jsonrpc: string
27
+ result: {
28
+ content: Array<{
29
+ type: string
30
+ text: string
31
+ }>
32
+ }
33
+ }
34
+
35
+ export const CodeSearchTool = Tool.define("codesearch", {
36
+ description: DESCRIPTION,
37
+ parameters: z.object({
38
+ query: z
39
+ .string()
40
+ .describe(
41
+ "Search query to find relevant context for APIs, Libraries, and SDKs. For example, 'React useState hook examples', 'Python pandas dataframe filtering', 'Express.js middleware', 'Next js partial prerendering configuration'",
42
+ ),
43
+ tokensNum: z
44
+ .number()
45
+ .min(1000)
46
+ .max(50000)
47
+ .default(5000)
48
+ .describe(
49
+ "Number of tokens to return (1000-50000). Default is 5000 tokens. Adjust this value based on how much context you need - use lower values for focused queries and higher values for comprehensive documentation.",
50
+ ),
51
+ }),
52
+ async execute(params, ctx) {
53
+ await ctx.ask({
54
+ permission: "codesearch",
55
+ patterns: [params.query],
56
+ always: ["*"],
57
+ metadata: {
58
+ query: params.query,
59
+ tokensNum: params.tokensNum,
60
+ },
61
+ })
62
+
63
+ const codeRequest: McpCodeRequest = {
64
+ jsonrpc: "2.0",
65
+ id: 1,
66
+ method: "tools/call",
67
+ params: {
68
+ name: "get_code_context_exa",
69
+ arguments: {
70
+ query: params.query,
71
+ tokensNum: params.tokensNum || 5000,
72
+ },
73
+ },
74
+ }
75
+
76
+ const controller = new AbortController()
77
+ const timeoutId = setTimeout(() => controller.abort(), 30000)
78
+
79
+ try {
80
+ const headers: Record<string, string> = {
81
+ accept: "application/json, text/event-stream",
82
+ "content-type": "application/json",
83
+ }
84
+
85
+ const response = await fetch(`${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.CONTEXT}`, {
86
+ method: "POST",
87
+ headers,
88
+ body: JSON.stringify(codeRequest),
89
+ signal: AbortSignal.any([controller.signal, ctx.abort]),
90
+ })
91
+
92
+ clearTimeout(timeoutId)
93
+
94
+ if (!response.ok) {
95
+ const errorText = await response.text()
96
+ throw new Error(`Code search error (${response.status}): ${errorText}`)
97
+ }
98
+
99
+ const responseText = await response.text()
100
+
101
+ // Parse SSE response
102
+ const lines = responseText.split("\n")
103
+ for (const line of lines) {
104
+ if (line.startsWith("data: ")) {
105
+ const data: McpCodeResponse = JSON.parse(line.substring(6))
106
+ if (data.result && data.result.content && data.result.content.length > 0) {
107
+ return {
108
+ output: data.result.content[0].text,
109
+ title: `Code search: ${params.query}`,
110
+ metadata: {},
111
+ }
112
+ }
113
+ }
114
+ }
115
+
116
+ return {
117
+ output:
118
+ "No code snippets or documentation found. Please try a different query, be more specific about the library or programming concept, or check the spelling of framework names.",
119
+ title: `Code search: ${params.query}`,
120
+ metadata: {},
121
+ }
122
+ } catch (error) {
123
+ clearTimeout(timeoutId)
124
+
125
+ if (error instanceof Error && error.name === "AbortError") {
126
+ throw new Error("Code search request timed out")
127
+ }
128
+
129
+ throw error
130
+ }
131
+ },
132
+ })
@@ -0,0 +1,12 @@
1
+ - Search and get relevant context for any programming task using Exa Code API
2
+ - Provides the highest quality and freshest context for libraries, SDKs, and APIs
3
+ - Use this tool for ANY question or task related to programming
4
+ - Returns comprehensive code examples, documentation, and API references
5
+ - Optimized for finding specific programming patterns and solutions
6
+
7
+ Usage notes:
8
+ - Adjustable token count (1000-50000) for focused or comprehensive results
9
+ - Default 5000 tokens provides balanced context for most queries
10
+ - Use lower values for specific questions, higher values for comprehensive documentation
11
+ - Supports queries about frameworks, libraries, APIs, and programming concepts
12
+ - Examples: 'React useState hook examples', 'Python pandas dataframe filtering', 'Express.js middleware'
@@ -0,0 +1,152 @@
1
+ import z from "zod"
2
+ import path from "path"
3
+ import { pathToFileURL } from "url"
4
+ import { Tool } from "./tool"
5
+ import DESCRIPTION from "./context_collect.txt"
6
+ import { Instance } from "@/project/instance"
7
+ import { Ripgrep } from "@/file/ripgrep"
8
+ import { assertExternalDirectory } from "./external-directory"
9
+ import { FileIgnore } from "@/file/ignore"
10
+ import { LSP } from "@/lsp"
11
+
12
+ const parameters = z.object({
13
+ paths: z.array(z.string()).optional().describe("Files or directories to include"),
14
+ pattern: z.string().optional().describe("Optional regex filter for lines"),
15
+ maxFiles: z.number().int().min(1).max(100).optional().describe("Maximum files to collect"),
16
+ maxLines: z.number().int().min(1).max(2000).optional().describe("Maximum lines per file"),
17
+ includeSymbols: z.boolean().optional().describe("Include LSP symbols for files"),
18
+ includeDiagnostics: z.boolean().optional().describe("Include LSP diagnostics for files"),
19
+ })
20
+
21
+ export const ContextCollectTool = Tool.define<typeof parameters, { count: number; truncated: boolean }>(
22
+ "context_collect",
23
+ {
24
+ description: DESCRIPTION,
25
+ parameters,
26
+ async execute(params, ctx) {
27
+ const roots = params.paths?.length ? params.paths : [Instance.directory]
28
+ const limitFiles = params.maxFiles ?? 20
29
+ const limitLines = params.maxLines ?? 200
30
+ const includeSymbols = params.includeSymbols ?? false
31
+ const includeDiagnostics = params.includeDiagnostics ?? false
32
+ const resolved = roots.map((item) => (path.isAbsolute(item) ? item : path.resolve(Instance.directory, item)))
33
+ const regex = params.pattern ? new RegExp(params.pattern) : undefined
34
+
35
+ await ctx.ask({
36
+ permission: "context_collect",
37
+ patterns: resolved,
38
+ always: ["*"],
39
+ metadata: {
40
+ paths: resolved,
41
+ pattern: params.pattern,
42
+ maxFiles: limitFiles,
43
+ maxLines: limitLines,
44
+ },
45
+ })
46
+
47
+ for (const item of resolved) {
48
+ const info = await Bun.file(item)
49
+ .stat()
50
+ .catch(() => undefined)
51
+ const kind = info && info.isDirectory() ? "directory" : "file"
52
+ await assertExternalDirectory(ctx, item, { kind })
53
+ }
54
+
55
+ const files = await collectFiles(resolved, limitFiles)
56
+ const diagnostics = includeDiagnostics ? await LSP.diagnostics() : undefined
57
+ const lines: string[] = []
58
+
59
+ if (files.length === 0) {
60
+ return {
61
+ title: "Context collect",
62
+ output: "No files found.",
63
+ metadata: {
64
+ count: 0,
65
+ truncated: false,
66
+ },
67
+ }
68
+ }
69
+
70
+ lines.push(`Collected ${files.length} files`)
71
+
72
+ for (const file of files) {
73
+ const rel = path.relative(Instance.directory, file) || file
74
+ const body = await readSnippet(file, limitLines, regex)
75
+ const snippet = body || "(no matching content)"
76
+ lines.push("")
77
+ lines.push(`file: ${rel}`)
78
+ lines.push(snippet)
79
+
80
+ if (includeSymbols) {
81
+ const symbols = await collectSymbols(file)
82
+ if (symbols.length > 0) {
83
+ lines.push("")
84
+ lines.push("symbols:")
85
+ lines.push(...symbols.map((item) => `- ${item}`))
86
+ }
87
+ }
88
+
89
+ if (includeDiagnostics && diagnostics) {
90
+ const issues = diagnostics[file] ?? []
91
+ if (issues.length > 0) {
92
+ lines.push("")
93
+ lines.push("diagnostics:")
94
+ lines.push(...issues.slice(0, 10).map((item) => `- ${LSP.Diagnostic.pretty(item)}`))
95
+ }
96
+ }
97
+ }
98
+
99
+ return {
100
+ title: "Context collect",
101
+ output: lines.join("\n"),
102
+ metadata: {
103
+ count: files.length,
104
+ truncated: files.length >= limitFiles,
105
+ },
106
+ }
107
+ },
108
+ },
109
+ )
110
+
111
+ async function collectFiles(roots: string[], limit: number) {
112
+ const files: string[] = []
113
+ for (const root of roots) {
114
+ if (files.length >= limit) break
115
+ const info = await Bun.file(root)
116
+ .stat()
117
+ .catch(() => undefined)
118
+ if (!info) continue
119
+ if (info.isFile()) {
120
+ files.push(root)
121
+ continue
122
+ }
123
+ if (!info.isDirectory()) continue
124
+
125
+ for await (const entry of Ripgrep.files({ cwd: root })) {
126
+ if (files.length >= limit) break
127
+ const full = path.join(root, entry)
128
+ const rel = path.relative(Instance.directory, full)
129
+ if (FileIgnore.match(rel)) continue
130
+ files.push(full)
131
+ }
132
+ }
133
+ return files
134
+ }
135
+
136
+ async function readSnippet(filePath: string, limit: number, regex?: RegExp) {
137
+ const file = Bun.file(filePath)
138
+ if (file.type.startsWith("image/") || file.type === "application/pdf") {
139
+ return ""
140
+ }
141
+ const text = await file.text().catch(() => "")
142
+ if (!text) return ""
143
+ const lines = text.split("\n")
144
+ const filtered = regex ? lines.filter((line) => regex.test(line)) : lines
145
+ return filtered.slice(0, limit).join("\n")
146
+ }
147
+
148
+ async function collectSymbols(filePath: string) {
149
+ const uri = pathToFileURL(filePath).href
150
+ const symbols = await LSP.documentSymbol(uri).catch(() => [])
151
+ return symbols.map((item) => item.name).slice(0, 20)
152
+ }
@@ -0,0 +1,9 @@
1
+ Collect workspace context from files.
2
+
3
+ Usage:
4
+ - paths: files or directories to include
5
+ - pattern: optional regex to filter lines
6
+ - maxFiles: maximum files to collect (default: 20)
7
+ - maxLines: maximum lines per file (default: 200)
8
+ - includeSymbols: include LSP symbols
9
+ - includeDiagnostics: include LSP diagnostics
@@ -0,0 +1,81 @@
1
+ import z from "zod"
2
+ import path from "path"
3
+ import { Tool } from "./tool"
4
+ import DESCRIPTION from "./context_diagnostics.txt"
5
+ import { LSP } from "@/lsp"
6
+ import { Instance } from "@/project/instance"
7
+ import { assertExternalDirectory } from "./external-directory"
8
+
9
+ const parameters = z.object({
10
+ filePath: z.string().optional().describe("Optional file path to filter diagnostics"),
11
+ limit: z.number().int().min(1).max(200).optional().describe("Maximum diagnostics per file"),
12
+ })
13
+
14
+ export const ContextDiagnosticsTool = Tool.define<typeof parameters, { count: number }>("context_diagnostics", {
15
+ description: DESCRIPTION,
16
+ parameters,
17
+ async execute(params, ctx) {
18
+ const limit = params.limit ?? 50
19
+
20
+ await ctx.ask({
21
+ permission: "context_diagnostics",
22
+ patterns: [params.filePath ?? "*"],
23
+ always: ["*"],
24
+ metadata: {
25
+ filePath: params.filePath,
26
+ limit,
27
+ },
28
+ })
29
+
30
+ if (params.filePath) {
31
+ const target = path.isAbsolute(params.filePath)
32
+ ? params.filePath
33
+ : path.resolve(Instance.directory, params.filePath)
34
+ await assertExternalDirectory(ctx, target, { kind: "file" })
35
+ await LSP.touchFile(target, true)
36
+
37
+ const all = await LSP.diagnostics()
38
+ const issues = all[target] ?? []
39
+ if (issues.length === 0) {
40
+ return {
41
+ title: path.relative(Instance.worktree, target),
42
+ output: "No diagnostics found.",
43
+ metadata: { count: 0 },
44
+ }
45
+ }
46
+
47
+ const output = issues
48
+ .slice(0, limit)
49
+ .map((item) => LSP.Diagnostic.pretty(item))
50
+ .join("\n")
51
+ return {
52
+ title: path.relative(Instance.worktree, target),
53
+ output,
54
+ metadata: { count: issues.length },
55
+ }
56
+ }
57
+
58
+ const diagnostics = await LSP.diagnostics()
59
+ const entries = Object.entries(diagnostics).filter(([, issues]) => issues.length > 0)
60
+ if (entries.length === 0) {
61
+ return {
62
+ title: "Diagnostics",
63
+ output: "No diagnostics found.",
64
+ metadata: { count: 0 },
65
+ }
66
+ }
67
+
68
+ const lines: string[] = []
69
+ for (const [file, issues] of entries) {
70
+ lines.push(`${file}:`)
71
+ lines.push(...issues.slice(0, limit).map((item) => ` ${LSP.Diagnostic.pretty(item)}`))
72
+ lines.push("")
73
+ }
74
+
75
+ return {
76
+ title: "Diagnostics",
77
+ output: lines.join("\n").trim(),
78
+ metadata: { count: entries.length },
79
+ }
80
+ },
81
+ })
@@ -0,0 +1,5 @@
1
+ List LSP diagnostics.
2
+
3
+ Usage:
4
+ - filePath: optional file path to filter
5
+ - limit: maximum diagnostics per file (default: 50)
@@ -0,0 +1,117 @@
1
+ import z from "zod"
2
+ import path from "path"
3
+ import { Tool } from "./tool"
4
+ import DESCRIPTION from "./context_related.txt"
5
+ import { Instance } from "@/project/instance"
6
+ import { assertExternalDirectory } from "./external-directory"
7
+
8
+ const parameters = z.object({
9
+ filePath: z.string().describe("Entry file to analyze for related imports"),
10
+ limit: z.number().int().min(1).max(200).optional().describe("Maximum related files"),
11
+ })
12
+
13
+ export const ContextRelatedTool = Tool.define<typeof parameters, { count: number }>("context_related", {
14
+ description: DESCRIPTION,
15
+ parameters,
16
+ async execute(params, ctx) {
17
+ const entry = path.isAbsolute(params.filePath) ? params.filePath : path.resolve(Instance.directory, params.filePath)
18
+ const limit = params.limit ?? 50
19
+
20
+ await ctx.ask({
21
+ permission: "context_related",
22
+ patterns: [entry],
23
+ always: ["*"],
24
+ metadata: {
25
+ filePath: entry,
26
+ limit,
27
+ },
28
+ })
29
+
30
+ await assertExternalDirectory(ctx, entry, { kind: "file" })
31
+
32
+ const file = Bun.file(entry)
33
+ if (!(await file.exists())) {
34
+ throw new Error(`File not found: ${entry}`)
35
+ }
36
+
37
+ const text = await file.text().catch(() => "")
38
+ if (!text) {
39
+ return {
40
+ title: path.relative(Instance.worktree, entry),
41
+ output: "No related files found.",
42
+ metadata: { count: 0 },
43
+ }
44
+ }
45
+
46
+ const imports = collectImports(text)
47
+ const related = await resolveImports(imports, path.dirname(entry), limit)
48
+
49
+ if (related.length === 0) {
50
+ return {
51
+ title: path.relative(Instance.worktree, entry),
52
+ output: "No related files found.",
53
+ metadata: { count: 0 },
54
+ }
55
+ }
56
+
57
+ return {
58
+ title: path.relative(Instance.worktree, entry),
59
+ output: related.join("\n"),
60
+ metadata: { count: related.length },
61
+ }
62
+ },
63
+ })
64
+
65
+ function collectImports(text: string) {
66
+ const results = new Set<string>()
67
+ const patterns = [/from\s+["']([^"']+)["']/g, /require\(\s*["']([^"']+)["']\s*\)/g, /import\s+["']([^"']+)["']/g]
68
+
69
+ for (const pattern of patterns) {
70
+ for (const match of text.matchAll(pattern)) {
71
+ const item = match[1]
72
+ if (!item) continue
73
+ results.add(item)
74
+ }
75
+ }
76
+
77
+ return Array.from(results)
78
+ }
79
+
80
+ async function resolveImports(imports: string[], base: string, limit: number) {
81
+ const results: string[] = []
82
+ for (const item of imports) {
83
+ if (results.length >= limit) break
84
+ if (!item.startsWith(".")) continue
85
+ const full = path.resolve(base, item)
86
+ const resolved = await resolveFile(full)
87
+ if (!resolved) continue
88
+ results.push(resolved)
89
+ }
90
+ return results
91
+ }
92
+
93
+ async function resolveFile(base: string) {
94
+ const candidates = [
95
+ base,
96
+ `${base}.ts`,
97
+ `${base}.tsx`,
98
+ `${base}.js`,
99
+ `${base}.jsx`,
100
+ `${base}.mjs`,
101
+ `${base}.cjs`,
102
+ `${base}.json`,
103
+ `${base}.mts`,
104
+ `${base}.cts`,
105
+ path.join(base, "index.ts"),
106
+ path.join(base, "index.tsx"),
107
+ path.join(base, "index.js"),
108
+ path.join(base, "index.jsx"),
109
+ path.join(base, "index.mjs"),
110
+ path.join(base, "index.cjs"),
111
+ ]
112
+
113
+ for (const item of candidates) {
114
+ if (await Bun.file(item).exists()) return item
115
+ }
116
+ return undefined
117
+ }
@@ -0,0 +1,5 @@
1
+ List files related to an entry file.
2
+
3
+ Usage:
4
+ - filePath: entry file to analyze
5
+ - limit: maximum related files (default: 50)
@@ -0,0 +1,108 @@
1
+ import z from "zod"
2
+ import path from "path"
3
+ import { Tool } from "./tool"
4
+ import DESCRIPTION from "./context_search.txt"
5
+ import { Rag } from "@/rag"
6
+ import { Ripgrep } from "@/file/ripgrep"
7
+ import { Instance } from "@/project/instance"
8
+ import { assertExternalDirectory } from "./external-directory"
9
+
10
+ const parameters = z.object({
11
+ pattern: z.string().describe("Regex pattern to search for"),
12
+ path: z.string().optional().describe("Directory to search in"),
13
+ include: z.string().optional().describe('File pattern to include in the search (e.g. "*.ts")'),
14
+ limit: z.number().int().min(1).max(200).optional().describe("Maximum number of matches"),
15
+ mode: z.enum(["regex", "semantic"]).optional().describe("Search mode (regex or semantic)"),
16
+ })
17
+
18
+ export const ContextSearchTool = Tool.define<typeof parameters, { matches: number; truncated: boolean }>(
19
+ "context_search",
20
+ {
21
+ description: DESCRIPTION,
22
+ parameters,
23
+ async execute(params, ctx) {
24
+ const search = params.path ?? Instance.directory
25
+ const base = path.isAbsolute(search) ? search : path.resolve(Instance.directory, search)
26
+ const limit = params.limit ?? 50
27
+ const mode = params.mode ?? "regex"
28
+
29
+ await ctx.ask({
30
+ permission: "context_search",
31
+ patterns: [params.pattern],
32
+ always: ["*"],
33
+ metadata: {
34
+ pattern: params.pattern,
35
+ path: base,
36
+ include: params.include,
37
+ limit,
38
+ mode,
39
+ },
40
+ })
41
+
42
+ await assertExternalDirectory(ctx, base, { kind: "directory" })
43
+
44
+ if (mode === "semantic") {
45
+ const semantic = await Rag.search({
46
+ query: params.pattern,
47
+ limit,
48
+ })
49
+ if (!semantic.ready) {
50
+ return {
51
+ title: params.pattern,
52
+ output: "RAG index not found. Run rag_index first.",
53
+ metadata: { matches: 0, truncated: false },
54
+ }
55
+ }
56
+ if (semantic.results.length === 0) {
57
+ return {
58
+ title: params.pattern,
59
+ output: "No semantic matches found.",
60
+ metadata: { matches: 0, truncated: false },
61
+ }
62
+ }
63
+ const lines = semantic.results.map((item) => {
64
+ const score = item.score.toFixed(3)
65
+ return `[${score}] ${item.file}:${item.start}-${item.end} ${item.snippet}`
66
+ })
67
+ return {
68
+ title: params.pattern,
69
+ output: lines.join("\n"),
70
+ metadata: { matches: semantic.results.length, truncated: false },
71
+ }
72
+ }
73
+
74
+ const matches = await Ripgrep.search({
75
+ cwd: base,
76
+ pattern: params.pattern,
77
+ glob: params.include ? [params.include] : undefined,
78
+ limit,
79
+ })
80
+
81
+ if (matches.length === 0) {
82
+ return {
83
+ title: params.pattern,
84
+ output: "No matches found.",
85
+ metadata: { matches: 0, truncated: false },
86
+ }
87
+ }
88
+
89
+ const rows = [`Found ${matches.length} matches`]
90
+ for (const match of matches) {
91
+ const full = path.resolve(base, match.path.text)
92
+ const text = match.lines.text.replace(/\s+/g, " ").trim()
93
+ rows.push(`${full}:${match.line_number}: ${text}`)
94
+ }
95
+
96
+ if (matches.length >= limit) {
97
+ rows.push("")
98
+ rows.push("(Results are truncated. Consider narrowing the pattern or path.)")
99
+ }
100
+
101
+ return {
102
+ title: params.pattern,
103
+ output: rows.join("\n"),
104
+ metadata: { matches: matches.length, truncated: matches.length >= limit },
105
+ }
106
+ },
107
+ },
108
+ )
@@ -0,0 +1,8 @@
1
+ Search workspace text to gather context.
2
+
3
+ Usage:
4
+ - pattern: regex pattern to search for
5
+ - path: directory to search (defaults to workspace)
6
+ - include: glob filter
7
+ - limit: maximum matches (default: 50)
8
+ - mode: regex or semantic search