@hawkeyexl/manni 4.11.0 → 4.12.1

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 (238) hide show
  1. package/README.md +1 -1
  2. package/dist/{batch-UAULUMGH.js → batch-KMGZMIAQ.js} +20 -19
  3. package/dist/build-NO4AWCYG.js +36 -0
  4. package/dist/calibrate-XQUG5XAK.js +41 -0
  5. package/dist/capture-5XE3ZMXK.js +38 -0
  6. package/dist/{check-YEOYBFST.js → check-HTNPLWOV.js} +19 -18
  7. package/dist/check-RJ45IBA6.js +34 -0
  8. package/dist/{check-VELUQAUW.js → check-W24BQNCT.js} +35 -34
  9. package/dist/{check-VELUQAUW.js.map → check-W24BQNCT.js.map} +1 -1
  10. package/dist/check-WFXSXICD.js +30 -0
  11. package/dist/{chunk-IGSHYP74.js → chunk-23P7KMJM.js} +4 -4
  12. package/dist/{chunk-HA6MQMOY.js → chunk-24J7TYPU.js} +6 -6
  13. package/dist/{chunk-PCS4VJBV.js → chunk-37QJLVS3.js} +9 -9
  14. package/dist/{chunk-4CK6ZSOK.js → chunk-3P6KCU36.js} +3 -3
  15. package/dist/{chunk-54F74XR3.js → chunk-5JBVFWVP.js} +19 -19
  16. package/dist/{chunk-B7XYNRJQ.js → chunk-6KIYVVKL.js} +2 -2
  17. package/dist/{chunk-J6IDQGJL.js → chunk-6TVH4FI7.js} +469 -85
  18. package/dist/chunk-6TVH4FI7.js.map +1 -0
  19. package/dist/{chunk-GDVZ5VII.js → chunk-7A452BPZ.js} +4 -4
  20. package/dist/{chunk-M42DZCOU.js → chunk-7FCLXEAQ.js} +2 -2
  21. package/dist/{chunk-2MJ62AYQ.js → chunk-7MCQHTQ5.js} +4 -3
  22. package/dist/chunk-7MCQHTQ5.js.map +1 -0
  23. package/dist/{chunk-LBSCW232.js → chunk-7NXPQKSB.js} +7 -7
  24. package/dist/{chunk-OPXWPJDA.js → chunk-A3TEDWBZ.js} +14 -14
  25. package/dist/{chunk-BBT6AVUG.js → chunk-BHHXU2D2.js} +2 -2
  26. package/dist/{chunk-D4N2V43Z.js → chunk-CEI2J42X.js} +13 -7
  27. package/dist/chunk-CEI2J42X.js.map +1 -0
  28. package/dist/{chunk-FQXWVS6J.js → chunk-CMMBWHT2.js} +9 -9
  29. package/dist/{chunk-EIFCP6CZ.js → chunk-CO47QJKZ.js} +2 -2
  30. package/dist/{chunk-2DRHT73U.js → chunk-CVZMKWZ5.js} +913 -1398
  31. package/dist/chunk-CVZMKWZ5.js.map +1 -0
  32. package/dist/{chunk-ADMEPUBT.js → chunk-CXWTNT2O.js} +3 -3
  33. package/dist/{chunk-LKP7QDFN.js → chunk-DAQTRAP5.js} +4 -4
  34. package/dist/chunk-DSWKBZWW.js +16 -0
  35. package/dist/chunk-DSWKBZWW.js.map +1 -0
  36. package/dist/{chunk-PWBH7DCQ.js → chunk-EESH6COU.js} +4 -4
  37. package/dist/{chunk-JPQDNYXH.js → chunk-EM67O2ET.js} +8 -2
  38. package/dist/chunk-EM67O2ET.js.map +1 -0
  39. package/dist/{chunk-HQR2ZBHW.js → chunk-I2XQRRP7.js} +36 -7
  40. package/dist/chunk-I2XQRRP7.js.map +1 -0
  41. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  42. package/dist/{chunk-2IR4T5PO.js → chunk-JJ4RSDSY.js} +2 -2
  43. package/dist/chunk-KCB5JCK4.js +2272 -0
  44. package/dist/chunk-KCB5JCK4.js.map +1 -0
  45. package/dist/{chunk-VSEBFHAY.js → chunk-KFKL4VTL.js} +11369 -10218
  46. package/dist/chunk-KFKL4VTL.js.map +1 -0
  47. package/dist/{chunk-PCQ7ELJH.js → chunk-L2TD7DZB.js} +109 -5
  48. package/dist/chunk-L2TD7DZB.js.map +1 -0
  49. package/dist/{chunk-WDWXAYVH.js → chunk-L3RLGGRK.js} +4 -4
  50. package/dist/{chunk-T7JAOYE5.js → chunk-L75CAZG4.js} +6 -6
  51. package/dist/{chunk-U7CTFN2J.js → chunk-MYRPMSOX.js} +7 -7
  52. package/dist/{chunk-Y6DOMTQD.js → chunk-NCF5NQV5.js} +27 -27
  53. package/dist/chunk-NCF5NQV5.js.map +1 -0
  54. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  55. package/dist/{chunk-FUCPZVRY.js → chunk-OEN6FBUW.js} +2 -2
  56. package/dist/{chunk-FBMZJEB3.js → chunk-OKMTUAWO.js} +4 -4
  57. package/dist/{chunk-QLWC7MKD.js → chunk-OTJOBZJ5.js} +135 -135
  58. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  59. package/dist/{chunk-R4WXQIOZ.js → chunk-PCEM5FOZ.js} +3 -3
  60. package/dist/{chunk-4D5IZSXM.js → chunk-PXNCRGUL.js} +3 -3
  61. package/dist/chunk-Q2QC5AZB.js +1868 -0
  62. package/dist/chunk-Q2QC5AZB.js.map +1 -0
  63. package/dist/{chunk-ODRPL3WB.js → chunk-Q3ODX5PF.js} +2 -2
  64. package/dist/{chunk-KGEQJ5CC.js → chunk-RRFFUWDL.js} +8 -8
  65. package/dist/{chunk-NSBXVPZL.js → chunk-S3XUYW5K.js} +17 -17
  66. package/dist/{chunk-LPIF5LIE.js → chunk-SAU2WQFC.js} +2 -2
  67. package/dist/{chunk-MSRU4D4P.js → chunk-SFLICIQV.js} +2 -2
  68. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  69. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  70. package/dist/chunk-VM7VAFJW.js.map +1 -0
  71. package/dist/{chunk-6HWBRZIN.js → chunk-VQYGLU4C.js} +252 -193
  72. package/dist/chunk-VQYGLU4C.js.map +1 -0
  73. package/dist/{chunk-2IAZEB45.js → chunk-WGMFDG6U.js} +229 -821
  74. package/dist/chunk-WGMFDG6U.js.map +1 -0
  75. package/dist/{chunk-GV56WGL2.js → chunk-WO4JYWZK.js} +1036 -883
  76. package/dist/chunk-WO4JYWZK.js.map +1 -0
  77. package/dist/chunk-XYRUDFKS.js +685 -0
  78. package/dist/chunk-XYRUDFKS.js.map +1 -0
  79. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  80. package/dist/chunk-YUTVAMWW.js +2 -0
  81. package/dist/{chunk-RLT5SEML.js → chunk-Z5MZCCTT.js} +6 -6
  82. package/dist/{chunk-BKVHX6FU.js → chunk-ZIRBFXDW.js} +5 -10
  83. package/dist/chunk-ZIRBFXDW.js.map +1 -0
  84. package/dist/{cli-O4ABTN4Z.js → cli-236TGVJG.js} +31 -30
  85. package/dist/{cli-O4ABTN4Z.js.map → cli-236TGVJG.js.map} +1 -1
  86. package/dist/{cli-3BTCK4AB.js → cli-3FAPJBEY.js} +27 -26
  87. package/dist/{cli-3BTCK4AB.js.map → cli-3FAPJBEY.js.map} +1 -1
  88. package/dist/{cli-JJMOVIKS.js → cli-BS43EVCD.js} +14 -14
  89. package/dist/{cli-RORDPAPE.js → cli-CMR4FYF6.js} +59 -38
  90. package/dist/cli-CMR4FYF6.js.map +1 -0
  91. package/dist/{cli-ONTC5PKT.js → cli-FX53PBQ3.js} +9 -9
  92. package/dist/{cli-6KZTHWGP.js → cli-IQNJLKSN.js} +37 -36
  93. package/dist/{cli-6KZTHWGP.js.map → cli-IQNJLKSN.js.map} +1 -1
  94. package/dist/{cli-4MF37HAQ.js → cli-KOMXVPXX.js} +26 -25
  95. package/dist/{cli-4MF37HAQ.js.map → cli-KOMXVPXX.js.map} +1 -1
  96. package/dist/{cli-I62SRH3R.js → cli-NGL63E53.js} +14 -13
  97. package/dist/{cli-DRMZBZLB.js → cli-QPGS2MR5.js} +43 -42
  98. package/dist/{cli-DRMZBZLB.js.map → cli-QPGS2MR5.js.map} +1 -1
  99. package/dist/{cli-VID7PJS3.js → cli-RKQX4TI3.js} +23 -22
  100. package/dist/{cli-VID7PJS3.js.map → cli-RKQX4TI3.js.map} +1 -1
  101. package/dist/{cli-VUKMWSSF.js → cli-WNEI5L7P.js} +4 -4
  102. package/dist/cli.js +19 -13
  103. package/dist/cli.js.map +1 -1
  104. package/dist/{config-XDA42RJL.js → config-JJW75SBX.js} +5 -5
  105. package/dist/docmeta.js +13 -12
  106. package/dist/docmeta.js.map +1 -1
  107. package/dist/github-4UR67MEN.js +35 -0
  108. package/dist/github-UPGKMVVF.js +30 -0
  109. package/dist/graph/runtime.d.ts +4 -1
  110. package/dist/graph/runtime.js +20 -9
  111. package/dist/graph/runtime.js.map +1 -1
  112. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  113. package/dist/index.d.ts +192 -26
  114. package/dist/index.js +129 -124
  115. package/dist/index.js.map +1 -1
  116. package/dist/{json-BXY44ED7.js → json-DQIELR36.js} +18 -17
  117. package/dist/labels-XSTJJMSG.js +73 -0
  118. package/dist/labels-XSTJJMSG.js.map +1 -0
  119. package/dist/lint-BLBGGOYM.js +34 -0
  120. package/dist/list-B3RRRWFQ.js +32 -0
  121. package/dist/list-ZFRT3JQH.js +35 -0
  122. package/dist/{page-EV7OUBAU.js → page-5ISEVJR5.js} +18 -16
  123. package/dist/{prepare-JHJDJB6I.js → prepare-KFXXG2CJ.js} +22 -21
  124. package/dist/{prepare-JHJDJB6I.js.map → prepare-KFXXG2CJ.js.map} +1 -1
  125. package/dist/{pretty-Q5Y2PA64.js → pretty-Y7CGQLAF.js} +18 -17
  126. package/dist/{pretty-SCRK66M5.js → pretty-ZISH3Q4F.js} +18 -17
  127. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  128. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  129. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  130. package/dist/{reporters-A5ADKDYR.js → reporters-4STXJJE2.js} +16 -15
  131. package/dist/{reporters-RBYTASMI.js → reporters-74B4U2GZ.js} +7 -7
  132. package/dist/run-DVGTKM52.js +37 -0
  133. package/dist/{term-CQAGNG3Q.js → term-PLJEYJQV.js} +981 -141
  134. package/dist/term-PLJEYJQV.js.map +1 -0
  135. package/dist/validate-CJNFQHMD.js +19 -0
  136. package/package.json +3 -2
  137. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  138. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  139. package/dist/build-QSPNK5AL.js +0 -35
  140. package/dist/calibrate-KXN4URPM.js +0 -40
  141. package/dist/capture-JHTSUPUC.js +0 -37
  142. package/dist/check-MDGXEUWL.js +0 -20
  143. package/dist/check-WOQRKNZK.js +0 -29
  144. package/dist/chunk-2DRHT73U.js.map +0 -1
  145. package/dist/chunk-2IAZEB45.js.map +0 -1
  146. package/dist/chunk-2MJ62AYQ.js.map +0 -1
  147. package/dist/chunk-4VBSTXN6.js +0 -392
  148. package/dist/chunk-4VBSTXN6.js.map +0 -1
  149. package/dist/chunk-6HWBRZIN.js.map +0 -1
  150. package/dist/chunk-BKVHX6FU.js.map +0 -1
  151. package/dist/chunk-D4N2V43Z.js.map +0 -1
  152. package/dist/chunk-EFW7CAG4.js +0 -387
  153. package/dist/chunk-EFW7CAG4.js.map +0 -1
  154. package/dist/chunk-GV56WGL2.js.map +0 -1
  155. package/dist/chunk-HQR2ZBHW.js.map +0 -1
  156. package/dist/chunk-J6IDQGJL.js.map +0 -1
  157. package/dist/chunk-JPQDNYXH.js.map +0 -1
  158. package/dist/chunk-JROBZ7JA.js +0 -818
  159. package/dist/chunk-JROBZ7JA.js.map +0 -1
  160. package/dist/chunk-PCQ7ELJH.js.map +0 -1
  161. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  162. package/dist/chunk-QLWC7MKD.js.map +0 -1
  163. package/dist/chunk-TU2WUBVZ.js +0 -2
  164. package/dist/chunk-VSEBFHAY.js.map +0 -1
  165. package/dist/chunk-Y6DOMTQD.js.map +0 -1
  166. package/dist/cli-RORDPAPE.js.map +0 -1
  167. package/dist/github-RY3FRA6P.js +0 -29
  168. package/dist/github-YKQSH7FS.js +0 -34
  169. package/dist/lint-YJ2L22BW.js +0 -33
  170. package/dist/list-NSG24VVX.js +0 -31
  171. package/dist/list-V6EGCSHX.js +0 -34
  172. package/dist/run-BUE2DDXN.js +0 -36
  173. package/dist/term-CQAGNG3Q.js.map +0 -1
  174. package/dist/validate-ZBW44RHT.js +0 -18
  175. /package/dist/{batch-UAULUMGH.js.map → batch-KMGZMIAQ.js.map} +0 -0
  176. /package/dist/{build-QSPNK5AL.js.map → build-NO4AWCYG.js.map} +0 -0
  177. /package/dist/{calibrate-KXN4URPM.js.map → calibrate-XQUG5XAK.js.map} +0 -0
  178. /package/dist/{capture-JHTSUPUC.js.map → capture-5XE3ZMXK.js.map} +0 -0
  179. /package/dist/{check-MDGXEUWL.js.map → check-HTNPLWOV.js.map} +0 -0
  180. /package/dist/{check-WOQRKNZK.js.map → check-RJ45IBA6.js.map} +0 -0
  181. /package/dist/{check-YEOYBFST.js.map → check-WFXSXICD.js.map} +0 -0
  182. /package/dist/{chunk-IGSHYP74.js.map → chunk-23P7KMJM.js.map} +0 -0
  183. /package/dist/{chunk-HA6MQMOY.js.map → chunk-24J7TYPU.js.map} +0 -0
  184. /package/dist/{chunk-PCS4VJBV.js.map → chunk-37QJLVS3.js.map} +0 -0
  185. /package/dist/{chunk-4CK6ZSOK.js.map → chunk-3P6KCU36.js.map} +0 -0
  186. /package/dist/{chunk-54F74XR3.js.map → chunk-5JBVFWVP.js.map} +0 -0
  187. /package/dist/{chunk-B7XYNRJQ.js.map → chunk-6KIYVVKL.js.map} +0 -0
  188. /package/dist/{chunk-GDVZ5VII.js.map → chunk-7A452BPZ.js.map} +0 -0
  189. /package/dist/{chunk-M42DZCOU.js.map → chunk-7FCLXEAQ.js.map} +0 -0
  190. /package/dist/{chunk-LBSCW232.js.map → chunk-7NXPQKSB.js.map} +0 -0
  191. /package/dist/{chunk-OPXWPJDA.js.map → chunk-A3TEDWBZ.js.map} +0 -0
  192. /package/dist/{chunk-BBT6AVUG.js.map → chunk-BHHXU2D2.js.map} +0 -0
  193. /package/dist/{chunk-FQXWVS6J.js.map → chunk-CMMBWHT2.js.map} +0 -0
  194. /package/dist/{chunk-EIFCP6CZ.js.map → chunk-CO47QJKZ.js.map} +0 -0
  195. /package/dist/{chunk-ADMEPUBT.js.map → chunk-CXWTNT2O.js.map} +0 -0
  196. /package/dist/{chunk-LKP7QDFN.js.map → chunk-DAQTRAP5.js.map} +0 -0
  197. /package/dist/{chunk-PWBH7DCQ.js.map → chunk-EESH6COU.js.map} +0 -0
  198. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  199. /package/dist/{chunk-2IR4T5PO.js.map → chunk-JJ4RSDSY.js.map} +0 -0
  200. /package/dist/{chunk-WDWXAYVH.js.map → chunk-L3RLGGRK.js.map} +0 -0
  201. /package/dist/{chunk-T7JAOYE5.js.map → chunk-L75CAZG4.js.map} +0 -0
  202. /package/dist/{chunk-U7CTFN2J.js.map → chunk-MYRPMSOX.js.map} +0 -0
  203. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  204. /package/dist/{chunk-FUCPZVRY.js.map → chunk-OEN6FBUW.js.map} +0 -0
  205. /package/dist/{chunk-FBMZJEB3.js.map → chunk-OKMTUAWO.js.map} +0 -0
  206. /package/dist/{chunk-R4WXQIOZ.js.map → chunk-PCEM5FOZ.js.map} +0 -0
  207. /package/dist/{chunk-4D5IZSXM.js.map → chunk-PXNCRGUL.js.map} +0 -0
  208. /package/dist/{chunk-ODRPL3WB.js.map → chunk-Q3ODX5PF.js.map} +0 -0
  209. /package/dist/{chunk-KGEQJ5CC.js.map → chunk-RRFFUWDL.js.map} +0 -0
  210. /package/dist/{chunk-NSBXVPZL.js.map → chunk-S3XUYW5K.js.map} +0 -0
  211. /package/dist/{chunk-LPIF5LIE.js.map → chunk-SAU2WQFC.js.map} +0 -0
  212. /package/dist/{chunk-MSRU4D4P.js.map → chunk-SFLICIQV.js.map} +0 -0
  213. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  214. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  215. /package/dist/{chunk-TU2WUBVZ.js.map → chunk-YUTVAMWW.js.map} +0 -0
  216. /package/dist/{chunk-RLT5SEML.js.map → chunk-Z5MZCCTT.js.map} +0 -0
  217. /package/dist/{cli-JJMOVIKS.js.map → cli-BS43EVCD.js.map} +0 -0
  218. /package/dist/{cli-ONTC5PKT.js.map → cli-FX53PBQ3.js.map} +0 -0
  219. /package/dist/{cli-I62SRH3R.js.map → cli-NGL63E53.js.map} +0 -0
  220. /package/dist/{cli-VUKMWSSF.js.map → cli-WNEI5L7P.js.map} +0 -0
  221. /package/dist/{config-XDA42RJL.js.map → config-JJW75SBX.js.map} +0 -0
  222. /package/dist/{github-RY3FRA6P.js.map → github-4UR67MEN.js.map} +0 -0
  223. /package/dist/{github-YKQSH7FS.js.map → github-UPGKMVVF.js.map} +0 -0
  224. /package/dist/{host-6GURH5HE.js.map → host-YSTYO5DX.js.map} +0 -0
  225. /package/dist/{json-BXY44ED7.js.map → json-DQIELR36.js.map} +0 -0
  226. /package/dist/{lint-YJ2L22BW.js.map → lint-BLBGGOYM.js.map} +0 -0
  227. /package/dist/{list-NSG24VVX.js.map → list-B3RRRWFQ.js.map} +0 -0
  228. /package/dist/{list-V6EGCSHX.js.map → list-ZFRT3JQH.js.map} +0 -0
  229. /package/dist/{page-EV7OUBAU.js.map → page-5ISEVJR5.js.map} +0 -0
  230. /package/dist/{pretty-Q5Y2PA64.js.map → pretty-Y7CGQLAF.js.map} +0 -0
  231. /package/dist/{pretty-SCRK66M5.js.map → pretty-ZISH3Q4F.js.map} +0 -0
  232. /package/dist/{provider-527CO4DM.js.map → provider-LBX4IXGX.js.map} +0 -0
  233. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  234. /package/dist/{reporters-A5ADKDYR.js.map → reporters-26H3N2KW.js.map} +0 -0
  235. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-4STXJJE2.js.map} +0 -0
  236. /package/dist/{reporters-RBYTASMI.js.map → reporters-74B4U2GZ.js.map} +0 -0
  237. /package/dist/{run-BUE2DDXN.js.map → run-DVGTKM52.js.map} +0 -0
  238. /package/dist/{validate-ZBW44RHT.js.map → validate-CJNFQHMD.js.map} +0 -0
