turbollm 1.7.0 → 1.7.2

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 (86) hide show
  1. package/README.md +29 -12
  2. package/bin/turbollm.mjs +29 -25
  3. package/dist/cli.js +428 -124
  4. package/dist/webdist/assets/{AgentsScreen-Dy6Pcr_B.js → AgentsScreen-sMeMB3IQ.js} +1 -1
  5. package/dist/webdist/assets/{ChatScreen-XT3yMWtr.js → ChatScreen-rXB7PrWJ.js} +1 -1
  6. package/dist/webdist/assets/{CustomizeScreen-hksRI8F6.js → CustomizeScreen-BBwvtk28.js} +1 -1
  7. package/dist/webdist/assets/DeveloperScreen-fXV-qXB5.js +1 -0
  8. package/dist/webdist/assets/{EnginesScreen-CAvhN3G3.js → EnginesScreen-CrmYzhio.js} +1 -1
  9. package/dist/webdist/assets/{MessageBubble-CwO3NgI3.js → MessageBubble-COuZ8jTd.js} +3 -3
  10. package/dist/webdist/assets/{ModelDetailDialog-Dv0x3tYC.js → ModelDetailDialog-Dlt5uF3h.js} +1 -1
  11. package/dist/webdist/assets/{ModelDirs-BaoSLHhX.js → ModelDirs-BYN-DmHL.js} +1 -1
  12. package/dist/webdist/assets/{ModelsScreen-CkMFGoDd.js → ModelsScreen-DncNvsj6.js} +1 -1
  13. package/dist/webdist/assets/{SettingsScreen-DQ32fA2_.js → SettingsScreen-DXX3r4Ep.js} +1 -1
  14. package/dist/webdist/assets/{arc-DlFjpdSr.js → arc-BrQAHE5c.js} +1 -1
  15. package/dist/webdist/assets/{architectureDiagram-3BPJPVTR-pFBox1KQ.js → architectureDiagram-3BPJPVTR-DzOwDk0E.js} +1 -1
  16. package/dist/webdist/assets/{arrow-left-BJsjxPBS.js → arrow-left-Dp4XRnbs.js} +1 -1
  17. package/dist/webdist/assets/{blockDiagram-GPEHLZMM-B0UPWZtT.js → blockDiagram-GPEHLZMM-Cbs2lNCh.js} +1 -1
  18. package/dist/webdist/assets/{c4Diagram-AAUBKEIU-gIXSPwNR.js → c4Diagram-AAUBKEIU-BAull9Yv.js} +1 -1
  19. package/dist/webdist/assets/channel-Bt5-ol5R.js +1 -0
  20. package/dist/webdist/assets/check-jMeH6YsH.js +1 -0
  21. package/dist/webdist/assets/{chevron-down-CpHgu445.js → chevron-down-C5ZMFCtb.js} +1 -1
  22. package/dist/webdist/assets/{chevron-right-CYjTEILC.js → chevron-right-DNVnXbZ1.js} +1 -1
  23. package/dist/webdist/assets/{chunk-2J33WTMH-BoxvMF9T.js → chunk-2J33WTMH-B38k4sJL.js} +1 -1
  24. package/dist/webdist/assets/{chunk-4BX2VUAB-Di3wYJWs.js → chunk-4BX2VUAB-VxAkYvb7.js} +1 -1
  25. package/dist/webdist/assets/{chunk-55IACEB6-BLqI6bau.js → chunk-55IACEB6-CAz9ZWyR.js} +1 -1
  26. package/dist/webdist/assets/{chunk-727SXJPM-q0EuKEuw.js → chunk-727SXJPM-CvLX5ghS.js} +1 -1
  27. package/dist/webdist/assets/{chunk-AQP2D5EJ-BMFuxIuh.js → chunk-AQP2D5EJ-CZ0fsnc1.js} +1 -1
  28. package/dist/webdist/assets/{chunk-FMBD7UC4-BbyVyd6J.js → chunk-FMBD7UC4-tjHz_yw8.js} +1 -1
  29. package/dist/webdist/assets/{chunk-ND2GUHAM-CInbMq-r.js → chunk-ND2GUHAM-DVSh5E5_.js} +1 -1
  30. package/dist/webdist/assets/{chunk-QZHKN3VN-BAkYvJ9H.js → chunk-QZHKN3VN-D1rUM2SU.js} +1 -1
  31. package/dist/webdist/assets/{circle-check-D1Fzzp2X.js → circle-check-qnghY_qF.js} +1 -1
  32. package/dist/webdist/assets/{circle-x-Dk1Mtsgt.js → circle-x-FM28MwOL.js} +1 -1
  33. package/dist/webdist/assets/classDiagram-4FO5ZUOK-jfnUpxOr.js +1 -0
  34. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-jfnUpxOr.js +1 -0
  35. package/dist/webdist/assets/{common-BZUOg168.js → common-BD4Wa3KL.js} +1 -1
  36. package/dist/webdist/assets/{copy-button-CWk5ixZc.js → copy-button-DypRNkqI.js} +1 -1
  37. package/dist/webdist/assets/{cose-bilkent-S5V4N54A-B9I8xuFl.js → cose-bilkent-S5V4N54A-DIUqY7o2.js} +1 -1
  38. package/dist/webdist/assets/{dagre-BM42HDAG-DBN5qMmD.js → dagre-BM42HDAG-BzTcsgZ1.js} +1 -1
  39. package/dist/webdist/assets/{diagram-2AECGRRQ-CmGPSh2a.js → diagram-2AECGRRQ-DanHH-W_.js} +1 -1
  40. package/dist/webdist/assets/{diagram-5GNKFQAL-D3KnkSMW.js → diagram-5GNKFQAL-DQ5sWHUL.js} +1 -1
  41. package/dist/webdist/assets/{diagram-KO2AKTUF-D7cM5kP4.js → diagram-KO2AKTUF-Jqr_pLwu.js} +1 -1
  42. package/dist/webdist/assets/{diagram-LMA3HP47-CbkHl9Oq.js → diagram-LMA3HP47-BZ89-cp0.js} +1 -1
  43. package/dist/webdist/assets/{diagram-OG6HWLK6-D6t7nOOv.js → diagram-OG6HWLK6-cidBc5qa.js} +1 -1
  44. package/dist/webdist/assets/{dialog-CkBHSegf.js → dialog-3hyZ9j4e.js} +1 -1
  45. package/dist/webdist/assets/{erDiagram-TEJ5UH35-JS8JzvNq.js → erDiagram-TEJ5UH35-DEAKZN7b.js} +1 -1
  46. package/dist/webdist/assets/{flowDiagram-I6XJVG4X-BwMtMrHu.js → flowDiagram-I6XJVG4X-Cyx8gMzN.js} +1 -1
  47. package/dist/webdist/assets/{ganttDiagram-6RSMTGT7-C-wMnJb7.js → ganttDiagram-6RSMTGT7-CqXYW44d.js} +1 -1
  48. package/dist/webdist/assets/{gitGraphDiagram-PVQCEYII-CmaAN2hw.js → gitGraphDiagram-PVQCEYII-0dv_zKYA.js} +1 -1
  49. package/dist/webdist/assets/{index-CUj3iHti.js → index-CriwC5VH.js} +2 -2
  50. package/dist/webdist/assets/{infoDiagram-5YYISTIA-DKn67bh9.js → infoDiagram-5YYISTIA-PxeM6E3u.js} +1 -1
  51. package/dist/webdist/assets/{ishikawaDiagram-YF4QCWOH-Ba1O-jRt.js → ishikawaDiagram-YF4QCWOH-BnNdTjj1.js} +1 -1
  52. package/dist/webdist/assets/{journeyDiagram-JHISSGLW-3jjcJZn2.js → journeyDiagram-JHISSGLW-D3AHUGxz.js} +1 -1
  53. package/dist/webdist/assets/{kanban-definition-UN3LZRKU-Dxyq8Dv_.js → kanban-definition-UN3LZRKU-YARl6SUt.js} +1 -1
  54. package/dist/webdist/assets/{linear-Cbah9FEU.js → linear-CMEhaWGh.js} +1 -1
  55. package/dist/webdist/assets/{mermaid.core-BGMPViwt.js → mermaid.core-Dfl2pPvv.js} +4 -4
  56. package/dist/webdist/assets/{mindmap-definition-RKZ34NQL-83sJsd2O.js → mindmap-definition-RKZ34NQL-BojWC6jk.js} +1 -1
  57. package/dist/webdist/assets/{pencil-Dd9X6iv6.js → pencil-CS33zp9q.js} +1 -1
  58. package/dist/webdist/assets/personas-CzcXp8zg.js +75 -0
  59. package/dist/webdist/assets/{pieDiagram-4H26LBE5-DD6VQLn8.js → pieDiagram-4H26LBE5-cjsdMtJJ.js} +1 -1
  60. package/dist/webdist/assets/{plus-CV0QBMWx.js → plus-BO3vGy6f.js} +1 -1
  61. package/dist/webdist/assets/{quadrantDiagram-W4KKPZXB-CaOiBtJ-.js → quadrantDiagram-W4KKPZXB-DYVcgQuL.js} +1 -1
  62. package/dist/webdist/assets/{refresh-cw-Dr6SqmsF.js → refresh-cw-Cco9RapO.js} +1 -1
  63. package/dist/webdist/assets/{requirementDiagram-4Y6WPE33-BOJpE9a_.js → requirementDiagram-4Y6WPE33-Dkj58nhB.js} +1 -1
  64. package/dist/webdist/assets/{sankeyDiagram-5OEKKPKP-Bn-kiFX4.js → sankeyDiagram-5OEKKPKP-l3GwUuNl.js} +1 -1
  65. package/dist/webdist/assets/{save-YHf8XYeJ.js → save-CSISNMk8.js} +1 -1
  66. package/dist/webdist/assets/{sequenceDiagram-3UESZ5HK-DZ1wNcJ4.js → sequenceDiagram-3UESZ5HK-CWj1Dplo.js} +1 -1
  67. package/dist/webdist/assets/{skeleton-DRpa3g92.js → skeleton-CBRf-twG.js} +1 -1
  68. package/dist/webdist/assets/{stateDiagram-AJRCARHV-KYRqsHqR.js → stateDiagram-AJRCARHV-zbnPRcoE.js} +1 -1
  69. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-Ukx8AVKZ.js +1 -0
  70. package/dist/webdist/assets/{timeline-definition-PNZ67QCA-DjShwJtM.js → timeline-definition-PNZ67QCA-C_zAo1WZ.js} +1 -1
  71. package/dist/webdist/assets/{trash-2-COu80uxw.js → trash-2-DJmVqx0w.js} +1 -1
  72. package/dist/webdist/assets/{vennDiagram-CIIHVFJN-ZMpZCx2T.js → vennDiagram-CIIHVFJN-DxfcocQu.js} +1 -1
  73. package/dist/webdist/assets/{vram-CNhvTqb8.js → vram-Dn53zt7R.js} +1 -1
  74. package/dist/webdist/assets/{wardley-L42UT6IY-7jACIdKq.js → wardley-L42UT6IY-BnZ8BinJ.js} +1 -1
  75. package/dist/webdist/assets/{wardleyDiagram-YWT4CUSO-DKWWvUrP.js → wardleyDiagram-YWT4CUSO-DMk9z7hr.js} +1 -1
  76. package/dist/webdist/assets/{wrench-BkSH7V5Q.js → wrench-Di5WLTz2.js} +1 -1
  77. package/dist/webdist/assets/{xychartDiagram-2RQKCTM6-CdjviSb8.js → xychartDiagram-2RQKCTM6-BUtTPXPF.js} +1 -1
  78. package/dist/webdist/index.html +1 -1
  79. package/package.json +2 -2
  80. package/dist/webdist/assets/DeveloperScreen-Bi2h8ovi.js +0 -1
  81. package/dist/webdist/assets/channel-BtQ7Ppn0.js +0 -1
  82. package/dist/webdist/assets/check-CnaxmcKg.js +0 -1
  83. package/dist/webdist/assets/classDiagram-4FO5ZUOK-BqNXe-Qd.js +0 -1
  84. package/dist/webdist/assets/classDiagram-v2-Q7XG4LA2-BqNXe-Qd.js +0 -1
  85. package/dist/webdist/assets/personas-ZZlSx77v.js +0 -291
  86. package/dist/webdist/assets/stateDiagram-v2-BHNVJYJU-BUgXWf2c.js +0 -1
