turbollm 1.14.4 → 1.14.5

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 (132) hide show
  1. package/README.md +2 -1
  2. package/dist/{chunk-SEL52AIK.js → chunk-3Z2SF2XI.js} +58 -9
  3. package/dist/{chunk-PJPEPLCC.js → chunk-WXR3RE6R.js} +22 -3
  4. package/dist/cli.js +993 -488
  5. package/dist/code-routes.js +1 -1
  6. package/dist/code-run-manager.js +1 -1
  7. package/dist/{distiller-VMWKFGZ3.js → distiller-X267J2RN.js} +1 -1
  8. package/dist/webdist/assets/{AgentEditPage-BNmbr88t.js → AgentEditPage-K_8Kxamh.js} +1 -1
  9. package/dist/webdist/assets/{ChatScreen-CF4JZk0M.js → ChatScreen-B4Ig3tR5.js} +1 -1
  10. package/dist/webdist/assets/{CodeComposer-Czcz90en.js → CodeComposer-D1WJXLdn.js} +1 -1
  11. package/dist/webdist/assets/{CodeHomeScreen-CwRKfNev.js → CodeHomeScreen-DG6FZNj8.js} +1 -1
  12. package/dist/webdist/assets/{CodeSessionScreen-uXHLPcxK.js → CodeSessionScreen-BAtRazPi.js} +1 -1
  13. package/dist/webdist/assets/{CustomizeScreen-O3AELYUa.js → CustomizeScreen-xsUfxqiu.js} +1 -1
  14. package/dist/webdist/assets/EnginesScreen-CpfnySul.js +10 -0
  15. package/dist/webdist/assets/{HardwareSection-Ct9uvnKd.js → HardwareSection-BXDzXTrH.js} +1 -1
  16. package/dist/webdist/assets/{JevPlaygroundScreen-C0e3c1AD.js → JevPlaygroundScreen-MzKO9H-B.js} +1 -1
  17. package/dist/webdist/assets/ModelDetailDialog-ChpRG1Wi.js +1 -0
  18. package/dist/webdist/assets/{ModelLoadMenu-BIIHFLIf.js → ModelLoadMenu-DqD8SqyE.js} +1 -1
  19. package/dist/webdist/assets/{ModelsScreen-CTomnU6F.js → ModelsScreen-CSpv0NKR.js} +2 -2
  20. package/dist/webdist/assets/{OnboardingScreen-CdHnY17u.js → OnboardingScreen-BTtikAjb.js} +1 -1
  21. package/dist/webdist/assets/{RoutineEditPage-B0fecLWw.js → RoutineEditPage-xhsMw8uU.js} +1 -1
  22. package/dist/webdist/assets/{RoutinesPanel-bwE_t5ac.js → RoutinesPanel-A47Qrtsa.js} +1 -1
  23. package/dist/webdist/assets/{SettingsScreen-aU01FuSA.js → SettingsScreen-BIlbFLiz.js} +1 -1
  24. package/dist/webdist/assets/{SidebarResizeHandle-8GEpkkUe.js → SidebarResizeHandle-CCBGM-70.js} +1 -1
  25. package/dist/webdist/assets/{SkillEditPage-Cr82fE6m.js → SkillEditPage-D3r6TT6U.js} +1 -1
  26. package/dist/webdist/assets/{TextClassificationRuntimeLabel-CZDGpukj.js → TextClassificationRuntimeLabel-BusPRB63.js} +1 -1
  27. package/dist/webdist/assets/{ToolApprovalBar-B9Gd7sly.js → ToolApprovalBar-aQMa6yF3.js} +3 -3
  28. package/dist/webdist/assets/{WorkspaceModeTabs-D01nxdBH.js → WorkspaceModeTabs-S_Z08ap7.js} +1 -1
  29. package/dist/webdist/assets/WorkspaceScreen-CDWEOdHi.js +1 -0
  30. package/dist/webdist/assets/{abnfDiagram-N423BO3Z-BO5-whYd.js → abnfDiagram-N423BO3Z-WkT4niiO.js} +1 -1
  31. package/dist/webdist/assets/{agent-api-BiGG4i9Z.js → agent-api-dHhdsF_P.js} +1 -1
  32. package/dist/webdist/assets/{arc-Bkr-WJBj.js → arc-C1Qod98t.js} +1 -1
  33. package/dist/webdist/assets/{architectureDiagram-T3A2C74G-BpdEgDYf.js → architectureDiagram-T3A2C74G-DmPyVTZM.js} +1 -1
  34. package/dist/webdist/assets/{arrow-down-BGVqLYYH.js → arrow-down-CpI18AXJ.js} +1 -1
  35. package/dist/webdist/assets/{arrow-up-Dw4ZubK1.js → arrow-up-D3CHtls4.js} +1 -1
  36. package/dist/webdist/assets/{badge-0CKYZFiJ.js → badge-DuIEkQ33.js} +1 -1
  37. package/dist/webdist/assets/{blockDiagram-VBNYF7ZC-OCC2w9nn.js → blockDiagram-VBNYF7ZC-D99dQ6pM.js} +1 -1
  38. package/dist/webdist/assets/{c4Diagram-5PPSVZJV-B8T-OLXR.js → c4Diagram-5PPSVZJV-8wCbIZWK.js} +1 -1
  39. package/dist/webdist/assets/channel-CuosB93r.js +1 -0
  40. package/dist/webdist/assets/{chat-api-CZXsbPp6.js → chat-api-CWOSJbG3.js} +1 -1
  41. package/dist/webdist/assets/{chat-queries-CZTi-T9L.js → chat-queries-Bo4yxif9.js} +1 -1
  42. package/dist/webdist/assets/{chevron-down-BXNIf5ta.js → chevron-down-BPJjG12o.js} +1 -1
  43. package/dist/webdist/assets/{chevron-left-DuyrdGoV.js → chevron-left-eqT4nGjT.js} +1 -1
  44. package/dist/webdist/assets/{chevron-right-C9xt5auV.js → chevron-right-CD_t-rdH.js} +1 -1
  45. package/dist/webdist/assets/{chunk-2GRJ4B5K-Dqxs1kIV.js → chunk-2GRJ4B5K-BCZwrMcN.js} +1 -1
  46. package/dist/webdist/assets/{chunk-2Q5K7J3B-Bub7QDEL.js → chunk-2Q5K7J3B-0bf5RxNa.js} +1 -1
  47. package/dist/webdist/assets/{chunk-5RXB4S5H-CLnrYCnz.js → chunk-5RXB4S5H-DE3OSVQ8.js} +1 -1
  48. package/dist/webdist/assets/{chunk-5VM5RSS4-CUJ0eM6n.js → chunk-5VM5RSS4-CmutKtE1.js} +1 -1
  49. package/dist/webdist/assets/{chunk-6Q2QTUOP-BRsYXZkO.js → chunk-6Q2QTUOP-g6Mn906K.js} +1 -1
  50. package/dist/webdist/assets/{chunk-GF5L2VYU-B5XH50Qk.js → chunk-GF5L2VYU-D3HaNsdk.js} +1 -1
  51. package/dist/webdist/assets/{chunk-JWPE2WC7-C3psRWVL.js → chunk-JWPE2WC7-Bp_Yzi1a.js} +1 -1
  52. package/dist/webdist/assets/{chunk-KBJHAD2P-BEA4H-19.js → chunk-KBJHAD2P-CPKAe-1s.js} +1 -1
  53. package/dist/webdist/assets/{chunk-RYQCIY6F-BUx3QiN3.js → chunk-RYQCIY6F-Cbw8xmRN.js} +1 -1
  54. package/dist/webdist/assets/{chunk-XXDRQBXY-C3MC_hbR.js → chunk-XXDRQBXY-48EaEmfu.js} +1 -1
  55. package/dist/webdist/assets/{circle-check-xk54fXJS.js → circle-check-BcMk8p-G.js} +1 -1
  56. package/dist/webdist/assets/{circle-x-BWb_DixX.js → circle-x-jAeBUHHH.js} +1 -1
  57. package/dist/webdist/assets/classDiagram-JCYQIIEL-BNyLm9RA.js +1 -0
  58. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-BNyLm9RA.js +1 -0
  59. package/dist/webdist/assets/{collapsible-BnnsqTsx.js → collapsible-D9Vr6VCp.js} +1 -1
  60. package/dist/webdist/assets/{common-BCWpRJ1N.js → common-DOT2z2u9.js} +1 -1
  61. package/dist/webdist/assets/{cose-bilkent-JH36ORCC-Dwv0af-M.js → cose-bilkent-JH36ORCC-CeIHgYP5.js} +1 -1
  62. package/dist/webdist/assets/{cynefin-VYW2F7L2-BWxNTdKV.js → cynefin-VYW2F7L2-DTMel-Z2.js} +1 -1
  63. package/dist/webdist/assets/{cynefinDiagram-MW4NZA55-BPyLIR_B.js → cynefinDiagram-MW4NZA55-_VdFnZ3Z.js} +1 -1
  64. package/dist/webdist/assets/{dagre-VZM6K2ZE-CEb_O4pV.js → dagre-VZM6K2ZE-CWvUzpyy.js} +1 -1
  65. package/dist/webdist/assets/{diagram-7IWD3JNH-DB88VkOY.js → diagram-7IWD3JNH-DhZYiT0q.js} +1 -1
  66. package/dist/webdist/assets/{diagram-B4RE2ZJO-DOM7mfIK.js → diagram-B4RE2ZJO-BhRzmLt2.js} +1 -1
  67. package/dist/webdist/assets/{diagram-LBJQPF4R-Cg0R6GxX.js → diagram-LBJQPF4R-CMGkNihd.js} +1 -1
  68. package/dist/webdist/assets/{diagram-Q27KOJAE-CxeCiLOT.js → diagram-Q27KOJAE-Bblz7Lbt.js} +1 -1
  69. package/dist/webdist/assets/{diagram-UB23O5K3-CprAhnai.js → diagram-UB23O5K3-BOmQ81Ue.js} +1 -1
  70. package/dist/webdist/assets/{dropdown-menu-DiPFrQLA.js → dropdown-menu-cPdo9ZZP.js} +1 -1
  71. package/dist/webdist/assets/{ebnfDiagram-BXEA7PRR-C4pv-oR4.js → ebnfDiagram-BXEA7PRR-BjfLTZAr.js} +1 -1
  72. package/dist/webdist/assets/{erDiagram-JOGREHBK-D4QygQ4I.js → erDiagram-JOGREHBK-DKEWSMft.js} +1 -1
  73. package/dist/webdist/assets/{file-text-C_cO6E_s.js → file-text-CZcdeBUP.js} +1 -1
  74. package/dist/webdist/assets/{flask-conical-DKXc7jUt.js → flask-conical-bYNo3nn1.js} +1 -1
  75. package/dist/webdist/assets/{flowDiagram-UKHOOZJN-izyZumYP.js → flowDiagram-UKHOOZJN-DqeWOBkV.js} +1 -1
  76. package/dist/webdist/assets/{folder-input-CyKO5ooe.js → folder-input-B2y6pkSW.js} +1 -1
  77. package/dist/webdist/assets/{folder-plus-D7xFZfCb.js → folder-plus-FsmAug1i.js} +1 -1
  78. package/dist/webdist/assets/{ganttDiagram-PKOTCBZU-CQWAMzDG.js → ganttDiagram-PKOTCBZU-0RAt3msp.js} +1 -1
  79. package/dist/webdist/assets/{git-branch-B0cM0Zxi.js → git-branch-DiLaGeql.js} +1 -1
  80. package/dist/webdist/assets/{gitGraphDiagram-DS77QQ5N-BvWR9w7Y.js → gitGraphDiagram-DS77QQ5N-BzPK0H9P.js} +1 -1
  81. package/dist/webdist/assets/{globe-NiyuFtle.js → globe-BsABIeUl.js} +1 -1
  82. package/dist/webdist/assets/{index-varAVIJU.js → index-Bqa6IN6i.js} +9 -9
  83. package/dist/webdist/assets/{infoDiagram-6WML65LV-1gqS_oWL.js → infoDiagram-6WML65LV-BqUpiKEw.js} +1 -1
  84. package/dist/webdist/assets/{ishikawaDiagram-WSZJBQD7-Cx6SFpay.js → ishikawaDiagram-WSZJBQD7-tD0IcS1A.js} +1 -1
  85. package/dist/webdist/assets/{journeyDiagram-NVQOT4AX-gGIHXgxK.js → journeyDiagram-NVQOT4AX-Ce9iAoBP.js} +1 -1
  86. package/dist/webdist/assets/{kanban-definition-27J2QSJJ-D1HhnnM7.js → kanban-definition-27J2QSJJ-Dhyqj0L0.js} +1 -1
  87. package/dist/webdist/assets/{linear-DSXg6Ffg.js → linear-CSASmH1C.js} +1 -1
  88. package/dist/webdist/assets/{lock-CnyzGHRX.js → lock-DCxOeYj-.js} +1 -1
  89. package/dist/webdist/assets/{mermaid.core-D5JisBj9.js → mermaid.core-DSQ7Sqx8.js} +4 -4
  90. package/dist/webdist/assets/{mindmap-definition-FAOFIHXS-B0byUkvK.js → mindmap-definition-FAOFIHXS-DhvP5DYu.js} +1 -1
  91. package/dist/webdist/assets/{monitor-CTN2u8tK.js → monitor-eXRQjF9w.js} +1 -1
  92. package/dist/webdist/assets/{pegDiagram-VL7TDLO6-Dt-zGf-k.js → pegDiagram-VL7TDLO6-CLzXNlsf.js} +1 -1
  93. package/dist/webdist/assets/{pencil-D69NKD-F.js → pencil-BtrApPfE.js} +1 -1
  94. package/dist/webdist/assets/{personas-BbUpeysB.js → personas-XaHDpxp2.js} +1 -1
  95. package/dist/webdist/assets/{pieDiagram-7S7Q4E2Y-DRMMSjp9.js → pieDiagram-7S7Q4E2Y-CKHXWPS9.js} +1 -1
  96. package/dist/webdist/assets/{quadrantDiagram-CIZ2JOQS-DaATWIfz.js → quadrantDiagram-CIZ2JOQS-BojJG_t4.js} +1 -1
  97. package/dist/webdist/assets/{railroadDiagram-AXF67PYL-CbsGiHwv.js → railroadDiagram-AXF67PYL-DuD3rtF0.js} +1 -1
  98. package/dist/webdist/assets/{refresh-cw-CLwEC3sr.js → refresh-cw-D6KnKU2_.js} +1 -1
  99. package/dist/webdist/assets/{remote-failure-drQ8KyR8.js → remote-failure-B8nqFhU5.js} +1 -1
  100. package/dist/webdist/assets/{requirementDiagram-LRYGKXZP-Dqc8MAdD.js → requirementDiagram-LRYGKXZP-BmoCUywL.js} +1 -1
  101. package/dist/webdist/assets/{rocket-CL94q3vq.js → rocket-B2q37T1r.js} +1 -1
  102. package/dist/webdist/assets/{rotate-ccw-NK7haSv1.js → rotate-ccw-BMo4jBZ1.js} +1 -1
  103. package/dist/webdist/assets/{sankeyDiagram-W5VNT64P-BfjZpzfh.js → sankeyDiagram-W5VNT64P-C89EHFeF.js} +1 -1
  104. package/dist/webdist/assets/{sequenceDiagram-SI44F4Z6-WbIPbQW4.js → sequenceDiagram-SI44F4Z6-BCR7KfeP.js} +1 -1
  105. package/dist/webdist/assets/{sheet-DKTuxDvt.js → sheet-CD8C6ONJ.js} +1 -1
  106. package/dist/webdist/assets/{sizeCapture-X5ZJPWSS-r0jtTB93.js → sizeCapture-X5ZJPWSS-1hcjxDkN.js} +1 -1
  107. package/dist/webdist/assets/{skeleton-DG0cOx3l.js → skeleton-C1o0gjEg.js} +1 -1
  108. package/dist/webdist/assets/{sliders-horizontal-B5iD6kNZ.js → sliders-horizontal-DtSuS5yg.js} +1 -1
  109. package/dist/webdist/assets/{sparkles-s6557zHQ.js → sparkles-C8N5PBOo.js} +1 -1
  110. package/dist/webdist/assets/{star-Dgi8I8ZH.js → star-CNv5CnL_.js} +1 -1
  111. package/dist/webdist/assets/{stateDiagram-OKZ733FA-CO7Wpb9l.js → stateDiagram-OKZ733FA-YPW5R4RS.js} +1 -1
  112. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-DIs6tBM2.js +1 -0
  113. package/dist/webdist/assets/{swimlanes-SLNWSIFB-ngVvfsnJ.js → swimlanes-SLNWSIFB-Bql7YB-c.js} +2 -2
  114. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-BzmV1yPG.js +8 -0
  115. package/dist/webdist/assets/{switch-Cs_mrLU4.js → switch-Dn5plSgD.js} +1 -1
  116. package/dist/webdist/assets/{terminal-BqnUErCU.js → terminal-Bl-uPRCi.js} +1 -1
  117. package/dist/webdist/assets/{timeline-definition-Z64GVDOM-C8Dt72UG.js → timeline-definition-Z64GVDOM-BZEdG7ZN.js} +1 -1
  118. package/dist/webdist/assets/{trash-2-CMalmZ6q.js → trash-2-DTsYIXDi.js} +1 -1
  119. package/dist/webdist/assets/{vennDiagram-T6HMQDX7-Bm5zYsBs.js → vennDiagram-T6HMQDX7-Cg9lsn_J.js} +1 -1
  120. package/dist/webdist/assets/{wardleyDiagram-T6FBY63Y-CxvwbEto.js → wardleyDiagram-T6FBY63Y-xbljZAia.js} +1 -1
  121. package/dist/webdist/assets/{wrench-rTTc-GDR.js → wrench-DbTBzsBR.js} +1 -1
  122. package/dist/webdist/assets/{xychartDiagram-ELKLHX3M-C6pDgitB.js → xychartDiagram-ELKLHX3M-CjLE0hzq.js} +1 -1
  123. package/dist/webdist/index.html +1 -1
  124. package/package.json +1 -1
  125. package/dist/webdist/assets/EnginesScreen-oqJoQAtM.js +0 -10
  126. package/dist/webdist/assets/ModelDetailDialog-CQ0GNrJz.js +0 -1
  127. package/dist/webdist/assets/WorkspaceScreen-CSAr0Q_B.js +0 -1
  128. package/dist/webdist/assets/channel-CeeZgowW.js +0 -1
  129. package/dist/webdist/assets/classDiagram-JCYQIIEL-B0TYtBgV.js +0 -1
  130. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-B0TYtBgV.js +0 -1
  131. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-BrtzYqXb.js +0 -1
  132. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-4F3hZEVL.js +0 -8
