@holoscript/core 7.0.0 → 8.0.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 (350) hide show
  1. package/README.md +4 -4
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-N6B6PJ6G.cjs +38 -0
  4. package/dist/GLTFPipeline-P3WMNYCN.js +17 -0
  5. package/dist/HoloScriptPlusParser-7FBIFUFC.js +693 -0
  6. package/dist/HoloScriptPlusParser-A2W7OCN2.cjs +698 -0
  7. package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
  8. package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
  9. package/dist/HoloScriptRuntime-CBYJX3LZ.js +10 -0
  10. package/dist/HoloScriptRuntime-VJ374RER.cjs +19 -0
  11. package/dist/USDZExporter-3FWJ25JI.cjs +1037 -0
  12. package/dist/USDZExporter-D2HQLQYK.js +1035 -0
  13. package/dist/agents/index.cjs +19 -0
  14. package/dist/agents/index.d.ts +100 -0
  15. package/dist/agents/index.js +17 -0
  16. package/dist/chunk-2BSMSUCE.js +1941 -0
  17. package/dist/chunk-2IWC4FP7.cjs +1189 -0
  18. package/dist/chunk-2M2DPHKB.js +762 -0
  19. package/dist/chunk-2X7NGX3M.js +2426 -0
  20. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  21. package/dist/chunk-3FOKASKO.cjs +348 -0
  22. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  23. package/dist/chunk-4C57PR42.js +468 -0
  24. package/dist/chunk-4GU5GCIY.js +1384 -0
  25. package/dist/chunk-4N4SXXWF.js +769 -0
  26. package/dist/chunk-4PDEPEQW.cjs +41 -0
  27. package/dist/chunk-4R6SBXDB.js +45 -0
  28. package/dist/chunk-4SDKXQ4C.js +811 -0
  29. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  30. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  31. package/dist/chunk-5GLCTO44.js +161 -0
  32. package/dist/chunk-5H2G27PK.cjs +627 -0
  33. package/dist/chunk-5JEU52DW.js +382 -0
  34. package/dist/chunk-5NWINHR5.cjs +689 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  38. package/dist/chunk-6EX3I5P4.cjs +130 -0
  39. package/dist/chunk-6Q7RC2MK.cjs +1418 -0
  40. package/dist/chunk-7H33U5SM.cjs +413 -0
  41. package/dist/chunk-7M3PNU2M.cjs +672 -0
  42. package/dist/chunk-7T25IEZ2.js +449 -0
  43. package/dist/chunk-7V4JI5TB.cjs +6947 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-ADADVMXY.js +404 -0
  46. package/dist/chunk-AIA52I7T.cjs +543 -0
  47. package/dist/chunk-ALC6K7GL.cjs +4402 -0
  48. package/dist/chunk-ANXZFVY2.js +113 -0
  49. package/dist/chunk-AOVGZ25K.cjs +56583 -0
  50. package/dist/chunk-AVJHHUC5.cjs +718 -0
  51. package/dist/chunk-BGY3SDG3.js +4396 -0
  52. package/dist/chunk-BOVPWH4H.js +3857 -0
  53. package/dist/chunk-BRQJKJGT.cjs +20 -0
  54. package/dist/chunk-C37BHB7N.cjs +636 -0
  55. package/dist/chunk-CBJY23VL.js +126 -0
  56. package/dist/chunk-CCATWPXM.js +778 -0
  57. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  58. package/dist/chunk-CMT5NMMS.js +669 -0
  59. package/dist/chunk-CR4FMIWL.cjs +1049 -0
  60. package/dist/chunk-CR7XRXRN.cjs +639 -0
  61. package/dist/chunk-CSD27UNQ.js +2176 -0
  62. package/dist/chunk-D3STJ56J.js +714 -0
  63. package/dist/chunk-DAJXW4KX.js +725 -0
  64. package/dist/chunk-DHO2YRIM.js +756 -0
  65. package/dist/chunk-DTGBOSEM.cjs +319 -0
  66. package/dist/chunk-E6XXE66V.js +2252 -0
  67. package/dist/chunk-E7JP3BS3.cjs +61 -0
  68. package/dist/chunk-EKBKLK7P.js +1169 -0
  69. package/dist/chunk-EKYL4PE3.cjs +404 -0
  70. package/dist/chunk-EXKSFGSX.cjs +274 -0
  71. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  72. package/dist/chunk-FDSGHPAK.js +130 -0
  73. package/dist/chunk-FEWUHQNM.cjs +144 -0
  74. package/dist/chunk-FFAOS5HQ.js +70 -0
  75. package/dist/chunk-FGGJQRLZ.js +270 -0
  76. package/dist/chunk-FHP6LXJS.js +415 -0
  77. package/dist/chunk-FJPADH77.cjs +666 -0
  78. package/dist/chunk-FL33V6U7.js +421 -0
  79. package/dist/chunk-FYSPZT4V.cjs +169 -0
  80. package/dist/chunk-GIOYPNTH.js +5575 -0
  81. package/dist/chunk-GJNCFRJU.cjs +125 -0
  82. package/dist/chunk-GMP623FG.cjs +1508 -0
  83. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  84. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  85. package/dist/chunk-GYZE55MO.js +2007 -0
  86. package/dist/chunk-GZG4KA4E.js +529 -0
  87. package/dist/chunk-H652NHX5.js +600 -0
  88. package/dist/chunk-HCCQLAA4.cjs +74 -0
  89. package/dist/chunk-HKEXJUWS.cjs +4007 -0
  90. package/dist/chunk-HNDK4IQU.cjs +5737 -0
  91. package/dist/chunk-HR2OSYVQ.js +56165 -0
  92. package/dist/chunk-HYNTS5CP.js +422 -0
  93. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  94. package/dist/chunk-ILRBGFVD.cjs +72 -0
  95. package/dist/chunk-IUDGEUDO.cjs +1409 -0
  96. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  97. package/dist/chunk-IVY74O6C.js +247 -0
  98. package/dist/chunk-IWC5DM2M.cjs +611 -0
  99. package/dist/chunk-J32ZJZJH.js +554 -0
  100. package/dist/chunk-J52VSAQ7.js +6884 -0
  101. package/dist/chunk-J6M4FPK5.js +421 -0
  102. package/dist/chunk-J7XZV333.js +844 -0
  103. package/dist/chunk-JBNDTXXV.cjs +2433 -0
  104. package/dist/chunk-JC5YBPSF.cjs +984 -0
  105. package/dist/chunk-JD7CIZ33.js +1949 -0
  106. package/dist/chunk-JIBL5LRK.js +4287 -0
  107. package/dist/chunk-JIYN45TV.cjs +2525 -0
  108. package/dist/chunk-K574J76X.cjs +457 -0
  109. package/dist/chunk-KHDZJE5D.cjs +2196 -0
  110. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  111. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  112. package/dist/chunk-KPJL34Y7.cjs +186 -0
  113. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  114. package/dist/chunk-L5LKKENW.cjs +424 -0
  115. package/dist/chunk-LHAXPADA.js +882 -0
  116. package/dist/chunk-LM2VU56C.cjs +37 -0
  117. package/dist/chunk-M56JSP4A.js +400 -0
  118. package/dist/chunk-MBOOR7X4.js +18 -0
  119. package/dist/chunk-MQWAT42R.cjs +4310 -0
  120. package/dist/chunk-MXFUTKCO.js +56 -0
  121. package/dist/chunk-MYY4PMWX.cjs +264 -0
  122. package/dist/chunk-N75IH2HY.js +258 -0
  123. package/dist/chunk-NCWCUZNS.cjs +72 -0
  124. package/dist/chunk-NG77ATEW.cjs +778 -0
  125. package/dist/chunk-NW5G5FBQ.js +215 -0
  126. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  127. package/dist/chunk-OH2FAIVU.js +608 -0
  128. package/dist/chunk-OIQYIIO3.cjs +473 -0
  129. package/dist/chunk-OL46QLBJ.js +61 -0
  130. package/dist/chunk-OMXII44L.js +5386 -0
  131. package/dist/chunk-OSYNRVOV.cjs +243 -0
  132. package/dist/chunk-PGANYCAG.cjs +220 -0
  133. package/dist/chunk-PHENW4MQ.js +65 -0
  134. package/dist/chunk-PY37LNDP.js +686 -0
  135. package/dist/chunk-Q56TT7IL.js +483 -0
  136. package/dist/chunk-QD32ADK6.js +1046 -0
  137. package/dist/chunk-QPOQ7VPI.js +1491 -0
  138. package/dist/chunk-QPSKHBJP.js +5963 -0
  139. package/dist/chunk-QXH7QDSZ.js +1989 -0
  140. package/dist/chunk-R24NNAEG.js +1399 -0
  141. package/dist/chunk-R75BSDH7.cjs +50 -0
  142. package/dist/chunk-RARB3MBR.js +207 -0
  143. package/dist/chunk-ROHLEP2W.cjs +847 -0
  144. package/dist/chunk-S3MDHNKB.cjs +490 -0
  145. package/dist/chunk-S6YWHCKV.cjs +410 -0
  146. package/dist/chunk-SIEXCILW.js +229 -0
  147. package/dist/chunk-SLU6UPJI.cjs +410 -0
  148. package/dist/chunk-SMIWS6DE.cjs +212 -0
  149. package/dist/chunk-T5J7ZKP3.cjs +4885 -0
  150. package/dist/chunk-TDCNJHWO.js +341 -0
  151. package/dist/chunk-TG7O4WBC.js +406 -0
  152. package/dist/chunk-THCK6ECW.js +2085 -0
  153. package/dist/chunk-TJHVSBP2.js +439 -0
  154. package/dist/chunk-TVHSPJ4N.cjs +606 -0
  155. package/dist/chunk-TWUXUCEW.cjs +781 -0
  156. package/dist/chunk-U44IKGG7.cjs +5390 -0
  157. package/dist/chunk-UFZZ7TSN.cjs +886 -0
  158. package/dist/chunk-UJXISJBN.js +487 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-UWJHCOH2.js +623 -0
  162. package/dist/chunk-V6MKC2FZ.js +979 -0
  163. package/dist/chunk-VJ3L7CHT.cjs +169 -0
  164. package/dist/chunk-VMLKSV26.js +1216 -0
  165. package/dist/chunk-VVKVQZI6.js +55 -0
  166. package/dist/chunk-W6RW64BB.cjs +1219 -0
  167. package/dist/chunk-WKX5AMOY.js +309 -0
  168. package/dist/chunk-WNNE3PO3.js +34 -0
  169. package/dist/chunk-WRKUDAZJ.js +3038 -0
  170. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  171. package/dist/chunk-WRNEH5MO.js +3169 -0
  172. package/dist/chunk-WRWEX5ZF.js +658 -0
  173. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  174. package/dist/chunk-X3UVCWNL.cjs +2257 -0
  175. package/dist/chunk-XB274MW5.cjs +814 -0
  176. package/dist/chunk-XHIV6326.cjs +793 -0
  177. package/dist/chunk-XIVIE43A.cjs +729 -0
  178. package/dist/chunk-XJAN7CZG.cjs +432 -0
  179. package/dist/chunk-XKTPFXGA.js +164 -0
  180. package/dist/chunk-XL6INWKT.js +121 -0
  181. package/dist/chunk-XSFNHP2E.js +632 -0
  182. package/dist/chunk-XT6JY5W5.js +9684 -0
  183. package/dist/chunk-XUILI4KB.cjs +430 -0
  184. package/dist/chunk-YF2I3MV3.js +46 -0
  185. package/dist/chunk-YIMN575O.js +4847 -0
  186. package/dist/chunk-YIVFJNYV.js +176 -0
  187. package/dist/chunk-YKGPCZEE.cjs +237 -0
  188. package/dist/chunk-YN2YWTXW.js +5731 -0
  189. package/dist/chunk-YN6V7R3L.cjs +327 -0
  190. package/dist/chunk-YQELFNJV.js +39 -0
  191. package/dist/chunk-YVD3CSO3.js +1183 -0
  192. package/dist/chunk-YVOAF4ML.js +623 -0
  193. package/dist/chunk-YWOBW2PV.cjs +759 -0
  194. package/dist/chunk-YYXH45E2.js +426 -0
  195. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  196. package/dist/chunk-ZU7NIRT6.js +325 -0
  197. package/dist/chunk-ZZ7RO2UQ.js +1243 -0
  198. package/dist/cli/holoscript-runner.cjs +2255 -0
  199. package/dist/cli/holoscript-runner.js +2230 -0
  200. package/dist/codebase/index.cjs +336 -0
  201. package/dist/codebase/index.js +331 -0
  202. package/dist/compiler/agent-inference.cjs +31 -0
  203. package/dist/compiler/agent-inference.js +8 -0
  204. package/dist/compiler/android-xr.cjs +24 -0
  205. package/dist/compiler/android-xr.js +14 -0
  206. package/dist/compiler/android.cjs +24 -0
  207. package/dist/compiler/android.js +14 -0
  208. package/dist/compiler/ar.cjs +23 -0
  209. package/dist/compiler/ar.js +11 -0
  210. package/dist/compiler/babylon.cjs +21 -0
  211. package/dist/compiler/babylon.js +15 -0
  212. package/dist/compiler/business-quest.cjs +43 -0
  213. package/dist/compiler/business-quest.js +4 -0
  214. package/dist/compiler/coco.cjs +27 -0
  215. package/dist/compiler/coco.js +4 -0
  216. package/dist/compiler/context.cjs +25 -0
  217. package/dist/compiler/context.d.ts +28 -0
  218. package/dist/compiler/context.js +8 -0
  219. package/dist/compiler/domain-block-utils.cjs +609 -0
  220. package/dist/compiler/domain-block-utils.js +11 -0
  221. package/dist/compiler/dtdl.cjs +27 -0
  222. package/dist/compiler/dtdl.js +11 -0
  223. package/dist/compiler/gltf-pipeline.cjs +39 -0
  224. package/dist/compiler/gltf-pipeline.js +4 -0
  225. package/dist/compiler/godot.cjs +18 -0
  226. package/dist/compiler/godot.js +12 -0
  227. package/dist/compiler/incremental.cjs +34 -0
  228. package/dist/compiler/incremental.js +9 -0
  229. package/dist/compiler/index.cjs +5408 -0
  230. package/dist/compiler/index.d.ts +334 -21
  231. package/dist/compiler/index.js +5069 -0
  232. package/dist/compiler/ios.cjs +23 -0
  233. package/dist/compiler/ios.js +13 -0
  234. package/dist/compiler/llm-provider-capabilities.cjs +25 -0
  235. package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
  236. package/dist/compiler/llm-provider-capabilities.js +8 -0
  237. package/dist/compiler/multi-layer.cjs +24 -0
  238. package/dist/compiler/multi-layer.js +15 -0
  239. package/dist/compiler/nodetoy.cjs +23 -0
  240. package/dist/compiler/nodetoy.d.ts +69 -0
  241. package/dist/compiler/nodetoy.js +4 -0
  242. package/dist/compiler/openxr.cjs +19 -0
  243. package/dist/compiler/openxr.js +13 -0
  244. package/dist/compiler/playcanvas.cjs +19 -0
  245. package/dist/compiler/playcanvas.js +13 -0
  246. package/dist/compiler/r3f.cjs +39 -0
  247. package/dist/compiler/r3f.d.ts +22 -0
  248. package/dist/compiler/r3f.js +17 -0
  249. package/dist/compiler/remotion.cjs +23 -0
  250. package/dist/compiler/remotion.js +4 -0
  251. package/dist/compiler/reproducibility.cjs +39 -0
  252. package/dist/compiler/reproducibility.js +4 -0
  253. package/dist/compiler/sdf.cjs +24 -0
  254. package/dist/compiler/sdf.js +12 -0
  255. package/dist/compiler/semantic-scene.cjs +31 -0
  256. package/dist/compiler/semantic-scene.js +4 -0
  257. package/dist/compiler/state.cjs +21 -0
  258. package/dist/compiler/state.js +11 -0
  259. package/dist/compiler/trait-composition.cjs +30 -0
  260. package/dist/compiler/trait-composition.js +9 -0
  261. package/dist/compiler/unity.cjs +19 -0
  262. package/dist/compiler/unity.js +13 -0
  263. package/dist/compiler/unreal.cjs +23 -0
  264. package/dist/compiler/unreal.js +13 -0
  265. package/dist/compiler/urdf.cjs +52 -0
  266. package/dist/compiler/urdf.js +12 -0
  267. package/dist/compiler/usd-physics.cjs +26 -0
  268. package/dist/compiler/usd-physics.js +9 -0
  269. package/dist/compiler/visionos.cjs +19 -0
  270. package/dist/compiler/visionos.js +13 -0
  271. package/dist/compiler/vrchat.cjs +22 -0
  272. package/dist/compiler/vrchat.js +12 -0
  273. package/dist/compiler/vrr.cjs +24 -0
  274. package/dist/compiler/vrr.js +12 -0
  275. package/dist/compiler/wasm.cjs +36 -0
  276. package/dist/compiler/wasm.js +12 -0
  277. package/dist/compiler/webgpu.cjs +18 -0
  278. package/dist/compiler/webgpu.js +12 -0
  279. package/dist/coordinators/index.cjs +1266 -0
  280. package/dist/coordinators/index.d.ts +72 -1
  281. package/dist/coordinators/index.js +1259 -0
  282. package/dist/debugger.cjs +24 -0
  283. package/dist/debugger.js +11 -0
  284. package/dist/dist-ACXG6IH5.cjs +3113 -0
  285. package/dist/dist-VD4L6V7Q.js +3076 -0
  286. package/dist/entries/interop.cjs +64 -0
  287. package/dist/entries/interop.js +7 -0
  288. package/dist/entries/scripting.cjs +55 -0
  289. package/dist/entries/scripting.js +10 -0
  290. package/dist/hololand/index.cjs +146 -0
  291. package/dist/hololand/index.d.ts +70 -0
  292. package/dist/hololand/index.js +5 -0
  293. package/dist/index.cjs +44660 -0
  294. package/dist/index.d.ts +978 -21
  295. package/dist/index.js +41422 -0
  296. package/dist/math/tropical-spmv.cjs +45 -0
  297. package/dist/math/tropical-spmv.js +4 -0
  298. package/dist/math/vec3.cjs +57 -0
  299. package/dist/math/vec3.js +4 -0
  300. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  301. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  302. package/dist/paper-0c-spike/index.cjs +150 -0
  303. package/dist/paper-0c-spike/index.js +141 -0
  304. package/dist/parser.cjs +61 -0
  305. package/dist/parser.d.ts +11 -0
  306. package/dist/parser.js +12 -0
  307. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  308. package/dist/playwright-VZPDVUEQ.js +98660 -0
  309. package/dist/reconstruction/index.cjs +153 -0
  310. package/dist/reconstruction/index.d.ts +29 -2
  311. package/dist/reconstruction/index.js +8 -0
  312. package/dist/runtime.cjs +316 -0
  313. package/dist/runtime.d.ts +61 -0
  314. package/dist/runtime.js +31 -0
  315. package/dist/self-improvement/index.cjs +563 -0
  316. package/dist/self-improvement/index.js +545 -0
  317. package/dist/src-4ROC227P.cjs +2094 -0
  318. package/dist/src-HCCCSYP7.js +2073 -0
  319. package/dist/storage/index.cjs +38 -0
  320. package/dist/storage/index.js +5 -0
  321. package/dist/testing.cjs +25 -0
  322. package/dist/testing.d.ts +70 -0
  323. package/dist/testing.js +4 -0
  324. package/dist/traitDocs/traitDocs.cjs +33 -0
  325. package/dist/traitDocs/traitDocs.js +7 -0
  326. package/dist/traits/botanical-lotus.cjs +177 -0
  327. package/dist/traits/botanical-lotus.d.ts +502 -0
  328. package/dist/traits/botanical-lotus.js +7 -0
  329. package/dist/traits/engines/index.cjs +520 -0
  330. package/dist/traits/engines/index.js +380 -0
  331. package/dist/traits/index.cjs +24548 -0
  332. package/dist/traits/index.d.ts +171 -35
  333. package/dist/traits/index.js +21638 -0
  334. package/dist/traits/simulation-solver-factory.cjs +13 -0
  335. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  336. package/dist/traits/simulation-solver-factory.js +4 -0
  337. package/dist/traits/webcam-gaze.cjs +35 -0
  338. package/dist/traits/webcam-gaze.d.ts +17 -0
  339. package/dist/traits/webcam-gaze.js +4 -0
  340. package/dist/type-checker.cjs +19 -0
  341. package/dist/type-checker.js +6 -0
  342. package/dist/world/index.cjs +947 -0
  343. package/dist/world/index.d.ts +147 -0
  344. package/dist/world/index.js +939 -0
  345. package/dist/world-model/index.cjs +1446 -0
  346. package/dist/world-model/index.d.ts +119 -0
  347. package/dist/world-model/index.js +1414 -0
  348. package/dist/wot/index.cjs +29 -0
  349. package/dist/wot/index.js +4 -0
  350. package/package.json +93 -49
