@skaile/workspaces 6.5.0 → 6.7.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 (392) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/ai-sdk.js +12 -19
  3. package/dist/ai-sdk.js.map +1 -1
  4. package/dist/app-sdk/index.js +1 -1
  5. package/dist/{asset-feeds-4I6Z4OI3.js → asset-feeds-4A7PJ4OB.js} +20 -20
  6. package/dist/{asset-feeds-4I6Z4OI3.js.map → asset-feeds-4A7PJ4OB.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +7 -7
  8. package/dist/asset-manager/index.js +12 -12
  9. package/dist/asset-manager/installer.js +8 -8
  10. package/dist/asset-manager/renderers.js +7 -7
  11. package/dist/asset-manager/src/index.d.ts +89 -15
  12. package/dist/asset-manager/src/index.d.ts.map +1 -1
  13. package/dist/asset-manager/src/install-agent.d.ts +22 -1
  14. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  15. package/dist/asset-manager/src/install-instances.d.ts +30 -1
  16. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  17. package/dist/asset-manager/src/installer.d.ts +12 -0
  18. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  19. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  20. package/dist/bridge/harnesses/claude-sdk.js +23 -17
  21. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  22. package/dist/bridge/harnesses/codex.js +12 -11
  23. package/dist/bridge/harnesses/codex.js.map +1 -1
  24. package/dist/bridge/harnesses/continue.js +13 -11
  25. package/dist/bridge/harnesses/continue.js.map +1 -1
  26. package/dist/bridge/harnesses/echo.js +6 -5
  27. package/dist/bridge/harnesses/echo.js.map +1 -1
  28. package/dist/bridge/harnesses/gemini.js +9 -7
  29. package/dist/bridge/harnesses/goose.js +13 -11
  30. package/dist/bridge/harnesses/goose.js.map +1 -1
  31. package/dist/bridge/harnesses/omp.js +10 -8
  32. package/dist/bridge/harnesses/omp.js.map +1 -1
  33. package/dist/bridge/harnesses/opencode.js +13 -11
  34. package/dist/bridge/harnesses/opencode.js.map +1 -1
  35. package/dist/bridge/harnesses/qwen.js +10 -8
  36. package/dist/bridge/harnesses/qwen.js.map +1 -1
  37. package/dist/bridge/index.js +19 -17
  38. package/dist/bridge/src/ai-sdk.d.ts.map +1 -1
  39. package/dist/bridge/src/claude-sdk-surface.d.ts +2 -1
  40. package/dist/bridge/src/claude-sdk-surface.d.ts.map +1 -1
  41. package/dist/bridge/src/harness-binaries.d.ts +21 -0
  42. package/dist/bridge/src/harness-binaries.d.ts.map +1 -0
  43. package/dist/bridge/src/harness-model-check.d.ts +22 -6
  44. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  45. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  46. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  47. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  48. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  49. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -1
  50. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  51. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  52. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  53. package/dist/bridge/src/index.d.ts +2 -1
  54. package/dist/bridge/src/index.d.ts.map +1 -1
  55. package/dist/{chunk-UZET67SO.js → chunk-237BMOZW.js} +4 -4
  56. package/dist/{chunk-UZET67SO.js.map → chunk-237BMOZW.js.map} +1 -1
  57. package/dist/{chunk-J5JWLKLB.js → chunk-37AYPPOO.js} +41 -19
  58. package/dist/chunk-37AYPPOO.js.map +1 -0
  59. package/dist/{chunk-3KSLUVKB.js → chunk-37X4A6VZ.js} +7 -7
  60. package/dist/{chunk-3KSLUVKB.js.map → chunk-37X4A6VZ.js.map} +1 -1
  61. package/dist/{chunk-EO7KGX6P.js → chunk-3HSLJAMJ.js} +4 -4
  62. package/dist/{chunk-EO7KGX6P.js.map → chunk-3HSLJAMJ.js.map} +1 -1
  63. package/dist/{chunk-AFTZNR2W.js → chunk-3W6XZQ2Y.js} +3 -3
  64. package/dist/{chunk-AFTZNR2W.js.map → chunk-3W6XZQ2Y.js.map} +1 -1
  65. package/dist/{chunk-SZTHSPRC.js → chunk-4C2E5QUP.js} +4 -3
  66. package/dist/chunk-4C2E5QUP.js.map +1 -0
  67. package/dist/{chunk-T7HGEMNB.js → chunk-4CD2R4MJ.js} +5 -4
  68. package/dist/chunk-4CD2R4MJ.js.map +1 -0
  69. package/dist/{chunk-TNQLDEM6.js → chunk-6RPS7JEH.js} +302 -54
  70. package/dist/chunk-6RPS7JEH.js.map +1 -0
  71. package/dist/{chunk-NSIOBKDX.js → chunk-6UP2EDFN.js} +4 -313
  72. package/dist/chunk-6UP2EDFN.js.map +1 -0
  73. package/dist/{chunk-KUADKMNX.js → chunk-72TLO2AG.js} +4 -4
  74. package/dist/{chunk-KUADKMNX.js.map → chunk-72TLO2AG.js.map} +1 -1
  75. package/dist/{chunk-HPA3RP5E.js → chunk-AO57IFME.js} +3 -3
  76. package/dist/{chunk-HPA3RP5E.js.map → chunk-AO57IFME.js.map} +1 -1
  77. package/dist/{chunk-G5SYFFMD.js → chunk-ASBZOTEO.js} +2 -2
  78. package/dist/{chunk-G5SYFFMD.js.map → chunk-ASBZOTEO.js.map} +1 -1
  79. package/dist/{chunk-YBEJCQE5.js → chunk-BB5EJLKZ.js} +3 -3
  80. package/dist/{chunk-YBEJCQE5.js.map → chunk-BB5EJLKZ.js.map} +1 -1
  81. package/dist/{chunk-LE6QS4PG.js → chunk-BKLDBUQA.js} +3 -3
  82. package/dist/{chunk-LE6QS4PG.js.map → chunk-BKLDBUQA.js.map} +1 -1
  83. package/dist/{chunk-HTGTNN2B.js → chunk-CMXDFTA2.js} +3 -3
  84. package/dist/{chunk-HTGTNN2B.js.map → chunk-CMXDFTA2.js.map} +1 -1
  85. package/dist/{chunk-J6YPKMMY.js → chunk-CTRTFMCX.js} +6 -6
  86. package/dist/{chunk-J6YPKMMY.js.map → chunk-CTRTFMCX.js.map} +1 -1
  87. package/dist/{chunk-ETF6Q3R3.js → chunk-DFP476EU.js} +8 -4
  88. package/dist/chunk-DFP476EU.js.map +1 -0
  89. package/dist/{chunk-TGUMN5G7.js → chunk-G44FFUMA.js} +13 -11
  90. package/dist/chunk-G44FFUMA.js.map +1 -0
  91. package/dist/{chunk-G4NCSYWR.js → chunk-G7NMF5WQ.js} +4 -4
  92. package/dist/{chunk-G4NCSYWR.js.map → chunk-G7NMF5WQ.js.map} +1 -1
  93. package/dist/{chunk-KA2GLAPS.js → chunk-GAIMSCZ7.js} +10 -8
  94. package/dist/chunk-GAIMSCZ7.js.map +1 -0
  95. package/dist/{chunk-AVFRFGM2.js → chunk-GNUA7XT2.js} +3 -2
  96. package/dist/chunk-GNUA7XT2.js.map +1 -0
  97. package/dist/{chunk-6Y3SC7O4.js → chunk-GTAHU4N4.js} +4 -4
  98. package/dist/{chunk-6Y3SC7O4.js.map → chunk-GTAHU4N4.js.map} +1 -1
  99. package/dist/{chunk-7H4GTP7V.js → chunk-HLAEYFUN.js} +3 -3
  100. package/dist/{chunk-7H4GTP7V.js.map → chunk-HLAEYFUN.js.map} +1 -1
  101. package/dist/{chunk-B436SG5P.js → chunk-HMVAGPYR.js} +48 -12
  102. package/dist/chunk-HMVAGPYR.js.map +1 -0
  103. package/dist/{chunk-EN5REMWV.js → chunk-HPXONAI2.js} +7 -5
  104. package/dist/chunk-HPXONAI2.js.map +1 -0
  105. package/dist/{chunk-KYNCY3F3.js → chunk-HQAPUPBE.js} +3 -3
  106. package/dist/{chunk-KYNCY3F3.js.map → chunk-HQAPUPBE.js.map} +1 -1
  107. package/dist/{chunk-USVUS4DJ.js → chunk-IRK3LNG3.js} +7 -7
  108. package/dist/{chunk-USVUS4DJ.js.map → chunk-IRK3LNG3.js.map} +1 -1
  109. package/dist/{chunk-7EMS2GZO.js → chunk-J7VEQORJ.js} +70 -17
  110. package/dist/chunk-J7VEQORJ.js.map +1 -0
  111. package/dist/{chunk-2HS357RA.js → chunk-KO3VSZQP.js} +48 -19
  112. package/dist/chunk-KO3VSZQP.js.map +1 -0
  113. package/dist/{chunk-KSH5CFQS.js → chunk-KORDNXKA.js} +3 -3
  114. package/dist/{chunk-KSH5CFQS.js.map → chunk-KORDNXKA.js.map} +1 -1
  115. package/dist/{chunk-Z2X7UZEZ.js → chunk-L3JQJ6D5.js} +6 -6
  116. package/dist/{chunk-Z2X7UZEZ.js.map → chunk-L3JQJ6D5.js.map} +1 -1
  117. package/dist/{chunk-OBZ5WQ32.js → chunk-L7QOZG5V.js} +3 -3
  118. package/dist/{chunk-OBZ5WQ32.js.map → chunk-L7QOZG5V.js.map} +1 -1
  119. package/dist/{chunk-B4BLJUYN.js → chunk-LX4TTTRR.js} +79 -36
  120. package/dist/chunk-LX4TTTRR.js.map +1 -0
  121. package/dist/{chunk-KSUT5KAE.js → chunk-LZPJOF7Y.js} +3 -3
  122. package/dist/{chunk-KSUT5KAE.js.map → chunk-LZPJOF7Y.js.map} +1 -1
  123. package/dist/{chunk-OLHHN3NO.js → chunk-N6ZGB5ES.js} +4 -3
  124. package/dist/chunk-N6ZGB5ES.js.map +1 -0
  125. package/dist/{chunk-2M3VLKT2.js → chunk-NURTGAWM.js} +3 -3
  126. package/dist/{chunk-2M3VLKT2.js.map → chunk-NURTGAWM.js.map} +1 -1
  127. package/dist/{chunk-22ZX33H6.js → chunk-O5Y7VMVQ.js} +16 -15
  128. package/dist/chunk-O5Y7VMVQ.js.map +1 -0
  129. package/dist/{chunk-IWKKTCXY.js → chunk-O7ADRMCR.js} +67 -16
  130. package/dist/chunk-O7ADRMCR.js.map +1 -0
  131. package/dist/{chunk-SRTWKZP2.js → chunk-OGTQUEAO.js} +21 -14
  132. package/dist/chunk-OGTQUEAO.js.map +1 -0
  133. package/dist/{chunk-U6KRTCNA.js → chunk-OSABUEWA.js} +3 -3
  134. package/dist/{chunk-U6KRTCNA.js.map → chunk-OSABUEWA.js.map} +1 -1
  135. package/dist/{chunk-E6UWI3TP.js → chunk-PLLZSKOO.js} +3 -3
  136. package/dist/{chunk-E6UWI3TP.js.map → chunk-PLLZSKOO.js.map} +1 -1
  137. package/dist/{chunk-W5KCAWGN.js → chunk-PTJTOPE5.js} +3 -3
  138. package/dist/{chunk-W5KCAWGN.js.map → chunk-PTJTOPE5.js.map} +1 -1
  139. package/dist/{chunk-TROEC2Z2.js → chunk-Q2NYTMT6.js} +18 -17
  140. package/dist/chunk-Q2NYTMT6.js.map +1 -0
  141. package/dist/{chunk-23SG4JRV.js → chunk-QC5BYUED.js} +52 -16
  142. package/dist/chunk-QC5BYUED.js.map +1 -0
  143. package/dist/{chunk-WFLQMAR5.js → chunk-QCR5AE5E.js} +5 -5
  144. package/dist/{chunk-WFLQMAR5.js.map → chunk-QCR5AE5E.js.map} +1 -1
  145. package/dist/{chunk-THX5EE3K.js → chunk-QW5B3TEO.js} +10 -4
  146. package/dist/chunk-QW5B3TEO.js.map +1 -0
  147. package/dist/{chunk-TDPQOR3C.js → chunk-RAHAZ7LP.js} +2 -2
  148. package/dist/{chunk-TDPQOR3C.js.map → chunk-RAHAZ7LP.js.map} +1 -1
  149. package/dist/{chunk-ZUU2PLA3.js → chunk-SBNUXJ6E.js} +3 -3
  150. package/dist/{chunk-ZUU2PLA3.js.map → chunk-SBNUXJ6E.js.map} +1 -1
  151. package/dist/{chunk-DKXNKFKP.js → chunk-SGI5MRKP.js} +75 -3
  152. package/dist/chunk-SGI5MRKP.js.map +1 -0
  153. package/dist/{chunk-UMLCKKIA.js → chunk-TMJBEGS4.js} +36 -7
  154. package/dist/chunk-TMJBEGS4.js.map +1 -0
  155. package/dist/{chunk-K4DHYTUM.js → chunk-TXX3OUYI.js} +3 -3
  156. package/dist/{chunk-K4DHYTUM.js.map → chunk-TXX3OUYI.js.map} +1 -1
  157. package/dist/{chunk-SN663FCA.js → chunk-U52FYGK5.js} +5 -5
  158. package/dist/{chunk-SN663FCA.js.map → chunk-U52FYGK5.js.map} +1 -1
  159. package/dist/{chunk-S7DVT2BV.js → chunk-UCB7FK25.js} +10 -8
  160. package/dist/chunk-UCB7FK25.js.map +1 -0
  161. package/dist/{chunk-3DA74PLW.js → chunk-USSP43U3.js} +3 -3
  162. package/dist/{chunk-3DA74PLW.js.map → chunk-USSP43U3.js.map} +1 -1
  163. package/dist/{chunk-X44XKBZX.js → chunk-WFK4MUBL.js} +21 -7
  164. package/dist/chunk-WFK4MUBL.js.map +1 -0
  165. package/dist/{chunk-YRC2EFOU.js → chunk-WIYVR24B.js} +4 -4
  166. package/dist/{chunk-YRC2EFOU.js.map → chunk-WIYVR24B.js.map} +1 -1
  167. package/dist/{chunk-6EKQENAP.js → chunk-WKENHNDM.js} +6 -6
  168. package/dist/{chunk-6EKQENAP.js.map → chunk-WKENHNDM.js.map} +1 -1
  169. package/dist/chunk-WWSRIT3J.js +59 -0
  170. package/dist/chunk-WWSRIT3J.js.map +1 -0
  171. package/dist/chunk-XON6ODIC.js +315 -0
  172. package/dist/chunk-XON6ODIC.js.map +1 -0
  173. package/dist/{chunk-2IAWVUW3.js → chunk-ZBA4P5TD.js} +4 -4
  174. package/dist/{chunk-2IAWVUW3.js.map → chunk-ZBA4P5TD.js.map} +1 -1
  175. package/dist/{chunk-IS3NIZBX.js → chunk-ZDTDS62B.js} +596 -127
  176. package/dist/chunk-ZDTDS62B.js.map +1 -0
  177. package/dist/{chunk-DNXPXJ3X.js → chunk-ZM4SDVUV.js} +79 -20
  178. package/dist/chunk-ZM4SDVUV.js.map +1 -0
  179. package/dist/{claude-code-JY6CYEG7.js → claude-code-BLFRZU2X.js} +5 -5
  180. package/dist/{claude-code-JY6CYEG7.js.map → claude-code-BLFRZU2X.js.map} +1 -1
  181. package/dist/cli/index.js +481 -205
  182. package/dist/cli/index.js.map +1 -1
  183. package/dist/cli/src/agent-pins.d.ts +9 -3
  184. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  185. package/dist/cli/src/commands/asset-cmd.d.ts +1 -1
  186. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  187. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  188. package/dist/cli/src/commands/catalog.d.ts +2 -0
  189. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  190. package/dist/cli/src/commands/config.d.ts.map +1 -1
  191. package/dist/cli/src/commands/harness-preflight.d.ts +38 -0
  192. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -0
  193. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  194. package/dist/cli/src/commands/library-index.d.ts +16 -0
  195. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  196. package/dist/cli/src/commands/migrate-assets.d.ts +5 -0
  197. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  198. package/dist/cli/src/commands/migrate-harness.d.ts +15 -7
  199. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  200. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  201. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  202. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  203. package/dist/cli/src/commands/project.d.ts +14 -0
  204. package/dist/cli/src/commands/project.d.ts.map +1 -1
  205. package/dist/cli/src/commands/run.d.ts.map +1 -1
  206. package/dist/cli/src/commands/serve-preflight.d.ts +6 -5
  207. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  208. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  209. package/dist/cli/src/commands/session.d.ts.map +1 -1
  210. package/dist/cli/src/commands/source.d.ts +11 -0
  211. package/dist/cli/src/commands/source.d.ts.map +1 -1
  212. package/dist/cli/src/commands/update.d.ts.map +1 -1
  213. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  214. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  215. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  216. package/dist/cli/src/commands/why.d.ts.map +1 -1
  217. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  218. package/dist/cli/src/session-hint.d.ts +7 -0
  219. package/dist/cli/src/session-hint.d.ts.map +1 -0
  220. package/dist/connectors/config.js +4 -4
  221. package/dist/connectors/index.js +23 -21
  222. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  223. package/dist/connectors/src/managed-gitconfig.d.ts +6 -4
  224. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  225. package/dist/connectors/src/mount-ledger.d.ts.map +1 -1
  226. package/dist/{connectors-VLFOQNS6.js → connectors-OJJU4LSN.js} +26 -24
  227. package/dist/{connectors-VLFOQNS6.js.map → connectors-OJJU4LSN.js.map} +1 -1
  228. package/dist/connectors-shared/index.js +2 -2
  229. package/dist/core/index.js +6 -6
  230. package/dist/core/logging.js +1 -1
  231. package/dist/core/manifest.js +1 -1
  232. package/dist/core/publish-manifest.js +2 -2
  233. package/dist/core/runtime-assets.js +4 -4
  234. package/dist/core/src/agent-instances.d.ts +11 -0
  235. package/dist/core/src/agent-instances.d.ts.map +1 -1
  236. package/dist/core/src/index.d.ts +3 -2
  237. package/dist/core/src/index.d.ts.map +1 -1
  238. package/dist/core/src/logging/index.d.ts +1 -0
  239. package/dist/core/src/logging/index.d.ts.map +1 -1
  240. package/dist/core/src/logging/log-safe-text.d.ts +20 -0
  241. package/dist/core/src/logging/log-safe-text.d.ts.map +1 -0
  242. package/dist/core/src/manifest.d.ts.map +1 -1
  243. package/dist/core/src/publish-manifest.d.ts +20 -6
  244. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  245. package/dist/core/src/repo-manager.d.ts +9 -0
  246. package/dist/core/src/repo-manager.d.ts.map +1 -1
  247. package/dist/core/src/run-state-ignore.d.ts +17 -0
  248. package/dist/core/src/run-state-ignore.d.ts.map +1 -0
  249. package/dist/core/src/workspace-config.d.ts +6 -0
  250. package/dist/core/src/workspace-config.d.ts.map +1 -1
  251. package/dist/core/workspace-config.js +3 -3
  252. package/dist/deploy/index.js +6 -6
  253. package/dist/discovery/index.js +3 -3
  254. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  255. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  256. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  257. package/dist/{ensure-sources-6O54DUQB.js → ensure-sources-F6VQDCWY.js} +28 -26
  258. package/dist/ensure-sources-F6VQDCWY.js.map +1 -0
  259. package/dist/factory-assets/connectors/box.js +23 -21
  260. package/dist/factory-assets/connectors/deploy.js +23 -21
  261. package/dist/factory-assets/connectors/devserver.js +23 -21
  262. package/dist/factory-assets/connectors/flow/adapter.js +23 -21
  263. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +2 -0
  264. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -1
  265. package/dist/factory-assets/connectors/flow/engine.js +7 -7
  266. package/dist/factory-assets/connectors/flow/run-flow.js +25 -23
  267. package/dist/factory-assets/connectors/flow.js +23 -21
  268. package/dist/factory-assets/connectors/git/CONNECTOR.md +4 -1
  269. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  270. package/dist/factory-assets/connectors/git.js +23 -21
  271. package/dist/factory-assets/connectors/gmail.js +23 -21
  272. package/dist/factory-assets/connectors/googledrive.js +23 -21
  273. package/dist/factory-assets/connectors/local.js +23 -21
  274. package/dist/factory-assets/connectors/mattermost.js +23 -21
  275. package/dist/factory-assets/connectors/memory.js +23 -21
  276. package/dist/factory-assets/connectors/minio.js +23 -21
  277. package/dist/factory-assets/connectors/postgres.js +23 -21
  278. package/dist/factory-assets/connectors/s3.js +23 -21
  279. package/dist/factory-assets/connectors/sharepoint.js +23 -21
  280. package/dist/factory-assets/connectors/sqlite.js +23 -21
  281. package/dist/factory-assets/connectors/static-server.js +23 -21
  282. package/dist/factory-assets/connectors/tunnel.js +23 -21
  283. package/dist/factory-assets/connectors/webdav.js +23 -21
  284. package/dist/factory-assets/connectors/xstate-store.js +23 -21
  285. package/dist/factory-assets/connectors/xstate.js +23 -21
  286. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +14 -1
  287. package/dist/{flows-CIUPK7SB.js → flows-I6ODIPZZ.js} +11 -11
  288. package/dist/{flows-CIUPK7SB.js.map → flows-I6ODIPZZ.js.map} +1 -1
  289. package/dist/{helpers-YHDQHQEQ.js → helpers-PJNUTZXZ.js} +28 -26
  290. package/dist/{helpers-YHDQHQEQ.js.map → helpers-PJNUTZXZ.js.map} +1 -1
  291. package/dist/library/index.js +9 -9
  292. package/dist/library/install.js +3 -3
  293. package/dist/library/src/manifest-writer.d.ts +5 -0
  294. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  295. package/dist/{library-publish-MUGUST43.js → library-publish-FNNDWVBO.js} +54 -52
  296. package/dist/library-publish-FNNDWVBO.js.map +1 -0
  297. package/dist/model-endpoint/index.js +10 -9
  298. package/dist/open-library-R5EZROFN.js +59 -0
  299. package/dist/{open-library-BVQCB37E.js.map → open-library-R5EZROFN.js.map} +1 -1
  300. package/dist/{open-registry-JCSIAKEC.js → open-registry-RZW2AFD6.js} +13 -13
  301. package/dist/{open-registry-JCSIAKEC.js.map → open-registry-RZW2AFD6.js.map} +1 -1
  302. package/dist/{paths-XLKCAFRZ.js → paths-RPK5PNZQ.js} +9 -9
  303. package/dist/{paths-XLKCAFRZ.js.map → paths-RPK5PNZQ.js.map} +1 -1
  304. package/dist/{plugin-store-NGRUTCJI.js → plugin-store-OJTERUEZ.js} +9 -9
  305. package/dist/{plugin-store-NGRUTCJI.js.map → plugin-store-OJTERUEZ.js.map} +1 -1
  306. package/dist/project-S2FT3LLR.js +90 -0
  307. package/dist/{project-BGYMLAS6.js.map → project-S2FT3LLR.js.map} +1 -1
  308. package/dist/resolver/index.js +7 -7
  309. package/dist/runner/index.js +39 -37
  310. package/dist/runner/src/capability-roundtrip.d.ts +6 -6
  311. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  312. package/dist/runner/src/composition/run-snapshot.d.ts +7 -1
  313. package/dist/runner/src/composition/run-snapshot.d.ts.map +1 -1
  314. package/dist/runner/src/external-mcp.d.ts +22 -0
  315. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  316. package/dist/runner/src/mcp-tools-snapshot.d.ts +13 -0
  317. package/dist/runner/src/mcp-tools-snapshot.d.ts.map +1 -0
  318. package/dist/runner/src/resources.d.ts +14 -0
  319. package/dist/runner/src/resources.d.ts.map +1 -1
  320. package/dist/runner/src/serve.d.ts.map +1 -1
  321. package/dist/sdk/asset-manager.js +12 -12
  322. package/dist/sdk/bridge.js +19 -17
  323. package/dist/sdk/core.js +6 -6
  324. package/dist/sdk/flow.js +7 -7
  325. package/dist/sdk/index.js +39 -37
  326. package/dist/sdk/index.js.map +1 -1
  327. package/dist/sdk/resolver.js +7 -7
  328. package/dist/sdk/runner.js +39 -37
  329. package/dist/sdk/session.js +2 -2
  330. package/dist/sdk/transport/ws/server.js +7 -7
  331. package/dist/sdk/transport/ws.js +7 -7
  332. package/dist/sdk/transport.js +7 -7
  333. package/dist/sdk/types.js +1 -1
  334. package/dist/serve-preflight-AADSOUO2.js +58 -0
  335. package/dist/{serve-preflight-GQY5DZX6.js.map → serve-preflight-AADSOUO2.js.map} +1 -1
  336. package/dist/session/index.js +2 -2
  337. package/dist/{setup-2NWSKSCO.js → setup-HOAJHUFQ.js} +29 -27
  338. package/dist/setup-HOAJHUFQ.js.map +1 -0
  339. package/dist/{skills-PXZOL2FZ.js → skills-KHHW3RZ3.js} +12 -12
  340. package/dist/{skills-PXZOL2FZ.js.map → skills-KHHW3RZ3.js.map} +1 -1
  341. package/dist/source-FOELFCY6.js +88 -0
  342. package/dist/{source-XA3L4H6I.js.map → source-FOELFCY6.js.map} +1 -1
  343. package/dist/{source-manifest-publish-QEGMTS33.js → source-manifest-publish-Q7P5AEVU.js} +51 -49
  344. package/dist/source-manifest-publish-Q7P5AEVU.js.map +1 -0
  345. package/dist/transport/index.js +7 -7
  346. package/dist/transport/ws/server.js +7 -7
  347. package/dist/transport/ws.js +7 -7
  348. package/dist/tui/index.js +63 -44
  349. package/dist/tui/index.js.map +1 -1
  350. package/dist/tui/src/repl.d.ts +10 -0
  351. package/dist/tui/src/repl.d.ts.map +1 -1
  352. package/dist/types/index.js +1 -1
  353. package/dist/types/src/version.d.ts +4 -4
  354. package/dist/workspace-plugin/adapters/mcp.js +30 -28
  355. package/dist/workspace-plugin/adapters/omp.js +14 -14
  356. package/dist/workspace-plugin/index.js +2 -2
  357. package/package.json +1 -1
  358. package/dist/chunk-22ZX33H6.js.map +0 -1
  359. package/dist/chunk-23SG4JRV.js.map +0 -1
  360. package/dist/chunk-2HS357RA.js.map +0 -1
  361. package/dist/chunk-7EMS2GZO.js.map +0 -1
  362. package/dist/chunk-AVFRFGM2.js.map +0 -1
  363. package/dist/chunk-B436SG5P.js.map +0 -1
  364. package/dist/chunk-B4BLJUYN.js.map +0 -1
  365. package/dist/chunk-DKXNKFKP.js.map +0 -1
  366. package/dist/chunk-DNXPXJ3X.js.map +0 -1
  367. package/dist/chunk-EN5REMWV.js.map +0 -1
  368. package/dist/chunk-ETF6Q3R3.js.map +0 -1
  369. package/dist/chunk-IS3NIZBX.js.map +0 -1
  370. package/dist/chunk-IWKKTCXY.js.map +0 -1
  371. package/dist/chunk-J5JWLKLB.js.map +0 -1
  372. package/dist/chunk-KA2GLAPS.js.map +0 -1
  373. package/dist/chunk-NSIOBKDX.js.map +0 -1
  374. package/dist/chunk-OLHHN3NO.js.map +0 -1
  375. package/dist/chunk-S7DVT2BV.js.map +0 -1
  376. package/dist/chunk-SRTWKZP2.js.map +0 -1
  377. package/dist/chunk-SZTHSPRC.js.map +0 -1
  378. package/dist/chunk-T7HGEMNB.js.map +0 -1
  379. package/dist/chunk-TGUMN5G7.js.map +0 -1
  380. package/dist/chunk-THX5EE3K.js.map +0 -1
  381. package/dist/chunk-TNQLDEM6.js.map +0 -1
  382. package/dist/chunk-TROEC2Z2.js.map +0 -1
  383. package/dist/chunk-UMLCKKIA.js.map +0 -1
  384. package/dist/chunk-X44XKBZX.js.map +0 -1
  385. package/dist/ensure-sources-6O54DUQB.js.map +0 -1
  386. package/dist/library-publish-MUGUST43.js.map +0 -1
  387. package/dist/open-library-BVQCB37E.js +0 -57
  388. package/dist/project-BGYMLAS6.js +0 -88
  389. package/dist/serve-preflight-GQY5DZX6.js +0 -56
  390. package/dist/setup-2NWSKSCO.js.map +0 -1
  391. package/dist/source-XA3L4H6I.js +0 -86
  392. package/dist/source-manifest-publish-QEGMTS33.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/harnesses/omp-models-yml.ts"],"names":[],"mappings":"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","file":"chunk-S7DVT2BV.js","sourcesContent":["/**\n * The omp adapter: an AI provider registry serialized into omp's own\n * configuration files, inside a session-private agent directory.\n *\n * omp already implements the target schema — `~/.omp/agent/models.yml` is a\n * `providers:` map with `baseUrl`, `api`, `apiKey`, `headers`, `authHeader`,\n * `auth`, `discovery` and `models[]` (`omp://models.md`) — so this module is a\n * *serializer*, not a translator. Our `surface` enum is omp's `api` enum\n * verbatim (§1.2); {@link OMP_API_VALUES} encodes that assertion so a future\n * surface that omp does not know is reported instead of silently written into\n * a file omp will then reject wholesale.\n *\n * Two files are produced:\n *\n * - `models.yml` — one entry per enabled `llm`/`embed` registry entry. `apiKey`\n * holds the **name** of the per-entry environment variable\n * (`SKAILE_AIP_<ID>_KEY`, {@link providerCredentialEnvName}), never a value:\n * omp resolves a `models.yml` `apiKey` as an env-var name first and only\n * falls back to treating it as a literal token. The values travel in the\n * child environment.\n * - `config.yml` — omp's settings file, carrying `modelRoles` rendered from the\n * `skaile.yaml` `roles` table. `models.yml`'s root accepts only `providers:`;\n * unknown root keys fail its schema, so roles cannot live there.\n *\n * `PI_CODING_AGENT_DIR` relocates omp's whole agent base — `config.yml`,\n * `models.yml` **and** the auth store `agent.db` (`omp://settings.md`). Pointing\n * it at a session-private directory is what makes N providers per session\n * possible without ever writing the user's `~/.omp/agent`. The cost is that a\n * standalone developer session would also lose the OAuth logins stored in that\n * auth store, so {@link materializeOmpAgentDir} seeds the session directory\n * with symlinks to everything in the user's agent directory *except* the two\n * files this module owns. Verified against omp 18.2.6: a ChatGPT/Codex OAuth\n * account stored in `~/.omp/agent/agent.db` still resolves (`omp token\n * openai-codex`) from a relocated directory that only symlinks `agent.db*`.\n * Under the platform the user directory does not exist, the seed is a no-op,\n * and the session starts empty — which is the correct behaviour there.\n *\n * @see PROVIDER-CONFIG-PLAN.md §2.3 (omp row), §5, §9\n * @see omp://models.md, omp://settings.md\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport net from \"node:net\";\nimport path from \"node:path\";\nimport {\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n AI_PROVIDER_SURFACES,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n normalizeEntryBaseUrl,\n parseModelRef,\n registryEntries,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { parse, stringify } from \"yaml\";\nimport type { ModelEntry } from \"../models.js\";\nimport {\n entryCredentialValue,\n providerCredentialEnvName,\n type RegistryCredentialEnvOptions,\n unresolvedProviderCredentials,\n} from \"../provider-materialize/credential-env.js\";\nimport { entrySurface } from \"../provider-materialize/env-harnesses.js\";\nimport type { AgentConfig, OmpHarnessOptions } from \"../types.js\";\n\n/**\n * omp's allowed provider/model `api` values (`omp://models.md`, \"Allowed\n * provider/model `api` values\").\n *\n * Every {@link AI_PROVIDER_SURFACES} member is in this list — that equality is\n * the premise the whole adapter rests on (§1.2). `google-gemini-cli` is omp's\n * one extra value, which the registry has no surface for.\n */\nexport const OMP_API_VALUES: readonly string[] = [...AI_PROVIDER_SURFACES, \"google-gemini-cli\"];\n\n/**\n * `discovery.type` values omp accepts. The registry's own enum is wider on one\n * side (`anthropic-models-list`, `google-models-list`, `none`) and narrower on\n * the other, so a discovery block is emitted only when omp can act on it.\n */\nconst OMP_DISCOVERY_TYPES: readonly string[] = [\n \"ollama\",\n \"llama.cpp\",\n \"lm-studio\",\n \"openai-models-list\",\n \"proxy\",\n \"litellm\",\n];\n\n/** One `providers.<id>` block of `models.yml`. */\ninterface OmpProviderBlock {\n baseUrl?: string;\n api?: string;\n /** The *name* of the env var holding the credential — never a value. */\n apiKey?: string;\n auth?: \"apiKey\" | \"none\" | \"oauth\";\n authHeader?: boolean;\n headers?: Record<string, string>;\n discovery?: { type: string };\n models?: OmpModelBlock[];\n}\n\n/** One entry of a provider's `models[]`. */\ninterface OmpModelBlock {\n id: string;\n name?: string;\n input?: string[];\n contextWindow?: number;\n supportsTools?: boolean;\n}\n\n/** The two files this module owns inside the agent directory. */\nexport const OMP_MODELS_FILENAME = \"models.yml\";\n\n/** omp's settings file; `modelRoles` lives here, not in `models.yml`. */\nexport const OMP_CONFIG_FILENAME = \"config.yml\";\n\n/**\n * Names {@link materializeOmpAgentDir} never links in from the user's agent\n * directory: the two files it writes itself, their alternate spellings, and\n * the legacy `settings.json` omp would migrate into `config.yml`.\n */\nconst OWNED_AGENT_DIR_FILES: Record<string, true> = {\n \"models.yml\": true,\n \"models.yaml\": true,\n \"models.json\": true,\n \"config.yml\": true,\n \"config.yaml\": true,\n \"config.yml.lock\": true,\n \"config.yaml.lock\": true,\n \"settings.json\": true,\n};\n\n/**\n * omp's own runtime state inside its home. An agent directory that an older release used as\n * omp's home still holds these; they are never agent files, so the identity link skips them\n * and the user's own login (`agent.db`) linked in from their agent directory stays in place.\n */\nconst OMP_RUNTIME_ENTRIES: Record<string, true> = {\n \"agent.db\": true,\n \"agent.db-shm\": true,\n \"agent.db-wal\": true,\n \"models.db\": true,\n \"models.db-shm\": true,\n \"models.db-wal\": true,\n \"skill-descriptions.db\": true,\n \"skill-descriptions.db-shm\": true,\n \"skill-descriptions.db-wal\": true,\n \"custom-session-files\": true,\n intercom: true,\n sessions: true,\n};\n\n/**\n * The only entries of the user's own omp agent directory a session's private home links in:\n * omp's credential store, so the login the developer already has keeps working. Sessions,\n * history, `mcp.json`, extensions and blobs stay out: a run must not write into the user's\n * session store or load their MCP servers and extensions. `config.yml` is copied, not linked.\n */\nconst OMP_LOGIN_FILES = [\"agent.db\", \"agent.db-shm\", \"agent.db-wal\"] as const;\n\n/** Options for {@link renderOmpRegistry}. */\nexport interface RenderOmpRegistryOptions extends RegistryCredentialEnvOptions {\n /** `skaile.yaml` `roles`: role name → model selector. Rendered as `modelRoles`. */\n roles?: Record<string, string>;\n /**\n * The session's own selector. When `roles` names no `default`, the resolved\n * model becomes `modelRoles.default` so `@default` (and omp's `*` alias)\n * resolve to the entry the session actually runs on.\n */\n modelRef?: string;\n /**\n * Settings to render underneath `modelRoles` — the user's own `config.yml`\n * when a standalone session seeds one. `modelRoles` is replaced wholesale,\n * not deep-merged: a seeded role pointing at a provider this session does\n * not define would otherwise survive as a dangling selector.\n */\n baseSettings?: Record<string, unknown>;\n}\n\n/** What {@link renderOmpRegistry} produced. */\nexport interface OmpRegistryRender {\n /** `models.yml` contents. */\n modelsYml: string;\n /** `config.yml` contents. */\n configYml: string;\n /**\n * `SKAILE_AIP_<ID>_KEY` → secret, for the child environment. The only place\n * a credential value appears; both rendered files hold names alone.\n */\n credentialEnv: Record<string, string>;\n /** Entry ids written to `models.yml`, in registry order. */\n providerIds: string[];\n /** `modelRoles` as written, role name → `<providerId>/<providerModelId>`. */\n modelRoles: Record<string, string>;\n /** Entries and roles that could not be rendered, and why. */\n warnings: string[];\n}\n\n/** The provider-side model ids an entry declares, keyed by logical id. */\nfunction entryModelIds(entry: AIProviderLlmEntry): Array<[string, string]> {\n const logical = new Set<string>([\n ...Object.keys(entry.model_map ?? {}),\n ...Object.keys(entry.capabilities ?? {}),\n ]);\n const seen = new Set<string>();\n const out: Array<[string, string]> = [];\n for (const id of logical) {\n const providerSide = entry.model_map?.[id] ?? id;\n if (seen.has(providerSide)) continue;\n seen.add(providerSide);\n out.push([id, providerSide]);\n }\n return out;\n}\n\n/**\n * Serialize one entry into an omp provider block, or report why it cannot be.\n *\n * omp requires `baseUrl` on any provider that declares `models[]`, and\n * provider-level `api` whenever `discovery` is set (except `discovery.type:\n * proxy`, where the wire is auto-detected per model). A file that violates its\n * schema is rejected *wholesale* — the registry keeps operating on built-in\n * models and the error only surfaces through `ModelRegistry.getError()` — so an\n * entry that cannot satisfy those rules is dropped here, loudly, rather than\n * taking every other provider down with it.\n */\nfunction renderProvider(\n id: string,\n entry: AIProviderLlmEntry,\n warnings: string[],\n): OmpProviderBlock | undefined {\n // The Anthropic SDK inside omp appends `/v1/messages`: a stored `…/v1` must\n // not reach the file as written. Not `entryBaseUrl`: omp gets no preset\n // literal, so an entry without an endpoint of its own is reported below.\n const baseUrl = normalizeEntryBaseUrl(resolveEntryBaseUrl(entry), entrySurface(entry));\n if (!baseUrl) {\n warnings.push(\n `provider '${id}' has no resolvable base_url (missing transport params?) — omitted from models.yml`,\n );\n return undefined;\n }\n\n // Only the entry's own surface becomes `api`; an inherited one stays omp's\n // to infer, as before. The preset's surface above only picks the URL rule.\n const surface = entry.surface;\n if (surface && !OMP_API_VALUES.includes(surface)) {\n warnings.push(\n `provider '${id}' has surface '${surface}', which omp's api enum does not accept`,\n );\n return undefined;\n }\n\n const block: OmpProviderBlock = { baseUrl };\n if (surface) block.api = surface;\n\n const kind = entry.credential?.kind ?? \"none\";\n if (kind === \"none\") {\n block.auth = \"none\";\n } else if (kind === \"sigv4\" || kind === \"google_adc\" || kind === \"azure_entra\") {\n // Ambient signing chains: the AWS/Google/Azure SDK inside omp signs the\n // request from its own environment. There is no token to hand over, and\n // omp must not treat the provider as unavailable for the lack of one.\n block.auth = \"none\";\n } else {\n block.apiKey = providerCredentialEnvName(id);\n // `bearer` is the only kind that needs the header injected; the Anthropic\n // and Azure surfaces place an `api_key_header` credential themselves.\n if (kind === \"bearer\" || kind === \"oauth\") block.authHeader = true;\n }\n\n const headers = { ...entry.headers };\n if (entry.query_params && Object.keys(entry.query_params).length > 0) {\n if (surface === \"bedrock-converse-stream\") {\n // omp keeps a query string on a Bedrock `baseUrl` and appends it to the\n // final URL (and to SigV4's canonical request) — the documented carrier\n // for gateways that authenticate by query parameter.\n const search = new URLSearchParams(entry.query_params).toString();\n block.baseUrl = `${baseUrl}${baseUrl.includes(\"?\") ? \"&\" : \"?\"}${search}`;\n } else {\n warnings.push(\n `provider '${id}' declares query_params, which omp's models.yml has no slot for on surface ` +\n `'${surface ?? \"unset\"}' — they were dropped`,\n );\n }\n }\n if (Object.keys(headers).length > 0) block.headers = headers;\n\n const discoveryType = entry.discovery?.type;\n if (discoveryType) {\n if (!OMP_DISCOVERY_TYPES.includes(discoveryType)) {\n warnings.push(\n `provider '${id}' declares discovery '${discoveryType}', which omp does not implement — ` +\n `models come from model_map only`,\n );\n } else if (!surface && discoveryType !== \"proxy\") {\n warnings.push(\n `provider '${id}' declares discovery '${discoveryType}' but no surface — omp requires ` +\n `provider-level api for every discovery type but 'proxy'`,\n );\n } else {\n block.discovery = { type: discoveryType };\n }\n }\n\n const models: OmpModelBlock[] = [];\n for (const [logical, providerSide] of entryModelIds(entry)) {\n const model: OmpModelBlock = { id: providerSide };\n if (logical !== providerSide) model.name = logical;\n const caps = entry.capabilities?.[logical];\n if (caps?.context_window !== undefined) model.contextWindow = caps.context_window;\n if (caps?.images !== undefined) model.input = caps.images ? [\"text\", \"image\"] : [\"text\"];\n if (caps?.tools !== undefined) model.supportsTools = caps.tools;\n models.push(model);\n }\n if (models.length > 0) {\n if (!surface) {\n warnings.push(\n `provider '${id}' declares models but no surface — omp requires api at provider or model level`,\n );\n return undefined;\n }\n block.models = models;\n } else if (!block.discovery) {\n warnings.push(\n `provider '${id}' declares neither model_map/capabilities nor a discovery omp implements — ` +\n `it will only override an omp built-in provider of the same id`,\n );\n }\n\n return block;\n}\n\n/**\n * Resolve the `roles` table into omp `modelRoles` selectors.\n *\n * Roles do not chain, so each value is resolved as a plain selector rather than\n * through `@role` expansion. A trailing omp thinking suffix (`:high`) survives\n * untouched: it is not part of any `model_map` key, so it falls through\n * `parseModelRef`'s literal path and is re-emitted on the provider-side id.\n */\nfunction renderModelRoles(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n roles: Record<string, string> | undefined,\n modelRef: string | undefined,\n warnings: string[],\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [role, selector] of Object.entries(roles ?? {})) {\n const trimmed = selector.trim();\n if (!trimmed) continue;\n const ref = parseModelRef(trimmed, registry);\n if (!ref?.providerModelId) {\n warnings.push(\n `role '${role}' ('${selector}') resolves to no model in this registry — dropped`,\n );\n continue;\n }\n out[role] = `${ref.providerId}/${ref.providerModelId}`;\n }\n if (out.default === undefined && modelRef) {\n const ref = parseModelRef(modelRef, registry, roles);\n if (ref?.providerModelId) out.default = `${ref.providerId}/${ref.providerModelId}`;\n }\n return out;\n}\n\n/**\n * The warning for an entry left out of `models.yml` because its credential does not resolve.\n * `skaile run` and `skaile repl` print the same fact as one `! provider ... is not used` line\n * (runner `credential-notice.ts`), so the harness keeps this warning off the console.\n */\nfunction credentialOmissionWarning(id: string, reason: string): string {\n return `provider '${id}' omitted from models.yml: ${reason}`;\n}\n\n/** True for a warning built by {@link credentialOmissionWarning}. */\nexport function isCredentialOmissionWarning(warning: string): boolean {\n return /^provider '[^']+' omitted from models\\.yml: /.test(warning);\n}\n\n/**\n * Serialize a registry into the two omp files plus the credential environment\n * that carries their secrets.\n *\n * Only enabled `llm`/`embed` entries are rendered: `stt`/`tts` entries have no\n * wire surface and omp has no slot for them. The credential environment is\n * scoped to the same set — the omp child has no use for a Deepgram key, and a\n * secret that reaches a process which cannot spend it is pure exposure.\n *\n * An entry whose credential does not resolve here still gets its\n * `SKAILE_AIP_<ID>_KEY` name written into `models.yml`: a `platform:` ref is\n * resolved by the session boundary, which materializes the value into\n * `AgentConfig.env` under that same programme-standard name.\n */\nexport function renderOmpRegistry(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RenderOmpRegistryOptions = {},\n): OmpRegistryRender {\n const warnings: string[] = [];\n const providers: Record<string, OmpProviderBlock> = {};\n const providerIds: string[] = [];\n const credentialEnv: Record<string, string> = {};\n\n // An entry whose credential cannot be resolved here is not handed to omp: it\n // would send an empty key (`invalid x-api-key`) and shadow omp's own login for\n // the same provider.\n const unresolved = new Map(\n unresolvedProviderCredentials(registry, options).map((u) => [u.providerId, u.reason]),\n );\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n const reason = unresolved.get(id);\n if (reason) {\n warnings.push(credentialOmissionWarning(id, reason));\n continue;\n }\n const block = renderProvider(id, entry as AIProviderLlmEntry, warnings);\n if (!block) continue;\n providers[id] = block;\n providerIds.push(id);\n // Only the canonical name, never a vendor-conventional alias: every\n // endpoint omp may address is named in models.yml with its own variable,\n // and a stray `ANTHROPIC_API_KEY` would silently make omp's *built-in*\n // Anthropic provider look authenticated with some gateway entry's key.\n const secret = entryCredentialValue(id, entry, options);\n if (secret) credentialEnv[providerCredentialEnvName(id)] = secret;\n }\n\n const modelRoles = renderModelRoles(registry, options.roles, options.modelRef, warnings);\n\n const settings: Record<string, unknown> = { ...options.baseSettings };\n if (Object.keys(modelRoles).length > 0) settings.modelRoles = modelRoles;\n\n return {\n modelsYml: stringify({ providers }),\n configYml: stringify(settings),\n credentialEnv,\n providerIds,\n modelRoles,\n warnings,\n };\n}\n\n/**\n * The models a registry makes selectable, as the harness-neutral catalog entry.\n *\n * ids are `<providerId>/<providerModelId>` — the exact selector omp's `--model`\n * and `modelRoles` take, and unambiguous when two entries serve the same model\n * id, which is the normal case once a session carries N providers.\n */\nexport function registryModelEntries(\n registry: AIProviderRegistry | MergedAIProviderRegistry | undefined,\n): ModelEntry[] {\n if (!registry) return [];\n const out: ModelEntry[] = [];\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n const label = entry.label ?? id;\n for (const [logical, providerSide] of entryModelIds(entry as AIProviderLlmEntry)) {\n out.push({ id: `${id}/${providerSide}`, name: `${label} ${logical}` });\n }\n }\n return out;\n}\n\n/**\n * Why omp cannot serve `<providerId>/<model>` from this registry, or `undefined` when it can (or\n * when this check cannot tell). omp knows only the models a registry entry declares\n * (`model_map`, `capabilities`) or its `discovery` lists: for a provider id omp has no login for\n * and an entry that declares neither, `omp --model fake/fake-1` exits with `Model \"fake/fake-1\"\n * not found` on the first prompt (p1334). `nativeProviders` are the ids omp ships a login for;\n * their entry only overrides the built-in provider, so the model may still be omp's own.\n */\nexport function ompRegistryModelRefusal(\n registry: AIProviderRegistry | MergedAIProviderRegistry | undefined,\n selector: string,\n nativeProviders: ReadonlySet<string>,\n): string | undefined {\n if (!registry) return undefined;\n const slash = selector.indexOf(\"/\");\n if (slash <= 0) return undefined;\n const head = selector.slice(0, slash);\n // A trailing omp thinking suffix (`:high`) is not part of the model id.\n const model = selector.slice(slash + 1).replace(/:(off|minimal|low|medium|high|xhigh)$/i, \"\");\n if (!model || nativeProviders.has(head)) return undefined;\n const found = registryEntries(registry).find(([id]) => id === head);\n if (!found) return undefined;\n const [, entry] = found;\n if ((entry.kind !== \"llm\" && entry.kind !== \"embed\") || !isEntryEnabled(entry)) return undefined;\n const llm = entry as AIProviderLlmEntry;\n if (llm.discovery?.type && OMP_DISCOVERY_TYPES.includes(llm.discovery.type)) return undefined;\n const known = entryModelIds(llm).flatMap(([logical, providerSide]) => [logical, providerSide]);\n if (known.includes(model)) return undefined;\n return known.length === 0\n ? `omp cannot serve model '${selector}': registry entry '${head}' declares no models (add model_map or capabilities to it in providers.yml), and omp has no login for '${head}'. Pick a model omp lists.`\n : `omp cannot serve model '${selector}': registry entry '${head}' declares ${known.join(\", \")}, not '${model}'. Pick one of those, or add '${model}' to the entry's model_map.`;\n}\n\n/** Options for {@link materializeOmpAgentDir}. */\nexport interface MaterializeOmpAgentDirOptions extends RenderOmpRegistryOptions {\n /**\n * The user's own omp agent directory to seed from — its auth store\n * (`agent.db`) is linked in so a standalone session keeps the login the\n * developer already has, and its `config.yml` is read as base settings.\n * Sessions, history, `mcp.json` and extensions are not linked. Absent (the\n * platform case) seeds nothing. A missing directory is not an error: it is the platform case.\n */\n seedFrom?: string;\n /**\n * GitAgent identity directory (`AgentConfig.agentDir`) whose contents omp\n * reads out of the same base: `agent.yaml`, `SOUL.md`, `RULES.md`,\n * `knowledge/`. Linked in after the seed, so identity wins a name clash.\n */\n identityDir?: string;\n}\n\n/** What {@link materializeOmpAgentDir} wrote. */\nexport interface OmpAgentDirMaterialization extends OmpRegistryRender {\n /** The directory `PI_CODING_AGENT_DIR` must point at. */\n agentDir: string;\n /** The directory is the harness's temporary home: remove it when the run ends. */\n ephemeral?: boolean;\n /** Names linked in from {@link MaterializeOmpAgentDirOptions.seedFrom}. */\n seeded: string[];\n /** Names linked in from {@link MaterializeOmpAgentDirOptions.identityDir}. */\n identity: string[];\n}\n\n/** Inputs {@link planOmpAgentDir} derives the session directory layout from. */\nexport interface OmpAgentDirPlanInput {\n /** Session working directory. Distinguishes two default-named sessions. */\n cwd: string;\n /** Session id — the directory key, so concurrent sessions never collide. */\n sessionId?: string;\n /** `AgentConfig.harnessOptions.omp`. */\n options?: OmpHarnessOptions;\n /** Home the default seed source resolves against. Defaults to `os.homedir()`. */\n homeDir?: string;\n /** Root the private directory is created under. Defaults to `os.tmpdir()`. */\n tmpDir?: string;\n}\n\n/** Where a session's omp agent directory lives, and what it inherits. */\nexport interface OmpAgentDirPlan {\n /** Session-private directory `PI_CODING_AGENT_DIR` points at. */\n agentDir: string;\n /** User agent directory whose login is linked in, when there is one to inherit. */\n seedFrom?: string;\n /**\n * The directory is the harness's own temporary home, to be removed when the run ends. False\n * when the session named its own `harnessOptions.omp.agentHome`, which belongs to the user.\n */\n ephemeral: boolean;\n}\n\n/**\n * Decide the session-private agent directory and whether it inherits the\n * developer's omp state.\n *\n * The directory is deliberately **outside `cwd`**. It holds omp's credential\n * store — a symlink to the developer's `agent.db` on a standalone machine —\n * and `cwd` is the one tree the agent has write access to by design; managed\n * codex draws the same line and rejects a private directory nested in the\n * workspace (`codex/instance-state.ts`). Sessions are keyed by id, falling\n * back to a digest of the workspace path. The temporary directory is `<key>-<random>`, created per\n * call, so no two runs share one (and one run's cleanup never removes another's).\n *\n * Seeding keys on the user directory *existing*, which is exactly the\n * platform/standalone distinction the plan draws: a platform container has no\n * `~/.omp/agent`, so the session correctly starts empty; a developer machine\n * has one, so the session keeps the logins already stored there.\n * `harnessOptions.omp.seedUserAgentDir: false` forces the empty case anyway.\n */\nexport async function planOmpAgentDir(input: OmpAgentDirPlanInput): Promise<OmpAgentDirPlan> {\n const options = input.options;\n const key =\n input.sessionId?.trim() ||\n createHash(\"sha256\").update(path.resolve(input.cwd)).digest(\"hex\").slice(0, 16);\n const ephemeral = options?.agentHome === undefined;\n // The temporary home is unique per spawn: callers key sessions loosely (`skaile chat` passes\n // none, `serve` without --session-id uses one shared id, sub-prompt harnesses share a hash), and\n // the harness deletes its home when its run ends, which must never reach a sibling's home.\n let agentDir = options?.agentHome ?? \"\";\n if (ephemeral) {\n const root = path.join(input.tmpDir ?? os.tmpdir(), \"skaile-omp-agent\");\n await fs.mkdir(root, { recursive: true });\n await sweepStaleOmpHomes(root);\n agentDir = await fs.mkdtemp(path.join(root, `${key.replace(/[^A-Za-z0-9._-]/g, \"_\")}-`));\n await fs.writeFile(path.join(agentDir, OWNER_FILE), String(process.pid));\n }\n if (options?.seedUserAgentDir === false) return { agentDir, ephemeral };\n\n const seedFrom =\n options?.userAgentDir ?? path.join(input.homeDir ?? os.homedir(), \".omp\", \"agent\");\n if (path.resolve(seedFrom) === path.resolve(agentDir)) return { agentDir, ephemeral };\n try {\n if (!(await fs.stat(seedFrom)).isDirectory()) return { agentDir, ephemeral };\n } catch {\n return { agentDir, ephemeral };\n }\n return { agentDir, seedFrom, ephemeral };\n}\n\n/** Names the process that created a temporary home; the sweep keeps a home whose owner lives. */\nconst OWNER_FILE = \".skaile-owner-pid\";\n/** A temporary home older than this whose owner is gone is removed at the next start. */\nconst STALE_HOME_MS = 24 * 60 * 60 * 1000;\n\n/**\n * The names skaile gave a temporary home: `<key>-<six random characters>` (`mkdtemp`), and\n * `<key>-<12 hex>` from releases before 5.16 (p1151).\n */\nconst SKAILE_HOME_NAME = /^[A-Za-z0-9._-]+-(?:[A-Za-z0-9]{6}|[0-9a-f]{12})$/;\n\nfunction processAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/**\n * Whether nothing listens on the unix socket `file`: a connect is refused (the process that\n * bound it is gone) or finds no socket. A socket somebody still serves, or one that does not\n * answer within a second, counts as in use.\n */\nfunction socketIsDead(file: string): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n const conn = net.connect(file);\n const done = (dead: boolean) => {\n conn.destroy();\n resolve(dead);\n };\n conn.setTimeout(1000, () => done(false));\n conn.once(\"connect\", () => done(false));\n conn.once(\"error\", (err: NodeJS.ErrnoException) =>\n done(err.code === \"ECONNREFUSED\" || err.code === \"ENOENT\"),\n );\n });\n}\n\n/**\n * Remove temporary homes older than a day whose creating process is gone: a run that was killed\n * never reached the harness's own cleanup, and every one leaves symlinks and databases behind\n * (p811). A home of a live process is kept whatever its age. A unix socket of that age that\n * nobody listens on is removed too (omp binds one beside the homes and a killed run leaves it,\n * p1316). Best effort: a failure is ignored.\n */\nasync function sweepStaleOmpHomes(root: string, now = Date.now()): Promise<void> {\n let names: string[];\n try {\n names = await fs.readdir(root);\n } catch {\n return;\n }\n await Promise.all(\n names.map(async (name) => {\n const home = path.join(root, name);\n try {\n const stat = await fs.lstat(home);\n if (now - stat.mtimeMs < STALE_HOME_MS) return;\n if (stat.isSocket()) {\n if (await socketIsDead(home)) await fs.rm(home, { force: true });\n return;\n }\n if (!stat.isDirectory()) return;\n const owner = Number.parseInt(\n await fs.readFile(path.join(home, OWNER_FILE), \"utf8\").catch(() => \"\"),\n 10,\n );\n if (Number.isInteger(owner) && processAlive(owner)) return;\n // A home with no owner file is one an older version made: remove it only when its\n // name has the `<key>-<six random characters>` shape `mkdtemp` gives (never a folder\n // somebody else put in this directory).\n if (!Number.isInteger(owner) && !SKAILE_HOME_NAME.test(name)) return;\n await fs.rm(home, { recursive: true, force: true });\n } catch {\n /* another process may be sweeping the same home */\n }\n }),\n );\n}\n\n/**\n * Run the steps that fill a planned home; when one throws, remove a temporary home before\n * rethrowing. The harness only learns the home (and deletes it at cleanup) once these steps\n * return, so a failure here would otherwise leave a new directory per spawn behind.\n */\nasync function removeHomeOnThrow<T>(plan: OmpAgentDirPlan, fill: () => Promise<T>): Promise<T> {\n try {\n return await fill();\n } catch (err) {\n if (plan.ephemeral) await fs.rm(plan.agentDir, { recursive: true, force: true });\n throw err;\n }\n}\n\n/** Remove a path whatever it is, without following a symlink into its target. */\nasync function removeEntry(target: string): Promise<void> {\n let stat: Stats;\n try {\n stat = await fs.lstat(target);\n } catch {\n return;\n }\n if (stat.isSymbolicLink() || stat.isFile()) {\n await fs.unlink(target);\n return;\n }\n await fs.rm(target, { recursive: true, force: true });\n}\n\n/** Symlink every entry of `sourceDir` into `dir`, skipping the owned names. */\nasync function linkInto(\n dir: string,\n sourceDir: string,\n skip: Record<string, true>,\n): Promise<string[]> {\n let names: string[];\n try {\n names = await fs.readdir(sourceDir);\n } catch {\n return [];\n }\n const linked: string[] = [];\n for (const name of names) {\n if (skip[name]) continue;\n const target = path.join(dir, name);\n await removeEntry(target);\n await fs.symlink(path.join(sourceDir, name), target);\n linked.push(name);\n }\n return linked;\n}\n\n/**\n * Remove the symlinks into the user's agent directory that an older release (or a home the\n * session named itself) left in `dir`: only the login files may point there (p811).\n */\nasync function dropStaleSeedLinks(dir: string, sourceDir: string): Promise<void> {\n let names: string[];\n try {\n names = await fs.readdir(dir);\n } catch {\n return;\n }\n const root = path.resolve(sourceDir);\n for (const name of names) {\n if ((OMP_LOGIN_FILES as readonly string[]).includes(name)) continue;\n const entry = path.join(dir, name);\n try {\n if (!(await fs.lstat(entry)).isSymbolicLink()) continue;\n const to = path.resolve(dir, await fs.readlink(entry));\n if (to === root || to.startsWith(root + path.sep)) await fs.unlink(entry);\n } catch {\n // Gone or unreadable: nothing to drop.\n }\n }\n}\n\n/** Symlink the login files (see {@link OMP_LOGIN_FILES}) of the user's agent directory into `dir`. */\nasync function linkLoginFiles(dir: string, sourceDir: string): Promise<string[]> {\n await dropStaleSeedLinks(dir, sourceDir);\n const linked: string[] = [];\n for (const name of OMP_LOGIN_FILES) {\n const from = path.join(sourceDir, name);\n try {\n if (!(await fs.stat(from)).isFile()) continue;\n } catch {\n continue;\n }\n const target = path.join(dir, name);\n await removeEntry(target);\n await fs.symlink(from, target);\n linked.push(name);\n }\n return linked;\n}\n\n/** Read a seeded `config.yml` as the base settings, or `{}` when unusable. */\nasync function readSeededSettings(seedFrom: string): Promise<Record<string, unknown>> {\n for (const name of [\"config.yml\", \"config.yaml\"]) {\n let raw: string;\n try {\n raw = await fs.readFile(path.join(seedFrom, name), \"utf-8\");\n } catch {\n continue;\n }\n const parsed = parse(raw) as unknown;\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n }\n return {};\n}\n\n/**\n * The model selector of the user's own omp default (`modelRoles.default` in their `config.yml`)\n * when it can only be served by their own `models.yml`, else `undefined` (p1172).\n *\n * The session-private home never copies the user's `models.yml`: it holds their credentials.\n * A default such as `anthropic/claude-opus-5-5` that their `models.yml` defines (a gateway, a\n * local server) then names a provider the private home does not have, and omp quietly picks\n * another model. A default on a built-in omp provider keeps working there (its login is linked\n * in), and a provider the registry renders is there too, so neither is reported.\n */\nasync function ownDefaultNeedingOwnModels(\n seedFrom: string,\n rendered: readonly string[],\n): Promise<string | undefined> {\n const selector = (await readSeededSettings(seedFrom)).modelRoles;\n const own =\n selector && typeof selector === \"object\" && !Array.isArray(selector)\n ? (selector as Record<string, unknown>).default\n : undefined;\n if (typeof own !== \"string\" || !own.includes(\"/\")) return undefined;\n const providerId = own.slice(0, own.indexOf(\"/\"));\n if (rendered.includes(providerId)) return undefined;\n let raw: string;\n try {\n raw = await fs.readFile(path.join(seedFrom, OMP_MODELS_FILENAME), \"utf-8\");\n } catch {\n return undefined;\n }\n const providers = (parse(raw) as { providers?: unknown } | null)?.providers;\n if (!providers || typeof providers !== \"object\" || Array.isArray(providers)) return undefined;\n return providerId in providers ? own : undefined;\n}\n\n/**\n * Build the session-private agent directory and write omp's two files into it.\n *\n * The user's `~/.omp/agent/models.yml` and `config.yml` are never opened for\n * writing: `config.yml` is *copied* into the session (so a token refresh or a\n * settings write inside the session cannot reach back through a symlink),\n * `models.yml` is not seeded at all, and everything else — `agent.db*` above\n * all — is symlinked so the session shares the developer's logins and caches.\n */\nexport async function materializeOmpAgentDir(\n agentDir: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: MaterializeOmpAgentDirOptions = {},\n): Promise<OmpAgentDirMaterialization> {\n await fs.mkdir(agentDir, { recursive: true });\n\n const seeded = options.seedFrom ? await linkLoginFiles(agentDir, options.seedFrom) : [];\n const identity = options.identityDir\n ? await linkInto(agentDir, options.identityDir, OWNED_AGENT_DIR_FILES)\n : [];\n\n const baseSettings =\n options.baseSettings ??\n (options.seedFrom ? await readSeededSettings(options.seedFrom) : undefined);\n\n const render = renderOmpRegistry(registry, { ...options, baseSettings });\n\n await fs.writeFile(path.join(agentDir, OMP_MODELS_FILENAME), render.modelsYml, \"utf-8\");\n await fs.writeFile(path.join(agentDir, OMP_CONFIG_FILENAME), render.configYml, \"utf-8\");\n\n return { ...render, agentDir, seeded, identity };\n}\n\n/** What the omp harness gets back from {@link materializeOmpProviders}. */\nexport interface OmpProviderMaterialization extends OmpAgentDirMaterialization {\n /**\n * The `--model` argument for this session: `<providerId>/<providerModelId>`,\n * the one selector form omp treats as unambiguous when several providers\n * carry the same model id. Absent when the session named no model.\n */\n modelArg?: string;\n}\n\n/**\n * The whole omp adapter for one session: decide the private agent directory,\n * inherit the developer's omp state where there is any, write `models.yml` and\n * `config.yml`, and report the credential environment and `--model` selector\n * the child needs.\n *\n * Returns `undefined` when the session carries no registry with a selectable\n * entry — the harness then behaves exactly as it did before the registry\n * existed, which is what keeps this an expand-and-contract change.\n *\n * Also returns `undefined` when the session names no model (no `--model`, no\n * `default` role) and the user's own omp default is served by the user's own\n * `models.yml`, which a private home does not carry (p1172): the registry would\n * only swap that default for whatever model omp finds first.\n *\n * Also returns `undefined` when no entry can be handed to omp (every\n * credential unresolved) or when the entry the session's model selects was\n * left out: a session-private agent directory would then start omp without the\n * user's own settings, and a model that only the user's own omp login can\n * serve would fail with `No API key found` although native omp answers. The\n * harness then starts omp on the user's agent directory, so \"omp falls back to\n * its own login\" is true.\n *\n * `env:` references resolve against the runner's environment *overlaid with*\n * `config.env`, so a credential the session boundary already resolved (a\n * `platform:` secret it turned into an env var, for instance) is found here\n * under the name the registry entry points at.\n */\nexport async function materializeOmpProviders(\n config: AgentConfig,\n): Promise<OmpProviderMaterialization | undefined> {\n const registry = config.registry;\n if (!registry) return undefined;\n const selectable = registryEntries(registry).some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n if (!selectable) return undefined;\n\n const env = { ...process.env, ...config.env };\n const selected = config.modelRef\n ? parseModelRef(config.modelRef, registry, config.roles)\n : undefined;\n const usable = renderOmpRegistry(registry, {\n env,\n ...(config.roles ? { roles: config.roles } : {}),\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n }).providerIds;\n if (usable.length === 0) return undefined;\n if (selected && !usable.includes(selected.providerId)) return undefined;\n\n const plan = await planOmpAgentDir({\n cwd: config.cwd,\n ...(config.sessionId ? { sessionId: config.sessionId } : {}),\n ...(config.harnessOptions?.omp ? { options: config.harnessOptions.omp } : {}),\n });\n\n if (!selected && !config.model && plan.seedFrom) {\n const named = renderOmpRegistry(registry, {\n env,\n ...(config.roles ? { roles: config.roles } : {}),\n }).modelRoles;\n if (named.default === undefined && (await ownDefaultNeedingOwnModels(plan.seedFrom, usable))) {\n if (plan.ephemeral) await fs.rm(plan.agentDir, { recursive: true, force: true });\n return undefined;\n }\n }\n\n const rendered = await removeHomeOnThrow(plan, () =>\n materializeOmpAgentDir(plan.agentDir, registry, {\n env,\n ...(plan.seedFrom ? { seedFrom: plan.seedFrom } : {}),\n ...(config.agentDir ? { identityDir: config.agentDir } : {}),\n ...(config.roles ? { roles: config.roles } : {}),\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n }),\n );\n\n return {\n ...rendered,\n ephemeral: plan.ephemeral,\n ...(selected?.providerModelId\n ? { modelArg: `${selected.providerId}/${selected.providerModelId}` }\n : {}),\n };\n}\n\n/** What {@link materializeOmpIdentityDir} wrote. */\nexport interface OmpIdentityDirMaterialization {\n /** The directory `PI_CODING_AGENT_DIR` must point at. */\n agentDir: string;\n /** The directory is the harness's temporary home: remove it when the run ends. */\n ephemeral: boolean;\n /** Names linked in from the user's own omp agent directory. */\n seeded: string[];\n /** Names linked in from `AgentConfig.agentDir`. */\n identity: string[];\n}\n\n/**\n * The omp home of a session that has an agent directory but no provider registry.\n *\n * omp keeps its runtime state (`agent.db`, `models.db`, `skill-descriptions.db`, session\n * scratch, `intercom/`) in `PI_CODING_AGENT_DIR`. Pointing that at the agent directory itself\n * put those files beside `SOUL.md` in a pinned, shared source (`.skaile/cache/agents/<name>/`)\n * and made omp name a path inside the cache when it lacks a credential. So the home is a\n * private directory outside `cwd` (see {@link planOmpAgentDir}): the developer's own omp state\n * is linked in (their login keeps working), their `config.yml` / `models.yml` are copied (a\n * settings write cannot reach back), and the agent directory's entries are linked in last,\n * so the agent files stay where they are and omp can still read them.\n *\n * Returns `undefined` when the session has no `agentDir`.\n */\nexport async function materializeOmpIdentityDir(\n config: AgentConfig,\n): Promise<OmpIdentityDirMaterialization | undefined> {\n const identityDir = config.agentDir;\n if (!identityDir) return undefined;\n // Keyed by the agent and the workspace too: two role children of one session, each with\n // its own agent directory, must not link their entries into one home.\n const agentKey = createHash(\"sha256\")\n .update(`${path.resolve(identityDir)}\\0${path.resolve(config.cwd)}`)\n .digest(\"hex\")\n .slice(0, 12);\n const plan = await planOmpAgentDir({\n cwd: config.cwd,\n sessionId: `${config.sessionId?.trim() || \"agent\"}-${agentKey}`,\n ...(config.harnessOptions?.omp ? { options: config.harnessOptions.omp } : {}),\n });\n return removeHomeOnThrow(plan, async () => {\n await fs.mkdir(plan.agentDir, { recursive: true });\n const seeded = plan.seedFrom ? await linkLoginFiles(plan.agentDir, plan.seedFrom) : [];\n if (plan.seedFrom) {\n for (const name of Object.keys(OWNED_AGENT_DIR_FILES)) {\n const from = path.join(plan.seedFrom, name);\n try {\n if (!(await fs.stat(from)).isFile()) continue;\n } catch {\n continue;\n }\n const to = path.join(plan.agentDir, name);\n await removeEntry(to);\n await fs.copyFile(from, to);\n }\n }\n const identity = await linkInto(plan.agentDir, identityDir, {\n ...OWNED_AGENT_DIR_FILES,\n ...OMP_RUNTIME_ENTRIES,\n });\n return { agentDir: plan.agentDir, ephemeral: plan.ephemeral, seeded, identity };\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../cli/src/commands/serve-preflight.ts"],"names":[],"mappings":"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","file":"chunk-SRTWKZP2.js","sourcesContent":["/**\n * Start-up checks for `skaile serve`: fail with one actionable line before the\n * runner reports ready, instead of on the first prompt.\n */\n\nimport { statSync } from \"node:fs\";\nimport {\n checkHarnessModel,\n checkOmpListedModel,\n checkOmpServeModel,\n} from \"@skaile/workspaces/bridge\";\nimport {\n isEntryEnabled,\n type MergedAIProviderRegistry,\n pickRegistryEntries,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { loadRegistryView } from \"./providers.ts\";\nimport {\n DEFAULT_HARNESS_ID,\n installCommandFor,\n loadHarnessSdk,\n primaryAgentRef,\n resolveSettings,\n resolveSkWorkspaceConfig,\n sdkLookupPlaces,\n} from \"@skaile/workspaces/core\";\nimport { unknownHarnessMessage } from \"../harness-error.ts\";\nimport { agentDefinitionProblem } from \"./validate-instances.ts\";\n\n/** Optional SDK a harness needs at run time, and how to probe that it loads from a project. */\nconst HARNESS_SDKS: Record<\n string,\n { pkg: string; load: (projectDir: string) => Promise<unknown> }\n> = {\n \"claude-sdk\": {\n pkg: \"@anthropic-ai/claude-agent-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n ),\n },\n codex: {\n pkg: \"@openai/codex-sdk\",\n load: (projectDir) =>\n loadHarnessSdk(\"@openai/codex-sdk\", projectDir, () => import(\"@openai/codex-sdk\")),\n },\n};\n\n/**\n * Check that the harness `skaile serve` would start can load its SDK. The probe\n * is the same lookup the harness runs in `start()` (the project's `node_modules`,\n * then next to skaile), so a compiled binary that bundles the SDK passes.\n *\n * @param projectDir - Project the server serves.\n * @param harnessOverride - `--harness`, when given.\n * @param probe - Replaceable loader table, for tests.\n * @returns The one-line problem, or `null` when the harness can start.\n */\nexport async function checkHarnessSdk(\n projectDir: string,\n harnessOverride?: string,\n probe: typeof HARNESS_SDKS = HARNESS_SDKS,\n): Promise<string | null> {\n const settings = await resolveSettings(\n projectDir,\n harnessOverride ? { harness: harnessOverride } : {},\n );\n const harness = settings.harness ?? DEFAULT_HARNESS_ID;\n const sdk = probe[harness];\n if (!sdk) return null;\n try {\n await sdk.load(projectDir);\n return null;\n } catch {\n return `The ${harness} harness needs ${sdk.pkg}, which is not installed. Looked in ${sdkLookupPlaces(projectDir)}. Run in the project: ${installCommandFor(sdk.pkg, projectDir)} (or pick another harness with --harness).`;\n }\n}\n\n/**\n * Check that the model endpoint can load pi-ai, when `skaile serve` will start the\n * endpoint (`--model-endpoint`, or `model_endpoint.enabled` in skaile.yaml). Without\n * this the endpoint printed its ready line and answered every request with a 500.\n *\n * @param projectDir - Project the server serves.\n * @param flag - Parsed `--model-endpoint`, when given.\n * @param probe - Replaceable pi-ai check, for tests.\n * @returns The one-line problem (both places looked in, the install command), or `null`.\n */\nexport async function checkModelEndpointPeer(\n projectDir: string,\n flag: { enabled?: boolean } | undefined,\n probe?: (projectDir: string) => Promise<string | null>,\n): Promise<string | null> {\n const enabled =\n flag?.enabled ?? resolveSkWorkspaceConfig(projectDir).model_endpoint?.enabled === true;\n if (!enabled) return null;\n const check = probe ?? (await import(\"@skaile/workspaces/model-endpoint\")).checkPiAiInstalled;\n return check(projectDir);\n}\n\n/**\n * Check that the harness `skaile serve` would start can take the model given with `--model`: the\n * refusal a first prompt would raise as a fatal `error` (p1334), one line before the ready line.\n * The same check as `skaile run --dry-run`.\n *\n * Only an explicit `--model` is checked. A model that comes from `skaile.yaml` or the settings\n * files is not: the platform sends its registry layer at `session_init`, after the server is up,\n * so a provider the local `providers.yml` lacks may still be served. That model is checked at\n * the first prompt, as before. The check sees the local registry, narrowed by `--providers` as\n * the session narrows it, and is skipped when the registry comes from the host\n * (`secrets.provider` other than `env`).\n *\n * @param projectDir - Project the server serves.\n * @param overrides - `--harness`, `--model` and `--providers`, when given.\n * @param registry - Replaceable registry loader, for tests.\n * @param ompListed - Replaceable omp model lookup (`omp models find`), for tests.\n * @returns The one-line refusal, or `null` when the harness takes the model.\n */\nexport async function checkServeModel(\n projectDir: string,\n overrides: { harness?: string; model?: string; providers?: readonly string[] },\n registry: () => MergedAIProviderRegistry = () => loadRegistryView({ projectDir }).merged,\n ompListed: (model: string) => Promise<string | undefined> = checkOmpListedModel,\n): Promise<string | null> {\n if (!overrides.model) return null;\n // The platform delivers its registry layer over the transport after the server is up (p1332).\n const secretsProvider = resolveSkWorkspaceConfig(projectDir).secrets?.provider;\n if (secretsProvider && secretsProvider !== \"env\") return null;\n const settings = await resolveSettings(projectDir, {\n ...(overrides.harness ? { harness: overrides.harness } : {}),\n model: overrides.model,\n });\n if (!settings.model) return null;\n const local = registry();\n const narrowed = overrides.providers?.length\n ? pickRegistryEntries(local, overrides.providers)\n : local;\n const harness = settings.harness ?? DEFAULT_HARNESS_ID;\n const input = { registry: narrowed, model: settings.model };\n // A server answers its first prompt after it is ready: omp must be known to take the model now (p1334).\n const refusal =\n checkHarnessModel(harness, input) ??\n (harness === \"omp\" ? checkOmpServeModel(input) : undefined);\n if (refusal) return refusal;\n // No enabled registry entry: omp serves from its own agent directory, which only omp can list.\n const ownHome =\n harness === \"omp\" &&\n !registryEntries(narrowed).some(\n ([, entry]) => (entry.kind === \"llm\" || entry.kind === \"embed\") && isEntryEnabled(entry),\n );\n return (ownHome ? await ompListed(settings.model) : undefined) ?? null;\n}\n\n/**\n * Resolve `--provider <name>`: it picks one AI provider registry entry, the way\n * `--providers <ids>` picks several. The session then holds that entry only.\n *\n * Fails, with one line, when the entry is not in the local registry\n * (`providers.yml` and the layers above it) or when `--providers` is given\n * too and does not list it. The registry check is skipped when the registry\n * comes from the host (`secrets.provider` other than `env`): the platform\n * sends its entries at `session_init`, after the server is up.\n *\n * @param projectDir - Project the server serves.\n * @param provider - `--provider`, when given.\n * @param providers - Ids of `--providers`, when given.\n * @param registry - Replaceable registry loader, for tests.\n * @returns The entry ids the session keeps, or the one-line problem.\n */\nexport function resolveServeProvider(\n projectDir: string,\n provider: string | undefined,\n providers: readonly string[],\n registry: () => MergedAIProviderRegistry = () => loadRegistryView({ projectDir }).merged,\n): { providers: readonly string[] } | { problem: string } {\n const id = provider?.trim();\n if (!id) return { providers };\n if (providers.length > 0 && !providers.includes(id)) {\n return {\n problem: `--provider '${id}' is not in --providers (${providers.join(\", \")}). Use one of the two flags.`,\n };\n }\n const secretsProvider = resolveSkWorkspaceConfig(projectDir).secrets?.provider;\n if (!secretsProvider || secretsProvider === \"env\") {\n const known = registryEntries(registry()).map(([entryId]) => entryId);\n if (!known.includes(id)) {\n return {\n problem:\n known.length > 0\n ? `--provider: '${id}' is not an AI provider entry. Defined: ${known.join(\", \")}. Run: skaile providers list`\n : `--provider: '${id}' is not an AI provider entry; none is defined. Run: skaile providers add`,\n };\n }\n }\n return { providers: providers.length > 0 ? providers : [id] };\n}\n\n/**\n * Check that `--project-dir` is an existing directory, before `serve` creates anything in it. A\n * missing folder used to fail with a raw `ENOENT` stack from the log store (p1732). A symlink to\n * a directory passes; a relative path is read from the current directory.\n *\n * @param projectDir - The `--project-dir` value as typed.\n * @returns The one-line problem, or `null` when the directory exists.\n */\nexport function checkServeProjectDir(projectDir: string): string | null {\n try {\n if (statSync(projectDir).isDirectory()) return null;\n } catch {\n // missing, a dangling link or unreadable: the same line\n }\n return `--project-dir: '${projectDir}' is not a directory`;\n}\n\n/**\n * Check that the harness `skaile serve` would start is one that is registered: `--harness`, else\n * the project's settings, else the default. The same refusal `run` prints; without it the first\n * session build died with a raw stack (p1731). Load the project's plugins first: a plugin's\n * harness counts.\n *\n * @param projectDir - Project the server serves.\n * @param harnessOverride - `--harness`, when given.\n * @returns The one-line problem, or `null` when the harness is known.\n */\nexport async function checkServeHarness(\n projectDir: string,\n harnessOverride?: string,\n): Promise<string | null> {\n const settings = await resolveSettings(\n projectDir,\n harnessOverride ? { harness: harnessOverride } : {},\n );\n return unknownHarnessMessage(settings.harness ?? DEFAULT_HARNESS_ID) ?? null;\n}\n\n/**\n * Check that `agent.definition` of the project's `skaile.yaml` resolves, the rule `validate`\n * applies (`agent_ref_unresolved`, p1733). Without it `serve` died with a raw\n * `AgentRefResolutionError` stack.\n *\n * @param projectDir - Project the server serves.\n * @returns The error message, or `null` when no definition is set or it resolves.\n */\nexport function checkServeAgentDefinition(projectDir: string): string | null {\n const definition = primaryAgentRef(resolveSkWorkspaceConfig(projectDir));\n return definition ? agentDefinitionProblem(projectDir, definition) : null;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/provider-materialize/env-harnesses.ts"],"names":[],"mappings":"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","file":"chunk-SZTHSPRC.js","sourcesContent":["/**\n * Registry adapter for the **env-shaped CLI harnesses** — Gemini, Qwen, OpenCode,\n * Goose and Continue (§2.3).\n *\n * These harnesses take their endpoint from the environment rather than from a\n * config file, so the adapter's job is three things: resolve which registry\n * entry the session's model selector names, refuse at start when that entry\n * speaks a wire surface the harness cannot, and hand the harness the\n * provider-side model id it must put on the command line.\n *\n * Two pluralities meet here (`BUILTIN_HARNESS_CATALOG.providerPlurality`):\n *\n * - `single` — Gemini and Qwen address exactly one endpoint. The bound entry\n * supplies the credential *and* the base URL, and a surface mismatch is\n * fatal: a Gemini CLI pointed at an `openai-completions` endpoint cannot\n * work, and failing at start names the surface instead of leaving the user\n * with an opaque error mid-turn.\n * - `credentials-n` — OpenCode, Goose and Continue accept every enabled\n * entry's credential at once and select one active model. The credential\n * fan-out is `registryCredentialEnv`; the active model is this module's\n * `<provider>/<model>` binding.\n *\n * Writing the per-endpoint config files those three need for *custom*\n * endpoints (`opencode.json`, Goose `custom_providers/*.json`, Continue\n * `config.yaml`) is the file half, and is deliberately not here.\n *\n * @see PROVIDER-CONFIG-PLAN.md §2.3\n */\n\nimport {\n type AIProviderLlmEntry,\n type AIProviderSurface,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n mergeRegistries,\n normalizeEntryBaseUrl,\n parseModelRef,\n registryEntries,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { BUILTIN_HARNESS_CATALOG } from \"../registry.js\";\nimport type { AgentConfig } from \"../types.js\";\nimport { providerCredentialEnvName, registryCredentialEnv } from \"./credential-env.js\";\n\n/**\n * Everything a CLI harness needs to know about this session's AI providers,\n * resolved once from its {@link AgentConfig}.\n */\nexport interface EnvHarnessSession {\n /** The merged registry this session may address. Empty when none was configured. */\n registry: MergedAIProviderRegistry;\n /**\n * Environment `credential.ref` lookups resolve against — the process\n * environment widened with `config.env`, which is where the session\n * boundary delivered every resolved `SKAILE_AIP_<ID>_KEY`.\n */\n lookupEnv: Record<string, string | undefined>;\n /** Model selector: `<providerId>/<modelId>`, a bare id, or `@role`. */\n modelRef?: string;\n /** Roles table an `@role` selector resolves through. */\n roles?: Record<string, string>;\n}\n\n/**\n * Resolve the session's providers once, from its {@link AgentConfig}.\n *\n * `config.env` is folded into `lookupEnv` rather than kept apart: it is part\n * of the session's environment, not an extra, and a credential or\n * `*_BASE_URL` delivered there must be visible exactly as the child will see\n * it.\n */\nexport function resolveEnvHarnessSession(\n config: AgentConfig,\n processEnv: Record<string, string | undefined> = process.env,\n): EnvHarnessSession {\n return {\n registry: config.registry ?? mergeRegistries([]),\n lookupEnv: { ...processEnv, ...config.env },\n ...(config.modelRef ? { modelRef: config.modelRef } : {}),\n ...(config.roles ? { roles: config.roles } : {}),\n };\n}\n\n/** One resolved endpoint + model — everything a harness needs to spawn. */\nexport interface RegistryModelBinding {\n /** Registry id of the selected entry. */\n providerId: string;\n /** The selected entry itself. */\n entry: AIProviderLlmEntry;\n /** Logical model id, after `@role` expansion and before `model_map`. */\n modelId?: string;\n /** Provider-side model id — what goes on the wire / command line. */\n providerModelId?: string;\n /** Wire protocol, from the entry or its preset. */\n surface?: AIProviderSurface;\n /** Resolved endpoint, from the entry, its transport params, or its preset. */\n baseUrl?: string;\n /**\n * The provider name the *harness* knows this endpoint by — a catalog preset\n * id for a stock endpoint, the registry id for anything custom. See\n * {@link harnessProviderName}.\n */\n harnessProviderId: string;\n /** Non-fatal notes from `parseModelRef` (dangling role, disabled provider). */\n warnings: string[];\n}\n\n/** The entry's wire surface: its own, else its preset's. */\nexport function entrySurface(entry: AIProviderLlmEntry): AIProviderSurface | undefined {\n if (entry.surface) return entry.surface;\n return entry.preset ? getProviderPreset(entry.preset)?.surface : undefined;\n}\n\n/**\n * The entry's endpoint: its literal or transport-derived URL, else its\n * preset's literal, in the canonical spelling for its surface\n * (`normalizeEntryBaseUrl`: an `anthropic-messages` endpoint is its host root,\n * so `https://api.anthropic.com/v1` reads as `https://api.anthropic.com`).\n * Transport templates that still carry `{param}` placeholders never come\n * back — `resolveEntryBaseUrl` withholds those, and a preset's template is not\n * a URL.\n *\n * Every adapter reads the endpoint here and only re-spells it for a client\n * that wants something else ({@link versionedAnthropicBaseUrl}).\n */\nexport function entryBaseUrl(entry: AIProviderLlmEntry): string | undefined {\n const resolved =\n resolveEntryBaseUrl(entry) ??\n (entry.preset ? getProviderPreset(entry.preset)?.base_url : undefined);\n return normalizeEntryBaseUrl(resolved, entrySurface(entry));\n}\n\n/**\n * An `anthropic-messages` endpoint spelled for a client that appends only\n * `/messages` — `@ai-sdk/anthropic` (OpenCode) and Continue — rather than\n * `/v1/messages` like the Claude CLI, the Anthropic SDK and Goose. `baseUrl`\n * must already be canonical ({@link entryBaseUrl}); every other surface passes\n * through unchanged.\n */\nexport function versionedAnthropicBaseUrl(\n baseUrl: string,\n surface: AIProviderSurface | undefined,\n): string {\n if (surface !== \"anthropic-messages\") return baseUrl;\n // Append to the path, not the string: a query or fragment stays at the end.\n try {\n const url = new URL(baseUrl);\n url.pathname = `${url.pathname.replace(/\\/+$/, \"\")}/v1`;\n return url.toString();\n } catch {\n return `${baseUrl}/v1`;\n }\n}\n\n/**\n * True when a `credentials-n` harness already knows this endpoint under its\n * own catalog name — the entry names a preset and did not move it somewhere\n * else. Both sides are compared canonically, so `https://api.anthropic.com/v1`\n * is still the `anthropic` preset's endpoint.\n *\n * The one rule both halves of §2.3 read: it decides the name the env half\n * puts on the command line ({@link harnessProviderName}) *and* whether the\n * file half has to describe the endpoint at all. Reading it twice is what\n * keeps `-m <name>/<model>` and the generated provider file talking about the\n * same thing.\n */\nexport function isStockCatalogEndpoint(entry: AIProviderLlmEntry): boolean {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n if (!preset) return false;\n return entryBaseUrl(entry) === normalizeEntryBaseUrl(preset.base_url, entrySurface(entry));\n}\n\n/**\n * The provider name to give a `credentials-n` harness (`-m <name>/<model>`,\n * `GOOSE_PROVIDER`).\n *\n * A stock catalog endpoint is named by its preset, because that is the name\n * OpenCode's models.dev list and Goose's built-in provider table already use —\n * `prod-claude: {preset: anthropic}` is still Anthropic to them. An entry with\n * an endpoint of its own is named by its registry id: no built-in table knows\n * it, so the id is what its generated provider file is keyed by (the file half\n * of §2.3).\n */\nexport function harnessProviderName(providerId: string, entry: AIProviderLlmEntry): string {\n const preset = entry.preset ? getProviderPreset(entry.preset) : undefined;\n if (!preset || !isStockCatalogEndpoint(entry)) return providerId;\n return preset.id;\n}\n\n/**\n * Enabled `llm`/`embed` entries, in registry order. Also the set the file\n * adapters render (`opencode-config.ts`, `goose-custom-providers.ts`,\n * `continue-config-yaml.ts`): the env half and the file half must agree on\n * which entries exist before they can agree on what to call them.\n */\nexport function selectableEntries(\n registry: MergedAIProviderRegistry,\n): Array<[string, AIProviderLlmEntry]> {\n return registryEntries(registry).filter(\n (pair): pair is [string, AIProviderLlmEntry] =>\n (pair[1].kind === \"llm\" || pair[1].kind === \"embed\") && isEntryEnabled(pair[1]),\n );\n}\n\n/**\n * The provider-side model ids an entry declares, as `[logicalId, providerId]`\n * pairs in declaration order: every `model_map` entry, plus every\n * `capabilities` key the map does not rename.\n */\nexport function entryModelIds(entry: AIProviderLlmEntry): Array<[string, string]> {\n const logicalIds = [\n ...Object.keys(entry.model_map ?? {}),\n ...Object.keys(entry.capabilities ?? {}).filter((id) => !(id in (entry.model_map ?? {}))),\n ];\n return logicalIds.map((id) => [id, entry.model_map?.[id] ?? id]);\n}\n\nfunction describeBinding(\n providerId: string,\n entry: AIProviderLlmEntry,\n modelId: string | undefined,\n providerModelId: string | undefined,\n warnings: string[],\n): RegistryModelBinding {\n const surface = entrySurface(entry);\n const baseUrl = entryBaseUrl(entry);\n return {\n providerId,\n entry,\n ...(modelId === undefined ? {} : { modelId }),\n ...(providerModelId === undefined ? {} : { providerModelId }),\n ...(surface ? { surface } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n harnessProviderId: harnessProviderName(providerId, entry),\n warnings,\n };\n}\n\n/**\n * Resolve the session's endpoint + model.\n *\n * With no selector the first entry in registry order wins and the harness\n * keeps its own default model — exactly what an absent `model` meant before\n * the registry existed. Returns `undefined` when no entry can serve a model\n * (an empty, fully-disabled or voice-only registry).\n */\nexport function resolveRegistryBinding(\n session: EnvHarnessSession,\n): RegistryModelBinding | undefined {\n const entries = selectableEntries(session.registry);\n if (entries.length === 0) return undefined;\n\n const selector = session.modelRef?.trim();\n if (!selector) {\n const [providerId, entry] = entries[0];\n return describeBinding(providerId, entry, undefined, undefined, []);\n }\n\n // A selector that is exactly an entry id names the endpoint and nothing\n // else: the harness keeps its own default model. `parseModelRef` would read\n // it as a bare *model* id and fall back to registry order.\n const named = entries.find(([id]) => id === selector);\n if (named) return describeBinding(named[0], named[1], undefined, undefined, []);\n\n const resolved = parseModelRef(selector, session.registry, session.roles);\n if (!resolved) return undefined;\n const match = entries.find(([id]) => id === resolved.providerId);\n if (!match) return undefined;\n return describeBinding(\n match[0],\n match[1],\n resolved.modelId,\n resolved.providerModelId,\n resolved.warnings,\n );\n}\n\n/**\n * Every credential a `credentials-n` harness may use: one variable per\n * enabled registry entry. OpenCode, Goose and Continue have always received\n * *all* of them, not just the selected endpoint's, because they route across\n * providers inside a single session.\n */\nexport function credentialsForEveryProvider(session: EnvHarnessSession): Record<string, string> {\n return registryCredentialEnv(session.registry, { env: session.lookupEnv });\n}\n\n/**\n * Throw when the bound entry speaks a wire surface this harness cannot.\n *\n * The message names the offending surface and lists the ones the harness does\n * speak (`BUILTIN_HARNESS_CATALOG[harnessId].surfaces`). An entry that declares\n * no surface and names no preset is not judged — there is nothing to compare.\n */\nexport function assertHarnessSpeaksSurface(\n harnessId: string,\n productName: string,\n binding: RegistryModelBinding,\n): void {\n const supported = BUILTIN_HARNESS_CATALOG[harnessId]?.surfaces;\n if (!supported || supported.length === 0) return;\n const surface = binding.surface;\n if (!surface || supported.includes(surface)) return;\n throw new Error(\n `${productName} cannot speak the '${surface}' surface of AI provider entry ` +\n `'${binding.providerId}'. ${productName} speaks: ${supported.join(\", \")}. ` +\n `Point this session's model at an entry with one of those surfaces, ` +\n `or run it on a harness that speaks '${surface}'.`,\n );\n}\n\n/**\n * The models a `credentials-n` harness can be pointed at, straight from the\n * registry: every enabled entry's mapped ids, namespaced the way the harness\n * takes them (`-m <provider>/<model>`).\n *\n * These harnesses have no model-list endpoint of their own — OpenCode reads\n * models.dev, Goose and Continue read their config — so the registry is the\n * only list that describes *this* session's reachable models, and it needs no\n * network call to produce.\n */\nexport function registryModelEntries(session: EnvHarnessSession): ModelEntry[] {\n const out: ModelEntry[] = [];\n const seen = new Set<string>();\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n const harnessId = harnessProviderName(providerId, entry);\n const label = entry.label ?? providerId;\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n const id = `${harnessId}/${providerModelId}`;\n if (seen.has(id)) continue;\n seen.add(id);\n out.push({ id, name: `${label} ${logicalId}` });\n }\n }\n return out;\n}\n\n/**\n * Resolve the binding and enforce the surface — what a `single`-plurality\n * harness does at start.\n *\n * The registry is authoritative: pointing the harness at an entry it cannot\n * speak throws rather than silently running somewhere else. `undefined` when\n * the session configured no endpoint at all, which leaves the harness on its\n * own native auth.\n */\nexport function bindSingleProviderEntry(\n harnessId: string,\n productName: string,\n session: EnvHarnessSession,\n): RegistryModelBinding | undefined {\n const binding = resolveRegistryBinding(session);\n if (!binding) return undefined;\n assertHarnessSpeaksSurface(harnessId, productName, binding);\n return binding;\n}\n\n/**\n * The `<provider>/<model>` selector a `credentials-n` harness takes on its\n * command line (`opencode -m`). `undefined` when no model was selected — the\n * harness then uses its own default rather than being handed a bare provider.\n */\nexport function harnessModelSelector(binding: RegistryModelBinding): string | undefined {\n if (!binding.providerModelId) return undefined;\n return `${binding.harnessProviderId}/${binding.providerModelId}`;\n}\n\n/**\n * Continue's model selection is a **role binding**, not a flag: `cn` has no\n * `--model` option (only `--config <slug>`), and its `config.yaml` binds each\n * model to roles (`chat`, `edit`, `apply`, …). This is the binding for the\n * role a headless `cn -p` turn runs as, and the shape its generated\n * `config.yaml` is rendered from.\n *\n * `apiKeyEnv` is a variable *name*: the secret travels in the child\n * environment, never in a rendered config.\n */\nexport interface ContinueRoleBinding {\n /** Continue role this model serves. A headless prompt is a `chat` turn. */\n role: \"chat\";\n /** Registry id of the entry. */\n providerId: string;\n /** Provider name Continue knows the endpoint by. */\n provider: string;\n /** Provider-side model id. */\n model?: string;\n /** Endpoint, when the entry states one, spelled the way Continue's `apiBase` wants it. */\n apiBase?: string;\n /** Env var holding the credential — the name, never the value. */\n apiKeyEnv: string;\n}\n\n/**\n * Map the session's chosen endpoint onto the Continue role a headless turn\n * runs as. `undefined` when the session configured no endpoint — `cn` then\n * runs against whatever its own `config.yaml` / Hub login provides.\n */\nexport function continueRoleBinding(session: EnvHarnessSession): ContinueRoleBinding | undefined {\n const binding = resolveRegistryBinding(session);\n if (!binding) return undefined;\n return {\n role: \"chat\",\n providerId: binding.providerId,\n provider: binding.harnessProviderId,\n ...(binding.providerModelId ? { model: binding.providerModelId } : {}),\n ...(binding.baseUrl\n ? { apiBase: versionedAnthropicBaseUrl(binding.baseUrl, binding.surface) }\n : {}),\n apiKeyEnv: providerCredentialEnvName(binding.providerId),\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../asset-manager/src/renderers.ts"],"names":["stringifyYaml"],"mappings":"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","file":"chunk-T7HGEMNB.js","sourcesContent":["/**\n * Framework-specific renderers for GitAgent packages.\n *\n * Each renderer transforms a parsed GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the native file format that the target agent framework natively reads.\n *\n * Only harnesses with a full bridge harness (runtime execution) are included:\n * claude-code → .claude/agents/<name>.md (YAML frontmatter + markdown body)\n * omp → .omp/agents/<name>/ (directory with agent.yaml + SOUL.md)\n * codex → .codex/agents/<name>.toml (TOML)\n *\n * Removed (no bridge harness): cursor, roo, github-copilot, gemini, amp.\n * Add them back when a bridge harness is implemented.\n */\n\nimport {\n chmodSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join, normalize, relative, resolve } from \"node:path\";\nimport { buildAgentPromptSections } from \"@skaile/workspaces/core\";\nimport {\n ANTHROPIC_MODEL_ALIASES,\n type AgentLifecycle,\n type AgentManifest,\n normalizeAnthropicModel,\n} from \"@skaile/workspaces/types/manifests\";\nimport { stringify as stringifyYaml } from \"yaml\";\nimport type { AbilityRef, ContractRef } from \"./fragments.js\";\n\n// ── Types ─────────────────────────────────��───────────────────────────────────\n\nexport type { AgentManifest };\n\n/**\n * All data an {@link AgentRenderer} needs to produce a native agent definition file.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport interface AgentRenderInput {\n /** Parsed `agent.yaml` manifest for the GitAgent being rendered. */\n manifest: AgentManifest;\n /** Raw content of `SOUL.md`, or `null` if absent. */\n soul: string | null;\n /** Raw content of `RULES.md`, or `null` if absent. */\n rules: string | null;\n /** Raw content of `DUTIES.md`, or `null` if absent. */\n duties: string | null;\n /** Agent name used as the output filename and frontmatter `name` field. */\n agentName: string;\n /** Resolved absolute path to the framework's agent deploy directory (e.g. `.claude/agents/`). */\n agentDeployDir: string;\n /** Absolute path to the workspace root. */\n workspaceRoot: string;\n /** Resolved ability refs — installed skills referenced in the `## Installed Abilities` section. */\n abilityRefs: AbilityRef[];\n /** Resolved contract refs — installed in the skills dir, listed in the `## Contracts` section. */\n contractRefs: ContractRef[];\n /** Resolved framework fragment markdown blocks (agent-mode, handoff, skill-discovery, etc.). */\n frameworkFragments: string[];\n /** Per-project prompt extension markdown blocks loaded from `skaile.yaml` `agent.prompt-extensions`. */\n promptExtensions: string[];\n /** `standing` (long-running identity) or `role` (short-lived, callable). */\n lifecycle: AgentLifecycle;\n /** Names of the skills the agent composes (`composes[{kind: skill}]`), as installed. */\n skills: string[];\n /** Names of the MCP servers the agent's `mcp-server` slots are bound to. */\n mcpServers: string[];\n /**\n * Absolute path of the agent's source directory (where `agent.yaml` lives). The omp renderer\n * copies the local `composes` directories out of it.\n */\n srcDir?: string;\n}\n\n/**\n * Result returned by every {@link AgentRenderer}.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport interface AgentRenderResult {\n /** Paths to files/dirs rendered, relative to `workspaceRoot`. */\n created: string[];\n /** The subset of `created` whose bytes differ from what was on disk before (new or edited); an identical rewrite is skipped. */\n changed: string[];\n /** Non-fatal warnings (e.g. experimental feature notices). */\n warnings: string[];\n}\n\n/**\n * A function that transforms an {@link AgentRenderInput} into framework-native agent definition files.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport type AgentRenderer = (input: AgentRenderInput) => AgentRenderResult;\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/**\n * Unlink a symlink (dangling or not) at a path skaile is about to write. `writeFileSync` follows\n * a link, so the write would land in the file the link points at: the user's own file, outside\n * the project (p1060). The link is replaced by the rendered file instead.\n */\nfunction dropSymlink(path: string): void {\n try {\n if (lstatSync(path).isSymbolicLink()) unlinkSync(path);\n } catch {\n // nothing at the path: the write creates it\n }\n}\n\n/**\n * Write an agent definition file. Agents are compiled artifacts — they must\n * reflect the current canonical source — but a file that already holds exactly\n * these bytes is left untouched (mtime included), so a repeat install is a no-op.\n * `created` lists every rendered path; `changed` only those that were (re)written.\n */\nfunction writeAgent(\n filePath: string,\n content: string,\n workspaceRoot: string,\n created: string[],\n changed: string[],\n): void {\n const rel = relative(workspaceRoot, filePath);\n created.push(rel);\n dropSymlink(filePath);\n if (existsSync(filePath)) {\n try {\n if (readFileSync(filePath, \"utf-8\") === content) return;\n } catch {\n // unreadable (e.g. a directory in the way): fall through to the write\n }\n }\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content, \"utf-8\");\n changed.push(rel);\n}\n\n/**\n * Build the full agent system prompt body baked into the framework-native agent file.\n *\n * This is the sole source of the agent's system prompt body. Agent identity is rendered at install time; the harness reads it natively at runtime.\n * The rendered output ends up in .claude/agents/<name>.md, .omp/agents/<name>/SOUL.md,\n * .codex/agents/<name>.toml and is read natively by the framework on every agent invocation.\n *\n * Section order is owned by the shared builder (`buildAgentPromptSections` in\n * core, the same one the runner assembles its system prompt with):\n * soul → `<MEMORY>` → framework fragments → `## Constraints` (RULES) →\n * `## Duties` → `## Installed Abilities` → `## Contracts` → composed inline\n * blocks → prompt extensions.\n */\nfunction buildMarkdownBody(\n soul: string | null,\n rules: string | null,\n duties: string | null,\n abilityRefs: AbilityRef[],\n contractRefs: ContractRef[],\n frameworkFragments: string[],\n promptExtensions: string[],\n): string {\n const sections = buildAgentPromptSections({\n soul,\n constraints: rules,\n duties,\n abilities: abilityRefs,\n contracts: contractRefs,\n frameworkFragments,\n promptExtensions,\n });\n return `${sections.map((s) => s.text).join(\"\\n\\n\")}\\n`;\n}\n\n/** Escape a string for use as a TOML multi-line basic string (triple-quote). */\nfunction toTomlMultilineString(s: string): string {\n // Replace \"\"\" with \\\\\"\"\" to avoid breaking the TOML literal\n return s.replace(/\"\"\"/g, '\\\\\"\\\\\"\\\\\"');\n}\n\n/**\n * The manifest's `model` as a harness other than Claude Code can take it: the Claude Code\n * aliases (`inherit`, `opus`, `sonnet`, `haiku`) name no model of another harness' provider, so a\n * `preferred` that is one of them is dropped (the harness starts the agent on its own default) and\n * so is a `fallback` entry that is. Any other selector (`provider/model`, a full id, `@role`) is\n * the author's choice and is passed through. `undefined` when nothing is left.\n */\nfunction harnessModel(model: AgentManifest[\"model\"]): AgentManifest[\"model\"] | undefined {\n if (!model) return undefined;\n const claudeOnly = (m: string): boolean =>\n (ANTHROPIC_MODEL_ALIASES as readonly string[]).includes(m);\n const { preferred, fallback, ...rest } = model;\n const kept: NonNullable<AgentManifest[\"model\"]> = { ...rest };\n if (preferred && !claudeOnly(preferred)) kept.preferred = preferred;\n const fallbacks = (fallback ?? []).filter((m) => !claudeOnly(m));\n if (fallbacks.length > 0) kept.fallback = fallbacks;\n return Object.keys(kept).length > 0 ? kept : undefined;\n}\n\n/** Directory entries that are never part of an asset (build and OS leftovers). */\nconst COPY_SKIP = new Set([\".git\", \".DS_Store\", \"node_modules\", \"__pycache__\"]);\n\n/** Copy a file or directory tree byte for byte; a file that already holds these bytes is left alone. */\nfunction copyTree(from: string, to: string, workspaceRoot: string, changed: string[]): void {\n const stat = lstatSync(from);\n if (stat.isSymbolicLink()) return;\n if (stat.isDirectory()) {\n for (const name of readdirSync(from)) {\n if (COPY_SKIP.has(name) || name.endsWith(\".pyc\")) continue;\n copyTree(join(from, name), join(to, name), workspaceRoot, changed);\n }\n return;\n }\n if (!stat.isFile()) return;\n const bytes = readFileSync(from);\n dropSymlink(to);\n // A script keeps its exec bit: a copy that loses it shows as a mode change in `git status` (p1657).\n const executable = (stat.mode & 0o111) !== 0;\n if (existsSync(to)) {\n try {\n if (bytes.equals(readFileSync(to))) {\n if (executable && (lstatSync(to).mode & 0o100) === 0) chmodSync(to, stat.mode & 0o777);\n return;\n }\n } catch {\n // unreadable (e.g. a directory in the way): fall through to the write\n }\n }\n mkdirSync(dirname(to), { recursive: true });\n writeFileSync(to, bytes);\n if (executable) chmodSync(to, stat.mode & 0o777);\n changed.push(relative(workspaceRoot, to));\n}\n\n/**\n * Make the `composes` of an omp `agent.yaml` resolvable from where it is written: every local ref\n * (`./rules-local/house-rules`) is copied next to the `agent.yaml`, at the path the ref names, and a\n * local ref that climbs out of the agent directory (`../shared/rules`) is copied to\n * `composes/<name>` and rewritten to that path. Catalog refs (`skill:@pub/name`) are kept as written.\n */\nfunction bundleLocalComposes(\n composes: NonNullable<AgentManifest[\"composes\"]>,\n srcDir: string | undefined,\n destDir: string,\n workspaceRoot: string,\n changed: string[],\n warnings: string[],\n): NonNullable<AgentManifest[\"composes\"]> {\n if (!srcDir) return composes;\n return composes.map((item) => {\n if (!item.ref.startsWith(\"./\") && !item.ref.startsWith(\"../\")) return item;\n const from = resolve(srcDir, item.ref);\n if (!existsSync(from)) {\n warnings.push(`compose ref ${item.ref} not found at ${from}: not copied into ${destDir}`);\n return item;\n }\n const rel = normalize(item.ref);\n const inside = !rel.startsWith(\"..\");\n const target = inside ? rel : join(\"composes\", basename(from));\n copyTree(from, join(destDir, target), workspaceRoot, changed);\n return inside ? item : { ...item, ref: `./${target}` };\n });\n}\n\n// ── Claude Code ────────────��──────────────────────────────────────────────────\n// Format: .claude/agents/<name>.md\n// Sub-agent support: automatic (description-based) + @-mention\n// Required frontmatter: name, description\n//\n// Installation → runtime handoff:\n// skaile install (claudeCodeRenderer) creates the .md file from GitAgent source\n// ClaudeSdkHarness.startQuery() passes options.agent = agentName to the SDK query\n// The SDK reads .claude/agents/<agentName>.md to get model, tools, and system prompt\n// This is equivalent to running: claude --agent <agentName>\n\n/**\n * Render a GitAgent to Claude Code's `.claude/agents/<name>.md` format.\n *\n * Writes YAML frontmatter (name, description, model, tools, skills, mcpServers,\n * maxTurns, background) followed by the enriched system prompt body. `skills`\n * lists the composed skills, `mcpServers` the MCP servers the agent's\n * `mcp-server` slots are bound to, and `background: true` marks a `role`\n * instance whose `runtime.background` is set. Always overwrites to reflect\n * current source.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport const claudeCodeRenderer: AgentRenderer = ({\n manifest,\n soul,\n rules,\n duties,\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n lifecycle,\n skills,\n mcpServers,\n}) => {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const frontmatter: Record<string, unknown> = {\n name: agentName,\n description: manifest.description ?? `${agentName} agent`,\n };\n\n // Model: map to Claude Code's model field. Accepts aliases (sonnet/opus/haiku/inherit)\n // or a full Anthropic ID. Unrecognized values (e.g. legacy `claude-opus-4`) are\n // coerced to the matching family alias so the agent still loads.\n if (manifest.model?.preferred) {\n const raw = manifest.model.preferred;\n const normalized = normalizeAnthropicModel(raw);\n if (normalized !== raw) {\n warnings.push(\n `agent ${agentName}: model \"${raw}\" is not a valid Claude model ID; normalized to alias \"${normalized}\". Update agent.yaml.`,\n );\n }\n frontmatter.model = normalized;\n }\n\n // Tool restrictions\n if (manifest.tools?.allowed?.length) {\n frontmatter.tools = manifest.tools.allowed.join(\", \");\n }\n if (manifest.tools?.denied?.length) {\n frontmatter.disallowedTools = manifest.tools.denied.join(\", \");\n }\n\n if (skills.length > 0) frontmatter.skills = skills;\n if (mcpServers.length > 0) frontmatter.mcpServers = mcpServers;\n\n // Runtime\n if (manifest.runtime?.max_turns) {\n frontmatter.maxTurns = manifest.runtime.max_turns;\n }\n if (lifecycle === \"role\" && manifest.runtime?.background === true) {\n frontmatter.background = true;\n }\n\n // Metadata pass-through for Claude Code-specific fields\n if (manifest.metadata?.color) frontmatter.color = manifest.metadata.color;\n if (manifest.metadata?.effort) frontmatter.effort = manifest.metadata.effort;\n if (manifest.metadata?.isolation) frontmatter.isolation = manifest.metadata.isolation;\n\n const body = buildMarkdownBody(\n soul,\n rules,\n duties,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n );\n const content = `---\\n${stringifyYaml(frontmatter).trim()}\\n---\\n\\n${body}`;\n const filePath = join(agentDeployDir, `${agentName}.md`);\n writeAgent(filePath, content, workspaceRoot, created, changed);\n\n return { created, changed, warnings };\n};\n\n// ── OpenAI Codex ──────────────────────────────────────────────────────────────\n// Format: .codex/agents/<name>.toml\n// Sub-agent support: explicit user request only (not automatic)\n// Required fields: name, description, developer_instructions\n\n/**\n * Tools that change the workspace or run commands. Codex has no per-agent tool\n * allowlist; the closest per-agent control is `sandbox_mode`, so an agent whose\n * declared tool surface contains none of these is rendered `read-only`.\n */\nconst MUTATING_TOOLS = [\"Write\", \"Edit\", \"MultiEdit\", \"NotebookEdit\", \"Bash\"] as const;\n\n/** `read-only` when the manifest's tool surface cannot mutate anything, else `undefined` (inherit). */\nfunction codexSandboxMode(tools: AgentManifest[\"tools\"]): \"read-only\" | undefined {\n const allowed = tools?.allowed ?? [];\n const denied = new Set(tools?.denied ?? []);\n if (allowed.length > 0) {\n return allowed.some((t) => !denied.has(t) && (MUTATING_TOOLS as readonly string[]).includes(t))\n ? undefined\n : \"read-only\";\n }\n // No allowlist: everything not denied is available.\n return MUTATING_TOOLS.every((t) => denied.has(t)) ? \"read-only\" : undefined;\n}\n\n/** Directory (next to `agents/`) holding each Codex agent's markdown identity, one file per agent. */\nexport const CODEX_IDENTITY_DIR = \"skaile-agents\";\n\n/**\n * Render a GitAgent to OpenAI Codex's `.codex/agents/<name>.toml` format.\n *\n * Produces a TOML file with `name`, `description`, `model`, `sandbox_mode` and\n * `developer_instructions`. `sandbox_mode = \"read-only\"` is the per-agent tool\n * restriction: it is emitted when the manifest's `tools` leave the agent no way\n * to write or run commands (Codex has no per-tool allowlist). Triple-quoted\n * TOML multi-line strings are escaped to avoid syntax errors.\n *\n * Also writes the agent's identity as `.codex/skaile-agents/<name>.md`, which\n * the Codex harness combines with the session's runtime prompt (one file per\n * agent, so several instances never overwrite each other).\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport const codexRenderer: AgentRenderer = ({\n manifest,\n soul,\n rules,\n duties,\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n}) => {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const instructions = buildMarkdownBody(\n soul,\n rules,\n duties,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n );\n const escaped = toTomlMultilineString(instructions);\n\n const lines: string[] = [\n `name = ${JSON.stringify(agentName)}`,\n `description = ${JSON.stringify(manifest.description ?? `${agentName} agent`)}`,\n ];\n // A Claude Code alias (`sonnet`) names no Codex model: leave `model` out and Codex uses its own.\n const model = harnessModel(manifest.model)?.preferred;\n if (model) lines.push(`model = ${JSON.stringify(model)}`);\n const sandboxMode = codexSandboxMode(manifest.tools);\n if (sandboxMode) lines.push(`sandbox_mode = ${JSON.stringify(sandboxMode)}`);\n lines.push(`developer_instructions = \"\"\"`, escaped.trim(), `\"\"\"`);\n\n const content = `${lines.join(\"\\n\")}\\n`;\n const filePath = join(agentDeployDir, `${agentName}.toml`);\n writeAgent(filePath, content, workspaceRoot, created, changed);\n\n // Write the full agent identity as markdown for the Codex harness to read at runtime.\n // The harness combines this with the session's dynamic content (resources, context)\n // and passes the result via model_instructions_file.\n const agentMdPath = join(dirname(agentDeployDir), CODEX_IDENTITY_DIR, `${agentName}.md`);\n writeAgent(agentMdPath, instructions, workspaceRoot, created, changed);\n\n return { created, changed, warnings };\n};\n\n// ── oh-my-pi ─��────────────��────────────────────────────────��─────────────────\n// Format: .omp/agents/<name>/ (directory with agent.yaml + SOUL.md + RULES.md)\n// oh-my-pi reads GitAgent directories natively via PI_CODING_AGENT_DIR.\n// The renderer copies/enriches the source directory rather than flattening to .md.\n//\n// Installation → runtime handoff:\n// skaile install (ompRenderer) creates .omp/agents/<name>/ from GitAgent source\n// OmpHarness._start() sets env.PI_CODING_AGENT_DIR = agentDir in the child process\n// omp reads SOUL.md/RULES.md/knowledge/ from that directory natively on startup\n//\n// Note: REPL mode can bypass the install step — agentDir can point directly to the\n// GitAgent source directory, and omp will read it natively via PI_CODING_AGENT_DIR.\n// The rendered .omp/agents/ copy is only needed when the source is not accessible\n// from the project cwd (e.g. different repo, remote workspace).\n\n/**\n * Render a GitAgent to oh-my-pi's `.omp/agents/<name>/` directory format.\n *\n * Writes `agent.yaml` (resolved model/tools/delegation plus the 0.2\n * declaration — `composes` verbatim, `lifecycle`, `io`, `memory`, `triggers`,\n * `capabilities`) and an enriched `SOUL.md` that includes fragments and\n * extensions. omp reads this directory natively via the `PI_CODING_AGENT_DIR`\n * environment variable.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport const ompRenderer: AgentRenderer = ({\n manifest,\n soul,\n rules,\n duties,\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n lifecycle,\n srcDir,\n}) => {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const destDir = join(agentDeployDir, agentName);\n\n // Write agent.yaml with tools resolved\n const agentYaml: Record<string, unknown> = {\n spec_version: manifest.spec_version ?? \"0.2\",\n name: agentName,\n version: manifest.version ?? \"1.0.0\",\n description: manifest.description ?? `${agentName} agent`,\n lifecycle,\n };\n // The model: omp takes provider-prefixed full IDs and `@role` selectors, and resolves the\n // family aliases it knows (verified live 2026-09-20 against omp v18.1.10 through\n // teamclaude.postxl.com: `--model anthropic/opus` produced\n // `model_change {\"model\":\"anthropic/claude-opus-5\",\"resolvedModelIsFallback\":false}`).\n // The Claude Code aliases the manifest writes (`sonnet`, `haiku`, `opus`, `inherit`) name no\n // model of an omp deployment on another provider, so they are left out and omp starts the agent\n // on its own default. Any other selector is passed through verbatim: it is not checked here, and\n // not coerced by `normalizeAnthropicModel`, which would substitute a different model on any\n // provider but Anthropic (see `resolveManifestModel` in `@skaile/workspaces/bridge`).\n const model = harnessModel(manifest.model);\n if (model) agentYaml.model = model;\n if (manifest.tools) agentYaml.tools = manifest.tools;\n if (manifest.delegation) agentYaml.delegation = manifest.delegation;\n if (manifest.runtime) agentYaml.runtime = manifest.runtime;\n if (manifest.io) agentYaml.io = manifest.io;\n if (manifest.memory) agentYaml.memory = manifest.memory;\n if (manifest.triggers?.length) agentYaml.triggers = manifest.triggers;\n if (manifest.capabilities?.length) agentYaml.capabilities = manifest.capabilities;\n if (manifest.composes?.length) {\n agentYaml.composes = bundleLocalComposes(\n manifest.composes,\n srcDir,\n destDir,\n workspaceRoot,\n changed,\n warnings,\n );\n }\n if (manifest.tags?.length) agentYaml.tags = manifest.tags;\n if (manifest.metadata) agentYaml.metadata = manifest.metadata;\n\n writeAgent(join(destDir, \"agent.yaml\"), stringifyYaml(agentYaml), workspaceRoot, [], changed);\n\n // Write SOUL.md (enriched with fragments and extensions, like other renderers)\n const enrichedSoul = buildMarkdownBody(\n soul,\n rules,\n duties,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n );\n writeAgent(join(destDir, \"SOUL.md\"), enrichedSoul, workspaceRoot, [], changed);\n\n // omp lists the agents it can spawn from flat `.omp/agents/<name>.md` files only (verified live\n // against omp 18.12.5: a `<name>/agent.yaml` directory is not listed, a flat file is), so the\n // directory above carries the full GitAgent package and this file is what omp loads.\n const frontmatter: Record<string, unknown> = {\n name: agentName,\n description: manifest.description ?? `${agentName} agent`,\n };\n if (manifest.tools?.allowed?.length) frontmatter.tools = manifest.tools.allowed.join(\", \");\n const selector = model?.preferred;\n if (selector) frontmatter.model = selector;\n writeAgent(\n join(agentDeployDir, `${agentName}.md`),\n `---\\n${stringifyYaml(frontmatter).trim()}\\n---\\n\\n${enrichedSoul}`,\n workspaceRoot,\n created,\n changed,\n );\n\n created.push(relative(workspaceRoot, destDir));\n return { created, changed, warnings };\n};\n\n// ── Renderer registry ──────────────────────────────���──────────────────────────\n\nexport type Log = (msg: string) => void;\nconst noop: Log = () => {};\n\n/**\n * Render an agent to framework-native format via the renderer registry.\n *\n * Shared by both the simple deploy path (`deployAsset`) and the enriched scaffold path (agents layer).\n *\n * @param input - Full render input including manifest, SOUL/RULES text, and resolved refs.\n * @param harnessTarget - Agent framework ID to look up in {@link AGENT_RENDERERS}.\n * @param log - Optional logger callback for progress messages.\n * @returns Object with `created` file paths and `warnings` list.\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport function renderAgentToFramework(\n input: AgentRenderInput,\n harnessTarget: string,\n log: Log = noop,\n): AgentRenderResult {\n const renderer = AGENT_RENDERERS[harnessTarget];\n if (!renderer) {\n return {\n created: [],\n changed: [],\n warnings: [`No renderer for framework \"${harnessTarget}\"`],\n };\n }\n const result = renderer(input);\n for (const c of result.created) log(` rendered agent: ${c}`);\n for (const w of result.warnings) log(` warn: ${w}`);\n return result;\n}\n\n/**\n * Registry mapping framework IDs to their {@link AgentRenderer} functions.\n *\n * Only harnesses with a full bridge harness are registered. Add new entries\n * when a bridge harness is implemented in `workspaces/bridge/src/harnesses/`.\n *\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport const AGENT_RENDERERS: Record<string, AgentRenderer> = {\n \"claude-code\": claudeCodeRenderer,\n omp: ompRenderer,\n codex: codexRenderer,\n};\n\n/**\n * Returns `true` if the given harness target supports file-based sub-agent installation.\n *\n * @param harnessTarget - Agent framework ID to check.\n * @returns `true` when `harnessTarget` has a registered entry in {@link AGENT_RENDERERS}.\n * @docLink packages/asset-manager/api-reference#renderers\n */\nexport function harnessTargetSupportsAgents(harnessTarget: string): boolean {\n return harnessTarget in AGENT_RENDERERS;\n}\n\n/**\n * The files the renderer of `harnessTarget` writes for the agent `agentName` into the agent deploy\n * directory `agentDeployDir` (`.claude/agents`, `.codex/agents`, `.omp/agents`): what `add\n * --dry-run` lists (p1621). Files a `composes:` of local refs adds to omp are not listed. Empty\n * for a harness target without an agent renderer.\n */\nexport function agentRenderFiles(\n harnessTarget: string,\n agentDeployDir: string,\n agentName: string,\n): string[] {\n switch (harnessTarget) {\n case \"claude-code\":\n return [join(agentDeployDir, `${agentName}.md`)];\n case \"codex\":\n return [\n join(agentDeployDir, `${agentName}.toml`),\n join(dirname(agentDeployDir), CODEX_IDENTITY_DIR, `${agentName}.md`),\n ];\n case \"omp\":\n return [\n join(agentDeployDir, agentName, \"agent.yaml\"),\n join(agentDeployDir, agentName, \"SOUL.md\"),\n join(agentDeployDir, `${agentName}.md`),\n ];\n default:\n return [];\n }\n}\n"]}