package/README.md CHANGED
@@ -563,7 +563,8 @@ switch between CUDA / ROCm / Metal / SYCL / Vulkan / CPU at any time (it downloa
563
563
  you choose, LM Studio-style).
564
564
 
565
565
  **Engine types.** **llama.cpp / GGUF**, **KoboldCpp** and **llamafile** (GGUF, every OS),
566
- **MLX** and **MLX-VLM** (macOS), and **vLLM** (Linux + NVIDIA) are all first-class engine kinds —
566
+ **MLX** and **MLX-VLM** (macOS), **vLLM** (Linux + NVIDIA), and **LiteRT-LM** (Google's on-device
567
+ runtime for `.litertlm` models, CPU or GPU, incl. Android via Termux; experimental) are all first-class engine kinds —
567
568
  install from the curated catalog, pick the right one per model, and switch from a single dropdown.
568
569
 
569
570
  **Fully supervised.** Every engine runs under a real state machine: health-gated readiness,
@@ -48,8 +48,22 @@ var RAPID_MLX_MODEL_ALIAS = "default";
48
48
  function engineModelAlias(engineKind, modelPath) {
49
49
  if (engineKind === "rapid-mlx") return RAPID_MLX_MODEL_ALIAS;
50
50
  if (engineKind === "mlx-vlm") return modelPath ?? null;
51
+ if (engineKind === "litert-lm") return modelPath ?? null;
51
52
  return engineKind === "mlx" || engineKind === "vllm" || engineKind === "sglang" ? ENGINE_MODEL_ALIAS : null;
52
53
  }
