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