@toolkit-cli/toolkode 1.3.7

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 (676) hide show
  1. package/AGENTS.md +69 -0
  2. package/BUN_SHELL_MIGRATION_PLAN.md +136 -0
  3. package/Dockerfile +18 -0
  4. package/README.md +15 -0
  5. package/bin/opencode +179 -0
  6. package/bin/toolkode +17 -0
  7. package/bin/toolkode.cjs +190 -0
  8. package/bunfig.toml +7 -0
  9. package/drizzle.config.ts +10 -0
  10. package/git +0 -0
  11. package/migration/20260127222353_familiar_lady_ursula/migration.sql +90 -0
  12. package/migration/20260127222353_familiar_lady_ursula/snapshot.json +796 -0
  13. package/migration/20260211171708_add_project_commands/migration.sql +1 -0
  14. package/migration/20260211171708_add_project_commands/snapshot.json +806 -0
  15. package/migration/20260213144116_wakeful_the_professor/migration.sql +11 -0
  16. package/migration/20260213144116_wakeful_the_professor/snapshot.json +897 -0
  17. package/migration/20260225215848_workspace/migration.sql +7 -0
  18. package/migration/20260225215848_workspace/snapshot.json +959 -0
  19. package/migration/20260227213759_add_session_workspace_id/migration.sql +2 -0
  20. package/migration/20260227213759_add_session_workspace_id/snapshot.json +983 -0
  21. package/migration/20260228203230_blue_harpoon/migration.sql +17 -0
  22. package/migration/20260228203230_blue_harpoon/snapshot.json +1102 -0
  23. package/migration/20260303231226_add_workspace_fields/migration.sql +5 -0
  24. package/migration/20260303231226_add_workspace_fields/snapshot.json +1013 -0
  25. package/migration/20260309230000_move_org_to_state/migration.sql +3 -0
  26. package/migration/20260309230000_move_org_to_state/snapshot.json +1156 -0
  27. package/migration/20260312043431_session_message_cursor/migration.sql +4 -0
  28. package/migration/20260312043431_session_message_cursor/snapshot.json +1168 -0
  29. package/migration/20260323234822_events/migration.sql +13 -0
  30. package/migration/20260323234822_events/snapshot.json +1271 -0
  31. package/package.json +160 -0
  32. package/parsers-config.ts +290 -0
  33. package/script/build-node.ts +54 -0
  34. package/script/build.ts +276 -0
  35. package/script/check-migrations.ts +16 -0
  36. package/script/postinstall.mjs +131 -0
  37. package/script/publish.ts +181 -0
  38. package/script/schema.ts +63 -0
  39. package/script/seed-e2e.ts +60 -0
  40. package/script/upgrade-opentui.ts +64 -0
  41. package/specs/effect-migration.md +293 -0
  42. package/specs/tui-plugins.md +389 -0
  43. package/src/account/account.sql.ts +39 -0
  44. package/src/account/index.ts +397 -0
  45. package/src/account/repo.ts +163 -0
  46. package/src/account/schema.ts +91 -0
  47. package/src/acp/README.md +174 -0
  48. package/src/acp/agent.ts +1743 -0
  49. package/src/acp/session.ts +116 -0
  50. package/src/acp/types.ts +24 -0
  51. package/src/agent/agent.ts +418 -0
  52. package/src/agent/generate.txt +75 -0
  53. package/src/agent/prompt/compaction.txt +14 -0
  54. package/src/agent/prompt/explore.txt +18 -0
  55. package/src/agent/prompt/summary.txt +11 -0
  56. package/src/agent/prompt/title.txt +44 -0
  57. package/src/auth/index.ts +115 -0
  58. package/src/bun/index.ts +128 -0
  59. package/src/bun/registry.ts +50 -0
  60. package/src/bus/bus-event.ts +40 -0
  61. package/src/bus/global.ts +10 -0
  62. package/src/bus/index.ts +184 -0
  63. package/src/channel/index.ts +231 -0
  64. package/src/cli/bootstrap.ts +17 -0
  65. package/src/cli/cmd/account.ts +257 -0
  66. package/src/cli/cmd/acp.ts +70 -0
  67. package/src/cli/cmd/agent.ts +245 -0
  68. package/src/cli/cmd/cmd.ts +7 -0
  69. package/src/cli/cmd/db.ts +119 -0
  70. package/src/cli/cmd/debug/agent.ts +167 -0
  71. package/src/cli/cmd/debug/config.ts +16 -0
  72. package/src/cli/cmd/debug/file.ts +97 -0
  73. package/src/cli/cmd/debug/index.ts +48 -0
  74. package/src/cli/cmd/debug/lsp.ts +53 -0
  75. package/src/cli/cmd/debug/ripgrep.ts +87 -0
  76. package/src/cli/cmd/debug/scrap.ts +16 -0
  77. package/src/cli/cmd/debug/skill.ts +16 -0
  78. package/src/cli/cmd/debug/snapshot.ts +52 -0
  79. package/src/cli/cmd/export.ts +89 -0
  80. package/src/cli/cmd/generate.ts +38 -0
  81. package/src/cli/cmd/github.ts +1646 -0
  82. package/src/cli/cmd/import.ts +207 -0
  83. package/src/cli/cmd/mcp.ts +754 -0
  84. package/src/cli/cmd/models.ts +78 -0
  85. package/src/cli/cmd/plug.ts +231 -0
  86. package/src/cli/cmd/pr.ts +127 -0
  87. package/src/cli/cmd/providers.ts +482 -0
  88. package/src/cli/cmd/run.ts +738 -0
  89. package/src/cli/cmd/serve.ts +42 -0
  90. package/src/cli/cmd/session.ts +159 -0
  91. package/src/cli/cmd/stats.ts +410 -0
  92. package/src/cli/cmd/tui/app.tsx +1255 -0
  93. package/src/cli/cmd/tui/attach.ts +88 -0
  94. package/src/cli/cmd/tui/component/border.tsx +21 -0
  95. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  96. package/src/cli/cmd/tui/component/dialog-command.tsx +171 -0
  97. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  98. package/src/cli/cmd/tui/component/dialog-model.tsx +264 -0
  99. package/src/cli/cmd/tui/component/dialog-provider.tsx +334 -0
  100. package/src/cli/cmd/tui/component/dialog-session-list.tsx +108 -0
  101. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  102. package/src/cli/cmd/tui/component/dialog-skill.tsx +36 -0
  103. package/src/cli/cmd/tui/component/dialog-stash.tsx +87 -0
  104. package/src/cli/cmd/tui/component/dialog-status.tsx +168 -0
  105. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  106. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  107. package/src/cli/cmd/tui/component/dialog-variant.tsx +29 -0
  108. package/src/cli/cmd/tui/component/dialog-workspace-list.tsx +320 -0
  109. package/src/cli/cmd/tui/component/error-component.tsx +91 -0
  110. package/src/cli/cmd/tui/component/logo.tsx +86 -0
  111. package/src/cli/cmd/tui/component/plugin-route-missing.tsx +14 -0
  112. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +667 -0
  113. package/src/cli/cmd/tui/component/prompt/frecency.tsx +90 -0
  114. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  115. package/src/cli/cmd/tui/component/prompt/index.tsx +1353 -0
  116. package/src/cli/cmd/tui/component/prompt/part.ts +16 -0
  117. package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
  118. package/src/cli/cmd/tui/component/spinner.tsx +24 -0
  119. package/src/cli/cmd/tui/component/startup-loading.tsx +63 -0
  120. package/src/cli/cmd/tui/component/textarea-keybindings.ts +73 -0
  121. package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
  122. package/src/cli/cmd/tui/component/workspace/dialog-session-list.tsx +151 -0
  123. package/src/cli/cmd/tui/context/args.tsx +15 -0
  124. package/src/cli/cmd/tui/context/directory.ts +13 -0
  125. package/src/cli/cmd/tui/context/exit.tsx +60 -0
  126. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  127. package/src/cli/cmd/tui/context/keybind.tsx +105 -0
  128. package/src/cli/cmd/tui/context/kv.tsx +52 -0
  129. package/src/cli/cmd/tui/context/local.tsx +406 -0
  130. package/src/cli/cmd/tui/context/plugin-keybinds.ts +41 -0
  131. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  132. package/src/cli/cmd/tui/context/route.tsx +52 -0
  133. package/src/cli/cmd/tui/context/sdk.tsx +128 -0
  134. package/src/cli/cmd/tui/context/sync.tsx +504 -0
  135. package/src/cli/cmd/tui/context/theme/amber.json +245 -0
  136. package/src/cli/cmd/tui/context/theme/amiga.json +245 -0
  137. package/src/cli/cmd/tui/context/theme/atari.json +245 -0
  138. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  139. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  140. package/src/cli/cmd/tui/context/theme/borland.json +245 -0
  141. package/src/cli/cmd/tui/context/theme/carbonfox.json +248 -0
  142. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  143. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  144. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  145. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  146. package/src/cli/cmd/tui/context/theme/commodore.json +245 -0
  147. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  148. package/src/cli/cmd/tui/context/theme/dos-edit.json +245 -0
  149. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  150. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  151. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  152. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  153. package/src/cli/cmd/tui/context/theme/gnu.json +245 -0
  154. package/src/cli/cmd/tui/context/theme/gruvbox.json +242 -0
  155. package/src/cli/cmd/tui/context/theme/hacker.json +245 -0
  156. package/src/cli/cmd/tui/context/theme/irix.json +245 -0
  157. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  158. package/src/cli/cmd/tui/context/theme/lucent-orng.json +237 -0
  159. package/src/cli/cmd/tui/context/theme/mac84.json +245 -0
  160. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  161. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  162. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  163. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  164. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  165. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  166. package/src/cli/cmd/tui/context/theme/norton.json +245 -0
  167. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  168. package/src/cli/cmd/tui/context/theme/opencode.json +245 -0
  169. package/src/cli/cmd/tui/context/theme/orng.json +249 -0
  170. package/src/cli/cmd/tui/context/theme/osaka-jade.json +93 -0
  171. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  172. package/src/cli/cmd/tui/context/theme/pine.json +245 -0
  173. package/src/cli/cmd/tui/context/theme/retrowave.json +245 -0
  174. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  175. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  176. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  177. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  178. package/src/cli/cmd/tui/context/theme/toolkode.json +245 -0
  179. package/src/cli/cmd/tui/context/theme/tron.json +245 -0
  180. package/src/cli/cmd/tui/context/theme/ubuntu.json +245 -0
  181. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  182. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  183. package/src/cli/cmd/tui/context/theme/vt100.json +245 -0
  184. package/src/cli/cmd/tui/context/theme/xcode.json +245 -0
  185. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  186. package/src/cli/cmd/tui/context/theme.tsx +1288 -0
  187. package/src/cli/cmd/tui/context/tui-config.tsx +9 -0
  188. package/src/cli/cmd/tui/event.ts +49 -0
  189. package/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +152 -0
  190. package/src/cli/cmd/tui/feature-plugins/home/tips.tsx +50 -0
  191. package/src/cli/cmd/tui/feature-plugins/sidebar/agents-panel.tsx +95 -0
  192. package/src/cli/cmd/tui/feature-plugins/sidebar/btw-panel.tsx +105 -0
  193. package/src/cli/cmd/tui/feature-plugins/sidebar/commands-panel.tsx +40 -0
  194. package/src/cli/cmd/tui/feature-plugins/sidebar/context.tsx +63 -0
  195. package/src/cli/cmd/tui/feature-plugins/sidebar/files.tsx +62 -0
  196. package/src/cli/cmd/tui/feature-plugins/sidebar/footer.tsx +93 -0
  197. package/src/cli/cmd/tui/feature-plugins/sidebar/git-panel.tsx +36 -0
  198. package/src/cli/cmd/tui/feature-plugins/sidebar/loop-panel.tsx +124 -0
  199. package/src/cli/cmd/tui/feature-plugins/sidebar/lsp.tsx +66 -0
  200. package/src/cli/cmd/tui/feature-plugins/sidebar/mcp.tsx +96 -0
  201. package/src/cli/cmd/tui/feature-plugins/sidebar/session-panel.tsx +48 -0
  202. package/src/cli/cmd/tui/feature-plugins/sidebar/todo.tsx +48 -0
  203. package/src/cli/cmd/tui/feature-plugins/system/plugins.tsx +270 -0
  204. package/src/cli/cmd/tui/plugin/api.tsx +420 -0
  205. package/src/cli/cmd/tui/plugin/index.ts +3 -0
  206. package/src/cli/cmd/tui/plugin/internal.ts +37 -0
  207. package/src/cli/cmd/tui/plugin/runtime.ts +967 -0
  208. package/src/cli/cmd/tui/plugin/slots.tsx +61 -0
  209. package/src/cli/cmd/tui/routes/home.tsx +173 -0
  210. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +65 -0
  211. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +110 -0
  212. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  213. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  214. package/src/cli/cmd/tui/routes/session/footer.tsx +91 -0
  215. package/src/cli/cmd/tui/routes/session/index.tsx +2229 -0
  216. package/src/cli/cmd/tui/routes/session/permission.tsx +685 -0
  217. package/src/cli/cmd/tui/routes/session/question.tsx +467 -0
  218. package/src/cli/cmd/tui/routes/session/sidebar.tsx +72 -0
  219. package/src/cli/cmd/tui/routes/session/subagent-footer.tsx +131 -0
  220. package/src/cli/cmd/tui/thread.ts +232 -0
  221. package/src/cli/cmd/tui/ui/dialog-alert.tsx +59 -0
  222. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +89 -0
  223. package/src/cli/cmd/tui/ui/dialog-export-options.tsx +208 -0
  224. package/src/cli/cmd/tui/ui/dialog-help.tsx +40 -0
  225. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +106 -0
  226. package/src/cli/cmd/tui/ui/dialog-select.tsx +402 -0
  227. package/src/cli/cmd/tui/ui/dialog.tsx +192 -0
  228. package/src/cli/cmd/tui/ui/link.tsx +28 -0
  229. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  230. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  231. package/src/cli/cmd/tui/util/clipboard.ts +192 -0
  232. package/src/cli/cmd/tui/util/editor.ts +37 -0
  233. package/src/cli/cmd/tui/util/selection.ts +25 -0
  234. package/src/cli/cmd/tui/util/signal.ts +7 -0
  235. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  236. package/src/cli/cmd/tui/util/transcript.ts +98 -0
  237. package/src/cli/cmd/tui/win32.ts +129 -0
  238. package/src/cli/cmd/tui/worker.ts +204 -0
  239. package/src/cli/cmd/uninstall.ts +353 -0
  240. package/src/cli/cmd/upgrade.ts +73 -0
  241. package/src/cli/cmd/web.ts +81 -0
  242. package/src/cli/effect/prompt.ts +25 -0
  243. package/src/cli/error.ts +46 -0
  244. package/src/cli/logo.ts +7 -0
  245. package/src/cli/network.ts +60 -0
  246. package/src/cli/ui.ts +116 -0
  247. package/src/cli/upgrade.ts +31 -0
  248. package/src/command/index.ts +195 -0
  249. package/src/command/template/initialize.txt +10 -0
  250. package/src/command/template/review.txt +101 -0
  251. package/src/config/config.ts +1693 -0
  252. package/src/config/markdown.ts +99 -0
  253. package/src/config/migrate-tui-config.ts +155 -0
  254. package/src/config/paths.ts +174 -0
  255. package/src/config/tui-schema.ts +36 -0
  256. package/src/config/tui.ts +212 -0
  257. package/src/control-plane/adaptors/index.ts +20 -0
  258. package/src/control-plane/adaptors/worktree.ts +38 -0
  259. package/src/control-plane/schema.ts +17 -0
  260. package/src/control-plane/sse.ts +66 -0
  261. package/src/control-plane/types.ts +21 -0
  262. package/src/control-plane/workspace.sql.ts +17 -0
  263. package/src/control-plane/workspace.ts +154 -0
  264. package/src/cron/index.ts +241 -0
  265. package/src/cron/parse.ts +189 -0
  266. package/src/effect/cross-spawn-spawner.ts +479 -0
  267. package/src/effect/instance-registry.ts +12 -0
  268. package/src/effect/instance-state.ts +47 -0
  269. package/src/effect/run-service.ts +19 -0
  270. package/src/env/index.ts +28 -0
  271. package/src/file/ignore.ts +82 -0
  272. package/src/file/index.ts +693 -0
  273. package/src/file/protected.ts +59 -0
  274. package/src/file/ripgrep.ts +376 -0
  275. package/src/file/time.ts +128 -0
  276. package/src/file/watcher.ts +171 -0
  277. package/src/filesystem/index.ts +226 -0
  278. package/src/flag/flag.ts +157 -0
  279. package/src/format/formatter.ts +396 -0
  280. package/src/format/index.ts +199 -0
  281. package/src/global/index.ts +54 -0
  282. package/src/hooks/index.ts +302 -0
  283. package/src/id/id.ts +85 -0
  284. package/src/ide/index.ts +74 -0
  285. package/src/index.ts +243 -0
  286. package/src/installation/index.ts +363 -0
  287. package/src/lsp/client.ts +252 -0
  288. package/src/lsp/index.ts +558 -0
  289. package/src/lsp/language.ts +120 -0
  290. package/src/lsp/launch.ts +21 -0
  291. package/src/lsp/server.ts +2093 -0
  292. package/src/mcp/auth.ts +181 -0
  293. package/src/mcp/index.ts +926 -0
  294. package/src/mcp/oauth-callback.ts +215 -0
  295. package/src/mcp/oauth-provider.ts +185 -0
  296. package/src/node.ts +1 -0
  297. package/src/patch/index.ts +680 -0
  298. package/src/permission/arity.ts +163 -0
  299. package/src/permission/evaluate.ts +15 -0
  300. package/src/permission/index.ts +322 -0
  301. package/src/permission/schema.ts +17 -0
  302. package/src/plugin/codex.ts +628 -0
  303. package/src/plugin/copilot.ts +343 -0
  304. package/src/plugin/index.ts +331 -0
  305. package/src/plugin/install.ts +384 -0
  306. package/src/plugin/meta.ts +165 -0
  307. package/src/plugin/shared.ts +172 -0
  308. package/src/project/bootstrap.ts +31 -0
  309. package/src/project/instance.ts +167 -0
  310. package/src/project/project.sql.ts +16 -0
  311. package/src/project/project.ts +519 -0
  312. package/src/project/schema.ts +16 -0
  313. package/src/project/state.ts +70 -0
  314. package/src/project/vcs.ts +124 -0
  315. package/src/provider/auth.ts +252 -0
  316. package/src/provider/error.ts +197 -0
  317. package/src/provider/models.ts +138 -0
  318. package/src/provider/provider.ts +1593 -0
  319. package/src/provider/schema.ts +39 -0
  320. package/src/provider/sdk/copilot/README.md +5 -0
  321. package/src/provider/sdk/copilot/chat/convert-to-openai-compatible-chat-messages.ts +170 -0
  322. package/src/provider/sdk/copilot/chat/get-response-metadata.ts +15 -0
  323. package/src/provider/sdk/copilot/chat/map-openai-compatible-finish-reason.ts +19 -0
  324. package/src/provider/sdk/copilot/chat/openai-compatible-api-types.ts +64 -0
  325. package/src/provider/sdk/copilot/chat/openai-compatible-chat-language-model.ts +815 -0
  326. package/src/provider/sdk/copilot/chat/openai-compatible-chat-options.ts +28 -0
  327. package/src/provider/sdk/copilot/chat/openai-compatible-metadata-extractor.ts +44 -0
  328. package/src/provider/sdk/copilot/chat/openai-compatible-prepare-tools.ts +83 -0
  329. package/src/provider/sdk/copilot/copilot-provider.ts +100 -0
  330. package/src/provider/sdk/copilot/index.ts +2 -0
  331. package/src/provider/sdk/copilot/openai-compatible-error.ts +27 -0
  332. package/src/provider/sdk/copilot/responses/convert-to-openai-responses-input.ts +335 -0
  333. package/src/provider/sdk/copilot/responses/map-openai-responses-finish-reason.ts +22 -0
  334. package/src/provider/sdk/copilot/responses/openai-config.ts +18 -0
  335. package/src/provider/sdk/copilot/responses/openai-error.ts +22 -0
  336. package/src/provider/sdk/copilot/responses/openai-responses-api-types.ts +214 -0
  337. package/src/provider/sdk/copilot/responses/openai-responses-language-model.ts +1769 -0
  338. package/src/provider/sdk/copilot/responses/openai-responses-prepare-tools.ts +173 -0
  339. package/src/provider/sdk/copilot/responses/openai-responses-settings.ts +1 -0
  340. package/src/provider/sdk/copilot/responses/tool/code-interpreter.ts +87 -0
  341. package/src/provider/sdk/copilot/responses/tool/file-search.ts +127 -0
  342. package/src/provider/sdk/copilot/responses/tool/image-generation.ts +114 -0
  343. package/src/provider/sdk/copilot/responses/tool/local-shell.ts +64 -0
  344. package/src/provider/sdk/copilot/responses/tool/web-search-preview.ts +103 -0
  345. package/src/provider/sdk/copilot/responses/tool/web-search.ts +102 -0
  346. package/src/provider/toolkit-manifest.ts +110 -0
  347. package/src/provider/transform.ts +1045 -0
  348. package/src/pty/index.ts +397 -0
  349. package/src/pty/schema.ts +17 -0
  350. package/src/question/index.ts +221 -0
  351. package/src/question/schema.ts +17 -0
  352. package/src/server/error.ts +36 -0
  353. package/src/server/event.ts +7 -0
  354. package/src/server/instance.ts +285 -0
  355. package/src/server/mdns.ts +60 -0
  356. package/src/server/middleware.ts +29 -0
  357. package/src/server/projectors.ts +28 -0
  358. package/src/server/router.ts +99 -0
  359. package/src/server/routes/config.ts +92 -0
  360. package/src/server/routes/event.ts +83 -0
  361. package/src/server/routes/experimental.ts +271 -0
  362. package/src/server/routes/file.ts +197 -0
  363. package/src/server/routes/global.ts +339 -0
  364. package/src/server/routes/mcp.ts +225 -0
  365. package/src/server/routes/permission.ts +69 -0
  366. package/src/server/routes/project.ts +118 -0
  367. package/src/server/routes/provider.ts +171 -0
  368. package/src/server/routes/pty.ts +211 -0
  369. package/src/server/routes/question.ts +99 -0
  370. package/src/server/routes/session.ts +1031 -0
  371. package/src/server/routes/tui.ts +379 -0
  372. package/src/server/routes/workspace.ts +94 -0
  373. package/src/server/server.ts +312 -0
  374. package/src/session/compaction.ts +424 -0
  375. package/src/session/index.ts +882 -0
  376. package/src/session/instruction.ts +321 -0
  377. package/src/session/llm.ts +341 -0
  378. package/src/session/message-v2.ts +1030 -0
  379. package/src/session/message.ts +191 -0
  380. package/src/session/overflow.ts +22 -0
  381. package/src/session/processor.ts +554 -0
  382. package/src/session/projectors.ts +135 -0
  383. package/src/session/prompt/anthropic.txt +105 -0
  384. package/src/session/prompt/beast.txt +147 -0
  385. package/src/session/prompt/build-switch.txt +5 -0
  386. package/src/session/prompt/codex.txt +79 -0
  387. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  388. package/src/session/prompt/default.txt +108 -0
  389. package/src/session/prompt/gemini.txt +155 -0
  390. package/src/session/prompt/gpt.txt +107 -0
  391. package/src/session/prompt/max-steps.txt +16 -0
  392. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  393. package/src/session/prompt/plan.txt +26 -0
  394. package/src/session/prompt/trinity.txt +97 -0
  395. package/src/session/prompt.ts +2058 -0
  396. package/src/session/retry.ts +106 -0
  397. package/src/session/revert.ts +138 -0
  398. package/src/session/schema.ts +38 -0
  399. package/src/session/session.sql.ts +103 -0
  400. package/src/session/status.ts +102 -0
  401. package/src/session/summary.ts +170 -0
  402. package/src/session/system.ts +74 -0
  403. package/src/session/todo.ts +57 -0
  404. package/src/share/share-next.ts +288 -0
  405. package/src/share/share.sql.ts +13 -0
  406. package/src/shell/shell.ts +73 -0
  407. package/src/skill/discovery.ts +116 -0
  408. package/src/skill/index.ts +284 -0
  409. package/src/skills-marketplace/index.ts +305 -0
  410. package/src/snapshot/index.ts +489 -0
  411. package/src/sql.d.ts +4 -0
  412. package/src/storage/db.bun.ts +8 -0
  413. package/src/storage/db.node.ts +8 -0
  414. package/src/storage/db.ts +177 -0
  415. package/src/storage/json-migration.ts +425 -0
  416. package/src/storage/schema.sql.ts +10 -0
  417. package/src/storage/schema.ts +5 -0
  418. package/src/storage/storage.ts +217 -0
  419. package/src/sync/README.md +179 -0
  420. package/src/sync/event.sql.ts +16 -0
  421. package/src/sync/index.ts +263 -0
  422. package/src/sync/schema.ts +14 -0
  423. package/src/team/index.ts +428 -0
  424. package/src/tool/apply_patch.ts +281 -0
  425. package/src/tool/apply_patch.txt +33 -0
  426. package/src/tool/bash.ts +271 -0
  427. package/src/tool/bash.txt +115 -0
  428. package/src/tool/batch.ts +183 -0
  429. package/src/tool/batch.txt +24 -0
  430. package/src/tool/codesearch.ts +132 -0
  431. package/src/tool/codesearch.txt +12 -0
  432. package/src/tool/cron-create.ts +54 -0
  433. package/src/tool/cron-create.txt +16 -0
  434. package/src/tool/cron-delete.ts +29 -0
  435. package/src/tool/cron-delete.txt +1 -0
  436. package/src/tool/cron-list.ts +41 -0
  437. package/src/tool/cron-list.txt +1 -0
  438. package/src/tool/edit.ts +667 -0
  439. package/src/tool/edit.txt +10 -0
  440. package/src/tool/external-directory.ts +32 -0
  441. package/src/tool/glob.ts +78 -0
  442. package/src/tool/glob.txt +6 -0
  443. package/src/tool/grep.ts +156 -0
  444. package/src/tool/grep.txt +8 -0
  445. package/src/tool/invalid.ts +17 -0
  446. package/src/tool/ls.ts +121 -0
  447. package/src/tool/ls.txt +1 -0
  448. package/src/tool/lsp.ts +97 -0
  449. package/src/tool/lsp.txt +19 -0
  450. package/src/tool/multiedit.ts +46 -0
  451. package/src/tool/multiedit.txt +41 -0
  452. package/src/tool/plan-enter.txt +14 -0
  453. package/src/tool/plan-exit.txt +13 -0
  454. package/src/tool/plan.ts +131 -0
  455. package/src/tool/question.ts +33 -0
  456. package/src/tool/question.txt +10 -0
  457. package/src/tool/read.ts +293 -0
  458. package/src/tool/read.txt +14 -0
  459. package/src/tool/registry.ts +232 -0
  460. package/src/tool/schema.ts +17 -0
  461. package/src/tool/send-message.ts +59 -0
  462. package/src/tool/send-message.txt +7 -0
  463. package/src/tool/skill.ts +105 -0
  464. package/src/tool/task.ts +230 -0
  465. package/src/tool/task.txt +62 -0
  466. package/src/tool/team.ts +235 -0
  467. package/src/tool/team.txt +22 -0
  468. package/src/tool/todo.ts +31 -0
  469. package/src/tool/todowrite.txt +167 -0
  470. package/src/tool/tool.ts +90 -0
  471. package/src/tool/truncate.ts +144 -0
  472. package/src/tool/truncation-dir.ts +4 -0
  473. package/src/tool/webfetch.ts +206 -0
  474. package/src/tool/webfetch.txt +13 -0
  475. package/src/tool/websearch.ts +150 -0
  476. package/src/tool/websearch.txt +14 -0
  477. package/src/tool/write.ts +84 -0
  478. package/src/tool/write.txt +8 -0
  479. package/src/util/abort.ts +35 -0
  480. package/src/util/archive.ts +17 -0
  481. package/src/util/color.ts +19 -0
  482. package/src/util/context.ts +25 -0
  483. package/src/util/data-url.ts +9 -0
  484. package/src/util/defer.ts +12 -0
  485. package/src/util/effect-http-client.ts +11 -0
  486. package/src/util/effect-zod.ts +98 -0
  487. package/src/util/error.ts +77 -0
  488. package/src/util/filesystem.ts +203 -0
  489. package/src/util/flock.ts +333 -0
  490. package/src/util/fn.ts +21 -0
  491. package/src/util/format.ts +20 -0
  492. package/src/util/git.ts +35 -0
  493. package/src/util/glob.ts +34 -0
  494. package/src/util/hash.ts +7 -0
  495. package/src/util/iife.ts +3 -0
  496. package/src/util/keybind.ts +103 -0
  497. package/src/util/lazy.ts +23 -0
  498. package/src/util/locale.ts +81 -0
  499. package/src/util/lock.ts +98 -0
  500. package/src/util/log.ts +182 -0
  501. package/src/util/network.ts +9 -0
  502. package/src/util/process.ts +172 -0
  503. package/src/util/queue.ts +32 -0
  504. package/src/util/record.ts +3 -0
  505. package/src/util/rpc.ts +66 -0
  506. package/src/util/schema.ts +53 -0
  507. package/src/util/scrap.ts +10 -0
  508. package/src/util/signal.ts +12 -0
  509. package/src/util/timeout.ts +14 -0
  510. package/src/util/token.ts +7 -0
  511. package/src/util/update-schema.ts +13 -0
  512. package/src/util/which.ts +14 -0
  513. package/src/util/wildcard.ts +59 -0
  514. package/src/worktree/index.ts +638 -0
  515. package/sst-env.d.ts +10 -0
  516. package/test/AGENTS.md +81 -0
  517. package/test/account/repo.test.ts +326 -0
  518. package/test/account/service.test.ts +282 -0
  519. package/test/acp/agent-interface.test.ts +51 -0
  520. package/test/acp/event-subscription.test.ts +685 -0
  521. package/test/agent/agent.test.ts +717 -0
  522. package/test/auth/auth.test.ts +58 -0
  523. package/test/bun.test.ts +53 -0
  524. package/test/bus/bus-effect.test.ts +164 -0
  525. package/test/bus/bus-integration.test.ts +87 -0
  526. package/test/bus/bus.test.ts +219 -0
  527. package/test/cli/account.test.ts +26 -0
  528. package/test/cli/cmd/tui/prompt-part.test.ts +47 -0
  529. package/test/cli/github-action.test.ts +198 -0
  530. package/test/cli/github-remote.test.ts +80 -0
  531. package/test/cli/import.test.ts +54 -0
  532. package/test/cli/plugin-auth-picker.test.ts +120 -0
  533. package/test/cli/tui/keybind-plugin.test.ts +90 -0
  534. package/test/cli/tui/plugin-add.test.ts +61 -0
  535. package/test/cli/tui/plugin-install.test.ts +95 -0
  536. package/test/cli/tui/plugin-lifecycle.test.ts +225 -0
  537. package/test/cli/tui/plugin-loader-entrypoint.test.ts +189 -0
  538. package/test/cli/tui/plugin-loader-pure.test.ts +71 -0
  539. package/test/cli/tui/plugin-loader.test.ts +563 -0
  540. package/test/cli/tui/plugin-toggle.test.ts +157 -0
  541. package/test/cli/tui/theme-store.test.ts +51 -0
  542. package/test/cli/tui/thread.test.ts +128 -0
  543. package/test/cli/tui/transcript.test.ts +322 -0
  544. package/test/config/agent-color.test.ts +71 -0
  545. package/test/config/config.test.ts +2187 -0
  546. package/test/config/fixtures/empty-frontmatter.md +4 -0
  547. package/test/config/fixtures/frontmatter.md +28 -0
  548. package/test/config/fixtures/markdown-header.md +11 -0
  549. package/test/config/fixtures/no-frontmatter.md +1 -0
  550. package/test/config/fixtures/weird-model-id.md +13 -0
  551. package/test/config/markdown.test.ts +228 -0
  552. package/test/config/tui.test.ts +667 -0
  553. package/test/control-plane/sse.test.ts +56 -0
  554. package/test/effect/cross-spawn-spawner.test.ts +402 -0
  555. package/test/effect/instance-state.test.ts +384 -0
  556. package/test/effect/run-service.test.ts +46 -0
  557. package/test/file/fsmonitor.test.ts +62 -0
  558. package/test/file/ignore.test.ts +10 -0
  559. package/test/file/index.test.ts +946 -0
  560. package/test/file/path-traversal.test.ts +198 -0
  561. package/test/file/ripgrep.test.ts +54 -0
  562. package/test/file/time.test.ts +354 -0
  563. package/test/file/watcher.test.ts +247 -0
  564. package/test/filesystem/filesystem.test.ts +319 -0
  565. package/test/fixture/db.ts +11 -0
  566. package/test/fixture/fixture.test.ts +26 -0
  567. package/test/fixture/fixture.ts +141 -0
  568. package/test/fixture/flock-worker.ts +72 -0
  569. package/test/fixture/lsp/fake-lsp-server.js +77 -0
  570. package/test/fixture/plug-worker.ts +93 -0
  571. package/test/fixture/plugin-meta-worker.ts +26 -0
  572. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  573. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  574. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  575. package/test/fixture/skills/index.json +6 -0
  576. package/test/fixture/tui-plugin.ts +335 -0
  577. package/test/fixture/tui-runtime.ts +34 -0
  578. package/test/format/format.test.ts +179 -0
  579. package/test/ide/ide.test.ts +82 -0
  580. package/test/installation/installation.test.ts +151 -0
  581. package/test/keybind.test.ts +421 -0
  582. package/test/lib/effect.ts +37 -0
  583. package/test/lib/filesystem.ts +10 -0
  584. package/test/lsp/client.test.ts +95 -0
  585. package/test/lsp/index.test.ts +55 -0
  586. package/test/lsp/launch.test.ts +22 -0
  587. package/test/lsp/lifecycle.test.ts +147 -0
  588. package/test/mcp/headers.test.ts +153 -0
  589. package/test/mcp/lifecycle.test.ts +750 -0
  590. package/test/mcp/oauth-auto-connect.test.ts +199 -0
  591. package/test/mcp/oauth-browser.test.ts +249 -0
  592. package/test/memory/abort-leak.test.ts +137 -0
  593. package/test/patch/patch.test.ts +348 -0
  594. package/test/permission/arity.test.ts +33 -0
  595. package/test/permission/next.test.ts +1148 -0
  596. package/test/permission-task.test.ts +323 -0
  597. package/test/plugin/auth-override.test.ts +74 -0
  598. package/test/plugin/codex.test.ts +123 -0
  599. package/test/plugin/install-concurrency.test.ts +134 -0
  600. package/test/plugin/install.test.ts +504 -0
  601. package/test/plugin/loader-shared.test.ts +625 -0
  602. package/test/plugin/meta.test.ts +137 -0
  603. package/test/plugin/trigger.test.ts +111 -0
  604. package/test/preload.ts +90 -0
  605. package/test/project/migrate-global.test.ts +140 -0
  606. package/test/project/project.test.ts +459 -0
  607. package/test/project/state.test.ts +115 -0
  608. package/test/project/vcs.test.ts +116 -0
  609. package/test/project/worktree-remove.test.ts +96 -0
  610. package/test/project/worktree.test.ts +173 -0
  611. package/test/provider/amazon-bedrock.test.ts +447 -0
  612. package/test/provider/copilot/convert-to-copilot-messages.test.ts +523 -0
  613. package/test/provider/copilot/copilot-chat-model.test.ts +592 -0
  614. package/test/provider/gitlab-duo.test.ts +412 -0
  615. package/test/provider/provider.test.ts +2284 -0
  616. package/test/provider/transform.test.ts +2758 -0
  617. package/test/pty/pty-output-isolation.test.ts +141 -0
  618. package/test/pty/pty-session.test.ts +92 -0
  619. package/test/question/question.test.ts +453 -0
  620. package/test/server/global-session-list.test.ts +89 -0
  621. package/test/server/project-init-git.test.ts +121 -0
  622. package/test/server/session-list.test.ts +90 -0
  623. package/test/server/session-messages.test.ts +132 -0
  624. package/test/server/session-select.test.ts +78 -0
  625. package/test/session/compaction.test.ts +1094 -0
  626. package/test/session/instruction.test.ts +170 -0
  627. package/test/session/llm.test.ts +882 -0
  628. package/test/session/message-v2.test.ts +957 -0
  629. package/test/session/messages-pagination.test.ts +115 -0
  630. package/test/session/processor-effect.test.ts +838 -0
  631. package/test/session/prompt.test.ts +518 -0
  632. package/test/session/retry.test.ts +232 -0
  633. package/test/session/revert-compact.test.ts +286 -0
  634. package/test/session/session.test.ts +142 -0
  635. package/test/session/structured-output-integration.test.ts +233 -0
  636. package/test/session/structured-output.test.ts +391 -0
  637. package/test/session/system.test.ts +59 -0
  638. package/test/share/share-next.test.ts +76 -0
  639. package/test/skill/discovery.test.ts +116 -0
  640. package/test/skill/skill.test.ts +392 -0
  641. package/test/snapshot/snapshot.test.ts +1235 -0
  642. package/test/storage/db.test.ts +14 -0
  643. package/test/storage/json-migration.test.ts +849 -0
  644. package/test/sync/index.test.ts +191 -0
  645. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  646. package/test/tool/apply_patch.test.ts +567 -0
  647. package/test/tool/bash.test.ts +403 -0
  648. package/test/tool/edit.test.ts +681 -0
  649. package/test/tool/external-directory.test.ts +128 -0
  650. package/test/tool/fixtures/large-image.png +0 -0
  651. package/test/tool/fixtures/models-api.json +38413 -0
  652. package/test/tool/grep.test.ts +111 -0
  653. package/test/tool/question.test.ts +108 -0
  654. package/test/tool/read.test.ts +509 -0
  655. package/test/tool/registry.test.ts +126 -0
  656. package/test/tool/skill.test.ts +167 -0
  657. package/test/tool/task.test.ts +49 -0
  658. package/test/tool/truncation.test.ts +161 -0
  659. package/test/tool/webfetch.test.ts +101 -0
  660. package/test/tool/write.test.ts +353 -0
  661. package/test/util/data-url.test.ts +14 -0
  662. package/test/util/effect-zod.test.ts +61 -0
  663. package/test/util/error.test.ts +38 -0
  664. package/test/util/filesystem.test.ts +558 -0
  665. package/test/util/flock.test.ts +383 -0
  666. package/test/util/format.test.ts +59 -0
  667. package/test/util/glob.test.ts +164 -0
  668. package/test/util/iife.test.ts +36 -0
  669. package/test/util/lazy.test.ts +50 -0
  670. package/test/util/lock.test.ts +72 -0
  671. package/test/util/module.test.ts +59 -0
  672. package/test/util/process.test.ts +128 -0
  673. package/test/util/timeout.test.ts +21 -0
  674. package/test/util/which.test.ts +100 -0
  675. package/test/util/wildcard.test.ts +90 -0
  676. package/tsconfig.json +23 -0