package/README.md CHANGED
@@ -79,7 +79,7 @@ TurboLLM does the opposite:
79
79
  a **VRAM-fit verdict before you load** — no more flag guessing.
80
80
  - **📊 Real tokens/sec, never faked.** Speed in the model list is *measured on your machine*
81
81
  from actual generation — live while you chat, and remembered per model.
82
- - **🪶 Lightweight.** A ~0.3 MB npm package on Node — **no Electron, no bundled Chromium, no
82
+ - **🪶 Lightweight.** A ~2 MB npm package on Node — **no Electron, no bundled Chromium, no
83
83
  Python**. It downloads only the engine your GPU actually needs (Vulkan ≈ 38 MB).
84
84
  - **🔌 Drop-in APIs.** OpenAI **and** Anthropic-compatible — so Claude Code and every existing
85
85
  tool work unchanged.
@@ -261,6 +261,12 @@ library, and loads it on the fly** if it isn't already running — then keeps up
261
261
  hot** in an LRU pool so the next switch is instant. An agent (or Claude Code) that hops between a
262
262
  coding model, a vision model, and an embedder just names each one and it works — no pre-wiring.
263
263
 
264
+ **One command wires up more than just Claude Code.** `turbollm launch <cli>` also supports
265
+ `opencode`, `kilo`, `openclaw`, and `hermes` — each gets pointed at TurboLLM the way that tool
266
+ expects (config file merge, or its own CLI command) instead of a manual copy-paste setup. Inside
267
+ Claude Code, `/model` lists your local models directly (with **Auto Model Swap** on in Settings →
268
+ Gateway) so you can switch mid-session instead of only at launch.
269
+
264
270
  </details>
