@holoscript/core 7.0.0 → 8.0.0

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 (345) hide show
  1. package/README.md +2 -2
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-276GE64O.js +16 -0
  4. package/dist/GLTFPipeline-M7WSSJED.cjs +37 -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-3URVTKPJ.js +10 -0
  10. package/dist/HoloScriptRuntime-SXEAEU2N.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-23J755AR.js +1046 -0
  17. package/dist/chunk-253GBQZY.cjs +627 -0
  18. package/dist/chunk-25IQCHTO.cjs +781 -0
  19. package/dist/chunk-2BSMSUCE.js +1941 -0
  20. package/dist/chunk-2M2DPHKB.js +762 -0
  21. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  22. package/dist/chunk-3AO425MZ.cjs +886 -0
  23. package/dist/chunk-3FOKASKO.cjs +348 -0
  24. package/dist/chunk-3HYYMEXI.cjs +56578 -0
  25. package/dist/chunk-3NFFOWGG.js +4287 -0
  26. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  27. package/dist/chunk-4C57PR42.js +468 -0
  28. package/dist/chunk-4N4SXXWF.js +769 -0
  29. package/dist/chunk-4PDEPEQW.cjs +41 -0
  30. package/dist/chunk-4R6SBXDB.js +45 -0
  31. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  32. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  33. package/dist/chunk-5GLCTO44.js +161 -0
  34. package/dist/chunk-5JEU52DW.js +382 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-62FBK3B7.js +70 -0
  38. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  39. package/dist/chunk-6DPSFNJB.cjs +847 -0
  40. package/dist/chunk-6EX3I5P4.cjs +130 -0
  41. package/dist/chunk-73FELZVJ.cjs +611 -0
  42. package/dist/chunk-7CUEMLDZ.cjs +6445 -0
  43. package/dist/chunk-7HIASF7S.cjs +814 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-AIA52I7T.cjs +543 -0
  46. package/dist/chunk-ANXZFVY2.js +113 -0
  47. package/dist/chunk-AYBXB26F.js +2176 -0
  48. package/dist/chunk-B4TFTDG4.js +449 -0
  49. package/dist/chunk-BE4UJCQT.js +623 -0
  50. package/dist/chunk-BRQJKJGT.cjs +20 -0
  51. package/dist/chunk-C2A5DUMF.cjs +689 -0
  52. package/dist/chunk-C37BHB7N.cjs +636 -0
  53. package/dist/chunk-CBJY23VL.js +126 -0
  54. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  55. package/dist/chunk-CXFDRBQU.cjs +672 -0
  56. package/dist/chunk-D54CNIAJ.cjs +413 -0
  57. package/dist/chunk-DAJXW4KX.js +725 -0
  58. package/dist/chunk-DTGBOSEM.cjs +319 -0
  59. package/dist/chunk-E7JP3BS3.cjs +61 -0
  60. package/dist/chunk-EKBKLK7P.js +1169 -0
  61. package/dist/chunk-EKYL4PE3.cjs +404 -0
  62. package/dist/chunk-EUDQTK7N.cjs +4310 -0
  63. package/dist/chunk-EXKSFGSX.cjs +274 -0
  64. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  65. package/dist/chunk-F43YAA34.js +623 -0
  66. package/dist/chunk-FDSGHPAK.js +130 -0
  67. package/dist/chunk-FEWUHQNM.cjs +144 -0
  68. package/dist/chunk-FGGJQRLZ.js +270 -0
  69. package/dist/chunk-FHP6LXJS.js +415 -0
  70. package/dist/chunk-FJPADH77.cjs +666 -0
  71. package/dist/chunk-FYSPZT4V.cjs +169 -0
  72. package/dist/chunk-GIOYPNTH.js +5575 -0
  73. package/dist/chunk-GJNCFRJU.cjs +125 -0
  74. package/dist/chunk-GMP623FG.cjs +1508 -0
  75. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  76. package/dist/chunk-GQT4TYKY.cjs +4381 -0
  77. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  78. package/dist/chunk-GYZE55MO.js +2007 -0
  79. package/dist/chunk-GZG4KA4E.js +529 -0
  80. package/dist/chunk-H652NHX5.js +600 -0
  81. package/dist/chunk-HCCQLAA4.cjs +74 -0
  82. package/dist/chunk-HINXWAOD.cjs +1049 -0
  83. package/dist/chunk-HYNTS5CP.js +422 -0
  84. package/dist/chunk-HZSPDCXV.cjs +457 -0
  85. package/dist/chunk-HZTDET3N.js +1399 -0
  86. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  87. package/dist/chunk-ILRBGFVD.cjs +72 -0
  88. package/dist/chunk-IPWSXCCN.js +1183 -0
  89. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  90. package/dist/chunk-IVSZDECV.js +882 -0
  91. package/dist/chunk-IVY74O6C.js +247 -0
  92. package/dist/chunk-IZM5VQZD.js +714 -0
  93. package/dist/chunk-J32ZJZJH.js +554 -0
  94. package/dist/chunk-J6M4FPK5.js +421 -0
  95. package/dist/chunk-JC5YBPSF.cjs +984 -0
  96. package/dist/chunk-JCLBKPMX.js +3813 -0
  97. package/dist/chunk-JD7CIZ33.js +1949 -0
  98. package/dist/chunk-JIYN45TV.cjs +2525 -0
  99. package/dist/chunk-JJBE3TIH.cjs +1189 -0
  100. package/dist/chunk-JX7YL6ZE.js +2252 -0
  101. package/dist/chunk-K4VVR7CN.cjs +2433 -0
  102. package/dist/chunk-KEFNV2WM.cjs +2257 -0
  103. package/dist/chunk-KH4CNH66.cjs +424 -0
  104. package/dist/chunk-KJLB4OPV.js +5731 -0
  105. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  106. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  107. package/dist/chunk-KPJL34Y7.cjs +186 -0
  108. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  109. package/dist/chunk-KVRSTFNH.cjs +72 -0
  110. package/dist/chunk-LICPB5HZ.cjs +1409 -0
  111. package/dist/chunk-LM2VU56C.cjs +37 -0
  112. package/dist/chunk-M56JSP4A.js +400 -0
  113. package/dist/chunk-MBOOR7X4.js +18 -0
  114. package/dist/chunk-MGE5Z4GS.js +608 -0
  115. package/dist/chunk-MXFUTKCO.js +56 -0
  116. package/dist/chunk-MYY4PMWX.cjs +264 -0
  117. package/dist/chunk-N75IH2HY.js +258 -0
  118. package/dist/chunk-NBMHU6SW.js +669 -0
  119. package/dist/chunk-NG77ATEW.cjs +778 -0
  120. package/dist/chunk-NGKREZ36.js +6384 -0
  121. package/dist/chunk-NHWSN2SD.cjs +718 -0
  122. package/dist/chunk-NV4VMVXU.js +421 -0
  123. package/dist/chunk-NW5G5FBQ.js +215 -0
  124. package/dist/chunk-NXZFOPVD.cjs +5737 -0
  125. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  126. package/dist/chunk-OIQYIIO3.cjs +473 -0
  127. package/dist/chunk-OL46QLBJ.js +61 -0
  128. package/dist/chunk-OMXII44L.js +5386 -0
  129. package/dist/chunk-OR4Q2BGL.cjs +759 -0
  130. package/dist/chunk-OSYNRVOV.cjs +243 -0
  131. package/dist/chunk-PGANYCAG.cjs +220 -0
  132. package/dist/chunk-PHENW4MQ.js +65 -0
  133. package/dist/chunk-PHVRG4I2.js +844 -0
  134. package/dist/chunk-Q56TT7IL.js +483 -0
  135. package/dist/chunk-QPOQ7VPI.js +1491 -0
  136. package/dist/chunk-QPSKHBJP.js +5963 -0
  137. package/dist/chunk-QXH7QDSZ.js +1989 -0
  138. package/dist/chunk-R75BSDH7.cjs +50 -0
  139. package/dist/chunk-RARB3MBR.js +207 -0
  140. package/dist/chunk-RVBHAXFG.js +56160 -0
  141. package/dist/chunk-S3MDHNKB.cjs +490 -0
  142. package/dist/chunk-S4W6Z2MN.js +2426 -0
  143. package/dist/chunk-S6YWHCKV.cjs +410 -0
  144. package/dist/chunk-SIEXCILW.js +229 -0
  145. package/dist/chunk-SJBGLS25.cjs +2196 -0
  146. package/dist/chunk-SLU6UPJI.cjs +410 -0
  147. package/dist/chunk-SMIWS6DE.cjs +212 -0
  148. package/dist/chunk-T2QCTZMO.js +811 -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-U44IKGG7.cjs +5390 -0
  156. package/dist/chunk-UJXISJBN.js +487 -0
  157. package/dist/chunk-UM6C3CGK.js +4375 -0
  158. package/dist/chunk-UMABK6SI.js +686 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-V6MKC2FZ.js +979 -0
  162. package/dist/chunk-VECQYRXL.js +474 -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-W7VDOASB.cjs +639 -0
  168. package/dist/chunk-WDT3JTGM.cjs +483 -0
  169. package/dist/chunk-WJIHFLMJ.js +404 -0
  170. package/dist/chunk-WKX5AMOY.js +309 -0
  171. package/dist/chunk-WNNE3PO3.js +34 -0
  172. package/dist/chunk-WRKUDAZJ.js +3038 -0
  173. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  174. package/dist/chunk-WRNEH5MO.js +3169 -0
  175. package/dist/chunk-WRWEX5ZF.js +658 -0
  176. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  177. package/dist/chunk-XHIV6326.cjs +793 -0
  178. package/dist/chunk-XIVIE43A.cjs +729 -0
  179. package/dist/chunk-XJAN7CZG.cjs +432 -0
  180. package/dist/chunk-XKTPFXGA.js +164 -0
  181. package/dist/chunk-XL6INWKT.js +121 -0
  182. package/dist/chunk-XSFNHP2E.js +632 -0
  183. package/dist/chunk-XT6JY5W5.js +9684 -0
  184. package/dist/chunk-XUILI4KB.cjs +430 -0
  185. package/dist/chunk-XUUVDHIF.cjs +3962 -0
  186. package/dist/chunk-YF2I3MV3.js +46 -0
  187. package/dist/chunk-YIMN575O.js +4847 -0
  188. package/dist/chunk-YIVFJNYV.js +176 -0
  189. package/dist/chunk-YKGPCZEE.cjs +237 -0
  190. package/dist/chunk-YN6V7R3L.cjs +327 -0
  191. package/dist/chunk-YQELFNJV.js +39 -0
  192. package/dist/chunk-YYXH45E2.js +426 -0
  193. package/dist/chunk-ZBQXLH2L.js +756 -0
  194. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  195. package/dist/chunk-ZU7NIRT6.js +325 -0
  196. package/dist/chunk-ZZ7RO2UQ.js +1243 -0
  197. package/dist/chunk-ZZEI7MV4.js +778 -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 +605 -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 +5860 -0
  230. package/dist/compiler/index.d.ts +322 -21
  231. package/dist/compiler/index.js +5525 -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.js +4 -0
  241. package/dist/compiler/openxr.cjs +19 -0
  242. package/dist/compiler/openxr.js +13 -0
  243. package/dist/compiler/playcanvas.cjs +19 -0
  244. package/dist/compiler/playcanvas.js +13 -0
  245. package/dist/compiler/r3f.cjs +38 -0
  246. package/dist/compiler/r3f.d.ts +22 -0
  247. package/dist/compiler/r3f.js +16 -0
  248. package/dist/compiler/remotion.cjs +23 -0
  249. package/dist/compiler/remotion.js +4 -0
  250. package/dist/compiler/reproducibility.cjs +39 -0
  251. package/dist/compiler/reproducibility.js +4 -0
  252. package/dist/compiler/sdf.cjs +24 -0
  253. package/dist/compiler/sdf.js +12 -0
  254. package/dist/compiler/semantic-scene.cjs +31 -0
  255. package/dist/compiler/semantic-scene.js +4 -0
  256. package/dist/compiler/state.cjs +21 -0
  257. package/dist/compiler/state.js +11 -0
  258. package/dist/compiler/trait-composition.cjs +30 -0
  259. package/dist/compiler/trait-composition.js +9 -0
  260. package/dist/compiler/unity.cjs +19 -0
  261. package/dist/compiler/unity.js +13 -0
  262. package/dist/compiler/unreal.cjs +23 -0
  263. package/dist/compiler/unreal.js +13 -0
  264. package/dist/compiler/urdf.cjs +52 -0
  265. package/dist/compiler/urdf.js +12 -0
  266. package/dist/compiler/usd-physics.cjs +26 -0
  267. package/dist/compiler/usd-physics.js +9 -0
  268. package/dist/compiler/visionos.cjs +19 -0
  269. package/dist/compiler/visionos.js +13 -0
  270. package/dist/compiler/vrchat.cjs +22 -0
  271. package/dist/compiler/vrchat.js +12 -0
  272. package/dist/compiler/vrr.cjs +24 -0
  273. package/dist/compiler/vrr.js +12 -0
  274. package/dist/compiler/wasm.cjs +36 -0
  275. package/dist/compiler/wasm.js +12 -0
  276. package/dist/compiler/webgpu.cjs +18 -0
  277. package/dist/compiler/webgpu.js +12 -0
  278. package/dist/coordinators/index.cjs +1266 -0
  279. package/dist/coordinators/index.d.ts +72 -1
  280. package/dist/coordinators/index.js +1259 -0
  281. package/dist/debugger.cjs +24 -0
  282. package/dist/debugger.js +11 -0
  283. package/dist/entries/interop.cjs +64 -0
  284. package/dist/entries/interop.js +7 -0
  285. package/dist/entries/scripting.cjs +55 -0
  286. package/dist/entries/scripting.js +10 -0
  287. package/dist/hololand/index.cjs +146 -0
  288. package/dist/hololand/index.d.ts +70 -0
  289. package/dist/hololand/index.js +5 -0
  290. package/dist/index.cjs +43233 -0
  291. package/dist/index.d.ts +976 -21
  292. package/dist/index.js +39995 -0
  293. package/dist/math/tropical-spmv.cjs +45 -0
  294. package/dist/math/tropical-spmv.js +4 -0
  295. package/dist/math/vec3.cjs +57 -0
  296. package/dist/math/vec3.js +4 -0
  297. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  298. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  299. package/dist/paper-0c-spike/index.cjs +150 -0
  300. package/dist/paper-0c-spike/index.js +141 -0
  301. package/dist/parser.cjs +61 -0
  302. package/dist/parser.d.ts +11 -0
  303. package/dist/parser.js +12 -0
  304. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  305. package/dist/playwright-VZPDVUEQ.js +98660 -0
  306. package/dist/reconstruction/index.cjs +153 -0
  307. package/dist/reconstruction/index.d.ts +29 -2
  308. package/dist/reconstruction/index.js +8 -0
  309. package/dist/runtime.cjs +316 -0
  310. package/dist/runtime.d.ts +61 -0
  311. package/dist/runtime.js +31 -0
  312. package/dist/self-improvement/index.cjs +563 -0
  313. package/dist/self-improvement/index.js +545 -0
  314. package/dist/storage/index.cjs +38 -0
  315. package/dist/storage/index.js +5 -0
  316. package/dist/testing.cjs +25 -0
  317. package/dist/testing.d.ts +70 -0
  318. package/dist/testing.js +4 -0
  319. package/dist/traitDocs/traitDocs.cjs +33 -0
  320. package/dist/traitDocs/traitDocs.js +7 -0
  321. package/dist/traits/botanical-lotus.cjs +41 -0
  322. package/dist/traits/botanical-lotus.d.ts +172 -0
  323. package/dist/traits/botanical-lotus.js +4 -0
  324. package/dist/traits/engines/index.cjs +520 -0
  325. package/dist/traits/engines/index.js +380 -0
  326. package/dist/traits/index.cjs +24409 -0
  327. package/dist/traits/index.d.ts +171 -35
  328. package/dist/traits/index.js +21634 -0
  329. package/dist/traits/simulation-solver-factory.cjs +13 -0
  330. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  331. package/dist/traits/simulation-solver-factory.js +4 -0
  332. package/dist/traits/webcam-gaze.cjs +35 -0
  333. package/dist/traits/webcam-gaze.d.ts +17 -0
  334. package/dist/traits/webcam-gaze.js +4 -0
  335. package/dist/type-checker.cjs +19 -0
  336. package/dist/type-checker.js +6 -0
  337. package/dist/world/index.cjs +947 -0
  338. package/dist/world/index.d.ts +147 -0
  339. package/dist/world/index.js +939 -0
  340. package/dist/world-model/index.cjs +1446 -0
  341. package/dist/world-model/index.d.ts +119 -0
  342. package/dist/world-model/index.js +1414 -0
  343. package/dist/wot/index.cjs +29 -0
  344. package/dist/wot/index.js +4 -0
  345. package/package.json +93 -49