@@ -0,0 +1,9 @@
1
+ import { TuiConfig } from "@/config/tui"
2
+ import { createSimpleContext } from "./helper"
3
+
4
+ export const { use: useTuiConfig, provider: TuiConfigProvider } = createSimpleContext({
5
+ name: "TuiConfig",
6
+ init: (props: { config: TuiConfig.Info }) => {
7
+ return props.config
8
+ },
9
+ })
@@ -0,0 +1,49 @@
1
+ import { BusEvent } from "@/bus/bus-event"
2
+ import { Bus } from "@/bus"
3
+ import { SessionID } from "@/session/schema"
4
+ import z from "zod"
5
+
6
+ export const TuiEvent = {
7
+ PromptAppend: BusEvent.define("tui.prompt.append", z.object({ text: z.string() })),
8
+ CommandExecute: BusEvent.define(
9
+ "tui.command.execute",
10
+ z.object({
11
+ command: z.union([
12
+ z.enum([
13
+ "session.list",
14
+ "session.new",
15
+ "session.share",
16
+ "session.interrupt",
17
+ "session.compact",
18
+ "session.page.up",
19
+ "session.page.down",
20
+ "session.line.up",
21
+ "session.line.down",
22
+ "session.half.page.up",
23
+ "session.half.page.down",
24
+ "session.first",
25
+ "session.last",
26
+ "prompt.clear",
27
+ "prompt.submit",
28
+ "agent.cycle",
29
+ ]),
30
+ z.string(),
31
+ ]),
32
+ }),
33
+ ),
34
+ ToastShow: BusEvent.define(
35
+ "tui.toast.show",
36
+ z.object({
37
+ title: z.string().optional(),
38
+ message: z.string(),
39
+ variant: z.enum(["info", "success", "warning", "error"]),
40
+ duration: z.number().default(5000).optional().describe("Duration in milliseconds"),
41
+ }),
42
+ ),
43
+ SessionSelect: BusEvent.define(
44
+ "tui.session.select",
45
+ z.object({
46
+ sessionID: SessionID.zod.describe("Session ID to navigate to"),
47
+ }),
48
+ ),
49
+ }
@@ -0,0 +1,152 @@
1
+ import { For } from "solid-js"
2
+ import { DEFAULT_THEMES, useTheme } from "@tui/context/theme"
3
+
4
+ const themeCount = Object.keys(DEFAULT_THEMES).length
5
+ const themeTip = `Use {highlight}/themes{/highlight} or {highlight}Ctrl+X T{/highlight} to switch between ${themeCount} built-in themes`
6
+
7
+ type TipPart = { text: string; highlight: boolean }
8
+
9
+ function parse(tip: string): TipPart[] {
10
+ const parts: TipPart[] = []
11
+ const regex = /\{highlight\}(.*?)\{\/highlight\}/g
12
+ const found = Array.from(tip.matchAll(regex))
13
+ const state = found.reduce(
14
+ (acc, match) => {
15
+ const start = match.index ?? 0
16
+ if (start > acc.index) {
17
+ acc.parts.push({ text: tip.slice(acc.index, start), highlight: false })
18
+ }
19
+ acc.parts.push({ text: match[1], highlight: true })
20
+ acc.index = start + match[0].length
21
+ return acc
22
+ },
23
+ { parts, index: 0 },
24
+ )
25
+
26
+ if (state.index < tip.length) {
27
+ parts.push({ text: tip.slice(state.index), highlight: false })
28
+ }
29
+
30
+ return parts
31
+ }
32
+
33
+ export function Tips() {
34
+ const theme = useTheme().theme
35
+ const parts = parse(TIPS[Math.floor(Math.random() * TIPS.length)])
36
+
37
+ return (
38
+ <box flexDirection="row" maxWidth="100%">
39
+ <text flexShrink={0} style={{ fg: theme.warning }}>
40
+ ● Tip{" "}
41
+ </text>
42
+ <text flexShrink={1}>
43
+ <For each={parts}>
44
+ {(part) => <span style={{ fg: part.highlight ? theme.text : theme.textMuted }}>{part.text}</span>}
45
+ </For>
46
+ </text>
47
+ </box>
48
+ )
49
+ }
50
+
51
+ const TIPS = [
52
+ "Type {highlight}@{/highlight} followed by a filename to fuzzy search and attach files",
53
+ "Start a message with {highlight}!{/highlight} to run shell commands directly (e.g., {highlight}!ls -la{/highlight})",
54
+ "Press {highlight}Tab{/highlight} to cycle between Build and Plan agents",
55
+ "Use {highlight}/undo{/highlight} to revert the last message and file changes",
56
+ "Use {highlight}/redo{/highlight} to restore previously undone messages and file changes",
57
+ "Run {highlight}/share{/highlight} to create a public link to your conversation at toolkode.com",
58
+ "Drag and drop images into the terminal to add them as context",
59
+ "Press {highlight}Ctrl+V{/highlight} to paste images from your clipboard into the prompt",
60
+ "Press {highlight}Ctrl+X E{/highlight} or {highlight}/editor{/highlight} to compose messages in your external editor",
61
+ "Run {highlight}/init{/highlight} to auto-generate project rules based on your codebase",
62
+ "Run {highlight}/models{/highlight} or {highlight}Ctrl+X M{/highlight} to see and switch between available AI models",
63
+ themeTip,
64
+ "Press {highlight}Ctrl+X N{/highlight} or {highlight}/new{/highlight} to start a fresh conversation session",
65
+ "Use {highlight}/sessions{/highlight} or {highlight}Ctrl+X L{/highlight} to list and continue previous conversations",
66
+ "Run {highlight}/compact{/highlight} to summarize long sessions near context limits",
67
+ "Press {highlight}Ctrl+X X{/highlight} or {highlight}/export{/highlight} to save the conversation as Markdown",
68
+ "Press {highlight}Ctrl+X Y{/highlight} to copy the assistant's last message to clipboard",
69
+ "Press {highlight}Ctrl+P{/highlight} to see all available actions and commands",
70
+ "Run {highlight}/connect{/highlight} to add API keys for 75+ supported LLM providers",
71
+ "The leader key is {highlight}Ctrl+X{/highlight}; combine with other keys for quick actions",
72
+ "Press {highlight}F2{/highlight} to quickly switch between recently used models",
73
+ "Press {highlight}Ctrl+X B{/highlight} to show/hide the sidebar panel",
74
+ "Use {highlight}PageUp{/highlight}/{highlight}PageDown{/highlight} to navigate through conversation history",
75
+ "Press {highlight}Ctrl+G{/highlight} or {highlight}Home{/highlight} to jump to the beginning of the conversation",
76
+ "Press {highlight}Ctrl+Alt+G{/highlight} or {highlight}End{/highlight} to jump to the most recent message",
77
+ "Press {highlight}Shift+Enter{/highlight} or {highlight}Ctrl+J{/highlight} to add newlines in your prompt",
78
+ "Press {highlight}Ctrl+C{/highlight} when typing to clear the input field",
79
+ "Press {highlight}Escape{/highlight} to stop the AI mid-response",
80
+ "Switch to {highlight}Plan{/highlight} agent to get suggestions without making actual changes",
81
+ "Use {highlight}@agent-name{/highlight} in prompts to invoke specialized subagents",
82
+ "Press {highlight}Ctrl+X Right/Left{/highlight} to cycle through parent and child sessions",
83
+ "Create {highlight}toolkode.json{/highlight} for server settings and {highlight}tui.json{/highlight} for TUI settings",
84
+ "Place TUI settings in {highlight}~/.config/toolkode/tui.json{/highlight} for global config",
85
+ "Add {highlight}$schema{/highlight} to your config for autocomplete in your editor",
86
+ "Configure {highlight}model{/highlight} in config to set your default model",
87
+ "Override any keybind in {highlight}tui.json{/highlight} via the {highlight}keybinds{/highlight} section",
88
+ "Set any keybind to {highlight}none{/highlight} to disable it completely",
89
+ "Configure local or remote MCP servers in the {highlight}mcp{/highlight} config section",
90
+ "Toolkode auto-handles OAuth for remote MCP servers requiring auth",
91
+ "Add {highlight}.md{/highlight} files to {highlight}.toolkode/command/{/highlight} to define reusable custom prompts",
92
+ "Use {highlight}$ARGUMENTS{/highlight}, {highlight}$1{/highlight}, {highlight}$2{/highlight} in custom commands for dynamic input",
93
+ "Use backticks in commands to inject shell output (e.g., {highlight}`git status`{/highlight})",
94
+ "Add {highlight}.md{/highlight} files to {highlight}.toolkode/agent/{/highlight} for specialized AI personas",
95
+ "Configure per-agent permissions for {highlight}edit{/highlight}, {highlight}bash{/highlight}, and {highlight}webfetch{/highlight} tools",
96
+ 'Use patterns like {highlight}"git *": "allow"{/highlight} for granular bash permissions',
97
+ 'Set {highlight}"rm -rf *": "deny"{/highlight} to block destructive commands',
98
+ 'Configure {highlight}"git push": "ask"{/highlight} to require approval before pushing',
99
+ "Toolkode auto-formats files using prettier, gofmt, ruff, and more",
100
+ 'Set {highlight}"formatter": false{/highlight} in config to disable all auto-formatting',
101
+ "Define custom formatter commands with file extensions in config",
102
+ "Toolkode uses LSP servers for intelligent code analysis",
103
+ "Create {highlight}.ts{/highlight} files in {highlight}.toolkode/tools/{/highlight} to define new LLM tools",
104
+ "Tool definitions can invoke scripts written in Python, Go, etc",
105
+ "Add {highlight}.ts{/highlight} files to {highlight}.toolkode/plugin/{/highlight} for event hooks",
106
+ "Use plugins to send OS notifications when sessions complete",
107
+ "Create a plugin to prevent Toolkode from reading sensitive files",
108
+ "Use {highlight}toolkode run{/highlight} for non-interactive scripting",
109
+ "Use {highlight}toolkode --continue{/highlight} to resume the last session",
110
+ "Use {highlight}toolkode run -f file.ts{/highlight} to attach files via CLI",
111
+ "Use {highlight}--format json{/highlight} for machine-readable output in scripts",
112
+ "Run {highlight}toolkode serve{/highlight} for headless API access to Toolkode",
113
+ "Use {highlight}toolkode run --attach{/highlight} to connect to a running server",
114
+ "Run {highlight}toolkode upgrade{/highlight} to update to the latest version",
115
+ "Run {highlight}toolkode auth list{/highlight} to see all configured providers",
116
+ "Run {highlight}toolkode agent create{/highlight} for guided agent creation",
117
+ "Use {highlight}/toolkode{/highlight} in GitHub issues/PRs to trigger AI actions",
118
+ "Run {highlight}toolkode github install{/highlight} to set up the GitHub workflow",
119
+ "Comment {highlight}/toolkode fix this{/highlight} on issues to auto-create PRs",
120
+ "Comment {highlight}/oc{/highlight} on PR code lines for targeted code reviews",
121
+ 'Use {highlight}"theme": "system"{/highlight} to match your terminal\'s colors',
122
+ "Create JSON theme files in {highlight}.toolkode/themes/{/highlight} directory",
123
+ "Themes support dark/light variants for both modes",
124
+ "Reference ANSI colors 0-255 in custom themes",
125
+ "Use {highlight}{env:VAR_NAME}{/highlight} syntax to reference environment variables in config",
126
+ "Use {highlight}{file:path}{/highlight} to include file contents in config values",
127
+ "Use {highlight}instructions{/highlight} in config to load additional rules files",
128
+ "Set agent {highlight}temperature{/highlight} from 0.0 (focused) to 1.0 (creative)",
129
+ "Configure {highlight}steps{/highlight} to limit agentic iterations per request",
130
+ 'Set {highlight}"tools": {"bash": false}{/highlight} to disable specific tools',
131
+ 'Set {highlight}"mcp_*": false{/highlight} to disable all tools from an MCP server',
132
+ "Override global tool settings per agent configuration",
133
+ 'Set {highlight}"share": "auto"{/highlight} to automatically share all sessions',
134
+ 'Set {highlight}"share": "disabled"{/highlight} to prevent any session sharing',
135
+ "Run {highlight}/unshare{/highlight} to remove a session from public access",
136
+ "Permission {highlight}doom_loop{/highlight} prevents infinite tool call loops",
137
+ "Permission {highlight}external_directory{/highlight} protects files outside project",
138
+ "Run {highlight}toolkode debug config{/highlight} to troubleshoot configuration",
139
+ "Use {highlight}--print-logs{/highlight} flag to see detailed logs in stderr",
140
+ "Press {highlight}Ctrl+X G{/highlight} or {highlight}/timeline{/highlight} to jump to specific messages",
141
+ "Press {highlight}Ctrl+X H{/highlight} to toggle code block visibility in messages",
142
+ "Press {highlight}Ctrl+X S{/highlight} or {highlight}/status{/highlight} to see system status info",
143
+ "Enable {highlight}scroll_acceleration{/highlight} in {highlight}tui.json{/highlight} for smooth macOS-style scrolling",
144
+ "Toggle username display in chat via command palette ({highlight}Ctrl+P{/highlight})",
145
+ "Run {highlight}docker run -it --rm ghcr.io/toolkit-llm/toolkode{/highlight} for containerized use",
146
+ "Use {highlight}/connect{/highlight} with Toolkode Pro for curated, tested models",
147
+ "Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team sharing",
148
+ "Use {highlight}/review{/highlight} to review uncommitted changes, branches, or PRs",
149
+ "Run {highlight}/help{/highlight} or {highlight}Ctrl+X H{/highlight} to show the help dialog",
150
+ "Use {highlight}/rename{/highlight} to rename the current session",
151
+ "Press {highlight}Ctrl+Z{/highlight} to suspend the terminal and return to your shell",
152
+ ]
@@ -0,0 +1,50 @@
1
+ import type { TuiPlugin, TuiPluginModule } from "@toolkit-cli/plugin/tui"
2
+ import { createMemo, Show } from "solid-js"
3
+ import { Tips } from "./tips-view"
4
+
5
+ const id = "internal:home-tips"
6
+
7
+ function View(props: { show: boolean }) {
8
+ return (
9
+ <box height={2} minHeight={0} width="100%" maxWidth={75} alignItems="center" paddingTop={1} flexShrink={1}>
10
+ <Show when={props.show}>
11
+ <Tips />
12
+ </Show>
13
+ </box>
14
+ )
15
+ }
16
+
17
+ const tui: TuiPlugin = async (api) => {
18
+ api.command.register(() => [
19
+ {
20
+ title: api.kv.get("tips_hidden", false) ? "Show tips" : "Hide tips",
21
+ value: "tips.toggle",
22
+ keybind: "tips_toggle",
23
+ category: "System",
24
+ hidden: api.route.current.name !== "home",
25
+ onSelect() {
26
+ api.kv.set("tips_hidden", !api.kv.get("tips_hidden", false))
27
+ api.ui.dialog.clear()
28
+ },
29
+ },
30
+ ])
31
+
32
+ api.slots.register({
33
+ order: 100,
34
+ slots: {
35
+ home_bottom() {
36
+ const hidden = createMemo(() => api.kv.get("tips_hidden", true)) // hidden by default — clean center
37
+ const first = createMemo(() => api.state.session.count() === 0)
38
+ const show = createMemo(() => !first() && !hidden())
39
+ return <View show={show()} />
40
+ },
41
+ },
42
+ })
43
+ }
44
+
45
+ const plugin: TuiPluginModule & { id: string } = {
46
+ id,
47
+ tui,
48
+ }
49
+
50
+ export default plugin
@@ -0,0 +1,95 @@
1
+ import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@toolkit-cli/plugin/tui"
2
+ import { createMemo, createSignal, For, Show, onCleanup } from "solid-js"
3
+
4
+ const id = "internal:sidebar-agents"
5
+
6
+ interface SubAgent {
7
+ id: string
8
+ title: string
9
+ status: "busy" | "idle" | "error"
10
+ }
11
+
12
+ function truncate(s: string, max: number): string {
13
+ return s.length > max ? s.slice(0, max - 1) + "…" : s
14
+ }
15
+
16
+ function parseAgentType(title: string): string {
17
+ const match = title.match(/@(\w[\w-]*)/)
18
+ return match ? match[1] : "agent"
19
+ }
20
+
21
+ function View(props: { api: TuiPluginApi; session_id: string }) {
22
+ const theme = () => props.api.theme.current
23
+ const msg = createMemo(() => props.api.state.session.messages(props.session_id))
24
+ const [subAgents, setSubAgents] = createSignal<SubAgent[]>([])
25
+
26
+ const agentCount = createMemo(() => {
27
+ const agents = new Set<string>()
28
+ for (const m of msg()) {
29
+ if (m.role === "assistant" && m.agent) agents.add(m.agent)
30
+ }
31
+ return agents.size
32
+ })
33
+
34
+ const status = createMemo(() => {
35
+ const s = props.api.state.session.status(props.session_id)
36
+ return s?.type === "busy" ? "running" : "idle"
37
+ })
38
+
39
+ const timer = setInterval(async () => {
40
+ try {
41
+ const res = await props.api.client.session.list()
42
+ if (res.error || !res.data) return
43
+ const sessions = Array.isArray(res.data) ? res.data : []
44
+ const children = sessions.filter((s: any) => s.parentID === props.session_id)
45
+ const agents: SubAgent[] = children.map((s: any) => {
46
+ const st = props.api.state.session.status(s.id)
47
+ return {
48
+ id: s.id,
49
+ title: s.title || "subagent",
50
+ status: st?.type === "busy" ? "busy" : "idle",
51
+ }
52
+ })
53
+ setSubAgents(agents)
54
+ } catch {}
55
+ }, 3000)
56
+ onCleanup(() => clearInterval(timer))
57
+
58
+ return (
59
+ <box>
60
+ <text fg={theme().text}>
61
+ <b>Agents</b>
62
+ </text>
63
+ <text fg={theme().textMuted}>
64
+ <span style={{ fg: status() === "running" ? theme().warning : theme().success }}>●</span>{" "}
65
+ {status() === "running" ? "Running" : "Idle"}
66
+ {" "}{agentCount()} active
67
+ </text>
68
+ <Show when={subAgents().length > 0}>
69
+ <For each={subAgents()}>
70
+ {(agent) => (
71
+ <text fg={theme().textMuted}>
72
+ <span style={{ fg: agent.status === "busy" ? theme().warning : theme().textMuted }}>●</span>{" "}
73
+ <span style={{ fg: theme().text }}>{parseAgentType(agent.title)}</span>{" "}
74
+ {truncate(agent.title.replace(/@\w[\w-]*\s*subagent\s*/i, "").trim() || agent.title, 24)}
75
+ </text>
76
+ )}
77
+ </For>
78
+ </Show>
79
+ </box>
80
+ )
81
+ }
82
+
83
+ const tui: TuiPlugin = async (api) => {
84
+ api.slots.register({
85
+ order: 150,
86
+ slots: {
87
+ sidebar_content(_ctx, props) {
88
+ return <View api={api} session_id={props.session_id} />
89
+ },
90
+ },
91
+ })
92
+ }
93
+
94
+ const plugin: TuiPluginModule & { id: string } = { id, tui }
95
+ export default plugin
@@ -0,0 +1,105 @@
1
+ import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@toolkit-cli/plugin/tui"
2
+ import { createMemo, createSignal, For, Show, onCleanup } from "solid-js"
3
+
4
+ const id = "internal:sidebar-btw"
5
+
6
+ function View(props: { api: TuiPluginApi; session_id: string }) {
7
+ const theme = () => props.api.theme.current
8
+ const [polling, setPolling] = createSignal(false)
9
+
10
+ const history = createMemo(() => (props.api.kv.get("btw_history") as Array<{ q: string; a: string }>) || [])
11
+ const loading = createMemo(() => props.api.kv.get("btw_loading") as boolean)
12
+ const hasHistory = createMemo(() => history().length > 0)
13
+
14
+ // Poll for btw response — messages are {info, parts}[] format
15
+ const timer = setInterval(async () => {
16
+ const btwSessionID = props.api.kv.get("btw_session_id") as string | undefined
17
+ if (!btwSessionID || !loading() || polling()) return
18
+
19
+ setPolling(true)
20
+ try {
21
+ const res = await props.api.client.session.messages({ sessionID: btwSessionID })
22
+ if (res.error || !res.data) { setPolling(false); return }
23
+
24
+ const msgs = Array.isArray(res.data) ? res.data : []
25
+
26
+ // Find last completed assistant message
27
+ // Response format: {info: {role, time, ...}, parts: [{type, text, ...}]}
28
+ for (let i = msgs.length - 1; i >= 0; i--) {
29
+ const m = msgs[i] as any
30
+ const info = m.info ?? m // handle both {info, parts} and flat formats
31
+ const parts = m.parts ?? []
32
+
33
+ if (info.role !== "assistant") continue
34
+ if (!info.time?.completed) continue
35
+
36
+ // Extract text from parts
37
+ const textParts = parts.filter((p: any) => p.type === "text" && p.text?.trim())
38
+ if (textParts.length > 0) {
39
+ updateAnswer(textParts.map((p: any) => p.text.trim()).join("\n"))
40
+ break
41
+ }
42
+ }
43
+ } catch {
44
+ // ignore polling errors
45
+ } finally {
46
+ setPolling(false)
47
+ }
48
+ }, 1500)
49
+
50
+ function updateAnswer(text: string) {
51
+ const h = [...history()]
52
+ if (h.length > 0 && !h[h.length - 1].a) {
53
+ h[h.length - 1].a = text
54
+ props.api.kv.set("btw_history", h)
55
+ props.api.kv.set("btw_loading", false)
56
+ }
57
+ }
58
+
59
+ onCleanup(() => clearInterval(timer))
60
+
61
+ return (
62
+ <box>
63
+ <text fg={theme().primary}><b>/ask</b></text>
64
+ <Show when={hasHistory()} fallback={
65
+ <box>
66
+ <text fg={theme().textMuted}>Side conversation.</text>
67
+ <text fg={theme().textMuted}>
68
+ <span style={{ fg: theme().text }}>/ask</span> question
69
+ </text>
70
+ </box>
71
+ }>
72
+ <For each={history().slice(-3)}>
73
+ {(item) => (
74
+ <box paddingTop={1}>
75
+ <text fg={theme().primary}>&gt; {item.q}</text>
76
+ <Show when={item.a}>
77
+ <text fg={theme().text}>{item.a.length > 400 ? item.a.slice(0, 397) + "..." : item.a}</text>
78
+ </Show>
79
+ </box>
80
+ )}
81
+ </For>
82
+ <Show when={loading()}>
83
+ <text fg={theme().warning} paddingTop={1}>thinking...</text>
84
+ </Show>
85
+ <text fg={theme().textMuted} paddingTop={1}>
86
+ <span style={{ fg: theme().text }}>/ask clear</span> to reset
87
+ </text>
88
+ </Show>
89
+ </box>
90
+ )
91
+ }
92
+
93
+ const tui: TuiPlugin = async (api) => {
94
+ api.slots.register({
95
+ order: 450,
96
+ slots: {
97
+ sidebar_content(_ctx, props) {
98
+ return <View api={api} session_id={props.session_id} />
99
+ },
100
+ },
101
+ })
102
+ }
103
+
104
+ const plugin: TuiPluginModule & { id: string } = { id, tui }
105
+ export default plugin
@@ -0,0 +1,40 @@
1
+ import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@toolkit-cli/plugin/tui"
2
+ import { createMemo, Show } from "solid-js"
3
+
4
+ const id = "internal:sidebar-commands"
5
+
6
+ function View(props: { api: TuiPluginApi }) {
7
+ const theme = () => props.api.theme.current
8
+
9
+ const mcpCount = createMemo(() => props.api.state.mcp().length)
10
+
11
+ return (
12
+ <box>
13
+ <text fg={theme().primary}><b>Commands</b></text>
14
+ <Show when={mcpCount() > 0}>
15
+ <text fg={theme().textMuted}>
16
+ {mcpCount()} MCP servers
17
+ </text>
18
+ </Show>
19
+ <text fg={theme().textMuted}>
20
+ <span style={{ fg: theme().text }}>ctrl+p</span> palette
21
+ {" "}
22
+ <span style={{ fg: theme().text }}>/</span> slash
23
+ </text>
24
+ </box>
25
+ )
26
+ }
27
+
28
+ const tui: TuiPlugin = async (api) => {
29
+ api.slots.register({
30
+ order: 175,
31
+ slots: {
32
+ sidebar_content(_ctx) {
33
+ return <View api={api} />
34
+ },
35
+ },
36
+ })
37
+ }
38
+
39
+ const plugin: TuiPluginModule & { id: string } = { id, tui }
40
+ export default plugin
@@ -0,0 +1,63 @@
1
+ import type { AssistantMessage } from "@toolkit-cli/sdk/v2"
2
+ import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@toolkit-cli/plugin/tui"
3
+ import { createMemo } from "solid-js"
4
+
5
+ const id = "internal:sidebar-context"
6
+
7
+ const money = new Intl.NumberFormat("en-US", {
8
+ style: "currency",
9
+ currency: "USD",
10
+ })
11
+
12
+ function View(props: { api: TuiPluginApi; session_id: string }) {
13
+ const theme = () => props.api.theme.current
14
+ const msg = createMemo(() => props.api.state.session.messages(props.session_id))
15
+ const cost = createMemo(() => msg().reduce((sum, item) => sum + (item.role === "assistant" ? item.cost : 0), 0))
16
+
17
+ const state = createMemo(() => {
18
+ const last = msg().findLast((item): item is AssistantMessage => item.role === "assistant" && item.tokens.output > 0)
19
+ if (!last) {
20
+ return {
21
+ tokens: 0,
22
+ percent: null,
23
+ }
24
+ }
25
+
26
+ const tokens =
27
+ last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write
28
+ const model = props.api.state.provider.find((item) => item.id === last.providerID)?.models[last.modelID]
29
+ return {
30
+ tokens,
31
+ percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : null,
32
+ }
33
+ })
34
+
35
+ return (
36
+ <box>
37
+ <text fg={theme().text}>
38
+ <b>Context</b>
39
+ </text>
40
+ <text fg={theme().textMuted}>{state().tokens.toLocaleString()} tokens</text>
41
+ <text fg={theme().textMuted}>{state().percent ?? 0}% used</text>
42
+ <text fg={theme().textMuted}>{money.format(cost())} spent</text>
43
+ </box>
44
+ )
45
+ }
46
+
47
+ const tui: TuiPlugin = async (api) => {
48
+ api.slots.register({
49
+ order: 100,
50
+ slots: {
51
+ sidebar_content(_ctx, props) {
52
+ return <View api={api} session_id={props.session_id} />
53
+ },
54
+ },
55
+ })
56
+ }
57
+
58
+ const plugin: TuiPluginModule & { id: string } = {
59
+ id,
60
+ tui,
61
+ }
62
+
63
+ export default plugin
@@ -0,0 +1,62 @@
1
+ import type { TuiPlugin, TuiPluginApi, TuiPluginModule } from "@toolkit-cli/plugin/tui"
2
+ import { createMemo, For, Show, createSignal } from "solid-js"
3
+
4
+ const id = "internal:sidebar-files"
5
+
6
+ function View(props: { api: TuiPluginApi; session_id: string }) {
7
+ const [open, setOpen] = createSignal(true)
8
+ const theme = () => props.api.theme.current
9
+ const list = createMemo(() => props.api.state.session.diff(props.session_id))
10
+
11
+ return (
12
+ <Show when={list().length > 0}>
13
+ <box>
14
+ <box flexDirection="row" gap={1} onMouseDown={() => list().length > 2 && setOpen((x) => !x)}>
15
+ <Show when={list().length > 2}>
16
+ <text fg={theme().text}>{open() ? "▼" : "▶"}</text>
17
+ </Show>
18
+ <text fg={theme().text}>
19
+ <b>Modified Files</b>
20
+ </text>
21
+ </box>
22
+ <Show when={list().length <= 2 || open()}>
23
+ <For each={list()}>
24
+ {(item) => (
25
+ <box flexDirection="row" gap={1} justifyContent="space-between">
26
+ <text fg={theme().textMuted} wrapMode="none">
27
+ {item.file}
28
+ </text>
29
+ <box flexDirection="row" gap={1} flexShrink={0}>
30
+ <Show when={item.additions}>
31
+ <text fg={theme().diffAdded}>+{item.additions}</text>
32
+ </Show>
33
+ <Show when={item.deletions}>
34
+ <text fg={theme().diffRemoved}>-{item.deletions}</text>
35
+ </Show>
36
+ </box>
37
+ </box>
38
+ )}
39
+ </For>
40
+ </Show>
41
+ </box>
42
+ </Show>
43
+ )
44
+ }
45
+
46
+ const tui: TuiPlugin = async (api) => {
47
+ api.slots.register({
48
+ order: 500,
49
+ slots: {
50
+ sidebar_content(_ctx, props) {
51
+ return <View api={api} session_id={props.session_id} />
52
+ },
53
+ },
54
+ })
55
+ }
56
+
57
+ const plugin: TuiPluginModule & { id: string } = {
58
+ id,
59
+ tui,
60
+ }
61
+
62
+ export default plugin