@@ -13,7 +13,7 @@ import {
13
13
  providerSpecFor,
14
14
  resolveIdentity,
15
15
  selectProvider
16
- } from "./chunk-QCHVR4ZM.js";
16
+ } from "./chunk-VM7VAFJW.js";
17
17
  import {
18
18
  errorMessage
19
19
  } from "./chunk-G3T47CFV.js";
@@ -143,4 +143,4 @@ export {
143
143
  constructProvider,
144
144
  makeJudgeProvider
145
145
  };
146
- //# sourceMappingURL=chunk-NGTVREIH.js.map
146
+ //# sourceMappingURL=chunk-U6IHLEWT.js.map
@@ -31,6 +31,8 @@ import {
31
31
  DEFAULT_MODELS,
32
32
  DEFAULT_OPENAI_BASE_URL,
33
33
  InferenceError,
34
+ modelState,
35
+ nodeLlamaCppStatus,
34
36
  resolveProviderIdentityAsync
35
37
  } from "@hawkeyexl/inference";
36
38
  var DEFAULT_PROVIDER = "auto";
@@ -183,15 +185,23 @@ var LOCAL_PROVIDER = "llama-cpp";
183
185
  var LOCAL_FLAG_HELP = "run inference on this machine (llama-cpp); overrides any configured or eval-level provider";