@@ -0,0 +1,725 @@
1
+ import { init_CompilerBase, CompilerBase } from './chunk-QPSKHBJP.js';
2
+ import { ANSCapabilityPath } from '@holoscript/core-types/ans';
3
+
4
+ // src/compiler/LLMProviderCapabilitiesCompiler.ts
5
+ init_CompilerBase();
6
+ var VENDOR_AS_SUBSTRATE_PATTERNS = [
7
+ { pattern: /managed_agents_replaces_holomesh/i, rule: "W.GOLD.002 - vendor framework cannot replace HoloMesh" },
8
+ { pattern: /vector_store_as_source_of_truth/i, rule: "docs/LLM_CAPABILITIES.md hard-don'ts - vendor stores never source-of-truth" },
9
+ { pattern: /api_keys_as_identity/i, rule: "W.GOLD.004 - wallets are identity, API keys are sessions" }
10
+ ];
11
+ var VERIFY_PLACEHOLDER_PATTERN = /\[VERIFY/;
12
+ var STALENESS_DAYS_DEFAULT = 90;
13
+ var ADAPTER_CAPABILITY_FIELD_ORDER = [
14
+ "contextWindow",
15
+ "maxOutput",
16
+ "costPerMillion",
17
+ "streaming",
18
+ "tools",
19
+ "vision",
20
+ "highResVision",
21
+ "videoInput",
22
+ "audioInput",
23
+ "audioOutput",
24
+ "imageGeneration",
25
+ "videoGeneration",
26
+ "visibleReasoning",
27
+ "adjustableEffort",
28
+ "liveWebSearch",
29
+ "hostedShell",
30
+ "codeExecutionSandbox",
31
+ "fileSearchBuiltIn",
32
+ "promptCaching",
33
+ "perLoopBudget",
34
+ "serverSideCompaction",
35
+ "hostedAgenticLoop",
36
+ "persistentMemoryStore",
37
+ "structuredOutputs",
38
+ "embeddings",
39
+ "batchApi",
40
+ "realtimeVoice",
41
+ "embeddedChatUI",
42
+ "appsIframeSurface",
43
+ "mcpServerMode",
44
+ "appWorktrees",
45
+ "evalsFirstParty",
46
+ "local",
47
+ "zeroMarginalInference",
48
+ "bedrockAvailable",
49
+ "vertexAvailable",
50
+ "bearerTokenAccess"
51
+ ];
52
+ var ADAPTER_OPTIONAL_BOOLEAN_FIELDS = ADAPTER_CAPABILITY_FIELD_ORDER.filter(
53
+ (field) => ![
54
+ "contextWindow",
55
+ "maxOutput",
56
+ "costPerMillion",
57
+ "streaming",
58
+ "tools",
59
+ "vision",
60
+ "bearerTokenAccess"
61
+ ].includes(field)
62
+ );
63
+ var LLMProviderCapabilitiesCompiler = class extends CompilerBase {
64
+ constructor(options = {}) {
65
+ super();
66
+ this.compilerName = "LLMProviderCapabilitiesCompiler";
67
+ this.options = {
68
+ formats: options.formats ?? ["markdown_ssot"],
69
+ nowIso: options.nowIso ?? (/* @__PURE__ */ new Date()).toISOString().slice(0, 10)
70
+ };
71
+ }
72
+ getRequiredCapability() {
73
+ return ANSCapabilityPath.AGENT_INFERENCE;
74
+ }
75
+ /**
76
+ * Compile a HoloScript LLM-capabilities composition to provider-data
77
+ * targets.
78
+ *
79
+ * Phases:
80
+ * 1. extract - walk the HoloComposition AST, collect all v1 LLM
81
+ * traits into the typed AST shape
82
+ * 2. validate - apply BLOCK rules (duplicate-provider, orphan-FK,
83
+ * vendor-as-substrate, [VERIFY] in numeric position)
84
+ * and WARN rules (missing/stale last_verified)
85
+ * 3. emit - dispatch to per-format emitters
86
+ */
87
+ compile(composition, agentToken, outputPath) {
88
+ this.validateCompilerAccess(agentToken, outputPath);
89
+ const ast = this.extractMatrixAST(composition);
90
+ this.validate(ast);
91
+ const files = {};
92
+ for (const format of this.options.formats) {
93
+ switch (format) {
94
+ case "markdown_ssot":
95
+ files["LLM_CAPABILITIES.md"] = this.emitMarkdownSsot(ast);
96
+ break;
97
+ case "ts_adapter_capabilities":
98
+ Object.assign(files, this.emitTsAdapterCapabilities(ast));
99
+ break;
100
+ case "cost_guard_pricing":
101
+ files["cost-guard-pricing.ts"] = this.emitCostGuardPricing(ast);
102
+ break;
103
+ case "json_capability_matrix":
104
+ files["llm-capability-matrix.json"] = this.emitJsonCapabilityMatrix(ast);
105
+ break;
106
+ default: {
107
+ const exhaustive = format;
108
+ throw new Error(`Unknown emit format: ${String(exhaustive)}`);
109
+ }
110
+ }
111
+ }
112
+ return { files, ast, diagnostics: ast.warnings };
113
+ }
114
+ // --- Phase 1: extract -----------------------------------------------
115
+ extractMatrixAST(composition) {
116
+ const ast = {
117
+ providers: [],
118
+ models: [],
119
+ capabilities: [],
120
+ superpowers: [],
121
+ routingRecommendations: [],
122
+ hardDonts: [],
123
+ warnings: []
124
+ };
125
+ for (const trait of composition.traits ?? []) {
126
+ this.dispatchTrait(trait, ast);
127
+ }
128
+ for (const obj of composition.objects ?? []) {
129
+ this.extractFromObject(obj, ast);
130
+ }
131
+ return ast;
132
+ }
133
+ extractFromObject(obj, ast) {
134
+ const traits = obj.traits ?? [];
135
+ for (const trait of traits) {
136
+ this.dispatchTrait(trait, ast);
137
+ }
138
+ }
139
+ dispatchTrait(trait, ast) {
140
+ const cfg = trait.config;
141
+ switch (trait.name) {
142
+ case "capability_matrix_meta":
143
+ ast.meta = {
144
+ version: stringField(cfg, "version", "1.0.0"),
145
+ generatedAt: stringField(cfg, "generated_at", ""),
146
+ noMonopolyRule: boolField(cfg, "no_monopoly_rule", true),
147
+ refreshCadenceDays: numberField(
148
+ cfg,
149
+ "refresh_cadence_days",
150
+ STALENESS_DAYS_DEFAULT,
151
+ "capability_matrix_meta.refresh_cadence_days"
152
+ )
153
+ };
154
+ break;
155
+ case "llm_provider":
156
+ ast.providers.push({
157
+ name: stringField(cfg, "name", ""),
158
+ vendorUrl: stringField(cfg, "vendor_url", ""),
159
+ authEnv: stringField(cfg, "auth_env", ""),
160
+ baseUrl: stringFieldOrUndef(cfg, "base_url"),
161
+ docsRoot: stringFieldOrUndef(cfg, "docs_root"),
162
+ status: stringField(cfg, "status", "planned"),
163
+ uniqueSuperpower: stringField(cfg, "unique_superpower", ""),
164
+ lastVerified: stringField(cfg, "last_verified", "")
165
+ });
166
+ break;
167
+ case "llm_model":
168
+ ast.models.push({
169
+ provider: stringField(cfg, "provider", ""),
170
+ friendlyName: stringField(cfg, "friendly_name", ""),
171
+ modelId: stringField(cfg, "model_id", ""),
172
+ contextWindow: numberField(cfg, "context_window", 0, "llm_model.context_window"),
173
+ maxOutput: numberField(cfg, "max_output", 0, "llm_model.max_output"),
174
+ inputPerMTok: numberField(cfg, "input_per_mtok", 0, "llm_model.input_per_mtok"),
175
+ outputPerMTok: numberField(cfg, "output_per_mtok", 0, "llm_model.output_per_mtok"),
176
+ status: stringField(cfg, "status", "active"),
177
+ lastVerified: stringField(cfg, "last_verified", ""),
178
+ retiresOn: stringFieldOrUndef(cfg, "retires_on")
179
+ });
180
+ break;
181
+ case "llm_capability":
182
+ ast.capabilities.push({
183
+ provider: stringField(cfg, "provider", ""),
184
+ name: stringField(cfg, "name", ""),
185
+ value: extractCapabilityValue(cfg["value"]),
186
+ notes: stringFieldOrUndef(cfg, "notes"),
187
+ lastVerified: stringFieldOrUndef(cfg, "last_verified")
188
+ });
189
+ break;
190
+ case "llm_superpower":
191
+ ast.superpowers.push({
192
+ provider: stringField(cfg, "provider", ""),
193
+ name: stringField(cfg, "name", ""),
194
+ description: stringField(cfg, "description", ""),
195
+ betaHeader: stringFieldOrUndef(cfg, "beta_header")
196
+ });
197
+ break;
198
+ case "llm_routing_recommendation":
199
+ ast.routingRecommendations.push({
200
+ provider: stringField(cfg, "provider", ""),
201
+ useWhen: stringListField(cfg, "use_when"),
202
+ avoidWhen: stringListField(cfg, "avoid_when"),
203
+ defaultFor: stringListField(cfg, "default_for")
204
+ });
205
+ break;
206
+ case "llm_hard_dont": {
207
+ const appliesTo = stringListField(cfg, "applies_to");
208
+ ast.hardDonts.push({
209
+ name: stringField(cfg, "name", ""),
210
+ reason: stringField(cfg, "reason", ""),
211
+ alternative: stringFieldOrUndef(cfg, "alternative"),
212
+ appliesTo: appliesTo.length > 0 ? appliesTo : ["all-providers"]
213
+ });
214
+ break;
215
+ }
216
+ default:
217
+ ast.warnings.push({
218
+ severity: "warning",
219
+ rule: "unknown-trait",
220
+ message: `Trait "${trait.name}" is not in LLM-capabilities vocabulary v1. Ignored. Add to vocabulary if load-bearing.`
221
+ });
222
+ break;
223
+ }
224
+ }
225
+ // --- Phase 2: validate (BLOCK throws, WARN accumulates) -----------
226
+ validate(ast) {
227
+ const providerNames = /* @__PURE__ */ new Set();
228
+ for (const provider of ast.providers) {
229
+ if (providerNames.has(provider.name)) {
230
+ throw new LLMCapabilityCompileError(
231
+ `@llm_provider name "${provider.name}" is duplicated. Each provider must appear exactly once in the matrix (W.GOLD.006 - single source of truth). If you need per-deployment overrides, use a separate composition with @include selectors.`
232
+ );
233
+ }
234
+ providerNames.add(provider.name);
235
+ }
236
+ const orphanCheck = (providerName, fromTrait, fromName) => {
237
+ if (providerName && !providerNames.has(providerName)) {
238
+ throw new LLMCapabilityCompileError(
239
+ `@${fromTrait} "${fromName}" references provider "${providerName}" but no @llm_provider with that name exists in the composition. Add the provider entry or fix the reference.`
240
+ );
241
+ }
242
+ };
243
+ for (const model of ast.models) {
244
+ orphanCheck(model.provider, "llm_model", model.modelId || model.friendlyName);
245
+ }
246
+ for (const cap of ast.capabilities) {
247
+ orphanCheck(cap.provider, "llm_capability", cap.name);
248
+ }
249
+ for (const sp of ast.superpowers) {
250
+ orphanCheck(sp.provider, "llm_superpower", sp.name);
251
+ }
252
+ for (const rr of ast.routingRecommendations) {
253
+ orphanCheck(rr.provider, "llm_routing_recommendation", rr.provider);
254
+ }
255
+ for (const dont of ast.hardDonts) {
256
+ const haystack = `${dont.name} ${dont.reason}`;
257
+ for (const vendorPat of VENDOR_AS_SUBSTRATE_PATTERNS) {
258
+ if (vendorPat.pattern.test(haystack)) {
259
+ throw new LLMCapabilityCompileError(
260
+ `@llm_hard_dont "${dont.name}" appears to author a vendor-as-substrate pattern. Rule: ${vendorPat.rule}. (A correct hard_dont SAYS "do not adopt vendor as substrate" - this one's framing matches the inverse.)`
261
+ );
262
+ }
263
+ }
264
+ }
265
+ for (const cap of ast.capabilities) {
266
+ if (typeof cap.value === "string" && VERIFY_PLACEHOLDER_PATTERN.test(cap.value)) {
267
+ throw new LLMCapabilityCompileError(
268
+ `@llm_capability "${cap.name}" for provider "${cap.provider}" has [VERIFY] placeholder in its value. The matrix must not route on unverified data (F.014 / W.GOLD.341). File a /research task to populate the field, then re-emit.`
269
+ );
270
+ }
271
+ }
272
+ for (const model of ast.models) {
273
+ if (model.inputPerMTok === 0 && model.outputPerMTok === 0) {
274
+ ast.warnings.push({
275
+ severity: "warning",
276
+ rule: "F.014 unverified-pricing",
277
+ message: `@llm_model "${model.modelId}" for provider "${model.provider}" has zero input+output pricing. If this is a free / local model, add a note; otherwise this likely indicates an unverified source field that needs a /research task to populate.`
278
+ });
279
+ }
280
+ }
281
+ for (const provider of ast.providers) {
282
+ if (!provider.lastVerified) {
283
+ ast.warnings.push({
284
+ severity: "warning",
285
+ rule: "F.014 missing-last-verified",
286
+ message: `@llm_provider "${provider.name}" has no last_verified field. Per the SSOT update protocol, every provider must declare when it was last reconciled with vendor docs.`
287
+ });
288
+ continue;
289
+ }
290
+ const ageDays = daysBetween(provider.lastVerified, this.options.nowIso);
291
+ if (ageDays !== null && ageDays > STALENESS_DAYS_DEFAULT) {
292
+ ast.warnings.push({
293
+ severity: "warning",
294
+ rule: "F.014 stale-last-verified",
295
+ message: `@llm_provider "${provider.name}" was last verified ${provider.lastVerified} (${ageDays} days ago). Per F.014 / W.GOLD.341, > ${STALENESS_DAYS_DEFAULT}-day-old data must be re-verified before relying on it for routing.`
296
+ });
297
+ }
298
+ }
299
+ }
300
+ // --- Phase 3: emit -- compile_to_markdown_ssot ---------------------
301
+ /**
302
+ * Emit LLM_CAPABILITIES.md - the markdown SSOT format read by
303
+ * humans and consumed as the canonical reference (today's source
304
+ * of truth, tomorrow's emitted target). Format mirrors the
305
+ * existing `docs/LLM_CAPABILITIES.md` shape for round-trip
306
+ * compatibility.
307
+ */
308
+ emitMarkdownSsot(ast) {
309
+ const lines = [];
310
+ lines.push("# LLM Capabilities & Benchmarks - SSOT");
311
+ lines.push("");
312
+ lines.push(
313
+ "> Authoritative source for every LLM provider we route to. Drives the capability manifests in `packages/llm-provider/`, brain-composition `requires/prefers` fields, `CostGuard` pricing, and routing decisions in `packages/holoscript-agent/`."
314
+ );
315
+ if (ast.meta?.noMonopolyRule) {
316
+ lines.push(">");
317
+ lines.push(
318
+ "> **No-monopoly rule:** No provider is the default for the framework. Routing defaults are per-brain, declared in `.hsplus`, never baked into core packages."
319
+ );
320
+ }
321
+ lines.push("");
322
+ if (ast.meta) {
323
+ lines.push("## Matrix metadata");
324
+ lines.push("");
325
+ lines.push(`- **Version**: ${ast.meta.version}`);
326
+ lines.push(`- **Generated**: ${ast.meta.generatedAt}`);
327
+ lines.push(`- **Refresh cadence**: every ${ast.meta.refreshCadenceDays} days`);
328
+ lines.push("");
329
+ }
330
+ if (ast.providers.length > 0) {
331
+ lines.push("## Provider matrix");
332
+ lines.push("");
333
+ lines.push("| Provider | Status | Unique superpower | Last verified |");
334
+ lines.push("|---|---|---|---|");
335
+ for (const p of ast.providers) {
336
+ lines.push(
337
+ `| **${p.name}** | ${p.status} | ${p.uniqueSuperpower} | ${p.lastVerified || "*(unverified)*"} |`
338
+ );
339
+ }
340
+ lines.push("");
341
+ }
342
+ if (ast.hardDonts.length > 0) {
343
+ lines.push("## Hard don'ts (cross-provider red lines)");
344
+ lines.push("");
345
+ lines.push(
346
+ "These are non-negotiable. Each rule names what NOT to do, why, and the alternative."
347
+ );
348
+ lines.push("");
349
+ for (const d of ast.hardDonts) {
350
+ const scope = d.appliesTo.includes("all-providers") ? "all providers" : d.appliesTo.join(", ");
351
+ lines.push(`### ${d.name}`);
352
+ lines.push("");
353
+ lines.push(`- **Reason**: ${d.reason}`);
354
+ if (d.alternative) {
355
+ lines.push(`- **Alternative**: ${d.alternative}`);
356
+ }
357
+ lines.push(`- **Applies to**: ${scope}`);
358
+ lines.push("");
359
+ }
360
+ }
361
+ for (const provider of ast.providers) {
362
+ lines.push(`## ${provider.name}`);
363
+ lines.push("");
364
+ lines.push("### Identity & access");
365
+ lines.push("");
366
+ lines.push(`- **Vendor URL**: ${provider.vendorUrl || "*(missing)*"}`);
367
+ lines.push(`- **Auth env**: \`${provider.authEnv || "*(missing)*"}\``);
368
+ if (provider.baseUrl) lines.push(`- **Base URL**: ${provider.baseUrl}`);
369
+ if (provider.docsRoot) lines.push(`- **Docs root**: ${provider.docsRoot}`);
370
+ lines.push(`- **Status**: ${provider.status}`);
371
+ lines.push("");
372
+ const models = ast.models.filter((m) => m.provider === provider.name);
373
+ if (models.length > 0) {
374
+ lines.push("### Models");
375
+ lines.push("");
376
+ lines.push(
377
+ "| Friendly | Model ID | Context | Max out | $/M in | $/M out | Status | Last verified |"
378
+ );
379
+ lines.push("|---|---|---|---|---|---|---|---|");
380
+ for (const m of models) {
381
+ lines.push(
382
+ `| ${m.friendlyName} | \`${m.modelId}\` | ${formatTokens(m.contextWindow)} | ${formatTokens(m.maxOutput)} | $${m.inputPerMTok} | $${m.outputPerMTok} | ${m.status}${m.retiresOn ? ` (retires ${m.retiresOn})` : ""} | ${m.lastVerified || "*(unverified)*"} |`
383
+ );
384
+ }
385
+ lines.push("");
386
+ }
387
+ const superpowers = ast.superpowers.filter((s) => s.provider === provider.name);
388
+ if (superpowers.length > 0) {
389
+ lines.push("### Unique superpowers (segregated axis)");
390
+ lines.push("");
391
+ for (const sp of superpowers) {
392
+ const beta = sp.betaHeader ? ` *(beta header: \`${sp.betaHeader}\`)*` : "";
393
+ lines.push(`- **${sp.name}** - ${sp.description}${beta}`);
394
+ }
395
+ lines.push("");
396
+ }
397
+ const caps = ast.capabilities.filter((c) => c.provider === provider.name);
398
+ if (caps.length > 0) {
399
+ lines.push("### Capability flags");
400
+ lines.push("");
401
+ lines.push("| Capability | Value | Notes | Last verified |");
402
+ lines.push("|---|---|---|---|");
403
+ for (const c of caps) {
404
+ lines.push(
405
+ `| ${c.name} | ${formatCapabilityValue(c.value)} | ${c.notes ?? ""} | ${c.lastVerified ?? ""} |`
406
+ );
407
+ }
408
+ lines.push("");
409
+ }
410
+ const routing = ast.routingRecommendations.filter(
411
+ (r) => r.provider === provider.name
412
+ );
413
+ if (routing.length > 0) {
414
+ lines.push("### Routing recommendations");
415
+ lines.push("");
416
+ for (const r of routing) {
417
+ if (r.useWhen.length > 0) {
418
+ lines.push(`- **Use when**: ${r.useWhen.join("; ")}`);
419
+ }
420
+ if (r.avoidWhen.length > 0) {
421
+ lines.push(`- **Avoid when**: ${r.avoidWhen.join("; ")}`);
422
+ }
423
+ if (r.defaultFor.length > 0) {
424
+ lines.push(`- **Default for**: ${r.defaultFor.join("; ")}`);
425
+ }
426
+ }
427
+ lines.push("");
428
+ }
429
+ lines.push(`**Last verified:** ${provider.lastVerified || "*(unverified)*"}`);
430
+ lines.push("");
431
+ lines.push("---");
432
+ lines.push("");
433
+ }
434
+ lines.push(
435
+ `*Generated by HoloScript LLMProviderCapabilitiesCompiler (compile_to_markdown_ssot). Source: HoloScript composition. Vocabulary: v1 (ratified 2026-05-06). Per W.GOLD.006: this file is the EMITTED SSOT, not a hand-edited document - upstream source is the .hs composition.*`
436
+ );
437
+ lines.push("");
438
+ return lines.join("\n");
439
+ }
440
+ /**
441
+ * Emit paste-ready adapter capability constants. Each output entry is keyed
442
+ * by the adapter file basename plus `.capabilities`, matching the board-task
443
+ * contract (e.g. `anthropic.ts.capabilities`).
444
+ */
445
+ emitTsAdapterCapabilities(ast) {
446
+ const files = {};
447
+ for (const provider of ast.providers) {
448
+ const providerModels = ast.models.filter((model) => model.provider === provider.name);
449
+ const providerCapabilities = ast.capabilities.filter(
450
+ (capability) => capability.provider === provider.name
451
+ );
452
+ const entries = buildAdapterCapabilities(providerModels, providerCapabilities);
453
+ const lines = [];
454
+ lines.push("/**");
455
+ lines.push(" * Generated by HoloScript LLMProviderCapabilitiesCompiler");
456
+ lines.push(" * target: compile_to_ts_adapter_capabilities");
457
+ lines.push(` * provider: ${provider.name}`);
458
+ lines.push(" * Paste into the matching packages/llm-provider adapter.");
459
+ lines.push(" */");
460
+ lines.push(
461
+ `export const ${toProviderConstName(provider.name)}_CAPABILITIES: Capabilities = {`
462
+ );
463
+ for (const field of ADAPTER_CAPABILITY_FIELD_ORDER) {
464
+ if (!entries.has(field)) continue;
465
+ lines.push(` ${field}: ${formatTsCapabilityValue(entries.get(field))},`);
466
+ }
467
+ lines.push("};");
468
+ lines.push("");
469
+ files[`${provider.name}.ts.capabilities`] = lines.join("\n");
470
+ }
471
+ return files;
472
+ }
473
+ /**
474
+ * Emit a machine-readable capability matrix for routing/autocomplete
475
+ * tooling. `rows` is the compact cross-provider table (one provider per
476
+ * row, capability flags as columns). `providers` carries richer context
477
+ * for dashboards that need models, routing recommendations, or provenance.
478
+ */
479
+ emitJsonCapabilityMatrix(ast) {
480
+ const capabilityColumns = Array.from(
481
+ new Set(ast.capabilities.map((cap) => cap.name).filter(Boolean))
482
+ ).sort((a, b) => a.localeCompare(b));
483
+ const providers = ast.providers.map((provider) => {
484
+ const capabilities = ast.capabilities.filter((cap) => cap.provider === provider.name);
485
+ const capabilityValues = capabilityValueMap(capabilities, capabilityColumns);
486
+ const routing = ast.routingRecommendations.filter((r) => r.provider === provider.name);
487
+ return {
488
+ name: provider.name,
489
+ status: provider.status,
490
+ vendorUrl: provider.vendorUrl,
491
+ authEnv: provider.authEnv,
492
+ baseUrl: provider.baseUrl ?? null,
493
+ docsRoot: provider.docsRoot ?? null,
494
+ uniqueSuperpower: provider.uniqueSuperpower,
495
+ lastVerified: provider.lastVerified,
496
+ models: ast.models.filter((model) => model.provider === provider.name).map((model) => ({
497
+ friendlyName: model.friendlyName,
498
+ modelId: model.modelId,
499
+ contextWindow: model.contextWindow,
500
+ maxOutput: model.maxOutput,
501
+ inputPerMTok: model.inputPerMTok,
502
+ outputPerMTok: model.outputPerMTok,
503
+ status: model.status,
504
+ lastVerified: model.lastVerified,
505
+ retiresOn: model.retiresOn ?? null
506
+ })),
507
+ capabilities: capabilityValues,
508
+ capabilityDetails: Object.fromEntries(
509
+ capabilities.map((cap) => [
510
+ cap.name,
511
+ {
512
+ value: cap.value,
513
+ notes: cap.notes ?? null,
514
+ lastVerified: cap.lastVerified ?? null
515
+ }
516
+ ])
517
+ ),
518
+ superpowers: ast.superpowers.filter((superpower) => superpower.provider === provider.name).map((superpower) => ({
519
+ name: superpower.name,
520
+ description: superpower.description,
521
+ betaHeader: superpower.betaHeader ?? null
522
+ })),
523
+ routing: {
524
+ useWhen: routing.flatMap((r) => r.useWhen),
525
+ avoidWhen: routing.flatMap((r) => r.avoidWhen),
526
+ defaultFor: routing.flatMap((r) => r.defaultFor)
527
+ }
528
+ };
529
+ });
530
+ const rows = providers.map((provider) => ({
531
+ provider: provider.name,
532
+ status: provider.status,
533
+ uniqueSuperpower: provider.uniqueSuperpower,
534
+ lastVerified: provider.lastVerified,
535
+ ...provider.capabilities
536
+ }));
537
+ const payload = {
538
+ format: "json_capability_matrix",
539
+ formatVersion: "1.0.0",
540
+ generatedBy: "HoloScript LLMProviderCapabilitiesCompiler",
541
+ source: "HoloScript LLM-capabilities composition",
542
+ meta: ast.meta ?? null,
543
+ capabilityColumns,
544
+ rows,
545
+ providers,
546
+ hardDonts: ast.hardDonts,
547
+ diagnostics: ast.warnings
548
+ };
549
+ return JSON.stringify(payload, null, 2) + "\n";
550
+ }
551
+ /**
552
+ * Emit the CostGuard pricing constants. Shape intentionally mirrors
553
+ * packages/holoscript-agent/src/cost-guard.ts so the runtime can delete
554
+ * hardcoded tables once generated files are wired in.
555
+ */
556
+ emitCostGuardPricing(ast) {
557
+ const lines = [];
558
+ lines.push("/**");
559
+ lines.push(" * Generated by HoloScript LLMProviderCapabilitiesCompiler");
560
+ lines.push(" * target: compile_to_cost_guard_pricing");
561
+ lines.push(" * Source: HoloScript LLM-capabilities composition.");
562
+ lines.push(" * Do not hand-edit; update the .hs source and re-emit.");
563
+ lines.push(" */");
564
+ lines.push("");
565
+ for (const provider of ast.providers) {
566
+ const constName = `${toProviderConstName(provider.name)}_PRICING_USD_PER_MTOK`;
567
+ const models = ast.models.filter((m) => m.provider === provider.name);
568
+ lines.push(
569
+ `export const ${constName}: Record<string, { input: number; output: number }> = ` + (models.length === 0 ? "{};" : "{")
570
+ );
571
+ for (const model of models) {
572
+ lines.push(
573
+ ` ${tsStringLiteral(model.modelId)}: { input: ${formatNumberLiteral(model.inputPerMTok)}, output: ${formatNumberLiteral(model.outputPerMTok)} },`
574
+ );
575
+ }
576
+ if (models.length > 0) {
577
+ lines.push("};");
578
+ }
579
+ lines.push("");
580
+ }
581
+ return lines.join("\n");
582
+ }
583
+ };
584
+ var LLMCapabilityCompileError = class extends Error {
585
+ constructor(message) {
586
+ super(message);
587
+ this.name = "LLMCapabilityCompileError";
588
+ }
589
+ };
590
+ function createLLMProviderCapabilitiesCompiler(options) {
591
+ return new LLMProviderCapabilitiesCompiler(options);
592
+ }
593
+ function stringField(cfg, key, fallback) {
594
+ const v = cfg[key];
595
+ if (typeof v === "string") return v;
596
+ return fallback;
597
+ }
598
+ function stringFieldOrUndef(cfg, key) {
599
+ const v = cfg[key];
600
+ return typeof v === "string" ? v : void 0;
601
+ }
602
+ function numberField(cfg, key, fallback, location = key) {
603
+ const v = cfg[key];
604
+ if (typeof v === "number" && Number.isFinite(v)) return v;
605
+ if (typeof v === "string" && VERIFY_PLACEHOLDER_PATTERN.test(v)) {
606
+ throw new LLMCapabilityCompileError(
607
+ `${location} contains a [VERIFY] placeholder where a verified number is required. Numeric routing and pricing fields must be reconciled before emission (F.014 / W.GOLD.341).`
608
+ );
609
+ }
610
+ return fallback;
611
+ }
612
+ function boolField(cfg, key, fallback) {
613
+ const v = cfg[key];
614
+ return typeof v === "boolean" ? v : fallback;
615
+ }
616
+ function stringListField(cfg, key) {
617
+ const v = cfg[key];
618
+ if (!Array.isArray(v)) return [];
619
+ return v.filter((x) => typeof x === "string");
620
+ }
621
+ function extractCapabilityValue(v) {
622
+ if (typeof v === "boolean") return v;
623
+ if (typeof v === "number" && Number.isFinite(v)) return v;
624
+ if (typeof v === "string") return v;
625
+ return false;
626
+ }
627
+ function formatTokens(n) {
628
+ if (n === 0) return "*(unverified)*";
629
+ if (n >= 1e6) return `${n / 1e6}M`;
630
+ if (n >= 1e3) return `${n / 1e3}K`;
631
+ return String(n);
632
+ }
633
+ function formatCapabilityValue(v) {
634
+ if (typeof v === "boolean") return v ? "YES" : "no";
635
+ return String(v);
636
+ }
637
+ function toProviderConstName(providerName) {
638
+ const normalized = providerName.trim().replace(/[^A-Za-z0-9]+/g, "_").replace(/^_+|_+$/g, "").toUpperCase();
639
+ return normalized || "UNKNOWN_PROVIDER";
640
+ }
641
+ function tsStringLiteral(value) {
642
+ return `'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
643
+ }
644
+ function formatNumberLiteral(value) {
645
+ return Number.isFinite(value) ? String(value) : "0";
646
+ }
647
+ function buildAdapterCapabilities(models, capabilities) {
648
+ const byName = /* @__PURE__ */ new Map();
649
+ for (const capability of capabilities) {
650
+ byName.set(capability.name, capability);
651
+ }
652
+ const entries = /* @__PURE__ */ new Map();
653
+ entries.set("contextWindow", numericCapability(byName, "contextWindow") ?? maxModelNumber(models, "contextWindow"));
654
+ entries.set("maxOutput", numericCapability(byName, "maxOutput") ?? maxModelNumber(models, "maxOutput"));
655
+ const costPerMillion = uniformCostPerMillion(models);
656
+ if (costPerMillion) {
657
+ entries.set("costPerMillion", costPerMillion);
658
+ }
659
+ entries.set("streaming", booleanCapability(byName, "streaming") ?? true);
660
+ entries.set("tools", booleanCapability(byName, "tools") ?? true);
661
+ const highResVision = booleanCapability(byName, "highResVision");
662
+ entries.set("vision", booleanCapability(byName, "vision") ?? highResVision ?? false);
663
+ for (const field of ADAPTER_OPTIONAL_BOOLEAN_FIELDS) {
664
+ const value = booleanCapability(byName, field);
665
+ if (value !== void 0) {
666
+ entries.set(field, value);
667
+ }
668
+ }
669
+ entries.set("bearerTokenAccess", booleanCapability(byName, "bearerTokenAccess") ?? true);
670
+ return entries;
671
+ }
672
+ function numericCapability(byName, field) {
673
+ const value = byName.get(field)?.value;
674
+ return typeof value === "number" && Number.isFinite(value) ? value : void 0;
675
+ }
676
+ function booleanCapability(byName, field) {
677
+ const value = byName.get(field)?.value;
678
+ return typeof value === "boolean" ? value : void 0;
679
+ }
680
+ function maxModelNumber(models, field) {
681
+ return Math.max(0, ...models.map((model) => model[field]).filter(Number.isFinite));
682
+ }
683
+ function uniformCostPerMillion(models) {
684
+ const pricedModels = models.filter(
685
+ (model) => Number.isFinite(model.inputPerMTok) && Number.isFinite(model.outputPerMTok) && (model.inputPerMTok > 0 || model.outputPerMTok > 0)
686
+ );
687
+ if (pricedModels.length === 0) return void 0;
688
+ const first = pricedModels[0];
689
+ const allSame = pricedModels.every(
690
+ (model) => model.inputPerMTok === first.inputPerMTok && model.outputPerMTok === first.outputPerMTok
691
+ );
692
+ return allSame ? { input: first.inputPerMTok, output: first.outputPerMTok } : void 0;
693
+ }
694
+ function formatTsCapabilityValue(value) {
695
+ if (value === void 0) return "undefined";
696
+ if (typeof value === "boolean") return String(value);
697
+ if (typeof value === "number") return formatTsNumber(value);
698
+ if (typeof value === "string") return tsStringLiteral(value);
699
+ return `{ input: ${formatTsNumber(value.input)}, output: ${formatTsNumber(value.output)} }`;
700
+ }
701
+ function formatTsNumber(value) {
702
+ if (!Number.isFinite(value)) return "0";
703
+ if (!Number.isInteger(value) || Math.abs(value) < 1e3) return String(value);
704
+ const sign = value < 0 ? "-" : "";
705
+ return sign + Math.abs(value).toString().replace(/\B(?=(\d{3})+(?!\d))/g, "_");
706
+ }
707
+ function capabilityValueMap(capabilities, capabilityColumns) {
708
+ const byName = /* @__PURE__ */ new Map();
709
+ for (const capability of capabilities) {
710
+ byName.set(capability.name, capability);
711
+ }
712
+ return Object.fromEntries(
713
+ capabilityColumns.map((column) => [column, byName.get(column)?.value ?? null])
714
+ );
715
+ }
716
+ function daysBetween(earlier, later) {
717
+ const e = Date.parse(earlier);
718
+ const l = Date.parse(later);
719
+ if (!Number.isFinite(e) || !Number.isFinite(l)) return null;
720
+ return Math.floor((l - e) / (1e3 * 60 * 60 * 24));
721
+ }
722
+
723
+ export { LLMCapabilityCompileError, LLMProviderCapabilitiesCompiler, createLLMProviderCapabilitiesCompiler };
724
+ //# sourceMappingURL=chunk-DAJXW4KX.js.map
725
+ //# sourceMappingURL=chunk-DAJXW4KX.js.map