turbollm 1.14.1 → 1.14.3

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 (158) hide show
  1. package/README.md +16 -6
  2. package/dist/{chunk-P2FJIT7T.js → chunk-SEL52AIK.js} +14 -3
  3. package/dist/cli.js +243 -69
  4. package/dist/code-routes.js +21 -4
  5. package/dist/code-run-manager.js +1 -1
  6. package/dist/webdist/assets/{AgentEditPage-Cwa-zL38.js → AgentEditPage-CjfaBnD4.js} +1 -1
  7. package/dist/webdist/assets/{ChatScreen-Bc_Yl9Sx.js → ChatScreen-DY8g12qe.js} +18 -18
  8. package/dist/webdist/assets/CodeComposer-O6uw_dEo.js +1 -0
  9. package/dist/webdist/assets/CodeHomeScreen-D9uSHUf-.js +1 -0
  10. package/dist/webdist/assets/{CodeSessionScreen-8b2Ge4ie.js → CodeSessionScreen-D_rhtCFs.js} +3 -3
  11. package/dist/webdist/assets/{CustomizeScreen-C5nkAICY.js → CustomizeScreen-BcFX9Q_V.js} +4 -4
  12. package/dist/webdist/assets/{EnginesScreen-Up11ZhyB.js → EnginesScreen-D6uiILFx.js} +5 -5
  13. package/dist/webdist/assets/HardwareSection-Cy6agZys.js +1 -0
  14. package/dist/webdist/assets/JevPlaygroundScreen-CCRmBZsL.js +4 -0
  15. package/dist/webdist/assets/{ModelDetailDialog-B1JcClTY.js → ModelDetailDialog-2CnxrgyZ.js} +1 -1
  16. package/dist/webdist/assets/{ModelLoadMenu-CwIOXYXO.js → ModelLoadMenu-B55tUUUo.js} +1 -1
  17. package/dist/webdist/assets/{ModelsScreen-DQwvBWif.js → ModelsScreen-C3ZGHSfD.js} +2 -2
  18. package/dist/webdist/assets/OnboardingScreen-DibAVHbl.js +1 -0
  19. package/dist/webdist/assets/RoutineEditPage-DGx2VNfw.js +1 -0
  20. package/dist/webdist/assets/RoutinesPanel-D-EiZue1.js +1 -0
  21. package/dist/webdist/assets/SettingsScreen-PSqejyv-.js +2 -0
  22. package/dist/webdist/assets/SidebarResizeHandle-BEMfZ_M-.js +2 -0
  23. package/dist/webdist/assets/{SkillEditPage-D0GorNvr.js → SkillEditPage-a4L48IZM.js} +1 -1
  24. package/dist/webdist/assets/TextClassificationRuntimeLabel-BKeaXzVJ.js +1 -0
  25. package/dist/webdist/assets/{ToolApprovalBar-OKYB_ZAA.js → ToolApprovalBar-RNePIRp-.js} +17 -17
  26. package/dist/webdist/assets/WorkspaceModeTabs-DZdY2nBf.js +1 -0
  27. package/dist/webdist/assets/WorkspaceScreen-kicamjr8.js +1 -0
  28. package/dist/webdist/assets/{abnfDiagram-N423BO3Z-XHFTI65L.js → abnfDiagram-N423BO3Z-CxAOKJF6.js} +1 -1
  29. package/dist/webdist/assets/{agent-api-DOk_QFal.js → agent-api-BFbPafmn.js} +1 -1
  30. package/dist/webdist/assets/{arc-CNkBhygf.js → arc-C5Jiw2Ow.js} +1 -1
  31. package/dist/webdist/assets/{architectureDiagram-T3A2C74G-DhS0yd8i.js → architectureDiagram-T3A2C74G-CMYZ8ScY.js} +1 -1
  32. package/dist/webdist/assets/arrow-down-CzMySSLm.js +1 -0
  33. package/dist/webdist/assets/arrow-up-CvkWv_kZ.js +1 -0
  34. package/dist/webdist/assets/{badge-BLWWKpdD.js → badge-D4mMa17X.js} +1 -1
  35. package/dist/webdist/assets/{blockDiagram-VBNYF7ZC-Da4dRXQ_.js → blockDiagram-VBNYF7ZC-wmetya9r.js} +1 -1
  36. package/dist/webdist/assets/{c4Diagram-5PPSVZJV-DZlyWoX0.js → c4Diagram-5PPSVZJV-BeV5yKwp.js} +1 -1
  37. package/dist/webdist/assets/channel-lZjnTXKq.js +1 -0
  38. package/dist/webdist/assets/{chat-api-CH2dRFBP.js → chat-api-BwO7wZOQ.js} +1 -1
  39. package/dist/webdist/assets/chat-queries-D_0kcurv.js +1 -0
  40. package/dist/webdist/assets/{chevron-down-CvGX_-uJ.js → chevron-down-BOfiL1lz.js} +1 -1
  41. package/dist/webdist/assets/{chevron-left-DOsYIFeW.js → chevron-left-DSRtQQFP.js} +1 -1
  42. package/dist/webdist/assets/chevron-right-CVHs_Q7w.js +1 -0
  43. package/dist/webdist/assets/{chunk-2GRJ4B5K-C9h1bvfm.js → chunk-2GRJ4B5K-DjaqqqCb.js} +1 -1
  44. package/dist/webdist/assets/{chunk-2Q5K7J3B-BMmm-jOe.js → chunk-2Q5K7J3B-VCgCCKpJ.js} +1 -1
  45. package/dist/webdist/assets/{chunk-5RXB4S5H-DHORQmlT.js → chunk-5RXB4S5H-CvqiK9Tg.js} +1 -1
  46. package/dist/webdist/assets/{chunk-5VM5RSS4-Di4-RCdG.js → chunk-5VM5RSS4-DtTCp1C3.js} +1 -1
  47. package/dist/webdist/assets/{chunk-6Q2QTUOP-CBDkYNQ8.js → chunk-6Q2QTUOP-Dsic3APl.js} +1 -1
  48. package/dist/webdist/assets/{chunk-GF5L2VYU-BBX-ZTlB.js → chunk-GF5L2VYU-D8N4oTtR.js} +1 -1
  49. package/dist/webdist/assets/{chunk-JWPE2WC7-CVxwbspM.js → chunk-JWPE2WC7-R8PEhhHq.js} +1 -1
  50. package/dist/webdist/assets/{chunk-KBJHAD2P-Oo5VRh3b.js → chunk-KBJHAD2P-czwHsnCK.js} +1 -1
  51. package/dist/webdist/assets/{chunk-RYQCIY6F-Bf2E5f4L.js → chunk-RYQCIY6F-CoDqOb16.js} +1 -1
  52. package/dist/webdist/assets/{chunk-XXDRQBXY-DpxzpFS3.js → chunk-XXDRQBXY-Cldsz5dr.js} +1 -1
  53. package/dist/webdist/assets/{circle-check-sJ35WLnC.js → circle-check-djJJrY1O.js} +1 -1
  54. package/dist/webdist/assets/{circle-x-hbELBZ-8.js → circle-x-CArlOKoo.js} +1 -1
  55. package/dist/webdist/assets/classDiagram-JCYQIIEL-s5vmZBiR.js +1 -0
  56. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-s5vmZBiR.js +1 -0
  57. package/dist/webdist/assets/{collapsible-iTZnDqcl.js → collapsible-DEDu6inL.js} +1 -1
  58. package/dist/webdist/assets/{common-BgZzRAuV.js → common-DHTYD56P.js} +1 -1
  59. package/dist/webdist/assets/{cose-bilkent-JH36ORCC-DRPykHKI.js → cose-bilkent-JH36ORCC-DJJu2A8A.js} +1 -1
  60. package/dist/webdist/assets/{cynefin-VYW2F7L2-Bf5rHv2Z.js → cynefin-VYW2F7L2-B8S78-EI.js} +1 -1
  61. package/dist/webdist/assets/{cynefinDiagram-MW4NZA55-i0FqYmRg.js → cynefinDiagram-MW4NZA55-nCDMW2vi.js} +1 -1
  62. package/dist/webdist/assets/{dagre-VZM6K2ZE-CMbhTMZ4.js → dagre-VZM6K2ZE-DgF7Th-o.js} +1 -1
  63. package/dist/webdist/assets/{diagram-7IWD3JNH-CsOv9oXF.js → diagram-7IWD3JNH-ByjqDhlh.js} +1 -1
  64. package/dist/webdist/assets/{diagram-B4RE2ZJO-Dh_nM4nT.js → diagram-B4RE2ZJO-CdtoVUcH.js} +1 -1
  65. package/dist/webdist/assets/{diagram-LBJQPF4R-kpDBpfMN.js → diagram-LBJQPF4R-Bz8cz8Iw.js} +1 -1
  66. package/dist/webdist/assets/{diagram-Q27KOJAE-DsoOGsDe.js → diagram-Q27KOJAE-C0jR_yOk.js} +1 -1
  67. package/dist/webdist/assets/{diagram-UB23O5K3-Dm3BTmfy.js → diagram-UB23O5K3-NerVDH9H.js} +1 -1
  68. package/dist/webdist/assets/{dropdown-menu-CbF1OiRs.js → dropdown-menu-BrTbP2Ms.js} +1 -1
  69. package/dist/webdist/assets/{ebnfDiagram-BXEA7PRR-BuzsXY7o.js → ebnfDiagram-BXEA7PRR-U50-9H7G.js} +1 -1
  70. package/dist/webdist/assets/{erDiagram-JOGREHBK-xNT1gtBK.js → erDiagram-JOGREHBK-C3st41PU.js} +1 -1
  71. package/dist/webdist/assets/{file-text-7zVScZD1.js → file-text-DnQANfo2.js} +1 -1
  72. package/dist/webdist/assets/flask-conical-Dqj5KaQl.js +1 -0
  73. package/dist/webdist/assets/{flowDiagram-UKHOOZJN-CQY8WhcV.js → flowDiagram-UKHOOZJN-DpI16qBt.js} +1 -1
  74. package/dist/webdist/assets/folder-input-Do7bM16X.js +1 -0
  75. package/dist/webdist/assets/folder-plus-DU6plWQY.js +1 -0
  76. package/dist/webdist/assets/{ganttDiagram-PKOTCBZU-C_iuCo8m.js → ganttDiagram-PKOTCBZU-ChfxmXjs.js} +1 -1
  77. package/dist/webdist/assets/{git-branch-BAuPsOG-.js → git-branch-DFW4sRVn.js} +1 -1
  78. package/dist/webdist/assets/{gitGraphDiagram-DS77QQ5N-BnzkkDM-.js → gitGraphDiagram-DS77QQ5N-B7uz0MiG.js} +1 -1
  79. package/dist/webdist/assets/{globe-tqOR-8Fp.js → globe-CN3jxwvA.js} +1 -1
  80. package/dist/webdist/assets/{index-CgxaB3Gh.js → index-DRdg25dC.js} +12 -12
  81. package/dist/webdist/assets/index-DXD5wL5z.css +1 -0
  82. package/dist/webdist/assets/{infoDiagram-6WML65LV-BfOOh49N.js → infoDiagram-6WML65LV-CBNjKj7C.js} +1 -1
  83. package/dist/webdist/assets/{ishikawaDiagram-WSZJBQD7-DWrnYaz5.js → ishikawaDiagram-WSZJBQD7-tWioVCgq.js} +1 -1
  84. package/dist/webdist/assets/{journeyDiagram-NVQOT4AX-Cykxha8K.js → journeyDiagram-NVQOT4AX-Cm6j912_.js} +1 -1
  85. package/dist/webdist/assets/{kanban-definition-27J2QSJJ-B_u2ZkKD.js → kanban-definition-27J2QSJJ-MYnXca-f.js} +1 -1
  86. package/dist/webdist/assets/{linear-CCF9Cm7E.js → linear-DRAAYH9X.js} +1 -1
  87. package/dist/webdist/assets/{lock-knxG_35Q.js → lock-CW0VPUGW.js} +1 -1
  88. package/dist/webdist/assets/{mermaid.core-hpcIlkU_.js → mermaid.core-CtkhOarB.js} +4 -4
  89. package/dist/webdist/assets/{mindmap-definition-FAOFIHXS-Bo6uupGZ.js → mindmap-definition-FAOFIHXS-C5e6iYOC.js} +1 -1
  90. package/dist/webdist/assets/{monitor-h6B1Mhx_.js → monitor-hFoP-Pxj.js} +1 -1
  91. package/dist/webdist/assets/{onboarding-pick-BLFfRRkr.js → onboarding-pick-DLiG5ctU.js} +1 -1
  92. package/dist/webdist/assets/{pegDiagram-VL7TDLO6-CmaR_a28.js → pegDiagram-VL7TDLO6-BQ_Voj5w.js} +1 -1
  93. package/dist/webdist/assets/pencil-D2iXjVbD.js +1 -0
  94. package/dist/webdist/assets/personas-BWGXiudT.js +109 -0
  95. package/dist/webdist/assets/{pieDiagram-7S7Q4E2Y-BRwAkrJv.js → pieDiagram-7S7Q4E2Y-DXM9gFZw.js} +1 -1
  96. package/dist/webdist/assets/{quadrantDiagram-CIZ2JOQS-ltrBwN2e.js → quadrantDiagram-CIZ2JOQS-BRa9W3tx.js} +1 -1
  97. package/dist/webdist/assets/{railroadDiagram-AXF67PYL-BJnzgPB2.js → railroadDiagram-AXF67PYL-BVDEirWs.js} +1 -1
  98. package/dist/webdist/assets/{refresh-cw-BhFglZpi.js → refresh-cw-Cm6Ic0_8.js} +1 -1
  99. package/dist/webdist/assets/{remote-failure-Cln9acAA.js → remote-failure-BLjio7b3.js} +1 -1
  100. package/dist/webdist/assets/{requirementDiagram-LRYGKXZP-C5ahe8aN.js → requirementDiagram-LRYGKXZP-C74l9A1E.js} +1 -1
  101. package/dist/webdist/assets/{rocket-DatVWRvk.js → rocket-C-pxXPXZ.js} +1 -1
  102. package/dist/webdist/assets/rotate-ccw-BRymq87L.js +1 -0
  103. package/dist/webdist/assets/{sankeyDiagram-W5VNT64P-DIrucd4o.js → sankeyDiagram-W5VNT64P-BsH8Eu-e.js} +1 -1
  104. package/dist/webdist/assets/{sequenceDiagram-SI44F4Z6-NZ2lgqIC.js → sequenceDiagram-SI44F4Z6-B9XE2EdE.js} +1 -1
  105. package/dist/webdist/assets/sheet-C2_P3xP2.js +1 -0
  106. package/dist/webdist/assets/{sizeCapture-X5ZJPWSS-BR-pPk3k.js → sizeCapture-X5ZJPWSS-UMEN2RGV.js} +1 -1
  107. package/dist/webdist/assets/skeleton-B3RpKtmw.js +1 -0
  108. package/dist/webdist/assets/sliders-horizontal-Tbar8Iuv.js +1 -0
  109. package/dist/webdist/assets/sparkles-DobYQL8n.js +1 -0
  110. package/dist/webdist/assets/star-EZSc11Fy.js +1 -0
  111. package/dist/webdist/assets/{stateDiagram-OKZ733FA-BzhDztc8.js → stateDiagram-OKZ733FA-BYmvfWXV.js} +1 -1
  112. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-hXGYjhv4.js +1 -0
  113. package/dist/webdist/assets/{swimlanes-SLNWSIFB-4YPENUjd.js → swimlanes-SLNWSIFB-BXgBtl96.js} +2 -2
  114. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-Bz4WUleA.js +8 -0
  115. package/dist/webdist/assets/{switch-BMiiAxbI.js → switch-BkYO439N.js} +1 -1
  116. package/dist/webdist/assets/terminal-wAhyejeF.js +1 -0
  117. package/dist/webdist/assets/{timeline-definition-Z64GVDOM-Bdm_1AE1.js → timeline-definition-Z64GVDOM-HxbgMsz2.js} +1 -1
  118. package/dist/webdist/assets/trash-2-BeJEd3dS.js +1 -0
  119. package/dist/webdist/assets/{vennDiagram-T6HMQDX7-C_hXfFgj.js → vennDiagram-T6HMQDX7-BS199h5Z.js} +1 -1
  120. package/dist/webdist/assets/vram-BvF2RLge.js +1 -0
  121. package/dist/webdist/assets/{wardleyDiagram-T6FBY63Y-Dkrk5amJ.js → wardleyDiagram-T6FBY63Y-CiSNOVyM.js} +1 -1
  122. package/dist/webdist/assets/wrench-Cb_10Xfp.js +1 -0
  123. package/dist/webdist/assets/{xychartDiagram-ELKLHX3M-DD1iYy6L.js → xychartDiagram-ELKLHX3M-DcWM8BQj.js} +1 -1
  124. package/dist/webdist/index.html +2 -2
  125. package/package.json +1 -1
  126. package/dist/webdist/assets/CodeComposer-C6DyfH1r.js +0 -1
  127. package/dist/webdist/assets/CodeHomeScreen-b_zDL9RG.js +0 -1
  128. package/dist/webdist/assets/HardwareSection-OH0TJi_Z.js +0 -1
  129. package/dist/webdist/assets/JevPlaygroundScreen-BREsXz9q.js +0 -4
  130. package/dist/webdist/assets/OnboardingScreen-BqE0BT90.js +0 -1
  131. package/dist/webdist/assets/RoutineEditPage-DdZEKfQD.js +0 -1
  132. package/dist/webdist/assets/RoutinesPanel-BDGU4Lcb.js +0 -1
  133. package/dist/webdist/assets/SettingsScreen-DAeKSCFf.js +0 -2
  134. package/dist/webdist/assets/SidebarResizeHandle-0RTQMpIq.js +0 -2
  135. package/dist/webdist/assets/WorkspaceScreen-DMAN9bBt.js +0 -1
  136. package/dist/webdist/assets/channel-Dd7EBACN.js +0 -1
  137. package/dist/webdist/assets/chat-queries-BNmg0pO8.js +0 -1
  138. package/dist/webdist/assets/chevron-right-COyiGhAj.js +0 -1
  139. package/dist/webdist/assets/classDiagram-JCYQIIEL-CvUjZ1BS.js +0 -1
  140. package/dist/webdist/assets/classDiagram-v2-OCEON4UE-CvUjZ1BS.js +0 -1
  141. package/dist/webdist/assets/folder-input-CaZXVybt.js +0 -1
  142. package/dist/webdist/assets/folder-plus-D-kUUPUg.js +0 -1
  143. package/dist/webdist/assets/index-BoD2hVgN.css +0 -1
  144. package/dist/webdist/assets/model-kind-DfGaG8Om.js +0 -1
  145. package/dist/webdist/assets/pencil-Bcc9OQIw.js +0 -1
  146. package/dist/webdist/assets/personas-Ax5CJgp-.js +0 -109
  147. package/dist/webdist/assets/rotate-ccw-vrFQeroT.js +0 -1
  148. package/dist/webdist/assets/sheet-Cls7ZzjB.js +0 -1
  149. package/dist/webdist/assets/skeleton-B0RuU-NT.js +0 -1
  150. package/dist/webdist/assets/sliders-horizontal-BTgEAYjk.js +0 -1
  151. package/dist/webdist/assets/sparkles-zNEWlBS7.js +0 -1
  152. package/dist/webdist/assets/star-DqSiDQYi.js +0 -1
  153. package/dist/webdist/assets/stateDiagram-v2-UEYNNEHI-CcnhkGux.js +0 -1
  154. package/dist/webdist/assets/swimlanesDiagram-ULZ7WXOC-CkFtsRtE.js +0 -8
  155. package/dist/webdist/assets/terminal-BI0KvmWZ.js +0 -1
  156. package/dist/webdist/assets/trash-2-_mCrc_yU.js +0 -1
  157. package/dist/webdist/assets/vram-DPDyCsNQ.js +0 -1
  158. package/dist/webdist/assets/wrench-BOFcMR_W.js +0 -1