184
186
  var LOCAL_COMPATIBLE = /* @__PURE__ */ new Set([LOCAL_PROVIDER, DEFAULT_PROVIDER, "mock"]);
185
187
  function assertLocalFlag(flag, toError) {
186
- if (flag.local !== true || flag.provider === void 0) return;
188
+ if (flag.provider === void 0 || flag.local !== true && flag.offline !== true) return;
187
189
  assertKnownProvider(flag.provider, toError);
188
190
  if (LOCAL_COMPATIBLE.has(flag.provider)) return;
191
+ if (flag.local === true) {
192
+ throw toError(
193
+ `--local and --provider ${flag.provider} contradict each other: --local runs inference on this machine with ${LOCAL_PROVIDER}. Drop one of them.`
194
+ );
195
+ }
189
196
  throw toError(
190
- `--local and --provider ${flag.provider} contradict each other: --local runs inference on this machine with ${LOCAL_PROVIDER}. Drop one of them.`
197
+ `--offline and --provider ${flag.provider} contradict each other: --offline sends nothing off this machine, so only ${LOCAL_PROVIDER} with a model already downloaded can run. Drop one of them.`
191
198
  );
192
199
  }
200
+ function noOfflineModel(consequence) {
201
+ return `no model is available offline, so ${consequence}; download one first with --local, or drop --offline.`;
202
+ }
193
203
  function selectProvider(flag, levels) {
194
- if (flag.local === true) return selectLocal(flag, levels);
204
+ if (flag.local === true || flag.offline === true) return selectLocal(flag, levels);
195
205
  const provider = flag.provider ?? levels.find((level) => level.provider !== void 0)?.provider ?? DEFAULT_PROVIDER;
196
206
  const model = flag.model ?? levels.find(
197
207
  (level) => level.model !== void 0 && (level.provider === void 0 || level.provider === provider)
@@ -205,10 +215,11 @@ function selectLocal(flag, levels) {
205
215
  const replaced = chosen?.provider !== void 0 && chosen.origin !== void 0 && chosen.provider !== provider && chosen.provider !== DEFAULT_PROVIDER ? { provider: chosen.provider, source: chosen.origin } : void 0;
206
216
  return replaced === void 0 ? { provider, model } : { provider, model, replaced };
207
217
  }
208
- function localNotice(selection) {
218
+ function localNotice(selection, flags = {}) {
209
219
  const { replaced } = selection;
210
220
  if (replaced === void 0) return void 0;
211
- return `--local: using ${LOCAL_PROVIDER} instead of "${replaced.provider}" from ${replaced.source}.`;
221
+ const flag = flags.local !== true && flags.offline === true ? "--offline" : "--local";
222
+ return `${flag}: using ${LOCAL_PROVIDER} instead of "${replaced.provider}" from ${replaced.source}.`;
212
223
  }
213
224
  function providerSpecFor(connections, selection) {
214
225
  const { provider, model } = selection;
@@ -267,9 +278,22 @@ async function resolveIdentity(spec, toError) {
267
278
  );
268
279
  }
269
280
  }
281
+ async function offlineIdentity(spec, toError) {
282
+ if (spec.provider === "mock") return resolveIdentity(spec, toError);
283
+ if (spec.provider !== LOCAL_PROVIDER) return void 0;
284
+ if ((await nodeLlamaCppStatus()).state !== "present") return void 0;
285
+ const identity = await resolveIdentity(spec, toError);
286
+ const modelsDirectory = spec.llamaCpp?.modelsDirectory;
287
+ const state = await modelState(
288
+ identity.model,
289
+ modelsDirectory === void 0 ? {} : { modelsDirectory }
290
+ );
291
+ return state === "ready" ? identity : void 0;
292
+ }
270
293
 
271
294
  export {
272
295
  parseDuration,
296
+ DEFAULT_PROVIDER,
273
297
  DECISION_ONLY_PROVIDERS,
274
298
  assertKnownProvider,
275
299
  assertModelHasProvider,
@@ -278,9 +302,11 @@ export {
278
302
  DEFAULT_KEEP_ALIVE_MS,
279
303
  LOCAL_FLAG_HELP,
280
304
  assertLocalFlag,
305
+ noOfflineModel,
281
306
  selectProvider,
282
307
  localNotice,
283
308
  providerSpecFor,
284
- resolveIdentity
309
+ resolveIdentity,
310
+ offlineIdentity
285
311
  };
286
- //# sourceMappingURL=chunk-QCHVR4ZM.js.map
312
+ //# sourceMappingURL=chunk-VM7VAFJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shared/duration.ts","../src/shared/providers.ts"],"sourcesContent":["/**\n * `--newer-than <duration>`: a window of time back from now, shared by every\n * domain that selects its inputs by age.\n *\n * Deliberately strict. A duration this refuses is a usage error, because the\n * alternative (reading `7y` as zero, or as \"everything\") silently changes what\n * a gate looked at.\n */\n\nconst UNITS: Readonly<Record<string, number>> = {\n m: 60_000,\n h: 60 * 60_000,\n d: 24 * 60 * 60_000,\n w: 7 * 24 * 60 * 60_000,\n};\n\n/**\n * The usage error for a value that is not a duration. `label` is what the\n * user wrote it under, a flag or a config key.\n */\nexport function durationMessage(value: string, label = \"--newer-than\"): string {\n return `${label} must be a duration such as 30m, 24h, 7d or 2w, got \"${value}\"`;\n}\n\n/**\n * `7d` to milliseconds. A count, which may carry a fraction, then one unit:\n * `m` minutes, `h` hours, `d` days or `w` weeks. `makeError` builds the\n * domain's own `ToolError` subclass, so the refusal exits 2 under its name.\n */\nexport function parseDuration(\n text: string,\n makeError: (message: string) => Error,\n label?: string,\n): number {\n const match = /^(\\d+(?:\\.\\d+)?)([mhdw])$/.exec(text.trim());\n const count = match?.[1];\n const unit = match?.[2];\n const ms = unit === undefined ? undefined : UNITS[unit];\n if (count === undefined || ms === undefined) {\n throw makeError(durationMessage(text, label));\n }\n return Number(count) * ms;\n}\n","/**\n * Choosing an inference provider and model, for every tool that sends content\n * to one: `manni meta fill` and `manni docevals`.\n *\n * The names a tool accepts, the refusals, what `--local` overrides and the\n * detection call are one implementation, so a provider added upstream reaches both tools on the same\n * day and a message reads the same in both. What differs is only what the\n * caller passes in: the config key its user writes, and its own error class,\n * which is what maps the refusal to exit 2.\n */\nimport { resolve } from \"node:path\";\nimport {\n DEFAULT_JEV_BASE_URL,\n DEFAULT_MODELS,\n DEFAULT_OPENAI_BASE_URL,\n InferenceError,\n modelState,\n nodeLlamaCppStatus,\n resolveProviderIdentityAsync,\n type ProviderName,\n type ProviderSelector,\n type ProviderSpec,\n} from \"@hawkeyexl/inference\";\nimport { parseDuration } from \"./duration.js\";\nimport { errorMessage } from \"./errors.js\";\n\n/** Builds the caller's own error from a message. */\nexport type ToErrorFn = (message: string) => Error;\n\n/**\n * `auto` detects the highest-priority provider this machine can actually use —\n * an Anthropic key, then an OpenAI key, then the Claude CLI, then a local model\n * that needs no credentials at all. Defaulting to a named provider instead meant\n * a tool failed outright for anyone who did not happen to hold that vendor's\n * key.\n */\nexport const DEFAULT_PROVIDER = \"auto\";\n\n/**\n * Providers that answer decisions and never generate text. Every family tool\n * but one generates, so these are refused unless the caller asks for decisions,\n * as tracevals' in-loop judge does (proposal 0079).\n */\nexport const DECISION_ONLY_PROVIDERS: ReadonlySet<string> = new Set([\"jev\"]);\n\n/**\n * Provider names the inference layer accepts for generation, taken from the\n * library rather than copied. A hardcoded list silently went stale when `llama-cpp` was added\n * upstream; deriving it means a new provider works the day it ships.\n */\nexport const PROVIDERS: ReadonlySet<string> = new Set<string>([\n ...Object.keys(DEFAULT_MODELS).filter((name) => !DECISION_ONLY_PROVIDERS.has(name)),\n DEFAULT_PROVIDER,\n]);\n\n/**\n * The providers a user can name for a model, which is what every message lists.\n * `mock` is the library's test double: accepted when asked for by name, so the\n * suite and the docs' own tests can run without a provider, but never offered.\n */\nconst NAMEABLE_PROVIDERS: readonly string[] = Object.keys(DEFAULT_MODELS).filter(\n (name) => name !== \"mock\" && !DECISION_ONLY_PROVIDERS.has(name),\n);\n\n/**\n * Refuse a name the library does not offer, or a decision-only provider where\n * the caller generates.\n */\nexport function assertKnownProvider(\n name: string,\n toError: ToErrorFn,\n options: { decisions?: boolean } = {},\n): asserts name is ProviderSelector {\n if (DECISION_ONLY_PROVIDERS.has(name)) {\n if (options.decisions === true) return;\n throw toError(\n `Provider \"${name}\" answers decisions only, so it cannot generate. Available: ${[...NAMEABLE_PROVIDERS, DEFAULT_PROVIDER].join(\", \")}.`,\n );\n }\n if (PROVIDERS.has(name)) return;\n throw toError(\n `Unknown provider \"${name}\". Available: ${[...NAMEABLE_PROVIDERS, DEFAULT_PROVIDER].join(\", \")}.`,\n );\n}\n\n/**\n * A model name belongs to exactly one provider, so it cannot be handed to\n * whichever provider detection picks: `--model gpt-4o-mini` on a machine with an\n * Anthropic key selected anthropic and then 404'd mid-run, after file discovery\n * had already been paid for.\n *\n * The library enforces this too. It is repeated here to name the flag and the\n * config key rather than the API fields, since that is what the user typed.\n *\n * `name` is the EFFECTIVE provider, so a provider in config satisfies this just\n * as `--provider` does; only an unresolved `auto` is ambiguous. `configKey` is\n * the key as the user writes it (`fill.provider`, `docevals.provider`).\n */\nexport function assertModelHasProvider(\n name: ProviderSelector,\n model: string | undefined,\n configKey: string,\n toError: ToErrorFn,\n): void {\n if (name !== DEFAULT_PROVIDER || model == null) return;\n throw toError(\n `Model \"${model}\" was given without a provider: a model name does not say ` +\n `which provider owns it. Set --provider or ${configKey} to one of ` +\n `${NAMEABLE_PROVIDERS.join(\", \")}, or drop the model to take the ` +\n `detected provider's default.`,\n );\n}\n\n/**\n * Connection settings, per provider, as the family's top-level `providers:`\n * map states them. Only what the user wrote: `providerSpecFor` supplies the\n * defaults, so detection can tell a configured value from a default one.\n */\nexport interface ProviderConnections {\n anthropic?: { apiKeyEnv?: string };\n openai?: { baseUrl?: string; apiKeyEnv?: string };\n \"claude-cli\"?: { command?: string };\n /** A decide-only provider: it judges, and never generates. */\n jev?: { apiKeyEnv?: string; baseUrl?: string };\n /**\n * `modelsDir` is absolute: resolved against the config file's directory.\n * `keepAlive` is milliseconds, parsed from a duration; `0` unloads a model\n * as soon as no session holds it. It belongs to the model host, so it\n * never reaches a provider spec.\n */\n \"llama-cpp\"?: { modelsDir?: string; thoughtTokens?: number; keepAlive?: number };\n}\n\n/** The family's top-level `providers:` map, parsed. */\nexport interface ProvidersConfig extends ProviderConnections {\n /** Absent when not written. */\n provider?: ProviderSelector;\n /** Absent when not written. Never present without a named `provider`. */\n model?: string;\n}\n\n/** The family's top-level key for provider settings. */\nexport const PROVIDERS_KEY = \"providers\";\n\n/** What each provider's section may carry, in the order messages list it. */\nconst CONNECTION_KEYS = {\n anthropic: [\"apiKeyEnv\"],\n openai: [\"baseUrl\", \"apiKeyEnv\"],\n \"claude-cli\": [\"command\"],\n jev: [\"apiKeyEnv\", \"baseUrl\"],\n \"llama-cpp\": [\"modelsDir\", \"thoughtTokens\", \"keepAlive\"],\n} as const;\n\ntype ConnectionName = keyof typeof CONNECTION_KEYS;\n\nconst CONNECTION_NAMES = Object.keys(CONNECTION_KEYS) as ConnectionName[];\n\nconst TOP_LEVEL_KEYS: readonly string[] = [\"provider\", \"model\", ...CONNECTION_NAMES];\n\nfunction isMapping(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction rejectUnknown(\n raw: Record<string, unknown>,\n allowed: readonly string[],\n label: string,\n source: string,\n toError: ToErrorFn,\n): void {\n for (const key of Object.keys(raw)) {\n if (!allowed.includes(key)) {\n throw toError(\n `${source}: \"${label}\" has unknown key \"${key}\". Supported keys: ${allowed.join(\", \")}.`,\n );\n }\n }\n}\n\n/**\n * Parse the family's `providers:` map. Every message names `source`, and a\n * relative `llama-cpp.modelsDir` resolves from `dir`, the directory holding\n * the file, as every other path written in the config does.\n */\nexport function parseProviders(\n value: unknown,\n source: string,\n dir: string,\n toError: ToErrorFn,\n): ProvidersConfig {\n if (value == null) return {};\n if (!isMapping(value)) {\n throw toError(`${source}: \"${PROVIDERS_KEY}\" must be a mapping.`);\n }\n rejectUnknown(value, TOP_LEVEL_KEYS, PROVIDERS_KEY, source, toError);\n\n const string = (raw: Record<string, unknown>, key: string, label: string): string | undefined => {\n const v = raw[key];\n if (v === undefined) return undefined;\n if (typeof v !== \"string\") {\n throw toError(`${source}: \"${label}\" must be a string.`);\n }\n return v;\n };\n\n const parsed: ProvidersConfig = {};\n const provider = string(value, \"provider\", `${PROVIDERS_KEY}.provider`);\n if (provider !== undefined) {\n assertKnownProvider(provider, (message) => toError(`${source}: ${message}`));\n parsed.provider = provider;\n }\n const model = string(value, \"model\", `${PROVIDERS_KEY}.model`);\n if (model !== undefined) {\n if (provider === undefined || provider === DEFAULT_PROVIDER) {\n throw toError(\n `${source}: \"${PROVIDERS_KEY}.model\" was given without a provider: a model name does not ` +\n `say which provider owns it. Set ${PROVIDERS_KEY}.provider to one of ` +\n `${NAMEABLE_PROVIDERS.join(\", \")}, or drop the model to take the detected provider's default.`,\n );\n }\n parsed.model = model;\n }\n\n for (const name of CONNECTION_NAMES) {\n const section = value[name];\n if (section == null) continue;\n const label = `${PROVIDERS_KEY}.${name}`;\n if (!isMapping(section)) {\n throw toError(`${source}: \"${label}\" must be a mapping.`);\n }\n rejectUnknown(section, CONNECTION_KEYS[name], label, source, toError);\n const field = (key: string): string | undefined => string(section, key, `${label}.${key}`);\n switch (name) {\n case \"anthropic\": {\n const apiKeyEnv = field(\"apiKeyEnv\");\n parsed.anthropic = apiKeyEnv === undefined ? {} : { apiKeyEnv };\n break;\n }\n case \"openai\": {\n const baseUrl = field(\"baseUrl\");\n const apiKeyEnv = field(\"apiKeyEnv\");\n parsed.openai = {\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),\n };\n break;\n }\n case \"claude-cli\": {\n const command = field(\"command\");\n parsed[\"claude-cli\"] = command === undefined ? {} : { command };\n break;\n }\n case \"jev\": {\n const apiKeyEnv = field(\"apiKeyEnv\");\n const baseUrl = field(\"baseUrl\");\n parsed.jev = {\n ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n };\n break;\n }\n case \"llama-cpp\": {\n const modelsDir = field(\"modelsDir\");\n const thoughtTokens = section[\"thoughtTokens\"];\n if (\n thoughtTokens !== undefined &&\n (typeof thoughtTokens !== \"number\" || !Number.isInteger(thoughtTokens) || thoughtTokens < 0)\n ) {\n throw toError(\n `${source}: \"${label}.thoughtTokens\" must be a whole number of 0 or more, got ${JSON.stringify(thoughtTokens)}.`,\n );\n }\n const keepAlive = keepAliveOf(section[\"keepAlive\"], `${label}.keepAlive`, source, toError);\n parsed[\"llama-cpp\"] = {\n ...(modelsDir !== undefined ? { modelsDir: resolve(dir, modelsDir) } : {}),\n ...(thoughtTokens !== undefined ? { thoughtTokens } : {}),\n ...(keepAlive !== undefined ? { keepAlive } : {}),\n };\n break;\n }\n }\n }\n return parsed;\n}\n\n/** `providers.llama-cpp.keepAlive` when unset: ten minutes. */\nexport const DEFAULT_KEEP_ALIVE_MS = 10 * 60_000;\n\n/**\n * `keepAlive`, in milliseconds: `0`, or a duration as `--newer-than` takes\n * one. YAML reads a bare `0` as a number, so both spellings of zero count.\n */\nfunction keepAliveOf(\n value: unknown,\n label: string,\n source: string,\n toError: ToErrorFn,\n): number | undefined {\n if (value === undefined) return undefined;\n if (value === 0 || value === \"0\") return 0;\n const refuse = (): Error =>\n toError(\n `${source}: \"${label}\" must be 0 or a duration such as 30m, 24h, 7d or 2w, got \"${typeof value === \"string\" ? value : JSON.stringify(value)}\"`,\n );\n if (typeof value !== \"string\") throw refuse();\n return parseDuration(value, refuse);\n}\n\n/** A provider and a model as one level states them; either half may be absent. */\nexport interface ProviderChoice {\n provider?: string;\n model?: string;\n /**\n * Where the level's provider was written, as a `--local` notice names it:\n * `providers.provider`, `docevals.provider`, `fill.provider`, or\n * `eval \"<id>\" in <file>`.\n */\n origin?: string;\n}\n\n/** The command line's say: `--provider`, `--model`, `--local` and `--offline`. */\nexport interface ProviderFlags {\n provider?: string;\n model?: string;\n /** Run inference on this machine, with llama-cpp, whatever a level asks for. */\n local?: boolean;\n /**\n * Send nothing off this machine: the `--local` boundary, and then only a\n * model already downloaded. See `offlineIdentity`.\n */\n offline?: boolean;\n}\n\n/** A configured choice that `--local` or `--offline` set aside. */\nexport interface ReplacedChoice {\n provider: string;\n source: string;\n}\n\n/** The effective choice, before it is checked or detected. */\nexport interface ProviderSelection {\n provider: string;\n model: string | undefined;\n /** Under `--local`, the configured provider that would otherwise have run. */\n replaced?: ReplacedChoice;\n}\n\n/**\n * The provider `--local` runs. `claude-cli` does not qualify: the binary runs\n * on this machine, the inference does not (proposal 0017).\n */\nexport const LOCAL_PROVIDER = \"llama-cpp\";\n\n/** `--local`'s help, one wording on every command that takes the flag. */\nexport const LOCAL_FLAG_HELP =\n \"run inference on this machine (llama-cpp); overrides any configured or eval-level provider\";\n\n/**\n * Names `--provider` may carry beside `--local`. `auto` under `--local` can\n * only mean the local provider, and `mock` is the library's test double, which\n * sends nothing anywhere.\n */\nconst LOCAL_COMPATIBLE: ReadonlySet<string> = new Set([LOCAL_PROVIDER, DEFAULT_PROVIDER, \"mock\"]);\n\n/**\n * Refuse `--local` beside a `--provider` it contradicts. An unknown name is\n * refused as unknown first: `--local` would otherwise set it aside unread.\n */\nexport function assertLocalFlag(flag: ProviderFlags, toError: ToErrorFn): void {\n if (flag.provider === undefined || (flag.local !== true && flag.offline !== true)) return;\n assertKnownProvider(flag.provider, toError);\n if (LOCAL_COMPATIBLE.has(flag.provider)) return;\n if (flag.local === true) {\n throw toError(\n `--local and --provider ${flag.provider} contradict each other: --local runs inference ` +\n `on this machine with ${LOCAL_PROVIDER}. Drop one of them.`,\n );\n }\n throw toError(\n `--offline and --provider ${flag.provider} contradict each other: --offline sends nothing ` +\n `off this machine, so only ${LOCAL_PROVIDER} with a model already downloaded can run. Drop one of them.`,\n );\n}\n\n/**\n * What a verb says when `--offline` finds no model it may run, completed by\n * what that verb does without one.\n */\nexport function noOfflineModel(consequence: string): string {\n return `no model is available offline, so ${consequence}; download one first with --local, or drop --offline.`;\n}\n\n/**\n * The provider and model in force.\n *\n * `flag` is the command line. `levels` are the config's statements, highest\n * precedence first: for docevals an eval's own choice, then `docevals.provider`,\n * then the family's `providers:`; for `meta fill`, `meta.fill`, then the\n * family's. The provider is the flag's, else the first level that names one,\n * else `auto`.\n *\n * A model belongs to the provider its level names, so it is carried only to\n * that provider: a level whose provider lost does not lend its model to the\n * winner, which could not run it. A level naming no provider gives its model\n * to whichever provider is in force, which is how `--provider` supplies the\n * provider a configured model needs. The flag's model applies to whatever\n * wins.\n *\n * `--local` makes the provider llama-cpp, over every level. A level's model\n * then applies only where that level named llama-cpp, and the level whose\n * provider would otherwise have run is returned as `replaced`, unless it was\n * `auto`, which chose no hosted provider. `--offline` draws the same boundary,\n * and `offlineIdentity` then decides whether the model is on this machine.\n * Check the flag with `assertLocalFlag` first: a contradicting `--provider` is\n * not selected here.\n */\nexport function selectProvider(\n flag: ProviderFlags,\n levels: readonly ProviderChoice[],\n): ProviderSelection {\n if (flag.local === true || flag.offline === true) return selectLocal(flag, levels);\n const provider =\n flag.provider ?? levels.find((level) => level.provider !== undefined)?.provider ?? DEFAULT_PROVIDER;\n const model =\n flag.model ??\n levels.find(\n (level) =>\n level.model !== undefined && (level.provider === undefined || level.provider === provider),\n )?.model;\n return { provider, model };\n}\n\nfunction selectLocal(flag: ProviderFlags, levels: readonly ProviderChoice[]): ProviderSelection {\n // The mock seam survives, so a test can drive `--local` without a runtime.\n const provider = flag.provider === \"mock\" ? \"mock\" : LOCAL_PROVIDER;\n const model =\n flag.model ??\n levels.find((level) => level.model !== undefined && level.provider === provider)?.model;\n // A flag's provider is the command line's own choice, never a replaced one.\n const chosen =\n flag.provider === undefined ? levels.find((level) => level.provider !== undefined) : undefined;\n const replaced =\n chosen?.provider !== undefined &&\n chosen.origin !== undefined &&\n chosen.provider !== provider &&\n chosen.provider !== DEFAULT_PROVIDER\n ? { provider: chosen.provider, source: chosen.origin }\n : undefined;\n return replaced === undefined ? { provider, model } : { provider, model, replaced };\n}\n\n/**\n * What a selection's notice says, if it replaced anything, naming the flag\n * that drew the boundary: `--local`, or `--offline` when only it is set.\n */\nexport function localNotice(\n selection: ProviderSelection,\n flags: ProviderFlags = {},\n): string | undefined {\n const { replaced } = selection;\n if (replaced === undefined) return undefined;\n const flag = flags.local !== true && flags.offline === true ? \"--offline\" : \"--local\";\n return `${flag}: using ${LOCAL_PROVIDER} instead of \"${replaced.provider}\" from ${replaced.source}.`;\n}\n\n/**\n * The library's spec for a selection, with the connection settings from\n * `connections` for the provider it names.\n *\n * A named provider gets its own section, defaults filled. Under `auto` the\n * spec carries every setting detection reads, but only as the user wrote it:\n * the library counts a `baseUrl` as a reason openai is usable, so the default\n * endpoint must not reach detection. `apiKeyEnv` is left out there: the spec\n * has one for every provider, and detection looks for the default variables.\n */\nexport function providerSpecFor(\n connections: ProviderConnections,\n selection: { provider: ProviderSelector; model: string | null },\n): ProviderSpec {\n const { provider, model } = selection;\n const local = connections[\"llama-cpp\"] ?? {};\n const llamaCpp = {\n thoughtTokens: local.thoughtTokens ?? 0,\n ...(local.modelsDir !== undefined ? { modelsDirectory: local.modelsDir } : {}),\n };\n switch (provider) {\n case \"anthropic\":\n return {\n provider,\n model,\n apiKeyEnv: connections.anthropic?.apiKeyEnv ?? \"ANTHROPIC_API_KEY\",\n };\n case \"openai\":\n return {\n provider,\n model,\n apiKeyEnv: connections.openai?.apiKeyEnv ?? \"OPENAI_API_KEY\",\n baseUrl: connections.openai?.baseUrl ?? DEFAULT_OPENAI_BASE_URL,\n };\n case \"claude-cli\":\n return { provider, model, command: connections[\"claude-cli\"]?.command ?? \"claude\" };\n case \"jev\":\n return {\n provider,\n model,\n apiKeyEnv: connections.jev?.apiKeyEnv ?? \"TYPESAFE_API_KEY\",\n baseUrl: connections.jev?.baseUrl ?? DEFAULT_JEV_BASE_URL,\n };\n case \"llama-cpp\":\n // Local weights, in-process: no API key, and no network once they are\n // downloaded.\n return { provider, model, llamaCpp };\n case \"mock\":\n return { provider, model };\n case \"auto\": {\n const baseUrl = connections.openai?.baseUrl;\n const command = connections[\"claude-cli\"]?.command;\n const configuredLocal = local.thoughtTokens !== undefined || local.modelsDir !== undefined;\n return {\n provider,\n model,\n ...(baseUrl !== undefined ? { baseUrl } : {}),\n ...(command !== undefined ? { command } : {}),\n ...(configuredLocal ? { llamaCpp } : {}),\n };\n }\n }\n}\n\n/**\n * The concrete provider and model a spec resolves to, without constructing the\n * provider: a fully cached run needs no API key. Under `auto` this is where\n * detection runs. It probes the environment, the Claude CLI and the local\n * runtime, but never authenticates.\n *\n * The model returned is the RESOLVED one (the provider's default when none was\n * named, a llama-cpp tier's concrete weights), which is what makes it safe as\n * cache-key material: a library default that changes changes the key.\n */\nexport async function resolveIdentity(\n spec: ProviderSpec,\n toError: ToErrorFn,\n): Promise<{ provider: ProviderName; model: string }> {\n try {\n return await resolveProviderIdentityAsync(spec);\n } catch (err) {\n // Detection failing with nothing available is operational, not per-file:\n // the aggregate message names every provider it tried and why each was out.\n throw toError(\n err instanceof InferenceError\n ? err.message\n : `Could not resolve provider \"${String(spec.provider)}\": ${errorMessage(err)}`,\n );\n }\n}\n\n/**\n * The identity `--offline` may run, or `undefined` when none is on this\n * machine. `spec` comes from a selection made with `offline` set, so it names\n * llama-cpp, or the mock, which sends nothing anywhere.\n *\n * Nothing is downloaded or installed. The library answers both questions\n * without side effects: the runtime must be importable now, and the resolved\n * model's weights must be `ready` on disk, so a model still downloading is\n * not. Resolving the `auto` tier probes memory through the runtime, which is\n * why the runtime is checked first.\n */\nexport async function offlineIdentity(\n spec: ProviderSpec,\n toError: ToErrorFn,\n): Promise<{ provider: ProviderName; model: string } | undefined> {\n if (spec.provider === \"mock\") return resolveIdentity(spec, toError);\n if (spec.provider !== LOCAL_PROVIDER) return undefined;\n if ((await nodeLlamaCppStatus()).state !== \"present\") return undefined;\n const identity = await resolveIdentity(spec, toError);\n const modelsDirectory = spec.llamaCpp?.modelsDirectory;\n const state = await modelState(\n identity.model,\n modelsDirectory === undefined ? {} : { modelsDirectory },\n );\n return state === \"ready\" ? identity : undefined;\n}\n"],"mappings":"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","names":[]}