54
+ function applyEngineTokenLimit(engineKind, body) {
55
+ if (engineKind !== "litert-lm" || !("max_tokens" in body)) return body;
56
+ const b = body;
57
+ if (b.max_completion_tokens != null && b.max_tokens != null) {
58
+ const capped = Number(b.max_tokens);
59
+ const explicit = Number(b.max_completion_tokens);
60
+ if (Number.isFinite(capped) && Number.isFinite(explicit)) b.max_completion_tokens = Math.min(capped, explicit);
61
+ } else if (b.max_tokens != null) {
62
+ b.max_completion_tokens = b.max_tokens;
63
+ }
64
+ delete b.max_tokens;
65
+ return body;
66
+ }
53
67
 
54
68
  // src/link/link-proxy.ts
55
69
  var FACADE_PREFIX = "/api/link";
@@ -218,17 +232,24 @@ function resolveChatUpstream(d, requestedModel) {
218
232
  if (!target) {
219
233
  return { ok: false, status: 409, code: "model_not_loaded", message: "Engine not running." };
220
234
  }
235
+ const engineKind = d.registry.active()?.kind ?? "";
221
236
  return {
222
237
  ok: true,
223
238
  upstream: {
224
- modelField: engineModelAlias(d.registry.active()?.kind ?? "", d.manager.currentOpts()?.modelPath) ?? ms.model.key,
239
+ modelField: engineModelAlias(engineKind, d.manager.currentOpts()?.modelPath) ?? ms.model.key,
225
240
  modelName: ms.model.name,
226
241
  ctxMax: ms.model.ctx ?? DEFAULT_CTX,
227
- target
242
+ target,
243
+ engineKind
228
244
  }
229
245
  };
230
246
  }