265
271
 
266
272
  <details>
@@ -289,7 +295,7 @@ connected); **Remove** undoes it.
289
295
 
290
296
  <br/>
291
297
 
292
- - A **~0.3 MB npm package** on Node — no Electron, no bundled Chromium, no Python.
298
+ - A **~2 MB npm package** on Node — no Electron, no bundled Chromium, no Python.
293
299
  - **Offline-first** — no account, no backend, no internet, no telemetry.
294
300
  - **Windows · macOS · Linux**, with a CPU fallback when there's no GPU.
295
301
 
@@ -370,12 +376,20 @@ turbollm launch claude # auto-loads a model if none is running, th
370
376
  turbollm launch claude --model qwen3-8b # load a specific model first, then launch
371
377
  ```
372
378
 
373
- It sets Claude Code's `ANTHROPIC_BASE_URL` / `ANTHROPIC_MODEL` at TurboLLM and execs `claude`;
374
- extra args are forwarded. If no model is loaded it auto-loads your last-used one (or the first
375
- in your library); `--model` picks a specific one by key or name. If `claude` isn't installed,
376
- it tells you how. The in-app
377
- **Developer** screen also shows copy-paste env snippets for any OpenAI- or Anthropic-compatible
378
- tool (Open WebUI, Kilo Code, opencode, …).
379
+ It sets Claude Code's `ANTHROPIC_BASE_URL` and pins `ANTHROPIC_MODEL` to whatever model is
380
+ loaded (so the status line, `/status`, and context-window sizing all reflect the real model),
381
+ then execs `claude`; extra args are forwarded. If no model is loaded it auto-loads your
382
+ last-used one (or the first in your library); `--model` picks a specific one by key or name.
383
+ If `claude` isn't installed, it tells you how.
384
+
385
+ Other coding CLIs work too — `turbollm launch opencode`, `turbollm launch kilo`, and
386
+ `turbollm launch openclaw` write a `turbollm` provider into that tool's own config file
387
+ (preserving anything you already configured) and then launch it. If an existing config can't
388
+ be parsed, TurboLLM refuses to overwrite it and prints how to add the provider by hand.
389
+ `turbollm launch hermes` does the equivalent for [Hermes Agent](https://github.com/NousResearch/hermes-agent)
390
+ via its own `hermes config set` command (its config is YAML, so we drive its CLI instead of
391
+ hand-editing that file). The in-app **Developer** screen also shows copy-paste snippets for
392
+ any OpenAI- or Anthropic-compatible tool (Open WebUI, Kilo Code, opencode, …).
379
393
 
380
394
  ---
381
395
 
@@ -402,6 +416,7 @@ turbollm --addr 0.0.0.0:6996 # bind all interfaces (LAN sharing)
402
416
  turbollm --stop # stop a running daemon (any terminal)
403
417
  turbollm launch claude # start Claude Code (auto-loads a model if none is running)
404
418
  turbollm launch claude --model qwen3-8b # load a specific model, then launch
419
+ turbollm launch opencode # wire opencode (or kilo / openclaw) to TurboLLM, then launch
405
420
  ```