@@ -0,0 +1,984 @@
1
+ 'use strict';
2
+
3
+ var chunkKKP7JKN4_cjs = require('./chunk-KKP7JKN4.cjs');
4
+ var ans = require('@holoscript/core-types/ans');
5
+
6
+ // src/compiler/AgentInferenceExportTarget.ts
7
+ chunkKKP7JKN4_cjs.init_CompilerBase();
8
+ var DEFAULT_MODEL_CONFIG = {
9
+ provider: "anthropic",
10
+ // Default to Opus 4.7 — most capable Claude. Users override per-agent via
11
+ // the `@model` trait. NEVER silently downgrade for cost (per API skill rule).
12
+ name: "claude-opus-4-7",
13
+ temperature: 0.7,
14
+ maxTokens: 16e3,
15
+ // bumped from 4096 — current API default guidance
16
+ topP: 0.9,
17
+ topK: 40,
18
+ systemPrompt: "You are a helpful AI agent."
19
+ };
20
+ var ANTHROPIC_MODELS_NO_SAMPLING_PARAMS = /* @__PURE__ */ new Set(["claude-opus-4-7"]);
21
+ function modelAcceptsSamplingParams(modelName) {
22
+ return !ANTHROPIC_MODELS_NO_SAMPLING_PARAMS.has(modelName);
23
+ }
24
+ var AGENT_TRAIT_NAMES = /* @__PURE__ */ new Set([
25
+ "agent",
26
+ "model",
27
+ "inference",
28
+ "system_prompt",
29
+ "prompt",
30
+ "temperature",
31
+ "max_tokens",
32
+ "top_p",
33
+ "top_k",
34
+ "tool",
35
+ "tool_use",
36
+ "reasoning",
37
+ "memory",
38
+ "persona"
39
+ ]);
40
+ var AgentInferenceCompiler = class extends chunkKKP7JKN4_cjs.CompilerBase {
41
+ constructor(options = {}) {
42
+ super();
43
+ this.compilerName = "AgentInferenceCompiler";
44
+ this.agents = [];
45
+ this.warnings = [];
46
+ this.options = {
47
+ language: options.language ?? "typescript",
48
+ defaultProvider: options.defaultProvider ?? "anthropic",
49
+ defaultModel: options.defaultModel ?? "claude-sonnet-4-6",
50
+ defaultTemperature: options.defaultTemperature ?? 0.7,
51
+ defaultMaxTokens: options.defaultMaxTokens ?? 4096,
52
+ includeTypes: options.includeTypes ?? true,
53
+ includeReadme: options.includeReadme ?? true,
54
+ includeEnvTemplate: options.includeEnvTemplate ?? true
55
+ };
56
+ }
57
+ getRequiredCapability() {
58
+ return ans.ANSCapabilityPath.AGENT_INFERENCE;
59
+ }
60
+ /**
61
+ * Compile a HoloScript composition to runnable agent inference scripts.
62
+ *
63
+ * Extracts agent definitions from objects with @agent/@model/@tool traits,
64
+ * NPCs, dialogue trees, state machines, and domain blocks, then generates
65
+ * a complete multi-file agent project.
66
+ */
67
+ compile(composition, agentToken, outputPath) {
68
+ this.validateCompilerAccess(agentToken, outputPath);
69
+ this.agents = [];
70
+ this.warnings = [];
71
+ this.extractAgentsFromObjects(composition);
72
+ this.extractAgentsFromNPCs(composition);
73
+ this.extractAgentsFromDomainBlocks(composition);
74
+ if (this.agents.length === 0) {
75
+ this.agents.push(this.createDefaultAgent(composition));
76
+ this.warnings.push(
77
+ "No @agent traits found in composition. Created default agent from composition name."
78
+ );
79
+ }
80
+ const output = {};
81
+ const ext = this.options.language === "typescript" ? "ts" : "py";
82
+ output[`agent.${ext}`] = this.emitAgentScript(composition.name);
83
+ const allTools = this.agents.flatMap((a) => a.tools);
84
+ if (allTools.length > 0) {
85
+ output[`tools.${ext}`] = this.emitToolDefinitions(allTools);
86
+ }
87
+ output["config.json"] = this.emitConfigJson();
88
+ if (this.options.language === "typescript") {
89
+ output["package.json"] = this.emitPackageJson(composition.name);
90
+ if (this.options.includeTypes) {
91
+ output["types.ts"] = this.emitTypeDefinitions();
92
+ }
93
+ } else {
94
+ output["requirements.txt"] = this.emitRequirementsTxt();
95
+ }
96
+ if (this.options.includeEnvTemplate) {
97
+ output[".env.example"] = this.emitEnvTemplate();
98
+ }
99
+ if (this.options.includeReadme) {
100
+ output["README.md"] = this.emitReadme(composition.name);
101
+ }
102
+ return output;
103
+ }
104
+ /** Get extracted agents (for inspection/testing). */
105
+ getAgents() {
106
+ return this.agents;
107
+ }
108
+ /** Get warnings from last compilation. */
109
+ getWarnings() {
110
+ return this.warnings;
111
+ }
112
+ // ─── AST Extraction ─────────────────────────────────────────────────
113
+ extractAgentsFromObjects(composition) {
114
+ for (const obj of composition.objects) {
115
+ if (this.hasAgentTraits(obj)) {
116
+ this.agents.push(this.parseAgentObject(obj));
117
+ }
118
+ if (obj.children) {
119
+ for (const child of obj.children) {
120
+ if (this.hasAgentTraits(child)) {
121
+ this.agents.push(this.parseAgentObject(child));
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ extractAgentsFromNPCs(composition) {
128
+ for (const npc of composition.npcs) {
129
+ this.agents.push(this.parseNPCAsAgent(npc, composition));
130
+ }
131
+ }
132
+ extractAgentsFromDomainBlocks(composition) {
133
+ if (!composition.domainBlocks) return;
134
+ for (const block of composition.domainBlocks) {
135
+ if (this.isAgentDomainBlock(block)) {
136
+ this.agents.push(this.parseDomainBlockAsAgent(block));
137
+ }
138
+ }
139
+ }
140
+ hasAgentTraits(obj) {
141
+ return obj.traits.some((t) => AGENT_TRAIT_NAMES.has(t.name));
142
+ }
143
+ parseAgentObject(obj) {
144
+ const modelConfig = { ...DEFAULT_MODEL_CONFIG };
145
+ modelConfig.provider = this.options.defaultProvider;
146
+ modelConfig.name = this.options.defaultModel;
147
+ modelConfig.temperature = this.options.defaultTemperature;
148
+ modelConfig.maxTokens = this.options.defaultMaxTokens;
149
+ const tools = [];
150
+ const behaviors = [];
151
+ const stateProperties = [];
152
+ let role = "assistant";
153
+ for (const trait of obj.traits) {
154
+ switch (trait.name) {
155
+ case "agent":
156
+ role = this.extractStringValue(trait.config["role"]) ?? role;
157
+ break;
158
+ case "model":
159
+ this.applyModelConfig(trait, modelConfig);
160
+ break;
161
+ case "inference":
162
+ this.applyModelConfig(trait, modelConfig);
163
+ break;
164
+ case "system_prompt":
165
+ case "prompt":
166
+ modelConfig.systemPrompt = this.extractStringValue(trait.config["text"]) ?? this.extractStringValue(trait.config["content"]) ?? modelConfig.systemPrompt;
167
+ break;
168
+ case "temperature":
169
+ modelConfig.temperature = this.extractNumberValue(trait.config["value"]) ?? modelConfig.temperature;
170
+ break;
171
+ case "max_tokens":
172
+ modelConfig.maxTokens = this.extractNumberValue(trait.config["value"]) ?? modelConfig.maxTokens;
173
+ break;
174
+ case "top_p":
175
+ modelConfig.topP = this.extractNumberValue(trait.config["value"]) ?? modelConfig.topP;
176
+ break;
177
+ case "top_k":
178
+ modelConfig.topK = this.extractNumberValue(trait.config["value"]) ?? modelConfig.topK;
179
+ break;
180
+ case "tool":
181
+ case "tool_use":
182
+ tools.push(this.parseToolTrait(trait));
183
+ break;
184
+ case "persona":
185
+ modelConfig.systemPrompt = this.extractStringValue(trait.config["description"]) ?? modelConfig.systemPrompt;
186
+ break;
187
+ }
188
+ }
189
+ if (obj.state) {
190
+ for (const prop of obj.state.properties) {
191
+ stateProperties.push({
192
+ key: prop.key,
193
+ type: typeof prop.value === "number" ? "number" : typeof prop.value === "boolean" ? "boolean" : "string",
194
+ defaultValue: String(prop.value ?? "")
195
+ });
196
+ }
197
+ }
198
+ return {
199
+ name: obj.name,
200
+ role,
201
+ modelConfig,
202
+ tools,
203
+ behaviors,
204
+ stateProperties,
205
+ dialogueHandlers: []
206
+ };
207
+ }
208
+ parseNPCAsAgent(npc, composition) {
209
+ const modelConfig = { ...DEFAULT_MODEL_CONFIG };
210
+ modelConfig.provider = this.options.defaultProvider;
211
+ modelConfig.name = this.options.defaultModel;
212
+ modelConfig.temperature = this.options.defaultTemperature;
213
+ modelConfig.maxTokens = this.options.defaultMaxTokens;
214
+ const npcType = npc.npcType ?? "assistant";
215
+ const npcProps = npc.properties.map((p) => `${p.key}: ${String(p.value)}`).join(", ");
216
+ modelConfig.systemPrompt = `You are a ${npcType} named ${npc.name}. ${npcProps}`;
217
+ const tools = npc.behaviors.map((b) => this.parseBehaviorAsTool(b));
218
+ const behaviors = npc.behaviors.map((b) => ({
219
+ name: b.name,
220
+ trigger: b.trigger,
221
+ actions: b.actions.map((a) => a.actionType),
222
+ priority: b.priority ?? 0
223
+ }));
224
+ const dialogueHandlers = [];
225
+ if (npc.dialogueTree) {
226
+ const dialogue = composition.dialogues.find(
227
+ // @ts-expect-error During migration
228
+ (d) => d.name === npc.dialogueTree
229
+ );
230
+ if (dialogue) {
231
+ dialogueHandlers.push({
232
+ // @ts-expect-error During migration
233
+ id: dialogue.name,
234
+ // @ts-expect-error During migration
235
+ prompt: `Dialogue tree: ${dialogue.name}`,
236
+ // @ts-expect-error During migration
237
+ responses: dialogue.nodes?.map((n) => n.text ?? n.name ?? "") ?? []
238
+ });
239
+ }
240
+ }
241
+ return {
242
+ name: npc.name,
243
+ role: npcType,
244
+ modelConfig,
245
+ tools,
246
+ behaviors,
247
+ stateProperties: [],
248
+ dialogueHandlers
249
+ };
250
+ }
251
+ parseDomainBlockAsAgent(block) {
252
+ const modelConfig = { ...DEFAULT_MODEL_CONFIG };
253
+ modelConfig.provider = this.options.defaultProvider;
254
+ modelConfig.name = this.options.defaultModel;
255
+ const name = block.name ?? block.blockType ?? "DomainAgent";
256
+ const tools = [];
257
+ if (block.objects) {
258
+ for (const obj of block.objects) {
259
+ tools.push({
260
+ name: this.toSnakeCase(obj.name),
261
+ description: `Domain operation: ${obj.name}`,
262
+ // @ts-expect-error During migration
263
+ parameters: obj.properties.map((p) => ({
264
+ name: p.key,
265
+ type: typeof p.value === "number" ? "number" : "string",
266
+ description: `Parameter: ${p.key}`,
267
+ required: true
268
+ })),
269
+ returnType: "unknown",
270
+ source: "domain-block"
271
+ });
272
+ }
273
+ }
274
+ return {
275
+ name,
276
+ role: "domain-specialist",
277
+ modelConfig,
278
+ tools,
279
+ behaviors: [],
280
+ stateProperties: [],
281
+ dialogueHandlers: []
282
+ };
283
+ }
284
+ isAgentDomainBlock(block) {
285
+ const agentBlockTypes = ["agent_block", "inference_block", "ai_block"];
286
+ return agentBlockTypes.includes(block.blockType ?? "");
287
+ }
288
+ parseToolTrait(trait) {
289
+ const name = this.extractStringValue(trait.config["name"]) ?? "unnamed_tool";
290
+ const description = this.extractStringValue(trait.config["description"]) ?? "";
291
+ const parameters = [];
292
+ const paramsValue = trait.config["parameters"];
293
+ if (Array.isArray(paramsValue)) {
294
+ for (const param of paramsValue) {
295
+ if (param && typeof param === "object" && !Array.isArray(param)) {
296
+ const paramObj = param;
297
+ parameters.push({
298
+ name: this.extractStringValue(paramObj["name"]) ?? "param",
299
+ type: this.extractStringValue(paramObj["type"]) ?? "string",
300
+ description: this.extractStringValue(paramObj["description"]) ?? "",
301
+ required: paramObj["required"] === true,
302
+ defaultValue: paramObj["default"] != null ? String(paramObj["default"]) : void 0
303
+ });
304
+ }
305
+ }
306
+ }
307
+ return {
308
+ name,
309
+ description,
310
+ parameters,
311
+ returnType: this.extractStringValue(trait.config["returns"]) ?? "string",
312
+ source: "trait"
313
+ };
314
+ }
315
+ parseBehaviorAsTool(behavior) {
316
+ return {
317
+ name: this.toSnakeCase(behavior.name),
318
+ description: `Behavior: ${behavior.name} (triggered by: ${behavior.trigger})`,
319
+ parameters: behavior.actions.map((a) => ({
320
+ name: a.actionType,
321
+ type: "string",
322
+ description: `Action: ${a.actionType}`,
323
+ required: false
324
+ })),
325
+ returnType: "void",
326
+ source: "behavior"
327
+ };
328
+ }
329
+ createDefaultAgent(composition) {
330
+ return {
331
+ name: composition.name,
332
+ role: "assistant",
333
+ modelConfig: {
334
+ ...DEFAULT_MODEL_CONFIG,
335
+ provider: this.options.defaultProvider,
336
+ name: this.options.defaultModel,
337
+ temperature: this.options.defaultTemperature,
338
+ maxTokens: this.options.defaultMaxTokens,
339
+ systemPrompt: `You are an AI agent for ${composition.name}.`
340
+ },
341
+ tools: [],
342
+ behaviors: [],
343
+ stateProperties: [],
344
+ dialogueHandlers: []
345
+ };
346
+ }
347
+ applyModelConfig(trait, config) {
348
+ const provider = this.extractStringValue(trait.config["provider"]);
349
+ if (provider && this.isModelProvider(provider)) {
350
+ config.provider = provider;
351
+ }
352
+ config.name = this.extractStringValue(trait.config["name"]) ?? config.name;
353
+ config.temperature = this.extractNumberValue(trait.config["temperature"]) ?? config.temperature;
354
+ config.maxTokens = this.extractNumberValue(trait.config["max_tokens"]) ?? this.extractNumberValue(trait.config["maxTokens"]) ?? config.maxTokens;
355
+ config.topP = this.extractNumberValue(trait.config["top_p"]) ?? config.topP;
356
+ config.topK = this.extractNumberValue(trait.config["top_k"]) ?? config.topK;
357
+ const systemPrompt = this.extractStringValue(trait.config["system_prompt"]);
358
+ if (systemPrompt) {
359
+ config.systemPrompt = systemPrompt;
360
+ }
361
+ }
362
+ // ─── Code Generation (TypeScript) ───────────────────────────────────
363
+ emitAgentScript(compositionName) {
364
+ if (this.options.language === "python") {
365
+ return this.emitAgentScriptPython(compositionName);
366
+ }
367
+ return this.emitAgentScriptTypeScript(compositionName);
368
+ }
369
+ emitAgentScriptTypeScript(compositionName) {
370
+ const lines = [];
371
+ lines.push("/**");
372
+ lines.push(` * ${compositionName} \u2014 Agent Inference Script`);
373
+ lines.push(" * Generated by HoloScript AgentInferenceCompiler");
374
+ lines.push(" */");
375
+ lines.push("");
376
+ lines.push("import Anthropic from '@anthropic-ai/sdk';");
377
+ lines.push("import { tools, type ToolName, executeToolCall } from './tools';");
378
+ lines.push("import config from './config.json';");
379
+ if (this.options.includeTypes) {
380
+ lines.push("import type { AgentConfig, AgentState, Message } from './types';");
381
+ }
382
+ lines.push("");
383
+ for (const agent of this.agents) {
384
+ lines.push(`// \u2500\u2500\u2500 ${agent.name} \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`);
385
+ lines.push("");
386
+ lines.push(`export class ${this.toPascalCase(agent.name)}Agent {`);
387
+ lines.push(" private client: Anthropic;");
388
+ lines.push(" private messages: Anthropic.MessageParam[] = [];");
389
+ lines.push(` private systemPrompt: string;`);
390
+ lines.push("");
391
+ if (agent.stateProperties.length > 0) {
392
+ lines.push(" // Agent state");
393
+ for (const prop of agent.stateProperties) {
394
+ const tsType = prop.type === "number" ? "number" : prop.type === "boolean" ? "boolean" : "string";
395
+ lines.push(` private ${prop.key}: ${tsType} = ${JSON.stringify(prop.defaultValue)};`);
396
+ }
397
+ lines.push("");
398
+ }
399
+ lines.push(" constructor(apiKey?: string) {");
400
+ lines.push(
401
+ " this.client = new Anthropic({ apiKey: apiKey ?? process.env['ANTHROPIC_API_KEY'] });"
402
+ );
403
+ lines.push(` this.systemPrompt = ${JSON.stringify(agent.modelConfig.systemPrompt)};`);
404
+ lines.push(" }");
405
+ lines.push("");
406
+ lines.push(" async run(userMessage: string): Promise<string> {");
407
+ lines.push(" this.messages.push({ role: 'user', content: userMessage });");
408
+ lines.push("");
409
+ lines.push(" const response = await this.client.messages.create({");
410
+ lines.push(` model: ${JSON.stringify(agent.modelConfig.name)},`);
411
+ lines.push(` max_tokens: ${agent.modelConfig.maxTokens},`);
412
+ if (modelAcceptsSamplingParams(agent.modelConfig.name)) {
413
+ lines.push(` temperature: ${agent.modelConfig.temperature},`);
414
+ lines.push(` top_p: ${agent.modelConfig.topP},`);
415
+ }
416
+ lines.push(" system: this.systemPrompt,");
417
+ lines.push(" messages: this.messages,");
418
+ if (agent.tools.length > 0) {
419
+ lines.push(" tools,");
420
+ }
421
+ lines.push(" });");
422
+ lines.push("");
423
+ if (agent.tools.length > 0) {
424
+ lines.push(" // Handle tool use loop");
425
+ lines.push(" let currentResponse = response;");
426
+ lines.push(" while (currentResponse.stop_reason === 'tool_use') {");
427
+ lines.push(" const toolUseBlocks = currentResponse.content.filter(");
428
+ lines.push(" (block): block is Anthropic.ToolUseBlock => block.type === 'tool_use'");
429
+ lines.push(" );");
430
+ lines.push("");
431
+ lines.push(" const toolResults: Anthropic.ToolResultBlockParam[] = [];");
432
+ lines.push(" for (const toolUse of toolUseBlocks) {");
433
+ lines.push(" const result = await executeToolCall(");
434
+ lines.push(" toolUse.name as ToolName,");
435
+ lines.push(" toolUse.input as Record<string, unknown>");
436
+ lines.push(" );");
437
+ lines.push(" toolResults.push({");
438
+ lines.push(" type: 'tool_result',");
439
+ lines.push(" tool_use_id: toolUse.id,");
440
+ lines.push(
441
+ " content: typeof result === 'string' ? result : JSON.stringify(result),"
442
+ );
443
+ lines.push(" });");
444
+ lines.push(" }");
445
+ lines.push("");
446
+ lines.push(
447
+ " this.messages.push({ role: 'assistant', content: currentResponse.content });"
448
+ );
449
+ lines.push(" this.messages.push({ role: 'user', content: toolResults });");
450
+ lines.push("");
451
+ lines.push(" currentResponse = await this.client.messages.create({");
452
+ lines.push(` model: ${JSON.stringify(agent.modelConfig.name)},`);
453
+ lines.push(` max_tokens: ${agent.modelConfig.maxTokens},`);
454
+ if (modelAcceptsSamplingParams(agent.modelConfig.name)) {
455
+ lines.push(` temperature: ${agent.modelConfig.temperature},`);
456
+ }
457
+ lines.push(" system: this.systemPrompt,");
458
+ lines.push(" messages: this.messages,");
459
+ lines.push(" tools,");
460
+ lines.push(" });");
461
+ lines.push(" }");
462
+ lines.push("");
463
+ lines.push(
464
+ " this.messages.push({ role: 'assistant', content: currentResponse.content });"
465
+ );
466
+ lines.push(" const textBlocks = currentResponse.content.filter(");
467
+ lines.push(" (block): block is Anthropic.TextBlock => block.type === 'text'");
468
+ lines.push(" );");
469
+ lines.push(" return textBlocks.map((b) => b.text).join('\\n');");
470
+ } else {
471
+ lines.push(" this.messages.push({ role: 'assistant', content: response.content });");
472
+ lines.push(" const textBlocks = response.content.filter(");
473
+ lines.push(" (block): block is Anthropic.TextBlock => block.type === 'text'");
474
+ lines.push(" );");
475
+ lines.push(" return textBlocks.map((b) => b.text).join('\\n');");
476
+ }
477
+ lines.push(" }");
478
+ lines.push("");
479
+ lines.push(" reset(): void {");
480
+ lines.push(" this.messages = [];");
481
+ lines.push(" }");
482
+ lines.push("}");
483
+ lines.push("");
484
+ }
485
+ lines.push("// \u2500\u2500\u2500 Main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
486
+ lines.push("");
487
+ const primaryAgent = this.agents[0];
488
+ lines.push("async function main(): Promise<void> {");
489
+ lines.push(` const agent = new ${this.toPascalCase(primaryAgent.name)}Agent();`);
490
+ lines.push("");
491
+ lines.push(" // Interactive loop (stdin/stdout)");
492
+ lines.push(" const readline = await import('readline');");
493
+ lines.push(" const rl = readline.createInterface({");
494
+ lines.push(" input: process.stdin,");
495
+ lines.push(" output: process.stdout,");
496
+ lines.push(" });");
497
+ lines.push("");
498
+ lines.push(
499
+ ` console.log('${this.escapeStringValue(compositionName, "TypeScript")} agent ready. Type a message or "quit" to exit.');`
500
+ );
501
+ lines.push("");
502
+ lines.push(" const ask = (): void => {");
503
+ lines.push(" rl.question('> ', async (input: string) => {");
504
+ lines.push(" if (input.trim().toLowerCase() === 'quit') {");
505
+ lines.push(" rl.close();");
506
+ lines.push(" return;");
507
+ lines.push(" }");
508
+ lines.push(" try {");
509
+ lines.push(" const response = await agent.run(input);");
510
+ lines.push(" console.log(response);");
511
+ lines.push(" } catch (err) {");
512
+ lines.push(" console.error('Error:', err);");
513
+ lines.push(" }");
514
+ lines.push(" ask();");
515
+ lines.push(" });");
516
+ lines.push(" };");
517
+ lines.push(" ask();");
518
+ lines.push("}");
519
+ lines.push("");
520
+ lines.push("main().catch(console.error);");
521
+ return lines.join("\n");
522
+ }
523
+ // ─── Code Generation (Python) ───────────────────────────────────────
524
+ emitAgentScriptPython(compositionName) {
525
+ const lines = [];
526
+ lines.push('"""');
527
+ lines.push(`${compositionName} \u2014 Agent Inference Script`);
528
+ lines.push("Generated by HoloScript AgentInferenceCompiler");
529
+ lines.push('"""');
530
+ lines.push("");
531
+ lines.push("import os");
532
+ lines.push("import json");
533
+ lines.push("import anthropic");
534
+ lines.push("from tools import TOOLS, execute_tool_call");
535
+ lines.push("");
536
+ for (const agent of this.agents) {
537
+ const className = this.toPascalCase(agent.name);
538
+ lines.push("");
539
+ lines.push(`class ${className}Agent:`);
540
+ lines.push(` """${agent.role} agent."""`);
541
+ lines.push("");
542
+ lines.push(" def __init__(self, api_key: str | None = None):");
543
+ lines.push(" self.client = anthropic.Anthropic(");
544
+ lines.push(" api_key=api_key or os.environ.get('ANTHROPIC_API_KEY')");
545
+ lines.push(" )");
546
+ lines.push(` self.system_prompt = ${JSON.stringify(agent.modelConfig.systemPrompt)}`);
547
+ lines.push(" self.messages: list[dict] = []");
548
+ for (const prop of agent.stateProperties) {
549
+ lines.push(` self.${prop.key} = ${JSON.stringify(prop.defaultValue)}`);
550
+ }
551
+ lines.push("");
552
+ lines.push(" def run(self, user_message: str) -> str:");
553
+ lines.push(" self.messages.append({'role': 'user', 'content': user_message})");
554
+ lines.push("");
555
+ lines.push(" response = self.client.messages.create(");
556
+ lines.push(` model=${JSON.stringify(agent.modelConfig.name)},`);
557
+ lines.push(` max_tokens=${agent.modelConfig.maxTokens},`);
558
+ if (modelAcceptsSamplingParams(agent.modelConfig.name)) {
559
+ lines.push(` temperature=${agent.modelConfig.temperature},`);
560
+ }
561
+ lines.push(" system=self.system_prompt,");
562
+ lines.push(" messages=self.messages,");
563
+ if (agent.tools.length > 0) {
564
+ lines.push(" tools=TOOLS,");
565
+ }
566
+ lines.push(" )");
567
+ lines.push("");
568
+ if (agent.tools.length > 0) {
569
+ lines.push(" while response.stop_reason == 'tool_use':");
570
+ lines.push(" tool_results = []");
571
+ lines.push(" for block in response.content:");
572
+ lines.push(" if block.type == 'tool_use':");
573
+ lines.push(" result = execute_tool_call(block.name, block.input)");
574
+ lines.push(" tool_results.append({");
575
+ lines.push(" 'type': 'tool_result',");
576
+ lines.push(" 'tool_use_id': block.id,");
577
+ lines.push(" 'content': str(result),");
578
+ lines.push(" })");
579
+ lines.push("");
580
+ lines.push(
581
+ " self.messages.append({'role': 'assistant', 'content': response.content})"
582
+ );
583
+ lines.push(" self.messages.append({'role': 'user', 'content': tool_results})");
584
+ lines.push("");
585
+ lines.push(" response = self.client.messages.create(");
586
+ lines.push(` model=${JSON.stringify(agent.modelConfig.name)},`);
587
+ lines.push(` max_tokens=${agent.modelConfig.maxTokens},`);
588
+ if (modelAcceptsSamplingParams(agent.modelConfig.name)) {
589
+ lines.push(` temperature=${agent.modelConfig.temperature},`);
590
+ }
591
+ lines.push(" system=self.system_prompt,");
592
+ lines.push(" messages=self.messages,");
593
+ lines.push(" tools=TOOLS,");
594
+ lines.push(" )");
595
+ lines.push("");
596
+ }
597
+ lines.push(
598
+ " self.messages.append({'role': 'assistant', 'content': response.content})"
599
+ );
600
+ lines.push(" text_blocks = [b.text for b in response.content if b.type == 'text']");
601
+ lines.push(" return '\\n'.join(text_blocks)");
602
+ lines.push("");
603
+ lines.push(" def reset(self):");
604
+ lines.push(" self.messages = []");
605
+ lines.push("");
606
+ }
607
+ const primaryAgent = this.agents[0];
608
+ lines.push("");
609
+ lines.push("if __name__ == '__main__':");
610
+ lines.push(` agent = ${this.toPascalCase(primaryAgent.name)}Agent()`);
611
+ lines.push(
612
+ ` print('${this.escapeStringValue(compositionName, "Python")} agent ready. Type a message or "quit" to exit.')`
613
+ );
614
+ lines.push(" while True:");
615
+ lines.push(" user_input = input('> ')");
616
+ lines.push(" if user_input.strip().lower() == 'quit':");
617
+ lines.push(" break");
618
+ lines.push(" try:");
619
+ lines.push(" print(agent.run(user_input))");
620
+ lines.push(" except Exception as e:");
621
+ lines.push(" print(f'Error: {e}')");
622
+ return lines.join("\n");
623
+ }
624
+ // ─── Tool Definitions ───────────────────────────────────────────────
625
+ emitToolDefinitions(allTools) {
626
+ const provider = this.options.defaultProvider ?? DEFAULT_MODEL_CONFIG.provider;
627
+ if (this.options.language === "python") {
628
+ return this.emitToolDefinitionsPython(allTools, provider);
629
+ }
630
+ return this.emitToolDefinitionsTypeScript(allTools, provider);
631
+ }
632
+ emitToolDefinitionsTypeScript(allTools, provider) {
633
+ const lines = [];
634
+ lines.push("/**");
635
+ lines.push(" * Tool definitions for agent inference");
636
+ lines.push(` * Generated by HoloScript AgentInferenceCompiler (target: ${provider})`);
637
+ lines.push(" */");
638
+ lines.push("");
639
+ if (provider === "anthropic") {
640
+ lines.push("import Anthropic from '@anthropic-ai/sdk';");
641
+ }
642
+ lines.push("");
643
+ const toolNames = allTools.map((t) => `'${t.name}'`);
644
+ lines.push(`export type ToolName = ${toolNames.join(" | ")};`);
645
+ lines.push("");
646
+ if (provider === "anthropic") {
647
+ lines.push("export const tools: Anthropic.Tool[] = [");
648
+ for (const tool of allTools) {
649
+ lines.push(" {");
650
+ lines.push(` name: ${JSON.stringify(tool.name)},`);
651
+ lines.push(` description: ${JSON.stringify(tool.description)},`);
652
+ lines.push(" input_schema: {");
653
+ lines.push(" type: 'object' as const,");
654
+ lines.push(" properties: {");
655
+ for (const param of tool.parameters) {
656
+ lines.push(` ${param.name}: {`);
657
+ lines.push(` type: ${JSON.stringify(this.toJsonSchemaType(param.type))},`);
658
+ lines.push(` description: ${JSON.stringify(param.description)},`);
659
+ lines.push(" },");
660
+ }
661
+ lines.push(" },");
662
+ const required = tool.parameters.filter((p) => p.required).map((p) => `'${p.name}'`);
663
+ if (required.length > 0) {
664
+ lines.push(` required: [${required.join(", ")}],`);
665
+ }
666
+ lines.push(" },");
667
+ lines.push(" },");
668
+ }
669
+ lines.push("];");
670
+ } else if (provider === "custom") {
671
+ lines.push("export const tools = [");
672
+ for (const tool of allTools) {
673
+ lines.push(" {");
674
+ lines.push(` name: ${JSON.stringify(tool.name)},`);
675
+ lines.push(` description: ${JSON.stringify(tool.description)},`);
676
+ lines.push(" parameters: {");
677
+ lines.push(" type: 'object' as const,");
678
+ lines.push(" properties: {");
679
+ for (const param of tool.parameters) {
680
+ lines.push(` ${param.name}: {`);
681
+ lines.push(` type: ${JSON.stringify(this.toJsonSchemaType(param.type))},`);
682
+ lines.push(` description: ${JSON.stringify(param.description)},`);
683
+ lines.push(" },");
684
+ }
685
+ lines.push(" },");
686
+ const required = tool.parameters.filter((p) => p.required).map((p) => `'${p.name}'`);
687
+ if (required.length > 0) {
688
+ lines.push(` required: [${required.join(", ")}] as const,`);
689
+ }
690
+ lines.push(" },");
691
+ lines.push(" },");
692
+ }
693
+ lines.push("] as const;");
694
+ } else {
695
+ lines.push("export const tools = [");
696
+ for (const tool of allTools) {
697
+ lines.push(" {");
698
+ lines.push(" type: 'function' as const,");
699
+ lines.push(` name: ${JSON.stringify(tool.name)},`);
700
+ lines.push(` description: ${JSON.stringify(tool.description)},`);
701
+ lines.push(" parameters: {");
702
+ lines.push(" type: 'object' as const,");
703
+ lines.push(" properties: {");
704
+ for (const param of tool.parameters) {
705
+ lines.push(` ${param.name}: {`);
706
+ lines.push(` type: ${JSON.stringify(this.toJsonSchemaType(param.type))},`);
707
+ lines.push(` description: ${JSON.stringify(param.description)},`);
708
+ lines.push(" },");
709
+ }
710
+ lines.push(" },");
711
+ const required = tool.parameters.filter((p) => p.required).map((p) => `'${p.name}'`);
712
+ if (required.length > 0) {
713
+ lines.push(` required: [${required.join(", ")}] as const,`);
714
+ }
715
+ lines.push(" },");
716
+ lines.push(" },");
717
+ }
718
+ lines.push("] as const;");
719
+ }
720
+ lines.push("");
721
+ lines.push("export async function executeToolCall(");
722
+ lines.push(" name: ToolName,");
723
+ lines.push(" input: Record<string, unknown>");
724
+ lines.push("): Promise<unknown> {");
725
+ lines.push(" switch (name) {");
726
+ for (const tool of allTools) {
727
+ lines.push(` case ${JSON.stringify(tool.name)}:`);
728
+ lines.push(` // Stub: ${tool.name} (generated dispatcher)`);
729
+ lines.push(` return \`[${tool.name}] called with: \${JSON.stringify(input)}\`;`);
730
+ }
731
+ lines.push(" default:");
732
+ lines.push(" return `Unknown tool: ${name}`;");
733
+ lines.push(" }");
734
+ lines.push("}");
735
+ return lines.join("\n");
736
+ }
737
+ emitToolDefinitionsPython(allTools, provider) {
738
+ const lines = [];
739
+ lines.push('"""');
740
+ lines.push("Tool definitions for agent inference");
741
+ lines.push(`Generated by HoloScript AgentInferenceCompiler (target: ${provider})`);
742
+ lines.push('"""');
743
+ lines.push("");
744
+ lines.push("");
745
+ lines.push("TOOLS = [");
746
+ for (const tool of allTools) {
747
+ lines.push(" {");
748
+ if (provider !== "anthropic" && provider !== "custom") {
749
+ lines.push(' "type": "function",');
750
+ }
751
+ lines.push(` "name": ${JSON.stringify(tool.name)},`);
752
+ lines.push(` "description": ${JSON.stringify(tool.description)},`);
753
+ const paramKey = provider === "anthropic" ? "input_schema" : "parameters";
754
+ lines.push(` ${JSON.stringify(paramKey)}: {`);
755
+ lines.push(' "type": "object",');
756
+ lines.push(' "properties": {');
757
+ for (const param of tool.parameters) {
758
+ lines.push(` ${JSON.stringify(param.name)}: {`);
759
+ lines.push(
760
+ ` "type": ${JSON.stringify(this.toJsonSchemaType(param.type))},`
761
+ );
762
+ lines.push(` "description": ${JSON.stringify(param.description)},`);
763
+ lines.push(" },");
764
+ }
765
+ lines.push(" },");
766
+ const required = tool.parameters.filter((p) => p.required).map((p) => JSON.stringify(p.name));
767
+ if (required.length > 0) {
768
+ lines.push(` "required": [${required.join(", ")}],`);
769
+ }
770
+ lines.push(" },");
771
+ lines.push(" },");
772
+ }
773
+ lines.push("]");
774
+ lines.push("");
775
+ lines.push("");
776
+ lines.push("def execute_tool_call(name: str, tool_input: dict) -> str:");
777
+ for (const tool of allTools) {
778
+ lines.push(` if name == ${JSON.stringify(tool.name)}:`);
779
+ lines.push(` # Stub: ${tool.name} (generated dispatcher)`);
780
+ lines.push(` return f"[${tool.name}] called with: {tool_input}"`);
781
+ }
782
+ lines.push(` return f"Unknown tool: {name}"`);
783
+ return lines.join("\n");
784
+ }
785
+ // ─── Config & Package Files ─────────────────────────────────────────
786
+ emitConfigJson() {
787
+ const configs = this.agents.map((a) => ({
788
+ name: a.name,
789
+ role: a.role,
790
+ model: {
791
+ provider: a.modelConfig.provider,
792
+ name: a.modelConfig.name,
793
+ temperature: a.modelConfig.temperature,
794
+ max_tokens: a.modelConfig.maxTokens,
795
+ top_p: a.modelConfig.topP,
796
+ top_k: a.modelConfig.topK
797
+ },
798
+ system_prompt: a.modelConfig.systemPrompt,
799
+ tools: a.tools.map((t) => t.name)
800
+ }));
801
+ return JSON.stringify({ agents: configs }, null, 2);
802
+ }
803
+ emitPackageJson(compositionName) {
804
+ const pkg = {
805
+ name: this.toKebabCase(compositionName) + "-agent",
806
+ version: "1.0.0",
807
+ description: `Agent inference script for ${compositionName}`,
808
+ type: "module",
809
+ scripts: {
810
+ start: "tsx agent.ts",
811
+ build: "tsc"
812
+ },
813
+ dependencies: {
814
+ // Floor bumped to support adaptive thinking, output_config.effort,
815
+ // and Opus 4.7 sampling-param removal. Keep in sync with
816
+ // packages/llm-provider/package.json to avoid split versions.
817
+ "@anthropic-ai/sdk": "^0.88.0"
818
+ },
819
+ devDependencies: {
820
+ tsx: "^4.0.0",
821
+ typescript: "^5.5.0",
822
+ "@types/node": "^20.0.0"
823
+ }
824
+ };
825
+ const providers = new Set(this.agents.map((a) => a.modelConfig.provider));
826
+ if (providers.has("openai")) {
827
+ pkg.dependencies = { ...pkg.dependencies, openai: "^4.0.0" };
828
+ }
829
+ return JSON.stringify(pkg, null, 2);
830
+ }
831
+ emitRequirementsTxt() {
832
+ const deps = ["anthropic>=0.39.0"];
833
+ const providers = new Set(this.agents.map((a) => a.modelConfig.provider));
834
+ if (providers.has("openai")) {
835
+ deps.push("openai>=1.0.0");
836
+ }
837
+ return deps.join("\n") + "\n";
838
+ }
839
+ emitEnvTemplate() {
840
+ const lines = [];
841
+ lines.push("# Agent API Keys");
842
+ const providers = new Set(this.agents.map((a) => a.modelConfig.provider));
843
+ if (providers.has("anthropic")) {
844
+ lines.push("ANTHROPIC_API_KEY=sk-ant-...");
845
+ }
846
+ if (providers.has("openai")) {
847
+ lines.push("OPENAI_API_KEY=sk-...");
848
+ }
849
+ if (providers.has("ollama")) {
850
+ lines.push("OLLAMA_HOST=http://localhost:11434");
851
+ }
852
+ return lines.join("\n") + "\n";
853
+ }
854
+ emitTypeDefinitions() {
855
+ return `/**
856
+ * Type definitions for agent inference
857
+ * Generated by HoloScript AgentInferenceCompiler
858
+ */
859
+
860
+ export interface AgentConfig {
861
+ name: string;
862
+ role: string;
863
+ model: {
864
+ provider: string;
865
+ name: string;
866
+ temperature: number;
867
+ max_tokens: number;
868
+ top_p: number;
869
+ top_k: number;
870
+ };
871
+ system_prompt: string;
872
+ tools: string[];
873
+ }
874
+
875
+ export interface AgentState {
876
+ [key: string]: string | number | boolean;
877
+ }
878
+
879
+ export interface Message {
880
+ role: 'user' | 'assistant';
881
+ content: string;
882
+ }
883
+
884
+ export interface ToolResult {
885
+ tool_use_id: string;
886
+ content: string;
887
+ }
888
+ `;
889
+ }
890
+ emitReadme(compositionName) {
891
+ this.options.language === "typescript" ? "ts" : "py";
892
+ const lines = [];
893
+ lines.push(`# ${compositionName} Agent`);
894
+ lines.push("");
895
+ lines.push("Generated by HoloScript AgentInferenceCompiler.");
896
+ lines.push("");
897
+ lines.push("## Setup");
898
+ lines.push("");
899
+ if (this.options.language === "typescript") {
900
+ lines.push("```bash");
901
+ lines.push("npm install");
902
+ lines.push("cp .env.example .env");
903
+ lines.push("# Edit .env with your API key");
904
+ lines.push("npm start");
905
+ lines.push("```");
906
+ } else {
907
+ lines.push("```bash");
908
+ lines.push("pip install -r requirements.txt");
909
+ lines.push("cp .env.example .env");
910
+ lines.push("# Edit .env with your API key");
911
+ lines.push(`python agent.py`);
912
+ lines.push("```");
913
+ }
914
+ lines.push("");
915
+ lines.push("## Agents");
916
+ lines.push("");
917
+ for (const agent of this.agents) {
918
+ lines.push(`### ${agent.name}`);
919
+ lines.push(`- **Role**: ${agent.role}`);
920
+ lines.push(`- **Model**: ${agent.modelConfig.name}`);
921
+ lines.push(
922
+ `- **Tools**: ${agent.tools.length > 0 ? agent.tools.map((t) => t.name).join(", ") : "none"}`
923
+ );
924
+ lines.push("");
925
+ }
926
+ return lines.join("\n");
927
+ }
928
+ // ─── Helpers ────────────────────────────────────────────────────────
929
+ extractStringValue(value) {
930
+ if (typeof value === "string") return value;
931
+ return null;
932
+ }
933
+ extractNumberValue(value) {
934
+ if (typeof value === "number") return value;
935
+ return null;
936
+ }
937
+ isModelProvider(value) {
938
+ return ["anthropic", "openai", "local", "ollama", "custom"].includes(value);
939
+ }
940
+ toJsonSchemaType(type) {
941
+ switch (type.toLowerCase()) {
942
+ case "number":
943
+ case "float":
944
+ case "int":
945
+ case "integer":
946
+ return "number";
947
+ case "boolean":
948
+ case "bool":
949
+ return "boolean";
950
+ case "array":
951
+ case "list":
952
+ return "array";
953
+ case "object":
954
+ case "dict":
955
+ case "map":
956
+ return "object";
957
+ default:
958
+ return "string";
959
+ }
960
+ }
961
+ toPascalCase(name) {
962
+ return name.replace(/[^a-zA-Z0-9]+(.)/g, (_, c) => c.toUpperCase()).replace(/^(.)/, (_, c) => c.toUpperCase());
963
+ }
964
+ toSnakeCase(name) {
965
+ return name.replace(/([A-Z])/g, "_$1").replace(/[^a-zA-Z0-9]+/g, "_").replace(/^_/, "").toLowerCase();
966
+ }
967
+ toKebabCase(name) {
968
+ return name.replace(/([A-Z])/g, "-$1").replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-/, "").toLowerCase();
969
+ }
970
+ };
971
+ function createAgentInferenceCompiler(options) {
972
+ return new AgentInferenceCompiler(options);
973
+ }
974
+ function createPythonAgentInferenceCompiler(options) {
975
+ return new AgentInferenceCompiler({ ...options, language: "python" });
976
+ }
977
+ var AgentInferenceExportTarget_default = AgentInferenceCompiler;
978
+
979
+ exports.AgentInferenceCompiler = AgentInferenceCompiler;
980
+ exports.AgentInferenceExportTarget_default = AgentInferenceExportTarget_default;
981
+ exports.createAgentInferenceCompiler = createAgentInferenceCompiler;
982
+ exports.createPythonAgentInferenceCompiler = createPythonAgentInferenceCompiler;
983
+ //# sourceMappingURL=chunk-JC5YBPSF.cjs.map
984
+ //# sourceMappingURL=chunk-JC5YBPSF.cjs.map