247
+ function shapeForLocalEngine(upstream, body) {
248
+ if (upstream.remote || upstream.engineKind !== "litert-lm" || !body || typeof body !== "object" || Array.isArray(body)) return body;
249
+ return applyEngineTokenLimit(upstream.engineKind, { ...body });
250
+ }
231
251
  function callChatUpstream(upstream, body, signal, fetchImpl = fetch, d) {
252
+ body = shapeForLocalEngine(upstream, body);
232
253
  const payload = JSON.stringify(body);
233
254
  const call = upstream.remote ? (() => {
234
255
  const headers = linkHeaders(upstream.remote);
@@ -1541,7 +1562,7 @@ var BENCH_RATE_LIMIT_MS = 60 * 60 * 1e3;
1541
1562
  // src/models/scanner.ts
1542
1563
  import { existsSync as existsSync8, lstatSync as lstatSync2, readdirSync as readdirSync5, readFileSync as readFileSync8, realpathSync as realpathSync2, rmSync as rmSync4, writeFileSync as writeFileSync6 } from "fs";
1543
1564
  import { readdir, realpath, stat } from "fs/promises";
1544
- import { basename as basename3, dirname as dirname4, isAbsolute, join as join12, relative, resolve as resolve2, sep as sep2 } from "path";
1565
+ import { basename as basename4, dirname as dirname4, isAbsolute, join as join12, relative, resolve as resolve2, sep as sep2 } from "path";
1545
1566
 
1546
1567
  // src/gguf/gguf.ts
1547
1568
  import { closeSync, openSync, readSync } from "fs";
@@ -1550,9 +1571,37 @@ import { closeSync, openSync, readSync } from "fs";
1550
1571
  import { existsSync as existsSync7, lstatSync, readFileSync as readFileSync7 } from "fs";
1551
1572
  import { basename as basename2, join as join11 } from "path";
1552
1573
 
1574
+ // src/models/litertlm.ts
1575
+ import { open } from "fs/promises";
1576
+ import { basename as basename3 } from "path";
1577
+
1553
1578
  // src/models/profile.ts
1554
1579
  var ROCM_APU_NOMMAP_MIN_BYTES = 30 * 1024 ** 3;
1555
1580
 
1581
+ // src/engines/litert-lm.ts
1582
+ import { createHash as createHash2 } from "crypto";
1583
+ import { existsSync as existsSync10, mkdirSync as mkdirSync7, readdirSync as readdirSync6, rmSync as rmSync6, statSync as statSync2, writeFileSync as writeFileSync7 } from "fs";
1584
+ import { execFile as execFile3 } from "child_process";
1585
+ import { dirname as dirname5, join as join14 } from "path";
1586
+ import { promisify as promisify3 } from "util";
1587
+
1588
+ // src/engines/mlx.ts
1589
+ import { existsSync as existsSync9, mkdirSync as mkdirSync6, rmSync as rmSync5 } from "fs";
1590
+ import { execFile as execFile2 } from "child_process";
1591
+ import { join as join13 } from "path";
1592
+ import { promisify as promisify2 } from "util";
1593
+ var execFileP2 = promisify2(execFile2);
1594
+ var uvBinName = process.platform === "win32" ? "uv.exe" : "uv";
1595
+
1596
+ // src/engines/litert-lm.ts
1597
+ var execFileP3 = promisify3(execFile3);
1598
+ var NATIVE_LOAD_PROBE = [
1599
+ "import importlib, litert_lm",
1600
+ "ffi = importlib.import_module('litert_lm._ffi')",
1601
+ "load = getattr(ffi, '_get_lib', None)",
1602
+ "load() if callable(load) else None"
1603
+ ].join("\n");
1604
+
1556
1605
  // src/sysinfo/sysinfo.ts
1557
1606
  import { execFileSync as execFileSync3 } from "child_process";
1558
1607
  import os from "os";
@@ -1619,7 +1668,7 @@ async function autoTitleFromConversation(d, convId) {
1619
1668
  }
1620
1669
 
1621
1670
  // src/code/code-session.ts
1622
- import { join as join13, resolve as resolve3 } from "path";
1671
+ import { join as join15, resolve as resolve3 } from "path";
1623
1672
  import { readFile as readFile3 } from "fs/promises";
1624
1673
  import { Type, Unsafe } from "typebox";
1625
1674
  import {
@@ -2441,7 +2490,7 @@ async function runCodeSession(params) {
2441
2490
  console.warn(`[code-session] history seed for session ${sessionId} produced ${sessionManager.getEntries().length}/${expectedEntries} expected entries \u2014 falling back to a plain-text history prefix on this turn's prompt`);
2442
2491
  task = `${HISTORY_FALLBACK_PREFIX}${renderHistoryFallbackText(summaryText, priorMessages)}${HISTORY_FALLBACK_SUFFIX}${rawTask}`;
2443
2492
  }
2444
- const agentDir = join13(d.store.dir(), "pi-agent");
2493
+ const agentDir = join15(d.store.dir(), "pi-agent");
2445
2494
  modelRegistry.registerProvider("local", {
2446
2495
  ...upstream.provider,
2447
2496
  api: "openai-completions",
@@ -2568,7 +2617,7 @@ async function runCodeSession(params) {
2568
2617
  await sink({ event: "tool_call", data });
2569
2618
  });
2570
2619
  };
2571
- const skillAgentDir = join13(d.store.dir(), "pi-agent");
2620
+ const skillAgentDir = join15(d.store.dir(), "pi-agent");
2572
2621
  const skillResourceLoader = new DefaultResourceLoader({
2573
2622
  cwd: repoRoot,
2574
2623
  agentDir: skillAgentDir,
@@ -2709,7 +2758,7 @@ async function runCodeSession(params) {
2709
2758
  await sink({ event: "tool_call", data });
2710
2759
  });
2711
2760
  };
2712
- const subAgentDir = join13(d.store.dir(), "pi-agent");
2761
+ const subAgentDir = join15(d.store.dir(), "pi-agent");
2713
2762
  const subResourceLoader = new DefaultResourceLoader({
2714
2763
  cwd: repoRoot,
2715
2764
  agentDir: subAgentDir,
@@ -3364,7 +3413,7 @@ async function compactCodeSession(params) {
3364
3413
  return payload;
3365
3414
  });
3366
3415
  };
3367
- const compactAgentDir = join13(d.store.dir(), "pi-agent");
3416
+ const compactAgentDir = join15(d.store.dir(), "pi-agent");
3368
3417
  const compactResourceLoader = new DefaultResourceLoader({
3369
3418
  cwd: repoRoot,
3370
3419
  agentDir: compactAgentDir,
@@ -3463,7 +3512,7 @@ async function lookbackPreCompactionHistory(params) {
3463
3512
  return payload;
3464
3513
  });
3465
3514
  };
3466
- const lookbackAgentDir = join13(d.store.dir(), "pi-agent");
3515
+ const lookbackAgentDir = join15(d.store.dir(), "pi-agent");
3467
3516
  const lookbackResourceLoader = new DefaultResourceLoader({
3468
3517
  cwd: repoRoot,
3469
3518
  agentDir: lookbackAgentDir,
@@ -31,11 +31,14 @@ var GGMLC_GGUF = {
31
31
  };
32
32
  var NEEDS_PYTHON_ENGINE_LABEL = "needs MLX or vLLM";
33
33
  function formatIncompatibility(engineKind, format) {
34
- const label = format === "gguf" ? "needs llama.cpp" : NEEDS_PYTHON_ENGINE_LABEL;
34
+ const label = format === "gguf" ? "needs llama.cpp" : format === "litertlm" ? "needs LiteRT-LM" : NEEDS_PYTHON_ENGINE_LABEL;
35
35
  return { code: "format", label, message: formatMismatchMessage(engineKind, format) };
36
36
  }
37
37
  function formatMismatchMessage(engineKind, format) {
38
38
  if (engineKind === "laya") return "The Laya engine runs only Laya models \u2014 load this one on another engine.";
39
+ if (format === "litertlm") return "This is a LiteRT-LM model (.litertlm) \u2014 activate the LiteRT-LM engine to load it.";
40
+ if (engineKind === "litert-lm")
41
+ return "The active engine is LiteRT-LM \u2014 pick a .litertlm model, or switch to the engine this model's format needs.";
39
42
  if (engineKind === "mlx")
40
43
  return "The active engine is MLX \u2014 pick a safetensors model, or switch to a llama.cpp engine for GGUF.";
41
44
  if (engineKind === "rapid-mlx")
@@ -61,6 +64,7 @@ function engineAcceptsFormat(engineKind, format) {
61
64
  if (engineKind === "mlx-vlm") return format === "mlx";
62
65
  if (engineKind === "vllm") return format === "mlx";
63
66
  if (engineKind === "laya") return false;
67
+ if (engineKind === "litert-lm") return format === "litertlm";
64
68
  return format === "gguf";
65
69
  }
66
70
  function engineRejectsAudioModel(engineKind) {
@@ -71,8 +75,22 @@ var RAPID_MLX_MODEL_ALIAS = "default";
71
75
  function engineModelAlias(engineKind, modelPath) {
72
76
  if (engineKind === "rapid-mlx") return RAPID_MLX_MODEL_ALIAS;
73
77
  if (engineKind === "mlx-vlm") return modelPath ?? null;
78
+ if (engineKind === "litert-lm") return modelPath ?? null;
74
79
  return engineKind === "mlx" || engineKind === "vllm" || engineKind === "sglang" ? ENGINE_MODEL_ALIAS : null;
75
80
  }
81
+ function applyEngineTokenLimit(engineKind, body) {
82
+ if (engineKind !== "litert-lm" || !("max_tokens" in body)) return body;
83
+ const b = body;
84
+ if (b.max_completion_tokens != null && b.max_tokens != null) {
85
+ const capped = Number(b.max_tokens);
86
+ const explicit = Number(b.max_completion_tokens);
87
+ if (Number.isFinite(capped) && Number.isFinite(explicit)) b.max_completion_tokens = Math.min(capped, explicit);
88
+ } else if (b.max_tokens != null) {
89
+ b.max_completion_tokens = b.max_tokens;
90
+ }
91
+ delete b.max_tokens;
92
+ return body;
93
+ }
76
94
  var VENDOR_DISPLAY = {
77
95
  nvidia: "NVIDIA",
78
96
  amd: "AMD",
@@ -136,7 +154,7 @@ async function distill(d, material) {
136
154
  const res = await fetch(`${target}/v1/chat/completions`, {
137
155
  method: "POST",
138
156
  headers: { "Content-Type": "application/json" },
139
- body: JSON.stringify({
157
+ body: JSON.stringify(applyEngineTokenLimit(d.registry.active()?.kind ?? "", {
140
158
  model,
141
159
  messages: [
142
160
  { role: "system", content: DISTILL_SYSTEM },
@@ -152,7 +170,7 @@ Write ONE reusable skill as raw JSON \u2014 no markdown fences.` }
152
170
  chat_template_kwargs: { enable_thinking: false },
153
171
  response_format: { type: "json_object" },
154
172
  stream: false
155
- }),
173
+ })),
156
174
  signal: AbortSignal.timeout(9e4)
157
175
  });
158
176
  if (!res.ok) return { name: null, description: null, procedure: null };
@@ -232,6 +250,7 @@ export {
232
250
  modelIncompatibility,
233
251
  ENGINE_MODEL_ALIAS,
234
252
  engineModelAlias,
253
+ applyEngineTokenLimit,
235
254
  evaluateVariant,
236
255
  distillFromConversation,
237
256
  distillSkillsFromFolder