package/README.md CHANGED
@@ -249,7 +249,10 @@ the detail:
249
249
  **prefill t/s**, **time-to-first-token**, **total time**, exact **token counts**, and a
250
250
  **context-usage meter** (filled / max) on every reply.
251
251
  - **Thinking control** — toggle reasoning **off** for a direct answer, or leave it **on** with
252
- collapsible, timed "thought for N s" blocks.
252
+ collapsible, timed "thought for N s" blocks that grow with the reasoning; drag a block's bottom
253
+ edge to size it once and every block remembers it.
254
+ - **Find in chat** — **Ctrl/Cmd+F** (or the header's search button) searches the open conversation:
255
+ "3 of 17", Enter or the up/down buttons jump between matches and pan the chat to each, Esc closes.
253
256
  - **Markdown + syntax-highlighted code** with one-click copy — plus **inline Unicode charts**
254
257
  the model draws when a comparison, trend, or hierarchy is genuinely worth a visual.
255
258
  - **Live artifacts** — `html`, `svg`, and `mermaid` replies render as **sandboxed, offline
@@ -369,14 +372,20 @@ there. Entirely local; nothing leaves your machine.
369
372
  </details>
370
373
 
371
374
  <details>
372
- <summary><strong>🧠 Jev — ask structured questions about any text, locally</strong></summary>
375
+ <summary><strong>🧠 Text classification (Jev and Laya) — ask structured questions about any text, locally</strong></summary>
373
376
 
374
377
  <br/>
375
378
 
379
+ - **Models → Discover → Text classification** finds every model TurboLLM can run for this, whichever chat
380
+ engine is active. Two kinds run today: Jev (NLI cross-encoders on vLLM) and Laya (its own engine).
376
381
  - **Load an NLI model (such as OpenJev) and TurboLLM detects it as a Jev model.** Workspace turns
377
- into a JSON-first playground: two editors — the content, and the questions you're asking about
378
- it — *are* the request. Ctrl/Cmd+Enter to run; see the answers per question, the raw response,
379
- and a copyable `curl`.
382
+ into a playground: two editors — the content, and the questions you're asking about it — *are*
383
+ the request. Ctrl/Cmd+Enter to run; see the answers per question, the raw response, and a
384
+ copyable `curl`.
385
+ - **The questions editor has a Form view, too.** Toggle between JSON and Form any time. Form gives
386
+ you one card per question — a type dropdown (Yes/no, Pick one, Scale), instructions, and the
387
+ fields each type needs (an option list, an ordered scale) — no hand-written JSON required. Both
388
+ views stay in sync, and editing one question never touches another's.
380
389
  - **`POST /v1/systemone`** answers yes/no, pick-one, and scale questions in one call, using the
381
390
  public System One API's exact field names — a client written for that shape only changes its
382
391
  base URL and key. `POST /v1/classify` and `POST /v1/rerank` are there too for raw
@@ -387,7 +396,8 @@ there. Entirely local; nothing leaves your machine.
387
396
  - **Laya decision models, too** ([convaiinnovations/laya](https://huggingface.co/convaiinnovations/laya)):
388
397
  - What it is: a calibrated System One model that answers the same `/v1/systemone` questions in 100+ languages.
389
398
  - Where it runs: on its own Laya engine (Engines page; Windows, macOS, Linux; CPU or GPU), beside your chat model.
390
- - How to get it: search "laya" in Discover. The playground opens from the Workspace sidebar while it is loaded.
399
+ - How to get it: switch on the Text classification chip in Discover, or search "laya". The same playground opens from the Text classification tab under Chat, Code and Routines.
400
+ - Overview of both: <https://turbollm.dev/docs/text-classification>.
391
401
 
392
402
  </details>
393
403
 
@@ -76,6 +76,16 @@ async function proxyStream(remote, path, init, signal, fetchImpl = fetch) {
76
76
  return fetchImpl(buildUpstream(remote, path), { ...init, signal });
77
77
  }
78
78
 
79
+ // src/models/text-classifier.ts
80
+ function isTextClassifier(entry) {
81
+ return textClassifierRuntime(entry) !== void 0;
82
+ }
83
+ function textClassifierRuntime(entry) {
84
+ if (entry.jev) return "vllm";
85
+ if (entry.laya) return "laya";
86
+ return void 0;
87
+ }
88
+
79
89
  // src/observability/request-log.ts
80
90
  import { randomUUID as randomUUID3 } from "crypto";
81
91
  function requestLogConfig(d) {
@@ -195,12 +205,13 @@ function resolveChatUpstream(d, requestedModel) {
195
205
  if (ms.state !== "running" || !ms.model) {
196
206
  return { ok: false, status: 409, code: "model_not_loaded", message: "Load a model first." };
197
207
  }
198
- if (d.scanner.get(ms.model.key)?.jev) {
208
+ const loadedEntry = d.scanner.get(ms.model.key);
209
+ if (loadedEntry && isTextClassifier(loadedEntry)) {
199
210
  return {
200
211
  ok: false,
201
212
  status: 409,
202
213
  code: "jev_model_loaded",
203
- message: "A Jev model is loaded \u2014 it labels text and cannot chat. Switch to a chat model, or use the Jev Playground."
214
+ message: "A text classification model is loaded \u2014 it cannot chat. Switch to a chat model, or use the text classification playground."
204
215
  };
205
216
  }
206
217
  const target = d.manager.target();
@@ -1921,7 +1932,7 @@ var CREATE_ROUTINE_TOOL = {
1921
1932
  prompt: { type: "string", description: "The task to run, in the same words a user would ask it." },
1922
1933
  scheduleDisplay: { type: "string", description: 'Human-readable schedule, e.g. "Runs weekdays at 9:00 AM". Must accurately describe scheduleRule.' },
1923
1934
  scheduleRule: SCHEDULE_RULE_SCHEMA,
1924
- modelKey: { type: "string", description: `One of TurboLLM's own model keys \u2014 a compound id (e.g. "gemma 4 26b a4b qat|Q4_0|14439362752"), never a generic name like "gpt-4" or "claude". Call list_models first if you don't already know a real one; never guess. Never pick a model list_models marks "kind: jev" \u2014 it labels text and cannot run a routine.` },
1935
+ modelKey: { type: "string", description: `One of TurboLLM's own model keys \u2014 a compound id (e.g. "gemma 4 26b a4b qat|Q4_0|14439362752"), never a generic name like "gpt-4" or "claude". Call list_models first if you don't already know a real one; never guess. Never pick a model list_models marks "kind: jev" or "kind: laya" \u2014 those are text classification models and cannot run a routine.` },
1925
1936
  agentId: { type: "string", description: 'Required when flavor is "chat": an existing Customize -> Agents persona id.' },
1926
1937
  workspacePath: { type: "string", description: 'Required when flavor is "code": absolute path to the workspace directory.' },
1927
1938
  // Driven off schema.ts's list, not a second hand-maintained copy: this enum is what a MODEL