406
421
 
407
422
  | Flag | Description |
@@ -415,7 +430,9 @@ turbollm launch claude --model qwen3-8b # load a specific model, then launch
415
430
 
416
431
  `turbollm launch claude` also accepts `--model <key|name>` to load a specific model before
417
432
  launching; without it, an already-loaded model is used, or the last-used / first model is
418
- auto-loaded.
433
+ auto-loaded. The same command works with `opencode`, `kilo`, and `openclaw` — each gets a
434
+ `turbollm` provider merged into its own config file before it starts — and with `hermes`,
435
+ which gets configured via its own `hermes config set` command instead.
419
436
 
420
437
  ---
421
438
 
@@ -429,7 +446,7 @@ Use `--config <file>` to point at an alternate config (its directory becomes the
429
446
 
430
447
  ## Requirements
431
448
 
432
- - **Node.js 22 or newer** — enforced at startup with a clear message. <https://nodejs.org>
449
+ - **Node.js 22.13.0 or newer** — enforced at startup with a clear message. <https://nodejs.org>
433
450
  - **Windows, macOS, or Linux.**
434
451
  - A GPU is recommended but **not required** — a CPU build is provisioned as a fallback.
435
452
  - On Windows, the first time the auto-downloaded `llama-server` runs, SmartScreen/Defender may
@@ -475,7 +492,7 @@ Prefer Open WebUI's chat breadth? It works great pointed at TurboLLM's OpenAI en
475
492
 
476
493
  ## Troubleshooting
477
494
 
478
- - **`TurboLLM requires Node.js 22 or newer`** — upgrade Node: <https://nodejs.org>.
495
+ - **`TurboLLM requires Node.js 22.13.0 or newer`** — upgrade Node: <https://nodejs.org>.
479
496
  - **Model won't load / OOM** — pick a smaller quant (the VRAM verdict warns you), lower GPU
480
497
  offload, or close other GPU apps. Failures surface in the Engines screen with the engine log.
481
498
  - **Windows Defender / SmartScreen prompt** — that's the upstream `llama-server` binary on
@@ -502,7 +519,7 @@ node dist/cli.js --port 6996
502
519
  Frontend hot-reload: `cd web && npm run dev` (proxies `/api` and `/v1` to the daemon on
503
520
  :6996).
504
521
 
505
- **Stack:** Node ≥22 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
522
+ **Stack:** Node ≥22.13 · TypeScript · Hono · `node:sqlite` · tsup — and a React 19 + Tailwind v4 +
506
523
  shadcn/ui frontend. One TypeScript codebase, shipped as an npm package.
507
524
 
508
525
  ---
package/bin/turbollm.mjs CHANGED
@@ -1,25 +1,29 @@
1
- #!/usr/bin/env node
2
- // Hand-written launcher shim — NOT bundled by tsup. It runs before the bundled
3
- // daemon (dist/cli.js) loads, so it can do two things that must happen before
4
- // node:sqlite is imported (the bundle hoists that import, emitting an experimental
5
- // warning that PowerShell renders as a scary red error block on every run):
6
- // 1. Guard the Node version with a friendly message (node:sqlite needs Node 22+).
7
- // 2. Register a 'warning' filter that swallows the node:sqlite experimental notice
8
- // while still printing every other warning.
9
- // Then it hands off to the real CLI via dynamic import (same process; argv intact).
10
- const major = Number(process.versions.node.split('.')[0])
11
- if (major < 22) {
12
- process.stderr.write(
13
- `TurboLLM requires Node.js 22 or newer.\n` +
14
- `You are running Node.js ${process.versions.node}.\n` +
15
- `Please upgrade: https://nodejs.org\n`,
16
- )
17
- process.exit(1)
18
- }
19
-
20
- process.on('warning', (w) => {
21
- if (w.name === 'ExperimentalWarning' && /SQLite/i.test(w.message)) return
22
- process.stderr.write(`${w.stack ?? `${w.name}: ${w.message}`}\n`)
23
- })
24
-
25
- await import('../dist/cli.js')
1
+ #!/usr/bin/env node
2
+ // Hand-written launcher shim — NOT bundled by tsup. It runs before the bundled
3
+ // daemon (dist/cli.js) loads, so it can do two things that must happen before
4
+ // node:sqlite is imported (the bundle hoists that import, emitting an experimental
5
+ // warning that PowerShell renders as a scary red error block on every run):
6
+ // 1. Guard the Node version with a friendly message (node:sqlite needs Node 22.13+
7
+ // that's when node:sqlite became available WITHOUT the --experimental-sqlite flag;
8
+ // on 22.5.0-22.12.x it's registered only behind that flag, so importing it bare
9
+ // throws ERR_UNKNOWN_BUILTIN_MODULE: "No such built-in module: node:sqlite"
10
+ // (GitHub #40) even though `node -v` reports 22.x).
11
+ // 2. Register a 'warning' filter that swallows the node:sqlite experimental notice
12
+ // while still printing every other warning.
13
+ // Then it hands off to the real CLI via dynamic import (same process; argv intact).
14
+ const [major, minor] = process.versions.node.split('.').map(Number)
15
+ if (major < 22 || (major === 22 && minor < 13)) {
16
+ process.stderr.write(
17
+ `TurboLLM requires Node.js 22.13.0 or newer (needs node:sqlite unflagged).\n` +
18
+ `You are running Node.js ${process.versions.node}.\n` +
19
+ `Please upgrade: https://nodejs.org\n`,
20
+ )
21
+ process.exit(1)
22
+ }
23
+
24
+ process.on('warning', (w) => {
25
+ if (w.name === 'ExperimentalWarning' && /SQLite/i.test(w.message)) return
26
+ process.stderr.write(`${w.stack ?? `${w.name}: ${w.message}`}\n`)
27
+ })
28
+
29
+ await import('../dist/cli.js')