@skaile/workspaces 6.6.0 → 6.8.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 (381) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/ai-sdk.js +10 -17
  3. package/dist/ai-sdk.js.map +1 -1
  4. package/dist/app-sdk/index.js +1 -1
  5. package/dist/{asset-feeds-WQ6YQPHV.js → asset-feeds-NU5UOO5F.js} +18 -18
  6. package/dist/{asset-feeds-WQ6YQPHV.js.map → asset-feeds-NU5UOO5F.js.map} +1 -1
  7. package/dist/asset-manager/catalog-deployer.js +4 -4
  8. package/dist/asset-manager/index.js +10 -10
  9. package/dist/asset-manager/installer.js +6 -6
  10. package/dist/asset-manager/renderers.js +5 -5
  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 +34 -20
  21. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  22. package/dist/bridge/harnesses/codex.js +9 -8
  23. package/dist/bridge/harnesses/codex.js.map +1 -1
  24. package/dist/bridge/harnesses/continue.js +11 -9
  25. package/dist/bridge/harnesses/continue.js.map +1 -1
  26. package/dist/bridge/harnesses/echo.js +5 -4
  27. package/dist/bridge/harnesses/echo.js.map +1 -1
  28. package/dist/bridge/harnesses/gemini.js +8 -6
  29. package/dist/bridge/harnesses/goose.js +11 -9
  30. package/dist/bridge/harnesses/goose.js.map +1 -1
  31. package/dist/bridge/harnesses/omp.js +9 -7
  32. package/dist/bridge/harnesses/omp.js.map +1 -1
  33. package/dist/bridge/harnesses/opencode.js +11 -9
  34. package/dist/bridge/harnesses/opencode.js.map +1 -1
  35. package/dist/bridge/harnesses/qwen.js +9 -7
  36. package/dist/bridge/harnesses/qwen.js.map +1 -1
  37. package/dist/bridge/index.js +17 -15
  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/claude-self-turns.d.ts.map +1 -1
  47. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  48. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  49. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  50. package/dist/bridge/src/harnesses/omp-models-yml.d.ts.map +1 -1
  51. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  52. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  53. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  54. package/dist/bridge/src/index.d.ts +2 -1
  55. package/dist/bridge/src/index.d.ts.map +1 -1
  56. package/dist/bridge/src/types.d.ts +11 -0
  57. package/dist/bridge/src/types.d.ts.map +1 -1
  58. package/dist/{chunk-LBJ4M5J2.js → chunk-237BMOZW.js} +4 -4
  59. package/dist/{chunk-LBJ4M5J2.js.map → chunk-237BMOZW.js.map} +1 -1
  60. package/dist/{chunk-XYCYGN3Q.js → chunk-2I5HNM7K.js} +79 -20
  61. package/dist/chunk-2I5HNM7K.js.map +1 -0
  62. package/dist/{chunk-MXI3XWV6.js → chunk-3HSLJAMJ.js} +4 -4
  63. package/dist/{chunk-MXI3XWV6.js.map → chunk-3HSLJAMJ.js.map} +1 -1
  64. package/dist/{chunk-SCRYXAHH.js → chunk-3NJFPGEB.js} +6 -6
  65. package/dist/{chunk-SCRYXAHH.js.map → chunk-3NJFPGEB.js.map} +1 -1
  66. package/dist/{chunk-RHCEX2EV.js → chunk-3QX2X77G.js} +3 -3
  67. package/dist/{chunk-RHCEX2EV.js.map → chunk-3QX2X77G.js.map} +1 -1
  68. package/dist/{chunk-DS6UUCFG.js → chunk-4CD2R4MJ.js} +5 -4
  69. package/dist/chunk-4CD2R4MJ.js.map +1 -0
  70. package/dist/{chunk-7I5PNB2G.js → chunk-5TLMHB2U.js} +3 -3
  71. package/dist/{chunk-7I5PNB2G.js.map → chunk-5TLMHB2U.js.map} +1 -1
  72. package/dist/{chunk-KSH5CFQS.js → chunk-6PVRP3LW.js} +36 -5
  73. package/dist/chunk-6PVRP3LW.js.map +1 -0
  74. package/dist/{chunk-BSMW3PX2.js → chunk-6UP2EDFN.js} +4 -313
  75. package/dist/chunk-6UP2EDFN.js.map +1 -0
  76. package/dist/{chunk-U3UDOX6I.js → chunk-6ZM5X2XW.js} +6 -4
  77. package/dist/chunk-6ZM5X2XW.js.map +1 -0
  78. package/dist/{chunk-JRVQV7WC.js → chunk-757G6TTZ.js} +595 -126
  79. package/dist/chunk-757G6TTZ.js.map +1 -0
  80. package/dist/{chunk-G5SYFFMD.js → chunk-7NN3P6VF.js} +22 -5
  81. package/dist/chunk-7NN3P6VF.js.map +1 -0
  82. package/dist/{chunk-7PVGND4J.js → chunk-7YOHUX2M.js} +21 -14
  83. package/dist/chunk-7YOHUX2M.js.map +1 -0
  84. package/dist/{chunk-O7QZI6MQ.js → chunk-BB5EJLKZ.js} +2 -2
  85. package/dist/{chunk-O7QZI6MQ.js.map → chunk-BB5EJLKZ.js.map} +1 -1
  86. package/dist/{chunk-2M3VLKT2.js → chunk-BRPEW3UL.js} +3 -3
  87. package/dist/{chunk-2M3VLKT2.js.map → chunk-BRPEW3UL.js.map} +1 -1
  88. package/dist/{chunk-EPXZQIC6.js → chunk-DFP476EU.js} +8 -4
  89. package/dist/chunk-DFP476EU.js.map +1 -0
  90. package/dist/{chunk-B6N653ZG.js → chunk-DRHJRTAS.js} +6 -6
  91. package/dist/{chunk-B6N653ZG.js.map → chunk-DRHJRTAS.js.map} +1 -1
  92. package/dist/{chunk-4J7JQX4G.js → chunk-E3KABQS3.js} +4 -4
  93. package/dist/{chunk-4J7JQX4G.js.map → chunk-E3KABQS3.js.map} +1 -1
  94. package/dist/{chunk-MMOWIRHP.js → chunk-G44FFUMA.js} +12 -10
  95. package/dist/chunk-G44FFUMA.js.map +1 -0
  96. package/dist/{chunk-JIQUF3X2.js → chunk-G7NMF5WQ.js} +3 -3
  97. package/dist/{chunk-JIQUF3X2.js.map → chunk-G7NMF5WQ.js.map} +1 -1
  98. package/dist/{chunk-HGZN6JLP.js → chunk-HKRME377.js} +4 -4
  99. package/dist/{chunk-HGZN6JLP.js.map → chunk-HKRME377.js.map} +1 -1
  100. package/dist/{chunk-6A6HE5LW.js → chunk-HLAEYFUN.js} +3 -3
  101. package/dist/{chunk-6A6HE5LW.js.map → chunk-HLAEYFUN.js.map} +1 -1
  102. package/dist/{chunk-F4CZQD3T.js → chunk-I6XH46Q6.js} +4 -3
  103. package/dist/chunk-I6XH46Q6.js.map +1 -0
  104. package/dist/{chunk-7SJHSGUV.js → chunk-K6HCOTOZ.js} +16 -15
  105. package/dist/chunk-K6HCOTOZ.js.map +1 -0
  106. package/dist/{chunk-AQNW2FET.js → chunk-K7ZGY2BY.js} +351 -51
  107. package/dist/chunk-K7ZGY2BY.js.map +1 -0
  108. package/dist/{chunk-GTGWRKMJ.js → chunk-KHWGUXSF.js} +6 -6
  109. package/dist/{chunk-GTGWRKMJ.js.map → chunk-KHWGUXSF.js.map} +1 -1
  110. package/dist/{chunk-DI6J2PJB.js → chunk-KO3VSZQP.js} +47 -18
  111. package/dist/chunk-KO3VSZQP.js.map +1 -0
  112. package/dist/{chunk-VXYZ5M7Z.js → chunk-LJ6PLEDU.js} +64 -27
  113. package/dist/chunk-LJ6PLEDU.js.map +1 -0
  114. package/dist/{chunk-SHTXMERQ.js → chunk-LL5GMUQG.js} +10 -8
  115. package/dist/chunk-LL5GMUQG.js.map +1 -0
  116. package/dist/{chunk-TCH5UDKT.js → chunk-NW7Y5SNK.js} +10 -8
  117. package/dist/chunk-NW7Y5SNK.js.map +1 -0
  118. package/dist/{chunk-J4WKNJHO.js → chunk-O5Y7VMVQ.js} +15 -14
  119. package/dist/chunk-O5Y7VMVQ.js.map +1 -0
  120. package/dist/{chunk-6SXSVKQY.js → chunk-O7ADRMCR.js} +63 -14
  121. package/dist/chunk-O7ADRMCR.js.map +1 -0
  122. package/dist/{chunk-WW5NAU6N.js → chunk-ORXV3UB6.js} +3 -3
  123. package/dist/{chunk-WW5NAU6N.js.map → chunk-ORXV3UB6.js.map} +1 -1
  124. package/dist/{chunk-VJRL6ZK6.js → chunk-OSABUEWA.js} +3 -3
  125. package/dist/{chunk-VJRL6ZK6.js.map → chunk-OSABUEWA.js.map} +1 -1
  126. package/dist/{chunk-XD3RYAMR.js → chunk-PMZMG3HC.js} +6 -6
  127. package/dist/{chunk-XD3RYAMR.js.map → chunk-PMZMG3HC.js.map} +1 -1
  128. package/dist/{chunk-J262X4JU.js → chunk-Q6FKWPRO.js} +69 -16
  129. package/dist/chunk-Q6FKWPRO.js.map +1 -0
  130. package/dist/{chunk-E2EC6SAX.js → chunk-QC5BYUED.js} +51 -15
  131. package/dist/chunk-QC5BYUED.js.map +1 -0
  132. package/dist/{chunk-RAU5QPI6.js → chunk-QCR5AE5E.js} +5 -5
  133. package/dist/{chunk-RAU5QPI6.js.map → chunk-QCR5AE5E.js.map} +1 -1
  134. package/dist/{chunk-I5IF3JCG.js → chunk-QGA2OBUJ.js} +3 -3
  135. package/dist/{chunk-I5IF3JCG.js.map → chunk-QGA2OBUJ.js.map} +1 -1
  136. package/dist/{chunk-TUFNY6OD.js → chunk-QW5B3TEO.js} +10 -4
  137. package/dist/chunk-QW5B3TEO.js.map +1 -0
  138. package/dist/{chunk-Z4FERR4U.js → chunk-RDIGVPXX.js} +2 -2
  139. package/dist/{chunk-Z4FERR4U.js.map → chunk-RDIGVPXX.js.map} +1 -1
  140. package/dist/{chunk-SZKCE7EC.js → chunk-REAF7ZFA.js} +5 -5
  141. package/dist/{chunk-SZKCE7EC.js.map → chunk-REAF7ZFA.js.map} +1 -1
  142. package/dist/{chunk-OY22B7E2.js → chunk-SBNUXJ6E.js} +3 -3
  143. package/dist/{chunk-OY22B7E2.js.map → chunk-SBNUXJ6E.js.map} +1 -1
  144. package/dist/chunk-SILFO5RY.js +315 -0
  145. package/dist/chunk-SILFO5RY.js.map +1 -0
  146. package/dist/{chunk-6ARPZHOV.js → chunk-TMJBEGS4.js} +35 -6
  147. package/dist/chunk-TMJBEGS4.js.map +1 -0
  148. package/dist/{chunk-5XHQBCB5.js → chunk-WFK4MUBL.js} +21 -7
  149. package/dist/chunk-WFK4MUBL.js.map +1 -0
  150. package/dist/chunk-WWSRIT3J.js +59 -0
  151. package/dist/chunk-WWSRIT3J.js.map +1 -0
  152. package/dist/{chunk-N2PBAXAA.js → chunk-XCGDRLMH.js} +3 -3
  153. package/dist/{chunk-N2PBAXAA.js.map → chunk-XCGDRLMH.js.map} +1 -1
  154. package/dist/{chunk-YN6N3RBM.js → chunk-XIIIGLSL.js} +47 -11
  155. package/dist/chunk-XIIIGLSL.js.map +1 -0
  156. package/dist/{chunk-65UAC3ZR.js → chunk-Y6LC5PEZ.js} +4 -3
  157. package/dist/chunk-Y6LC5PEZ.js.map +1 -0
  158. package/dist/{chunk-KSUT5KAE.js → chunk-YEOG7CWQ.js} +3 -3
  159. package/dist/{chunk-KSUT5KAE.js.map → chunk-YEOG7CWQ.js.map} +1 -1
  160. package/dist/{chunk-5ETYBC2X.js → chunk-YGP6XEPA.js} +6 -6
  161. package/dist/{chunk-5ETYBC2X.js.map → chunk-YGP6XEPA.js.map} +1 -1
  162. package/dist/{chunk-2TLPC6TQ.js → chunk-YHNPWSSH.js} +41 -19
  163. package/dist/chunk-YHNPWSSH.js.map +1 -0
  164. package/dist/{chunk-6RHWTZPT.js → chunk-YZD7DUEF.js} +3 -3
  165. package/dist/{chunk-6RHWTZPT.js.map → chunk-YZD7DUEF.js.map} +1 -1
  166. package/dist/{chunk-4BFEPZ6J.js → chunk-ZBA4P5TD.js} +3 -3
  167. package/dist/{chunk-4BFEPZ6J.js.map → chunk-ZBA4P5TD.js.map} +1 -1
  168. package/dist/{claude-code-LZH7Y4Y5.js → claude-code-AESK7XO4.js} +4 -4
  169. package/dist/{claude-code-LZH7Y4Y5.js.map → claude-code-AESK7XO4.js.map} +1 -1
  170. package/dist/cli/index.js +474 -198
  171. package/dist/cli/index.js.map +1 -1
  172. package/dist/cli/src/agent-pins.d.ts +9 -3
  173. package/dist/cli/src/agent-pins.d.ts.map +1 -1
  174. package/dist/cli/src/commands/asset-cmd.d.ts +1 -1
  175. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  176. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  177. package/dist/cli/src/commands/catalog.d.ts +2 -0
  178. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  179. package/dist/cli/src/commands/config.d.ts.map +1 -1
  180. package/dist/cli/src/commands/harness-preflight.d.ts +38 -0
  181. package/dist/cli/src/commands/harness-preflight.d.ts.map +1 -0
  182. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  183. package/dist/cli/src/commands/library-index.d.ts +16 -0
  184. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  185. package/dist/cli/src/commands/migrate-assets.d.ts +5 -0
  186. package/dist/cli/src/commands/migrate-assets.d.ts.map +1 -1
  187. package/dist/cli/src/commands/migrate-harness.d.ts +15 -7
  188. package/dist/cli/src/commands/migrate-harness.d.ts.map +1 -1
  189. package/dist/cli/src/commands/migrate.d.ts.map +1 -1
  190. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  191. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -1
  192. package/dist/cli/src/commands/project.d.ts +14 -0
  193. package/dist/cli/src/commands/project.d.ts.map +1 -1
  194. package/dist/cli/src/commands/run.d.ts.map +1 -1
  195. package/dist/cli/src/commands/serve-preflight.d.ts +6 -5
  196. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  197. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  198. package/dist/cli/src/commands/session.d.ts.map +1 -1
  199. package/dist/cli/src/commands/source.d.ts +11 -0
  200. package/dist/cli/src/commands/source.d.ts.map +1 -1
  201. package/dist/cli/src/commands/update.d.ts.map +1 -1
  202. package/dist/cli/src/commands/validate-instances.d.ts +6 -0
  203. package/dist/cli/src/commands/validate-instances.d.ts.map +1 -1
  204. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  205. package/dist/cli/src/commands/why.d.ts.map +1 -1
  206. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -1
  207. package/dist/cli/src/session-hint.d.ts +7 -0
  208. package/dist/cli/src/session-hint.d.ts.map +1 -0
  209. package/dist/connectors/config.js +3 -3
  210. package/dist/connectors/index.js +21 -19
  211. package/dist/connectors/src/managed-gitconfig.d.ts +6 -4
  212. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  213. package/dist/{connectors-HU5MHSUJ.js → connectors-5ZZRVAPD.js} +24 -22
  214. package/dist/{connectors-HU5MHSUJ.js.map → connectors-5ZZRVAPD.js.map} +1 -1
  215. package/dist/connectors-shared/index.js +2 -2
  216. package/dist/core/index.js +4 -4
  217. package/dist/core/publish-manifest.js +1 -1
  218. package/dist/core/runtime-assets.js +3 -3
  219. package/dist/core/src/agent-instances.d.ts +11 -0
  220. package/dist/core/src/agent-instances.d.ts.map +1 -1
  221. package/dist/core/src/index.d.ts +3 -2
  222. package/dist/core/src/index.d.ts.map +1 -1
  223. package/dist/core/src/publish-manifest.d.ts +20 -6
  224. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  225. package/dist/core/src/repo-manager.d.ts +9 -0
  226. package/dist/core/src/repo-manager.d.ts.map +1 -1
  227. package/dist/core/src/run-state-ignore.d.ts +17 -0
  228. package/dist/core/src/run-state-ignore.d.ts.map +1 -0
  229. package/dist/core/src/workspace-config.d.ts.map +1 -1
  230. package/dist/core/workspace-config.js +2 -2
  231. package/dist/deploy/index.js +4 -4
  232. package/dist/discovery/index.js +2 -2
  233. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  234. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  235. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  236. package/dist/{ensure-sources-CAMWJTMR.js → ensure-sources-VLJ7AUUK.js} +26 -24
  237. package/dist/ensure-sources-VLJ7AUUK.js.map +1 -0
  238. package/dist/factory-assets/connectors/box.js +21 -19
  239. package/dist/factory-assets/connectors/deploy.js +21 -19
  240. package/dist/factory-assets/connectors/devserver.js +21 -19
  241. package/dist/factory-assets/connectors/flow/adapter.js +21 -19
  242. package/dist/factory-assets/connectors/flow/contract/schema.d.ts +3 -3
  243. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts +2 -0
  244. package/dist/factory-assets/connectors/flow/engine/router-settlement.d.ts.map +1 -1
  245. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  246. package/dist/factory-assets/connectors/flow/run-flow.js +22 -20
  247. package/dist/factory-assets/connectors/flow.js +21 -19
  248. package/dist/factory-assets/connectors/git/CONNECTOR.md +4 -1
  249. package/dist/factory-assets/connectors/git/exec.d.ts.map +1 -1
  250. package/dist/factory-assets/connectors/git.js +21 -19
  251. package/dist/factory-assets/connectors/gmail.js +21 -19
  252. package/dist/factory-assets/connectors/googledrive.js +21 -19
  253. package/dist/factory-assets/connectors/local.js +21 -19
  254. package/dist/factory-assets/connectors/mattermost.js +21 -19
  255. package/dist/factory-assets/connectors/memory.js +21 -19
  256. package/dist/factory-assets/connectors/minio.js +21 -19
  257. package/dist/factory-assets/connectors/postgres.js +21 -19
  258. package/dist/factory-assets/connectors/s3.js +21 -19
  259. package/dist/factory-assets/connectors/sharepoint.js +21 -19
  260. package/dist/factory-assets/connectors/sqlite.js +21 -19
  261. package/dist/factory-assets/connectors/static-server.js +21 -19
  262. package/dist/factory-assets/connectors/tunnel.js +21 -19
  263. package/dist/factory-assets/connectors/webdav.js +21 -19
  264. package/dist/factory-assets/connectors/xstate-store.js +21 -19
  265. package/dist/factory-assets/connectors/xstate.js +21 -19
  266. package/dist/factory-assets/skills/authoring-skaile-assets/SKILL.md +14 -1
  267. package/dist/{flows-GVOVQGQW.js → flows-I6ODIPZZ.js} +7 -7
  268. package/dist/{flows-GVOVQGQW.js.map → flows-I6ODIPZZ.js.map} +1 -1
  269. package/dist/{helpers-WMCCODAV.js → helpers-APXGTZ5A.js} +26 -24
  270. package/dist/{helpers-WMCCODAV.js.map → helpers-APXGTZ5A.js.map} +1 -1
  271. package/dist/library/index.js +7 -7
  272. package/dist/library/install.js +2 -2
  273. package/dist/library/src/manifest-writer.d.ts +5 -0
  274. package/dist/library/src/manifest-writer.d.ts.map +1 -1
  275. package/dist/{library-publish-UQQMHTND.js → library-publish-B5HL4OBE.js} +47 -45
  276. package/dist/library-publish-B5HL4OBE.js.map +1 -0
  277. package/dist/model-endpoint/index.js +8 -7
  278. package/dist/{open-library-OJ4HT2X4.js → open-library-F56D46K7.js} +29 -27
  279. package/dist/{open-library-OJ4HT2X4.js.map → open-library-F56D46K7.js.map} +1 -1
  280. package/dist/{open-registry-LWGIOJDK.js → open-registry-RZW2AFD6.js} +11 -11
  281. package/dist/{open-registry-LWGIOJDK.js.map → open-registry-RZW2AFD6.js.map} +1 -1
  282. package/dist/{paths-FR2752HV.js → paths-RPK5PNZQ.js} +7 -7
  283. package/dist/{paths-FR2752HV.js.map → paths-RPK5PNZQ.js.map} +1 -1
  284. package/dist/{plugin-store-IALJUBN2.js → plugin-store-OJTERUEZ.js} +7 -7
  285. package/dist/{plugin-store-IALJUBN2.js.map → plugin-store-OJTERUEZ.js.map} +1 -1
  286. package/dist/{project-UQFCYHYS.js → project-GLTP6VFV.js} +43 -41
  287. package/dist/{project-UQFCYHYS.js.map → project-GLTP6VFV.js.map} +1 -1
  288. package/dist/resolver/index.js +4 -4
  289. package/dist/runner/index.js +32 -30
  290. package/dist/runner/src/capability-roundtrip.d.ts +8 -7
  291. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  292. package/dist/runner/src/composition/run-snapshot.d.ts +7 -1
  293. package/dist/runner/src/composition/run-snapshot.d.ts.map +1 -1
  294. package/dist/runner/src/serve.d.ts.map +1 -1
  295. package/dist/runner/src/turn-scheduler.d.ts +8 -0
  296. package/dist/runner/src/turn-scheduler.d.ts.map +1 -1
  297. package/dist/runner/src/turn-visibility.d.ts +97 -0
  298. package/dist/runner/src/turn-visibility.d.ts.map +1 -0
  299. package/dist/sdk/asset-manager.js +10 -10
  300. package/dist/sdk/bridge.js +17 -15
  301. package/dist/sdk/core.js +4 -4
  302. package/dist/sdk/flow.js +5 -5
  303. package/dist/sdk/index.js +32 -30
  304. package/dist/sdk/index.js.map +1 -1
  305. package/dist/sdk/resolver.js +4 -4
  306. package/dist/sdk/runner.js +32 -30
  307. package/dist/sdk/session.js +2 -2
  308. package/dist/sdk/transport/ws/server.js +5 -5
  309. package/dist/sdk/transport/ws.js +5 -5
  310. package/dist/sdk/transport.js +5 -5
  311. package/dist/sdk/types.js +1 -1
  312. package/dist/serve-preflight-EHLBSNUE.js +58 -0
  313. package/dist/{serve-preflight-TYEKHC32.js.map → serve-preflight-EHLBSNUE.js.map} +1 -1
  314. package/dist/session/index.js +2 -2
  315. package/dist/session/src/dispatcher.d.ts.map +1 -1
  316. package/dist/{setup-4JV2IMCB.js → setup-PMZLMFCD.js} +27 -25
  317. package/dist/setup-PMZLMFCD.js.map +1 -0
  318. package/dist/{skills-6QTKFMLW.js → skills-KHHW3RZ3.js} +6 -6
  319. package/dist/{skills-6QTKFMLW.js.map → skills-KHHW3RZ3.js.map} +1 -1
  320. package/dist/source-QNSGAM3S.js +88 -0
  321. package/dist/{source-XYMMJVKR.js.map → source-QNSGAM3S.js.map} +1 -1
  322. package/dist/{source-manifest-publish-SZFGGKB4.js → source-manifest-publish-AI725AVE.js} +44 -42
  323. package/dist/source-manifest-publish-AI725AVE.js.map +1 -0
  324. package/dist/transport/index.js +5 -5
  325. package/dist/transport/ws/server.js +5 -5
  326. package/dist/transport/ws.js +5 -5
  327. package/dist/tui/index.js +56 -37
  328. package/dist/tui/index.js.map +1 -1
  329. package/dist/tui/src/repl.d.ts +10 -0
  330. package/dist/tui/src/repl.d.ts.map +1 -1
  331. package/dist/types/index.js +1 -1
  332. package/dist/types/src/capabilities.d.ts +3 -2
  333. package/dist/types/src/capabilities.d.ts.map +1 -1
  334. package/dist/types/src/events.d.ts +11 -10
  335. package/dist/types/src/events.d.ts.map +1 -1
  336. package/dist/types/src/index.d.ts +2 -0
  337. package/dist/types/src/index.d.ts.map +1 -1
  338. package/dist/types/src/manifests/preset.d.ts +5 -5
  339. package/dist/types/src/protocol.d.ts +3 -0
  340. package/dist/types/src/protocol.d.ts.map +1 -1
  341. package/dist/types/src/turn-visibility.d.ts +50 -0
  342. package/dist/types/src/turn-visibility.d.ts.map +1 -0
  343. package/dist/types/src/version.d.ts +18 -5
  344. package/dist/types/src/version.d.ts.map +1 -1
  345. package/dist/workspace-plugin/adapters/mcp.js +24 -22
  346. package/dist/workspace-plugin/adapters/omp.js +14 -14
  347. package/dist/workspace-plugin/index.js +1 -1
  348. package/package.json +1 -1
  349. package/dist/chunk-2TLPC6TQ.js.map +0 -1
  350. package/dist/chunk-5XHQBCB5.js.map +0 -1
  351. package/dist/chunk-65UAC3ZR.js.map +0 -1
  352. package/dist/chunk-6ARPZHOV.js.map +0 -1
  353. package/dist/chunk-6SXSVKQY.js.map +0 -1
  354. package/dist/chunk-7PVGND4J.js.map +0 -1
  355. package/dist/chunk-7SJHSGUV.js.map +0 -1
  356. package/dist/chunk-AQNW2FET.js.map +0 -1
  357. package/dist/chunk-BSMW3PX2.js.map +0 -1
  358. package/dist/chunk-DI6J2PJB.js.map +0 -1
  359. package/dist/chunk-DS6UUCFG.js.map +0 -1
  360. package/dist/chunk-E2EC6SAX.js.map +0 -1
  361. package/dist/chunk-EPXZQIC6.js.map +0 -1
  362. package/dist/chunk-F4CZQD3T.js.map +0 -1
  363. package/dist/chunk-G5SYFFMD.js.map +0 -1
  364. package/dist/chunk-J262X4JU.js.map +0 -1
  365. package/dist/chunk-J4WKNJHO.js.map +0 -1
  366. package/dist/chunk-JRVQV7WC.js.map +0 -1
  367. package/dist/chunk-KSH5CFQS.js.map +0 -1
  368. package/dist/chunk-MMOWIRHP.js.map +0 -1
  369. package/dist/chunk-SHTXMERQ.js.map +0 -1
  370. package/dist/chunk-TCH5UDKT.js.map +0 -1
  371. package/dist/chunk-TUFNY6OD.js.map +0 -1
  372. package/dist/chunk-U3UDOX6I.js.map +0 -1
  373. package/dist/chunk-VXYZ5M7Z.js.map +0 -1
  374. package/dist/chunk-XYCYGN3Q.js.map +0 -1
  375. package/dist/chunk-YN6N3RBM.js.map +0 -1
  376. package/dist/ensure-sources-CAMWJTMR.js.map +0 -1
  377. package/dist/library-publish-UQQMHTND.js.map +0 -1
  378. package/dist/serve-preflight-TYEKHC32.js +0 -56
  379. package/dist/setup-4JV2IMCB.js.map +0 -1
  380. package/dist/source-XYMMJVKR.js +0 -86
  381. package/dist/source-manifest-publish-SZFGGKB4.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bridge/src/harness-capabilities.ts","../bridge/src/provider-catalog.ts","../bridge/src/provider-materialize/credential-env.ts","../bridge/src/registry.ts"],"names":[],"mappings":"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","file":"chunk-BSMW3PX2.js","sourcesContent":["/**\n * What the runner may ask of a harness, by harness id.\n *\n * Deliberately light: this module imports no harness, no SDK and no `zod`, so a\n * runner file that only needs a capability can import it without loading the\n * harness graph. The plugin-registry singleton is read through its `internal`\n * module (the same file `@skaile/workspaces/plugin-registry` re-exports, so one\n * instance under the bundler's shared chunks), not through the package index,\n * which pulls in the deploy helpers and their `zod` schemas.\n *\n * @docLink packages/bridge/api-reference#registry\n */\n\nimport { pluginRegistry } from \"../../plugin-registry/src/internal.js\";\nimport type { HarnessCapabilities } from \"@skaile/workspaces/types\";\n\n/**\n * Capabilities of a harness that declares none: it recomposes its tools per\n * turn like every bridge harness that is not an in-process SDK, and has no\n * managed session, credentials file or transcript-file resume.\n */\nconst GENERIC_HARNESS_CAPABILITIES: HarnessCapabilities = {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n};\n\n/**\n * Declared capabilities of the built-in harnesses that differ from nothing.\n * `BUILTIN_HARNESS_CATALOG` rows point at these entries, so `listHarnesses()` and\n * {@link harnessCapabilities} read one table. A built-in absent here (echo,\n * gemini, qwen, opencode, goose, continue) takes the generic defaults.\n */\nexport const BUILTIN_HARNESS_CAPABILITIES = {\n // Recomposes its tools per turn, so a hot-plugged MCP server is live.\n omp: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: false,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n // The SDK takes in-process server instances and bakes its tool set at\n // creation; it reads Claude's `~/.claude` credentials and JSONL transcripts.\n \"claude-sdk\": {\n inProcessMcpServers: true,\n liveToolUpdates: false,\n managedSession: false,\n claudeCodeCredentials: true,\n resumeNeedsTranscript: true,\n },\n // Standalone SDK recomposes its tools per turn. A host-managed session\n // (native app-server) refreshes its own native tool snapshot instead.\n codex: {\n inProcessMcpServers: false,\n liveToolUpdates: true,\n managedSession: true,\n claudeCodeCredentials: false,\n resumeNeedsTranscript: false,\n },\n} as const satisfies Record<string, HarnessCapabilities>;\n\n/**\n * Resolve what the runner may ask of a harness, by harness id, without loading\n * its module. Built-ins read {@link BUILTIN_HARNESS_CAPABILITIES}; a third-party\n * harness reads its registered `HarnessTarget`; an unknown or absent id gets the\n * generic defaults. Fields a harness omits take the generic default too.\n *\n * This is the one place the runner learns harness facts — it never compares an\n * id against `\"claude-sdk\"`, `\"codex\"` or `\"omp\"`.\n *\n * @param id - Harness id (e.g. a session's `harnessType`); `undefined` resolves to the defaults.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function harnessCapabilities(id: string | undefined): HarnessCapabilities {\n const declared = id\n ? Object.hasOwn(BUILTIN_HARNESS_CAPABILITIES, id)\n ? BUILTIN_HARNESS_CAPABILITIES[id as keyof typeof BUILTIN_HARNESS_CAPABILITIES]\n : pluginRegistry.get(\"harness\", id)?.capabilities\n : undefined;\n return { ...GENERIC_HARNESS_CAPABILITIES, ...declared };\n}\n\n/**\n * Whether a hot-plugged MCP server reaches the agent's next turn without a\n * harness restart. A host-managed session refreshes its native tool snapshot\n * itself, so it never takes live updates, whatever the standalone harness does.\n *\n * @param id - Harness id of the live session.\n * @param managed - Whether the session is host-managed (`managedCodex`).\n * @docLink packages/bridge/api-reference#registry\n */\nexport function supportsLiveToolUpdates(id: string | undefined, managed = false): boolean {\n const caps = harnessCapabilities(id);\n return caps.liveToolUpdates && !(managed && caps.managedSession);\n}\n","/**\n * The AI provider catalog — the preset layer of the provider registry (§1.5,\n * layer 5).\n *\n * A preset is the three-or-four literals an endpoint needs beyond a credential:\n * its wire `surface`, its `base_url` (or the transport that derives one), the\n * header the credential rides in, and the path a read-only probe can GET. With\n * them, `skaile providers add --preset groq` needs nothing but an env var name.\n *\n * This replaced `provider-endpoints.ts` `PROVIDER_ENDPOINTS`: every endpoint\n * that table knew is present here, with the surface/transport/credential facts\n * it could not express.\n *\n * The record types come from `@skaile/workspaces/core/provider-registry` — the\n * schema has exactly one home.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.2, §1.3, §2.5\n */\n\nimport {\n AI_PROVIDER_BASE_URL_TEMPLATES,\n type AIProviderCredentialKind,\n type AIProviderDiscovery,\n type AIProviderEntry,\n type AIProviderKind,\n type AIProviderLlmEntry,\n type AIProviderRegistry,\n type AIProviderRegistryLayer,\n type AIProviderRegistryPatch,\n type AIProviderSurface,\n type AIProviderTransport,\n type AIProviderVoiceParams,\n resolveEntryBaseUrl,\n} from \"@skaile/workspaces/core/provider-registry\";\n\n/**\n * Where the credential goes on the wire. `{credential}` is replaced with the\n * resolved secret. Needed because `credential.kind` alone is ambiguous:\n * `api_key_header` is `x-api-key` for Anthropic, `x-goog-api-key` for Gemini,\n * `api-key` for Azure OpenAI and `Authorization: Token …` for Deepgram.\n */\nexport interface AIProviderAuthHeader {\n name: string;\n template: string;\n}\n\n/** A catalog preset — the fields an entry inherits by naming it. */\nexport interface AIProviderPreset {\n /** Preset id; also the default entry id `skaile providers add` writes. */\n id: string;\n kind: AIProviderKind;\n label: string;\n /** `llm`/`embed` only. */\n surface?: AIProviderSurface;\n /** `llm`/`embed` only; omitted means `direct`. */\n transport?: AIProviderTransport;\n /** Literal endpoint. Absent when the transport derives one from `params`. */\n base_url?: string;\n /**\n * Env var the vendor's own SDK reads as a base-URL override, when one\n * exists. Consulted by the callers that still address an endpoint by preset\n * id — model discovery, key validation, and `skaile migrate providers` — so\n * a shell already pointed at a gateway keeps pointing there.\n */\n base_url_env?: string;\n /** Static non-secret headers, e.g. Anthropic's `anthropic-version`. */\n headers?: Record<string, string>;\n /** Credential shape plus the conventional env var holding the secret. */\n credential: { kind: AIProviderCredentialKind; env?: string };\n /** Header the credential rides in; defaults per surface when omitted. */\n auth_header?: AIProviderAuthHeader;\n /** Default routing/voice parameters. */\n params?: Record<string, string>;\n /** `params` keys the operator must supply — the preset cannot know them. */\n required_params?: string[];\n /**\n * Read-only path a health probe GETs, relative to `base_url`: the models\n * list for LLM surfaces, an equivalent authenticated read for voice.\n * Absent when the endpoint has none (Bedrock's runtime host).\n */\n probe_path?: string;\n discovery?: AIProviderDiscovery;\n /** Anything the operator has to know that the fields do not say. */\n notes?: string;\n}\n\nconst ANTHROPIC_VERSION_HEADER: Record<string, string> = { \"anthropic-version\": \"2023-06-01\" };\n\nconst X_API_KEY: AIProviderAuthHeader = { name: \"x-api-key\", template: \"{credential}\" };\n\nconst OPENAI_MODELS_PATH = \"/v1/models\";\n\n/**\n * Every preset the runtime ships.\n *\n * Insertion order is display order in `skaile providers list`: first-party\n * clouds, then OpenAI-compatible vendors, then the transports that need\n * routing parameters, then local runtimes and gateways, then voice.\n *\n * Sources: `platform/_devlog/reports/2026-09-20-inference-provider-market-survey.md`\n * (36 endpoints, base URLs and auth headers verified there).\n */\nexport const AI_PROVIDER_PRESETS: Record<string, AIProviderPreset> = {\n anthropic: {\n id: \"anthropic\",\n kind: \"llm\",\n label: \"Anthropic\",\n surface: \"anthropic-messages\",\n base_url: \"https://api.anthropic.com\",\n base_url_env: \"ANTHROPIC_BASE_URL\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_API_KEY\" },\n auth_header: X_API_KEY,\n probe_path: \"/v1/models\",\n discovery: { type: \"anthropic-models-list\" },\n },\n openai: {\n id: \"openai\",\n kind: \"llm\",\n label: \"OpenAI\",\n surface: \"openai-responses\",\n base_url: \"https://api.openai.com/v1\",\n base_url_env: \"OPENAI_BASE_URL\",\n credential: { kind: \"bearer\", env: \"OPENAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Responses is OpenAI's current API; set surface openai-completions for chat-only clients.\",\n },\n google: {\n id: \"google\",\n kind: \"llm\",\n label: \"Google Gemini API\",\n surface: \"google-generative-ai\",\n base_url: \"https://generativelanguage.googleapis.com/v1beta\",\n credential: { kind: \"api_key_header\", env: \"GEMINI_API_KEY\" },\n auth_header: { name: \"x-goog-api-key\", template: \"{credential}\" },\n probe_path: \"/v1beta/models\",\n discovery: { type: \"google-models-list\" },\n },\n groq: {\n id: \"groq\",\n kind: \"llm\",\n label: \"Groq\",\n surface: \"openai-completions\",\n base_url: \"https://api.groq.com/openai/v1\",\n credential: { kind: \"bearer\", env: \"GROQ_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n deepseek: {\n id: \"deepseek\",\n kind: \"llm\",\n label: \"DeepSeek\",\n surface: \"openai-completions\",\n base_url: \"https://api.deepseek.com\",\n credential: { kind: \"bearer\", env: \"DEEPSEEK_API_KEY\" },\n probe_path: \"/models\",\n discovery: { type: \"openai-models-list\" },\n notes:\n \"Anthropic-shaped clients use https://api.deepseek.com/anthropic with surface anthropic-messages.\",\n },\n openrouter: {\n id: \"openrouter\",\n kind: \"llm\",\n label: \"OpenRouter\",\n surface: \"openai-completions\",\n base_url: \"https://openrouter.ai/api/v1\",\n credential: { kind: \"bearer\", env: \"OPENROUTER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n mistral: {\n id: \"mistral\",\n kind: \"llm\",\n label: \"Mistral\",\n surface: \"openai-completions\",\n base_url: \"https://api.mistral.ai/v1\",\n credential: { kind: \"bearer\", env: \"MISTRAL_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n xai: {\n id: \"xai\",\n kind: \"llm\",\n label: \"xAI (Grok)\",\n surface: \"openai-completions\",\n base_url: \"https://api.x.ai/v1\",\n credential: { kind: \"bearer\", env: \"XAI_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n together: {\n id: \"together\",\n kind: \"llm\",\n label: \"Together AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.together.ai/v1\",\n credential: { kind: \"bearer\", env: \"TOGETHER_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n fireworks: {\n id: \"fireworks\",\n kind: \"llm\",\n label: \"Fireworks AI\",\n surface: \"openai-completions\",\n base_url: \"https://api.fireworks.ai/inference/v1\",\n credential: { kind: \"bearer\", env: \"FIREWORKS_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n bedrock: {\n id: \"bedrock\",\n kind: \"llm\",\n label: \"AWS Bedrock\",\n surface: \"bedrock-converse-stream\",\n transport: \"bedrock\",\n credential: { kind: \"sigv4\" },\n required_params: [\"region\"],\n notes: \"Credentials come from the AWS default chain; the runtime host serves no models list.\",\n },\n vertex: {\n id: \"vertex\",\n kind: \"llm\",\n label: \"Google Vertex AI\",\n surface: \"google-vertex\",\n transport: \"vertex\",\n credential: { kind: \"google_adc\" },\n params: { publisher: \"google\" },\n required_params: [\"project\", \"location\"],\n probe_path: \"/models\",\n },\n \"azure-openai\": {\n id: \"azure-openai\",\n kind: \"llm\",\n label: \"Azure OpenAI\",\n surface: \"azure-openai-responses\",\n transport: \"azure-openai\",\n credential: { kind: \"api_key_header\", env: \"AZURE_OPENAI_API_KEY\" },\n auth_header: { name: \"api-key\", template: \"{credential}\" },\n required_params: [\"resource\", \"deployment\", \"api_version\"],\n probe_path: \"/models\",\n notes:\n \"api_version is mirrored into query_params['api-version']; switch credential.kind to azure_entra for Entra tokens.\",\n },\n foundry: {\n id: \"foundry\",\n kind: \"llm\",\n label: \"Claude on Microsoft Foundry\",\n surface: \"anthropic-messages\",\n transport: \"foundry\",\n headers: ANTHROPIC_VERSION_HEADER,\n credential: { kind: \"api_key_header\", env: \"ANTHROPIC_FOUNDRY_API_KEY\" },\n auth_header: X_API_KEY,\n required_params: [\"resource\"],\n probe_path: \"/v1/models\",\n },\n ollama: {\n id: \"ollama\",\n kind: \"llm\",\n label: \"Ollama (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:11434/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n lmstudio: {\n id: \"lmstudio\",\n kind: \"llm\",\n label: \"LM Studio (local)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:1234/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n },\n vllm: {\n id: \"vllm\",\n kind: \"llm\",\n label: \"vLLM (self-hosted)\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:8000/v1\",\n credential: { kind: \"none\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"A server started with --api-key expects credential.kind bearer and an env: ref.\",\n },\n litellm: {\n id: \"litellm\",\n kind: \"llm\",\n label: \"LiteLLM proxy\",\n surface: \"openai-completions\",\n base_url: \"http://localhost:4000\",\n credential: { kind: \"bearer\", env: \"LITELLM_API_KEY\" },\n probe_path: OPENAI_MODELS_PATH,\n discovery: { type: \"openai-models-list\" },\n notes: \"The credential is the proxy's virtual key; upstream keys stay in the proxy config.\",\n },\n deepgram: {\n id: \"deepgram\",\n kind: \"stt\",\n label: \"Deepgram\",\n base_url: \"https://api.deepgram.com\",\n credential: { kind: \"api_key_header\", env: \"DEEPGRAM_API_KEY\" },\n auth_header: { name: \"Authorization\", template: \"Token {credential}\" },\n params: { model: \"nova-3\", language: \"en\" },\n probe_path: \"/v1/projects\",\n },\n elevenlabs: {\n id: \"elevenlabs\",\n kind: \"tts\",\n label: \"ElevenLabs\",\n base_url: \"https://api.elevenlabs.io\",\n credential: { kind: \"api_key_header\", env: \"ELEVENLABS_API_KEY\" },\n auth_header: { name: \"xi-api-key\", template: \"{credential}\" },\n params: { voice_id: \"21m00Tcm4TlvDq8ikWAM\", output_format: \"mp3_44100_128\" },\n probe_path: \"/v1/models\",\n },\n};\n\n/** Presets in catalog order. */\nexport function listProviderPresets(): AIProviderPreset[] {\n return Object.values(AI_PROVIDER_PRESETS);\n}\n\n/** Look up a preset by id. */\nexport function getProviderPreset(id: string): AIProviderPreset | undefined {\n return AI_PROVIDER_PRESETS[id];\n}\n\n/**\n * The endpoint `skaile providers list` shows for a preset: the literal when\n * there is one, otherwise the transport's `base_url` template (§1.3) with its\n * `{param}` placeholders left in — they are exactly what the operator must\n * supply.\n */\nexport function presetBaseUrl(preset: AIProviderPreset): string | undefined {\n if (preset.base_url) return preset.base_url;\n if (!preset.transport || preset.transport === \"direct\") return undefined;\n return AI_PROVIDER_BASE_URL_TEMPLATES[preset.transport];\n}\n\n/**\n * The endpoint a request to this preset should actually go to: an explicit\n * override first, then the vendor's own `*_BASE_URL` variable\n * ({@link AIProviderPreset.base_url_env}), then the preset literal.\n *\n * Behind a gateway the credential in play is the *gateway's*, not the\n * vendor's, so discovery and key validation have to follow dispatch — firing\n * either at the vendor's public API 401s and yields an empty catalog, which a\n * caller that reads \"empty\" as \"unknown\" then degrades into \"accept anything\".\n *\n * Pure: reads only the `env` record it is handed.\n */\nexport function resolvePresetBaseUrl(\n preset: AIProviderPreset,\n options: { baseUrl?: string; env?: Record<string, string | undefined> } = {},\n): string | undefined {\n const explicit = options.baseUrl?.trim();\n if (explicit) return explicit;\n const fromEnv = preset.base_url_env ? options.env?.[preset.base_url_env]?.trim() : undefined;\n return fromEnv || preset.base_url;\n}\n\n/** Overrides {@link expandPreset} accepts from `skaile providers add`. */\nexport interface ExpandPresetOptions {\n /** `env:NAME` / `cmd:…` / `platform:…` / `keyring:…`. Never a literal. */\n credentialRef?: string;\n baseUrl?: string;\n surface?: AIProviderSurface;\n label?: string;\n /** Transport routing parameters, or voice parameters for `stt`/`tts`. */\n params?: Record<string, string>;\n}\n\n/**\n * Materialize a preset into a registry entry.\n *\n * The credential is always a reference: the preset's conventional `env:` var\n * unless the caller names another ref. No code path here can write a secret.\n * For `transport: azure-openai` the `api_version` parameter is mirrored into\n * `query_params['api-version']`, which is where the wire expects it (§1.3).\n */\nexport function expandPreset(\n preset: AIProviderPreset,\n options: ExpandPresetOptions = {},\n): AIProviderEntry {\n const ref =\n options.credentialRef ?? (preset.credential.env ? `env:${preset.credential.env}` : undefined);\n const credential = ref ? { kind: preset.credential.kind, ref } : { kind: preset.credential.kind };\n const base_url = options.baseUrl ?? preset.base_url;\n const params = { ...preset.params, ...options.params };\n\n if (preset.kind === \"stt\" || preset.kind === \"tts\") {\n return {\n kind: preset.kind,\n label: options.label ?? preset.label,\n preset: preset.id,\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(Object.keys(params).length > 0 ? { params: params as AIProviderVoiceParams } : {}),\n };\n }\n\n const transport = preset.transport ?? \"direct\";\n const entry: AIProviderLlmEntry = {\n kind: preset.kind === \"embed\" ? \"embed\" : \"llm\",\n label: options.label ?? preset.label,\n preset: preset.id,\n ...((options.surface ?? preset.surface) ? { surface: options.surface ?? preset.surface } : {}),\n ...(base_url ? { base_url } : {}),\n ...(preset.headers ? { headers: { ...preset.headers } } : {}),\n credential,\n ...(preset.discovery ? { discovery: { ...preset.discovery } } : {}),\n } as AIProviderLlmEntry;\n\n if (transport !== \"direct\") {\n Object.assign(entry, { transport, params });\n if (transport === \"azure-openai\" && params.api_version) {\n entry.query_params = { \"api-version\": params.api_version };\n }\n }\n return entry;\n}\n\n/**\n * Build the catalog merge layer for a set of configured entries (§1.5).\n *\n * Only the presets actually referenced by a `preset:` key are expanded, keyed\n * by the *entry* id — so `groq: {kind: llm, preset: groq}` deep-merges onto a\n * full Groq definition while an unreferenced preset stays out of the registry.\n *\n * Takes the **pre-gate** merge (`LoadedProviderRegistry.patches`), not the\n * gated registry: an entry that leaves `kind` or its transport `params` to the\n * preset is exactly the one the gate drops before this layer exists, and a\n * dropped entry names no preset to expand.\n */\nexport function catalogLayer(providers: AIProviderRegistryPatch): AIProviderRegistryLayer {\n const expanded: AIProviderRegistry = {};\n for (const [id, entry] of Object.entries(providers)) {\n if (!entry.preset) continue;\n const preset = AI_PROVIDER_PRESETS[entry.preset];\n if (!preset) continue;\n expanded[id] = expandPreset(preset);\n }\n return { layer: \"catalog\", providers: expanded };\n}\n\n/**\n * Join a base URL and a path without duplicating a shared leading segment:\n * `(\"https://gw/v1\", \"/v1/models\")` → `https://gw/v1/models`. Both spellings\n * are common in the wild, and a preset's path must work against a gateway base\n * the operator typed either way.\n */\nfunction joinBaseAndPath(base: string, path: string): string {\n const trimmed = base.replace(/\\/+$/, \"\");\n const segments = path.split(\"/\").filter(Boolean);\n const lead = segments[0];\n if (lead && trimmed.toLowerCase().endsWith(`/${lead.toLowerCase()}`)) {\n return `${trimmed}/${segments.slice(1).join(\"/\")}`;\n }\n return `${trimmed}${path}`;\n}\n\n/**\n * The read-only URL a health probe or model discovery can GET for an entry —\n * the models list on LLM surfaces, the equivalent authenticated read on voice\n * ones. `undefined` when the entry has no endpoint yet (missing transport\n * parameters) or the surface serves no such path (Bedrock runtime).\n *\n * This is the catalog method that supersedes `resolveProviderModelsUrl`.\n */\nexport function resolveProbeUrl(entry: AIProviderEntry): string | undefined {\n const base = resolveEntryBaseUrl(entry);\n if (!base) return undefined;\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n const path = (entry as AIProviderLlmEntry).discovery?.path ?? preset?.probe_path;\n if (!path) return undefined;\n const url = joinBaseAndPath(base, path);\n const query = (entry as AIProviderLlmEntry).query_params;\n if (!query || Object.keys(query).length === 0) return url;\n const search = new URLSearchParams(query).toString();\n return `${url}${url.includes(\"?\") ? \"&\" : \"?\"}${search}`;\n}\n\n/**\n * The header(s) that present a credential on the wire for an entry.\n *\n * `credential.kind` alone does not determine the header — `api_key_header` is\n * `x-api-key` at Anthropic, `x-goog-api-key` at Google and `api-key` at Azure —\n * so the preset's `auth_header` wins, then a per-surface default.\n * Returns `{}` when the credential is signed elsewhere (`sigv4`, `google_adc`)\n * or absent.\n */\nexport function buildCredentialHeaders(\n entry: AIProviderEntry,\n secret: string | undefined,\n): Record<string, string> {\n const kind = entry.credential?.kind ?? \"none\";\n if (!secret || kind === \"none\" || kind === \"sigv4\" || kind === \"google_adc\") return {};\n\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.auth_header) {\n return {\n [preset.auth_header.name]: preset.auth_header.template.replace(\"{credential}\", secret),\n };\n }\n if (kind === \"api_key_header\") {\n const surface = (entry as AIProviderLlmEntry).surface;\n if (surface === \"google-generative-ai\") return { \"x-goog-api-key\": secret };\n if (surface === \"azure-openai-responses\") return { \"api-key\": secret };\n return { \"x-api-key\": secret };\n }\n return { Authorization: `Bearer ${secret}` };\n}\n\n/** Outcome of {@link probeProviderEntry}. Never carries the credential. */\nexport interface AIProviderProbeResult {\n /** The endpoint answered 2xx. */\n ok: boolean;\n /** `false` when no request was made — nothing was verified either way. */\n probed: boolean;\n url?: string;\n status?: number;\n /** Human-readable outcome. Secret-free. */\n detail: string;\n}\n\n/** Options for {@link probeProviderEntry}. */\nexport interface ProbeProviderOptions {\n /** Resolved credential value, if the entry has one. Never logged. */\n secret?: string;\n /** Request deadline; default 8000 ms, matching `validateApiKey`. */\n timeoutMs?: number;\n}\n\n/**\n * Send one minimal, read-only request to an entry's endpoint and report what\n * came back.\n *\n * Returns `probed: false` — rather than a false negative — when the entry has\n * no probe path (Bedrock's runtime host) or no resolvable endpoint yet: a\n * SigV4- or ADC-signed request is the transport SDK's job, not this function's.\n */\nexport async function probeProviderEntry(\n entry: AIProviderEntry,\n options: ProbeProviderOptions = {},\n): Promise<AIProviderProbeResult> {\n const url = resolveProbeUrl(entry);\n if (!url) {\n const base = resolveEntryBaseUrl(entry);\n return {\n ok: false,\n probed: false,\n detail: base\n ? `no read-only probe endpoint is defined for this entry (${base})`\n : \"no base_url could be resolved — set base_url or the transport's params\",\n };\n }\n\n const headers: Record<string, string> = {\n ...entry.headers,\n ...buildCredentialHeaders(entry, options.secret),\n };\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 8000);\n try {\n const response = await fetch(url, { method: \"GET\", headers, signal: controller.signal });\n if (response.ok) {\n return { ok: true, probed: true, url, status: response.status, detail: \"endpoint reachable\" };\n }\n const detail =\n response.status === 401 || response.status === 403\n ? \"credential rejected (authentication failed)\"\n : `endpoint returned HTTP ${response.status}`;\n return { ok: false, probed: true, url, status: response.status, detail };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const detail =\n err instanceof Error && err.name === \"AbortError\"\n ? `request timed out after ${options.timeoutMs ?? 8000}ms`\n : message;\n return { ok: false, probed: true, url, detail };\n } finally {\n clearTimeout(timeout);\n }\n}\n","/**\n * Credential delivery for harness adapters — the one naming rule (§2.3).\n *\n * Every adapter that hands a registry entry's secret to a child process, and\n * every renderer that has to *name* that secret in a config file it writes\n * (omp's `models.yml` `apiKey:`, Codex's `env_key`, OpenCode's `{env:…}`),\n * agrees on one env-var name per entry: `SKAILE_AIP_<UPPER_ID>_KEY`. The name\n * goes in the file, the value goes in the child environment — a rendered\n * config never contains a secret.\n *\n * The platform's secret-env allowlist is a prefix rule on exactly that name,\n * and forge-common delivers the same names when it spawns `skaile serve`, so\n * the transform below is a cross-repo contract: uppercase, every character\n * outside `[A-Za-z0-9]` mapped to `_` (registry ids are `[a-z0-9][a-z0-9_-]*`,\n * so in practice only `-`).\n *\n * Alongside the canonical name, {@link registryCredentialEnv} also sets the\n * *conventional* carrier a CLI already reads (`ANTHROPIC_API_KEY`,\n * `GEMINI_API_KEY`, `GROQ_API_KEY`, …) so a catalog-preset entry works in a\n * harness that has no per-endpoint config file yet.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.4, §2.3\n */\n\nimport {\n type AIProviderEntry,\n type AIProviderRegistry,\n isEntryEnabled,\n type MergedAIProviderRegistry,\n parseCredentialRef,\n registryEntries,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { resolveCredential } from \"@skaile/workspaces/core/provider-registry-credentials\";\nimport { AI_PROVIDER_PRESETS } from \"../provider-catalog.js\";\n\n/** Options shared by every registry-shaped credential resolution. */\nexport interface RegistryCredentialOptions {\n /** Restrict resolution to one entry — the provider half of a `modelRef`. */\n providerId?: string;\n /** Environment `env:` refs resolve against. Defaults to `process.env`. */\n env?: Record<string, string | undefined>;\n /** Control-plane secrets keyed by config id, for `platform:` refs. */\n secrets?: Record<string, string>;\n /** Run `cmd:` references. Default `true`. */\n allowCommand?: boolean;\n}\n\n/** Prefix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_PREFIX = \"SKAILE_AIP_\";\n\n/** Suffix of the canonical per-entry credential variable. */\nexport const PROVIDER_CREDENTIAL_ENV_SUFFIX = \"_KEY\";\n\n/**\n * The env-var name that carries a registry entry's credential:\n * `anthropic` → `SKAILE_AIP_ANTHROPIC_KEY`, `my-gw.eu` → `SKAILE_AIP_MY_GW_EU_KEY`.\n *\n * Pure: no environment, no registry, no I/O. Renderers call it per entry while\n * emitting a config file, adapters call it while assembling a child env, and\n * the platform allowlist matches the prefix.\n */\nexport function providerCredentialEnvName(providerId: string): string {\n const slug = providerId.replace(/[^A-Za-z0-9]/g, \"_\").toUpperCase();\n return `${PROVIDER_CREDENTIAL_ENV_PREFIX}${slug}${PROVIDER_CREDENTIAL_ENV_SUFFIX}`;\n}\n\n/**\n * The env var a harness already looks for on its own, when the entry names one.\n *\n * The catalog preset's conventional carrier wins (`GEMINI_API_KEY` for\n * `google`), because that is the name the vendor's own CLI reads; otherwise an\n * `env:NAME` credential reference is taken at face value — the operator named\n * that variable, so the child gets it under the same name. `cmd:`, `platform:`\n * and `keyring:` refs have no conventional carrier and return `undefined`.\n */\nexport function conventionalCredentialEnvName(entry: AIProviderEntry): string | undefined {\n const preset = entry.preset ? AI_PROVIDER_PRESETS[entry.preset] : undefined;\n if (preset?.credential.env) return preset.credential.env;\n const ref = entry.credential?.ref ? parseCredentialRef(entry.credential.ref) : undefined;\n return ref?.form === \"env\" ? ref.name : undefined;\n}\n\n/**\n * Resolve one entry's credential to its value, or `undefined` when there is\n * none to hand over (`kind: none`, an ambient `sigv4`/`google_adc` chain, an\n * unset variable, a reserved `keyring:` ref).\n */\nexport function resolveEntryCredential(\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n }).value;\n}\n\n/**\n * One entry's credential value, including the one the session boundary\n * already resolved for it.\n *\n * A `platform:<configId>` reference is resolved by the runner — it holds the\n * `session_init` secrets map, the harness does not — and materialized into the\n * child environment under {@link providerCredentialEnvName}. So when the\n * reference itself yields nothing, that carrier is consulted: it is the same\n * secret, delivered one step earlier.\n */\nexport function entryCredentialValue(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialOptions = {},\n): string | undefined {\n return (\n resolveEntryCredential(entry, options) ?? options.env?.[providerCredentialEnvName(providerId)]\n );\n}\n\n/** One enabled entry whose credential is declared but cannot be resolved. */\nexport interface UnresolvedProviderCredential {\n providerId: string;\n /** Why it does not resolve, e.g. `environment variable ANTHROPIC_API_KEY is not set`. */\n reason: string;\n}\n\n/**\n * The enabled LLM/embed entries that name a credential this process cannot\n * resolve (the variable is unset, the command fails). A harness must not be\n * handed such an entry: the child would send an empty key and fail with a 401\n * instead of using its own login. Entries with no credential, an ambient\n * signing chain, or a value the session boundary already delivered under\n * {@link providerCredentialEnvName} are fine.\n */\nexport function unresolvedProviderCredentials(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialOptions = {},\n): UnresolvedProviderCredential[] {\n const out: UnresolvedProviderCredential[] = [];\n for (const [id, entry] of registryEntries(registry)) {\n if (entry.kind !== \"llm\" && entry.kind !== \"embed\") continue;\n if (!isEntryEnabled(entry)) continue;\n if (options.providerId && id !== options.providerId) continue;\n const resolved = resolveCredential(entry, {\n ...(options.env ? { env: options.env } : {}),\n ...(options.secrets ? { secrets: options.secrets } : {}),\n ...(options.allowCommand === undefined ? {} : { allowCommand: options.allowCommand }),\n });\n if (!resolved.error) continue;\n if (options.env?.[providerCredentialEnvName(id)]) continue;\n out.push({ providerId: id, reason: resolved.error });\n }\n return out;\n}\n\n/** Options for {@link entryCredentialEnv} / {@link registryCredentialEnv}. */\nexport interface RegistryCredentialEnvOptions extends RegistryCredentialOptions {\n /**\n * Also set the harness-conventional carrier\n * ({@link conventionalCredentialEnvName}). Default `true`. Set `false` for a\n * harness that reads every endpoint out of a rendered config file and must\n * not inherit a vendor default from a neighbouring entry.\n */\n aliases?: boolean;\n}\n\n/**\n * The credential variables one entry contributes: always\n * `SKAILE_AIP_<ID>_KEY`, plus the conventional carrier unless `aliases` is\n * `false`. Empty when the entry has no resolvable secret.\n */\nexport function entryCredentialEnv(\n providerId: string,\n entry: AIProviderEntry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const value = resolveEntryCredential(entry, options);\n if (!value) return {};\n const out: Record<string, string> = { [providerCredentialEnvName(providerId)]: value };\n if (options.aliases !== false) {\n const alias = conventionalCredentialEnvName(entry);\n if (alias) out[alias] = value;\n }\n return out;\n}\n\n/**\n * Every enabled entry's credential, as a child-process environment fragment.\n *\n * One canonical `SKAILE_AIP_<ID>_KEY` per entry whose credential resolves; the\n * conventional carriers are added underneath, first entry in registry order\n * winning a collision (registry order is highest-precedence layer first, so\n * the alias follows the same precedence the selector does). Entries whose\n * credential cannot be resolved contribute nothing.\n */\nexport function registryCredentialEnv(\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options: RegistryCredentialEnvOptions = {},\n): Record<string, string> {\n const canonical: Record<string, string> = {};\n const aliases: Record<string, string> = {};\n for (const [id, entry] of registryEntries(registry)) {\n if (options.providerId && id !== options.providerId) continue;\n if (!isEntryEnabled(entry)) continue;\n const value = resolveEntryCredential(entry, options);\n if (!value) continue;\n canonical[providerCredentialEnvName(id)] = value;\n if (options.aliases === false) continue;\n const alias = conventionalCredentialEnvName(entry);\n if (alias && aliases[alias] === undefined) aliases[alias] = value;\n }\n return { ...aliases, ...canonical };\n}\n","import type {\n AIProviderRegistry,\n AIProviderSurface,\n MergedAIProviderRegistry,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport type { HarnessContext } from \"@skaile/workspaces/plugin-registry\";\nimport { type PluginRegistry, pluginRegistry } from \"@skaile/workspaces/plugin-registry\";\nimport type { ModelEntry } from \"./models.js\";\nimport type { RegistryCredentialOptions } from \"./provider-materialize/credential-env.js\";\nimport { BUILTIN_HARNESS_CAPABILITIES } from \"./harness-capabilities.js\";\nimport type { AgentConfig, AgentHarness, HarnessInfo } from \"./types.js\";\n\n// Build-time harness gating. `bun build --compile --define:__INCLUDE_*__=...`\n// folds these to literal booleans so an excluded harness module and\n// its SDK are dead-code-stripped from the binary. Under tsup / vitest / bun\n// run-on-source no `--define` runs and the `typeof` guard defaults to `true` —\n// every harness is available (the SDKs stay optional peers).\ndeclare const __INCLUDE_CLAUDE_SDK__: boolean;\ndeclare const __INCLUDE_CODEX__: boolean;\nconst INCLUDE_CLAUDE_SDK =\n typeof __INCLUDE_CLAUDE_SDK__ === \"undefined\" ? true : __INCLUDE_CLAUDE_SDK__;\nconst INCLUDE_CODEX = typeof __INCLUDE_CODEX__ === \"undefined\" ? true : __INCLUDE_CODEX__;\n\n/**\n * Every wire surface omp can speak — it is the harness the `surface` enum was\n * lifted from, so its list is the enum.\n */\nconst OMP_SURFACES = [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"openai-codex-responses\",\n \"azure-openai-responses\",\n \"bedrock-converse-stream\",\n \"google-generative-ai\",\n \"google-vertex\",\n] as const satisfies readonly AIProviderSurface[];\n\n/**\n * Static capability metadata for every built-in harness.\n *\n * Pure data — this object imports no harness module and references no harness\n * SDK. {@link listHarnesses} returns it (merged with any third-party harnesses)\n * so selection UIs can enumerate every harness without loading a single\n * harness module. The matching harness module's `HarnessTarget` is registered\n * into the plugin registry by {@link registerBuiltinHarnesses}.\n *\n * `surfaces` and `providerPlurality` are the harness-capability declaration\n * the AI provider registry resolves against (plan §2.3): which wire protocols\n * a harness can be pointed at, and how many registry entries it can use at\n * once. The platform's resolver filters candidate entries on `surfaces`\n * instead of matching vendor names.\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport const BUILTIN_HARNESS_CATALOG: Record<string, HarnessInfo> = {\n omp: {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n surfaces: OMP_SURFACES,\n // omp renders the whole registry as its own `models.yml`, so every entry\n // stays selectable and roles / per-subagent models resolve across them.\n providerPlurality: \"registry\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES.omp,\n },\n \"claude-sdk\": {\n id: \"claude-sdk\",\n name: \"Claude Agent SDK\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Anthropic's own API, plus the two clouds the SDK addresses natively.\n // Foundry is `anthropic-messages` at a different host, not a surface.\n surfaces: [\"anthropic-messages\", \"bedrock-converse-stream\", \"google-vertex\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES[\"claude-sdk\"],\n },\n codex: {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n // Codex's `wire_api` is `responses` or `chat`; its subscription transport\n // is the codex-specific responses flavour.\n surfaces: [\"openai-codex-responses\", \"openai-responses\", \"openai-completions\"],\n providerPlurality: \"single\",\n capabilities: BUILTIN_HARNESS_CAPABILITIES.codex,\n },\n echo: {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Deterministic mock: it never opens a connection, so it speaks no wire\n // surface and no registry entry can be dispatched to it.\n surfaces: [],\n providerPlurality: \"single\",\n },\n gemini: {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n surfaces: [\"google-generative-ai\"],\n providerPlurality: \"single\",\n },\n qwen: {\n id: \"qwen\",\n name: \"Qwen Code\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n // Driven entirely through OPENAI_BASE_URL / OPENAI_API_KEY.\n surfaces: [\"openai-completions\"],\n providerPlurality: \"single\",\n },\n opencode: {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"openai-responses\",\n \"google-generative-ai\",\n ],\n providerPlurality: \"credentials-n\",\n },\n goose: {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\n \"anthropic-messages\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"bedrock-converse-stream\",\n ],\n providerPlurality: \"credentials-n\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n surfaces: [\"anthropic-messages\", \"openai-completions\", \"google-generative-ai\"],\n providerPlurality: \"credentials-n\",\n },\n};\n\nlet _harnessesRegistered = false;\n\n/**\n * Register every built-in harness's `HarnessTarget` into the plugin registry.\n *\n * This is the single id → module map in bridge core. Every specifier is a\n * literal string so `bun --compile` can statically bundle the harness module\n * (and, transitively, its SDK). The in-process-SDK harnesses (`claude-sdk`,\n * `codex`) are wrapped in build-constant guards so an excluded harness's\n * `await import` folds to dead code in the compiled binary. `omp` and `echo`\n * carry no SDK weight and are always available.\n *\n * **Static import discipline.** Every `import()` specifier below must be a\n * string literal — never aliased through a variable. Indirection defeats\n * `bun --compile`'s static analysis and silently drops the module from the\n * binary.\n *\n * Idempotent: guarded by a module flag so a second call is a no-op (a duplicate\n * `register` would otherwise throw `RegistrationError`).\n *\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function registerBuiltinHarnesses(\n registry: PluginRegistry = pluginRegistry,\n): Promise<void> {\n if (registry === pluginRegistry && _harnessesRegistered) return;\n\n if (!registry.get(\"harness\", \"omp\")) {\n const m = await import(\"@skaile/workspaces/harnesses/omp\");\n registry.register(\"harness\", m.ompHarnessTarget);\n }\n if (!registry.get(\"harness\", \"echo\")) {\n const m = await import(\"@skaile/workspaces/harnesses/echo\");\n registry.register(\"harness\", m.echoHarnessTarget);\n }\n if (INCLUDE_CLAUDE_SDK && !registry.get(\"harness\", \"claude-sdk\")) {\n const m = await import(\"@skaile/workspaces/harnesses/claude-sdk\");\n registry.register(\"harness\", m.claudeSdkHarnessTarget);\n }\n if (INCLUDE_CODEX && !registry.get(\"harness\", \"codex\")) {\n const m = await import(\"@skaile/workspaces/harnesses/codex\");\n registry.register(\"harness\", m.codexHarnessTarget);\n }\n // Subprocess CLI harnesses spawn an external binary the user installs\n // separately — no bundled SDK to dead-code-strip, so (like omp/echo) they\n // carry no build constant and are always registered.\n if (!registry.get(\"harness\", \"gemini\")) {\n const m = await import(\"@skaile/workspaces/harnesses/gemini\");\n registry.register(\"harness\", m.geminiHarnessTarget);\n }\n if (!registry.get(\"harness\", \"qwen\")) {\n const m = await import(\"@skaile/workspaces/harnesses/qwen\");\n registry.register(\"harness\", m.qwenHarnessTarget);\n }\n if (!registry.get(\"harness\", \"opencode\")) {\n const m = await import(\"@skaile/workspaces/harnesses/opencode\");\n registry.register(\"harness\", m.opencodeHarnessTarget);\n }\n if (!registry.get(\"harness\", \"goose\")) {\n const m = await import(\"@skaile/workspaces/harnesses/goose\");\n registry.register(\"harness\", m.gooseHarnessTarget);\n }\n if (!registry.get(\"harness\", \"continue\")) {\n const m = await import(\"@skaile/workspaces/harnesses/continue\");\n registry.register(\"harness\", m.continueHarnessTarget);\n }\n\n if (registry === pluginRegistry) _harnessesRegistered = true;\n}\n\n/**\n * Creates a new harness instance for the given harness id.\n *\n * Ensures the built-in harness targets are registered (idempotent), then looks\n * up the target in the plugin registry and calls its `create()`. The returned\n * harness has not been started yet — call `harness.start()` before sending\n * prompts.\n *\n * @param id - Registered harness identifier (e.g. `\"omp\"`, `\"claude-sdk\"`).\n * @param config - Configuration forwarded to the harness constructor.\n * @param ctx - Optional harness context (logger / abort signal). Defaults to `{}`.\n * @returns A freshly constructed (not yet started) {@link AgentHarness}.\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered harness at all.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function createHarness(\n id: string,\n config: AgentConfig,\n ctx?: HarnessContext,\n): Promise<AgentHarness> {\n const target = await resolveHarnessTarget(id);\n return target.create(config, ctx ?? {});\n}\n\n/**\n * Resolve a registered harness target by id, ensuring the built-ins are\n * registered first. Throws the canonical \"not bundled\" / \"unknown harness\"\n * errors so every caller (`createHarness`, `listModelsForHarness`) reports an\n * unrecognized id the same way instead of silently degrading.\n *\n * @throws {Error} When `id` is a known harness excluded from this build, or\n * when `id` does not match any registered harness at all.\n */\nasync function resolveHarnessTarget(id: string) {\n await registerBuiltinHarnesses();\n const target = pluginRegistry.get(\"harness\", id);\n if (!target) {\n if (id in BUILTIN_HARNESS_CATALOG) {\n throw new Error(`Agent harness \"${id}\" is not bundled in this build.`);\n }\n throw new Error(\n `Unknown agent harness: \"${id}\". Available: ${listHarnesses()\n .map((d) => d.id)\n .join(\", \")}`,\n );\n }\n return target;\n}\n\n/**\n * Returns the capability metadata for every available harness.\n *\n * Enumerates every built-in harness from {@link BUILTIN_HARNESS_CATALOG} without\n * loading a single harness module or harness SDK, then merges in any third-party\n * harness targets registered into the plugin registry that are not already in\n * the catalog. Use this to populate harness selection UIs.\n *\n * @returns Array of {@link HarnessInfo} objects, one per available harness.\n * @docLink packages/bridge/api-reference#registry\n */\nexport function listHarnesses(): HarnessInfo[] {\n const merged = new Map<string, HarnessInfo>();\n for (const info of Object.values(BUILTIN_HARNESS_CATALOG)) {\n merged.set(info.id, info);\n }\n for (const meta of pluginRegistry.list(\"harness\")) {\n if (!merged.has(meta.id)) {\n // Third-party harnesses carry no HarnessInfo row; read the capability flags\n // off the registered target (defaulting to conservative false) so a\n // model-agnostic / in-band-abort harness can still advertise them.\n const target = pluginRegistry.get(\"harness\", meta.id);\n merged.set(meta.id, {\n id: meta.id,\n name: meta.displayName,\n modelAgnostic: target?.modelAgnostic ?? false,\n supportsInBandAbort: target?.supportsInBandAbort ?? false,\n // Left absent when the target declares nothing: \"speaks no surface\" and\n // \"did not say\" are different claims, and the platform resolver must be\n // able to tell them apart before it filters a harness out.\n ...(target?.surfaces ? { surfaces: target.surfaces } : {}),\n ...(target?.providerPlurality ? { providerPlurality: target.providerPlurality } : {}),\n ...(target?.capabilities ? { capabilities: target.capabilities } : {}),\n });\n }\n }\n return [...merged.values()];\n}\n\n/**\n * List models available to a specific harness without starting a full agent session.\n *\n * Ensures the built-in harness targets are registered (idempotent), then\n * delegates to the target's optional `listModels()`. Throws on an unknown /\n * not-bundled id (same contract as {@link createHarness}); returns `[]` only\n * when the target exists but exposes no `listModels`.\n *\n * @param harnessId - Registered harness id (e.g. `\"omp\"`, `\"claude-sdk\"`, `\"codex\"`).\n * @param registry - The AI provider registry to discover against — either the\n * bare `id → entry` map or a merged view. Each entry names its credential by\n * reference, resolved through `options` and delivered to the throwaway\n * harness as `SKAILE_AIP_<ID>_KEY` environment entries.\n * @param options - Which entry to restrict to, and where `env:` / `platform:`\n * references resolve from. Defaults to the whole registry against\n * `process.env`.\n * @throws {Error} When `harnessId` is unknown or excluded from this build.\n * @docLink packages/bridge/api-reference#registry\n */\nexport async function listModelsForHarness(\n harnessId: string,\n registry: AIProviderRegistry | MergedAIProviderRegistry,\n options?: RegistryCredentialOptions,\n): Promise<ModelEntry[]> {\n const target = await resolveHarnessTarget(harnessId);\n return (await target.listModels?.(registry, options)) ?? [];\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["parseYaml","parseFrontmatter","join","basename","relative","resolve","existsSync","readFileSync","stringifyYaml"],"mappings":"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","file":"chunk-DI6J2PJB.js","sourcesContent":["/**\n * Agent installation — renders a GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the framework-native format (`.claude/agents/<name>.md`, `.omp/agents/<name>/`,\n * `.codex/agents/<name>.toml`) and resolves abilities, contracts, fragments, and\n * prompt extensions from the workspace config along the way.\n *\n * System prompt phases (per agent):\n * 1. extends merge — inherit from parent agent.yaml if manifest.extends is set\n * 2. instance overrides — model / budget / lifecycle of the `skaile.yaml` instance\n * 3. ability refs — read SKILL.md frontmatter of the composed skills\n * 4. contract refs — locate CONTRACT.md files of the composed contracts\n * 5. fragments — resolve framework fragments (agent-mode, handoff, etc.)\n * 6. prompt-extensions — load per-project markdown extensions from skaile.yaml\n *\n * Used by `installer.ts` (the asset-install path, one agent asset under its own\n * name) and `install-instances.ts` (`skaile install`, one rendering per\n * `skaile.yaml` agent instance, named by the instance id). Sub-agents composed as\n * `composes: [{ kind: agent }]` (binding `delegate`, the default) are installed\n * flat (no nesting) in the same deploy directory; `binding: run` sub-agents are\n * host-executed and get no native file.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, join, relative, resolve } from \"node:path\";\nimport type { AgentInstanceConfig, HarnessName, SkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport {\n AGENT_INSTANCE_ID_PATTERN,\n HARNESS_TARGETS,\n parseFrontmatter as parseMarkdownFrontmatter,\n parseAssetRefLoose,\n resolveAgentDefinitionDir,\n} from \"@skaile/workspaces/core\";\nimport type { AgentComposeItem, AgentLifecycle } from \"@skaile/workspaces/types/manifests\";\nimport { parse as parseYaml } from \"yaml\";\nimport {\n type AbilityRef,\n type ConnectorRef,\n type ContractRef,\n type FragmentContext,\n loadPromptExtensions,\n resolveFragments,\n} from \"./fragments.js\";\nimport { type AgentManifest, type AgentRenderInput, renderAgentToFramework } from \"./renderers.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Source file of the legacy markdown agent form: frontmatter + the system prompt as body. */\nconst AGENT_MD_FILE = \"AGENT.md\";\n\n/** A Claude-style `tools:` value (`\"Read, Grep\"` or a list) as the manifest's `tools.allowed`. */\nfunction toolsFromMarkdown(value: unknown): AgentManifest[\"tools\"] | undefined {\n if (Array.isArray(value)) return { allowed: value.map(String) };\n if (typeof value === \"string\") {\n const allowed = value.split(/[,\\s]+/).filter(Boolean);\n return allowed.length > 0 ? { allowed } : undefined;\n }\n return value && typeof value === \"object\" ? (value as AgentManifest[\"tools\"]) : undefined;\n}\n\n/**\n * The `AGENT.md` form of an agent as a manifest: the frontmatter, with the\n * Claude-style scalar `model:` / `tools:` shapes mapped to the manifest's\n * `model.preferred` / `tools.allowed`, and `metadata.version` read as `version`.\n */\nfunction readAgentMdManifest(agentDir: string): { manifest: AgentManifest; body: string } | null {\n const mdPath = join(agentDir, AGENT_MD_FILE);\n if (!existsSync(mdPath)) return null;\n try {\n const { data, body } = parseMarkdownFrontmatter(readFileSync(mdPath, \"utf-8\"));\n const meta = data.metadata as { version?: unknown } | undefined;\n const manifest: Record<string, unknown> = { ...data };\n if (manifest.version === undefined && meta?.version !== undefined) {\n manifest.version = String(meta.version);\n }\n if (typeof data.model === \"string\") manifest.model = { preferred: data.model };\n if (data.tools !== undefined) manifest.tools = toolsFromMarkdown(data.tools);\n return { manifest: manifest as AgentManifest, body };\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's manifest: `agent.yaml`, else the frontmatter of the legacy\n * `AGENT.md`. `null` when the directory holds neither (or it cannot be parsed).\n */\nexport function readManifest(agentDir: string): AgentManifest | null {\n const yamlPath = join(agentDir, \"agent.yaml\");\n if (!existsSync(yamlPath)) return readAgentMdManifest(agentDir)?.manifest ?? null;\n try {\n return parseYaml(readFileSync(yamlPath, \"utf-8\")) as AgentManifest;\n } catch {\n return null;\n }\n}\n\nfunction readFile(agentDir: string, name: string): string | null {\n const p = join(agentDir, name);\n if (!existsSync(p)) return null;\n try {\n return readFileSync(p, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/**\n * The agent's identity text: `SOUL.md`; for an `AGENT.md` agent the markdown body\n * comes first, so a `SOUL.md` next to it extends the prompt rather than replacing it.\n */\nexport function readSoul(agentDir: string): string | null {\n const soul = readFile(agentDir, \"SOUL.md\");\n if (existsSync(join(agentDir, \"agent.yaml\"))) return soul;\n const body = readAgentMdManifest(agentDir)?.body;\n if (!body) return soul;\n return soul ? `${body}\\n\\n${soul}` : body;\n}\n\n/**\n * A name becomes a file or directory name under the deploy dir; one with a path\n * segment (`../x`, `a/b`) would write outside it. Refused, never sanitized.\n */\nfunction isSafeFileName(name: string): boolean {\n return name.length > 0 && name !== \".\" && name !== \"..\" && !/[\\\\/\\0]/.test(name);\n}\n\n/** Extract YAML frontmatter from a markdown file (content between first two --- delimiters). */\nfunction parseFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n try {\n return (parseYaml(match[1]!) as Record<string, unknown>) ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Merge parent and child agent manifests.\n * Scalars: child wins. Arrays: parent + child, deduplicated (`composes` by\n * kind + ref + slot id, other arrays by value).\n */\nfunction mergeManifests(parent: AgentManifest, child: AgentManifest): AgentManifest {\n const result: AgentManifest = { ...parent };\n for (const [k, val] of Object.entries(child) as [keyof AgentManifest, unknown][]) {\n if (val === undefined) continue;\n const parentVal = result[k as keyof AgentManifest];\n if (k === \"composes\" && Array.isArray(val) && Array.isArray(parentVal)) {\n const merged = new Map<string, AgentComposeItem>();\n for (const item of [...parentVal, ...val] as AgentComposeItem[]) {\n merged.set(`${item.kind}\\u0000${item.ref}\\u0000${item.id ?? \"\"}`, item);\n }\n result.composes = [...merged.values()];\n } else if (Array.isArray(val) && Array.isArray(parentVal)) {\n (result as Record<string, unknown>)[k] = [...new Set([...parentVal, ...val])];\n } else {\n (result as Record<string, unknown>)[k] = val;\n }\n }\n return result;\n}\n\n/**\n * Phase 1: inherit scalars/arrays from a parent agent when `manifest.extends` is set.\n * Returns the (possibly merged) manifest; pushes a warning when the parent is missing.\n */\nfunction applyExtendsMerge(\n manifest: AgentManifest,\n srcDir: string,\n warnings: string[],\n): AgentManifest {\n if (!manifest.extends) return manifest;\n const parentDir = resolve(srcDir, manifest.extends);\n const parentManifest = readManifest(parentDir);\n if (parentManifest) {\n return mergeManifests(parentManifest, manifest);\n }\n warnings.push(\n `extends: parent agent not found at \"${manifest.extends}\" (from ${srcDir}) — skipping inheritance`,\n );\n return manifest;\n}\n\n/**\n * Phase 2: apply the instance's overrides to the asset's manifest — the model\n * selector, the turn budget (`budget.max_turns` → `runtime.max_turns`) and the\n * lifecycle. Returns the effective manifest and lifecycle.\n */\nfunction applyInstanceOverrides(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): { manifest: AgentManifest; lifecycle: AgentLifecycle } {\n const lifecycle = instance?.lifecycle ?? manifest.lifecycle ?? \"standing\";\n if (!instance) return { manifest, lifecycle };\n const effective: AgentManifest = { ...manifest, lifecycle };\n if (instance.model) {\n effective.model = { ...manifest.model, ...instance.model } as AgentManifest[\"model\"];\n }\n if (instance.budget?.max_turns !== undefined) {\n effective.runtime = { ...manifest.runtime, max_turns: instance.budget.max_turns };\n }\n return { manifest: effective, lifecycle };\n}\n\n/**\n * The name a composed asset is installed under: the asset name of a canonical\n * ref (`skill:@pub/name#1.0.0` → `name`), else the last path segment\n * (`./skills/name` → `name`).\n */\nfunction composeRefName(ref: string): string {\n const parsed = parseAssetRefLoose(ref);\n if (parsed) return parsed.name;\n const tail = ref.replace(/\\/+$/, \"\").split(\"/\").pop() ?? ref;\n return tail.replace(/^[a-z-]+:/, \"\").replace(/#.*$/, \"\") || ref;\n}\n\n/** Names of the composed items of `kind`, in declaration order, de-duplicated. */\nfunction composedNames(manifest: AgentManifest, kind: string): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === kind)\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * Names of the agents the agent at `srcDir` calls as `delegate` sub-agents (its `kind: agent`\n * composes whose binding is not `run`). {@link installAgent} renders them next to it as\n * sub-agents, so a caller that renders the same agent on its own must do so as one too.\n */\nexport function delegateNamesOf(srcDir: string): string[] {\n const manifest = readManifest(srcDir);\n const names = (manifest?.composes ?? [])\n .filter((item) => item.kind === \"agent\" && item.binding !== \"run\")\n .map((item) => composeRefName(item.ref));\n return [...new Set(names)];\n}\n\n/**\n * The MCP servers an agent's `mcp-server` slots are bound to: the server the\n * instance's `connectors` map binds the slot id to, else the composed asset's\n * own name (the id its server is rendered under).\n */\nfunction boundMcpServers(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const names = (manifest.composes ?? [])\n .filter((item) => item.kind === \"mcp-server\")\n .map(\n (item) => (item.id ? instance?.connectors?.[item.id] : undefined) ?? composeRefName(item.ref),\n );\n return [...new Set(names)];\n}\n\n/**\n * The workspace connector ids an agent's `connector` slots are bound to: the connector the\n * instance's `connectors` map binds the slot id to, else the slot id (a slot is usually named\n * after the workspace connector it uses), else the composed asset's own name.\n */\nfunction boundConnectorIds(\n manifest: AgentManifest,\n instance: AgentInstanceConfig | undefined,\n): string[] {\n const ids = (manifest.composes ?? [])\n .filter((item) => item.kind === \"connector\")\n .flatMap((item) => {\n const bound = item.id ? instance?.connectors?.[item.id] : undefined;\n return bound ? [bound] : [item.id, composeRefName(item.ref)].filter((s): s is string => !!s);\n });\n return [...new Set(ids)];\n}\n\n/** Phase 3: resolve ability refs — read description from the installed SKILL.md of each composed skill. */\nfunction resolveAbilityRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): AbilityRef[] {\n const abilityRefs: AbilityRef[] = [];\n for (const name of composedNames(manifest, \"skill\")) {\n const skillMdPath = join(workspaceRoot, skillsRelDir, name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n const fm = parseFrontmatter(readFileSync(skillMdPath, \"utf-8\"));\n const desc = typeof fm.description === \"string\" ? fm.description : undefined;\n if (desc) abilityRefs.push({ name, description: desc });\n } catch {\n // skip unreadable SKILL.md\n }\n }\n return abilityRefs;\n}\n\n/** Phase 4: resolve contract refs — locate the CONTRACT.md of each composed contract in the skills dir. */\nfunction resolveContractRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): ContractRef[] {\n const contractRefs: ContractRef[] = [];\n for (const name of composedNames(manifest, \"contract\")) {\n const contractAbsPath = join(workspaceRoot, skillsRelDir, name, \"CONTRACT.md\");\n if (!existsSync(contractAbsPath)) continue;\n contractRefs.push({ name, relativePath: relative(workspaceRoot, contractAbsPath) });\n }\n return contractRefs;\n}\n\n/** A `kind: agent` composition item rendered as its own native sub-agent file. */\ninterface DelegateSubAgent {\n /** `composes[].ref` as written. */\n ref: string;\n /** Absolute path of the sub-agent's source directory. */\n srcDir: string;\n /** File name: the item's `as`, else the sub-agent's own `name`. */\n name: string;\n /** `composes[].as`, forwarded as the install name override. */\n alias: string | undefined;\n}\n\n/**\n * Phase 5a: the `delegate` sub-agents of an agent — its `kind: agent` items\n * whose binding is not `run` (`delegate` is the default for the harnesses that\n * render native agent files). Catalog refs resolve like `agents.<id>.ref`;\n * anything else is a path relative to the composing agent's directory. An\n * unresolvable item is skipped with a warning.\n */\nfunction resolveDelegates(\n manifest: AgentManifest,\n agentName: string,\n srcDir: string,\n workspaceRoot: string,\n warnings: string[],\n): DelegateSubAgent[] {\n const delegates: DelegateSubAgent[] = [];\n for (const item of manifest.composes ?? []) {\n if (item.kind !== \"agent\" || item.binding === \"run\") continue;\n let subSrc: string | undefined;\n try {\n subSrc =\n item.ref.startsWith(\"agent:\") || item.ref.startsWith(\"ai-assets://\")\n ? resolveAgentDefinitionDir(workspaceRoot, item.ref)\n : resolve(srcDir, item.ref);\n } catch (err) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): ${err instanceof Error ? err.message : String(err)}`,\n );\n continue;\n }\n if (!subSrc || !existsSync(subSrc)) {\n warnings.push(`Sub-agent source not found: ${item.ref} (from ${agentName})`);\n continue;\n }\n const sub = readManifest(subSrc);\n const name = item.as ?? sub?.name ?? basename(subSrc);\n // The name is a file name under the deploy dir: refuse anything that is not a plain id.\n if (typeof name !== \"string\" || !AGENT_INSTANCE_ID_PATTERN.test(name)) {\n warnings.push(\n `Sub-agent ${item.ref} (from ${agentName}): name ${JSON.stringify(name)} must match ${AGENT_INSTANCE_ID_PATTERN} — skipped`,\n );\n continue;\n }\n delegates.push({\n ref: item.ref,\n srcDir: subSrc,\n name,\n alias: item.as,\n });\n }\n return delegates;\n}\n\n/** Phase 5b: assemble the fragment context from the manifest, workspace config, and resolved refs. */\nfunction buildFragmentContext(\n subAgentNames: string[],\n harness: string,\n skillsRelDir: string,\n wsConfig: SkWorkspaceConfig | undefined,\n abilityRefs: AbilityRef[],\n contractRefs: ContractRef[],\n /** Set for an agent that another agent calls: the connector ids its own slots are bound to. */\n callee?: { subAgent: boolean; connectorIds: string[] },\n): FragmentContext {\n const connectors: ConnectorRef[] = (wsConfig?.connectors ?? [])\n .filter((c) => !callee || callee.connectorIds.includes(c.id))\n .map((c) => ({\n id: c.id,\n driver: c.driver,\n access: c.access ?? \"read-write\",\n }));\n\n const agentsRelDir = HARNESS_TARGETS[harness as HarnessName]?.local.agent ?? \"\";\n\n return {\n framework: harness,\n skillsDir: skillsRelDir,\n agentsDir: agentsRelDir,\n subAgents: subAgentNames,\n ...(callee ? { subAgent: callee.subAgent } : {}),\n connectors,\n abilityRefs,\n contractRefs,\n };\n}\n\n// ── Core installation ─────────────────────────────────────────────────────────\n\n/**\n * Install a single GitAgent source directory using the appropriate renderer.\n *\n * When `includeSubAgents` is `true`, recursively installs the `delegate`\n * sub-agents (`composes: [{ kind: agent }]`) as separate flat agents in the\n * same deploy directory (no nesting). Tracks visited directories to prevent\n * infinite loops in sub-agent cycles.\n *\n * @param srcDir - Absolute path to the GitAgent source directory (contains `agent.yaml`).\n * @param agentDeployDir - Absolute path to the framework's agent deploy directory.\n * @param workspaceRoot - Absolute path to the workspace root.\n * @param harness - Agent framework ID used to select the renderer.\n * @param skillsRelDir - Relative path to the installed skills dir (e.g. `\".claude/skills\"`).\n * @param nameOverride - Override name for the installed agent. Defaults to `manifest.name`;\n * an instance render passes the instance id.\n * @param includeSubAgents - When `true`, recursively install `delegate` sub-agents.\n * @param visited - Set of resolved source paths already processed (cycle guard).\n * @param wsConfig - Workspace config from `skaile.yaml` (fragments, connectors, extensions).\n * @param log - Optional logger callback for progress messages.\n * @param instance - The `skaile.yaml` instance being rendered; its model / budget / lifecycle\n * override the asset's and its `connectors` map binds the `mcp-server` slots.\n * @returns Object with `created` file paths (every rendered file), `changed` (the subset whose\n * bytes differ from what was deployed before) and `warnings` list.\n * @docLink packages/asset-manager/concepts#install-agent\n */\nexport function installAgent(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n harness: string,\n /** Relative path to the installed skills dir (e.g. \".claude/skills\") */\n skillsRelDir: string,\n nameOverride: string | undefined,\n includeSubAgents: boolean,\n visited: Set<string>,\n wsConfig: SkWorkspaceConfig | undefined,\n log?: (msg: string) => void,\n instance?: AgentInstanceConfig,\n /** `true` for a `delegate` sub-agent rendered for the agent that calls it. */\n delegated = false,\n): { created: string[]; changed: string[]; warnings: string[] } {\n const created: string[] = [];\n const changed: string[] = [];\n const warnings: string[] = [];\n\n const realSrc = resolve(srcDir);\n if (visited.has(realSrc)) return { created, changed, warnings };\n visited.add(realSrc);\n\n const initialManifest = readManifest(srcDir);\n if (!initialManifest) {\n warnings.push(`${srcDir} has no agent.yaml or AGENT.md — skipping (not an agent package)`);\n return { created, changed, warnings };\n }\n\n // Phase 1: extends merge — inherit scalars/arrays from parent agent\n // Phase 2: instance overrides — model / budget / lifecycle\n const { manifest, lifecycle } = applyInstanceOverrides(\n applyExtendsMerge(initialManifest, srcDir, warnings),\n instance,\n );\n\n const agentName = nameOverride ?? manifest.name ?? basename(srcDir);\n if (typeof agentName !== \"string\" || !isSafeFileName(agentName)) {\n warnings.push(\n `${srcDir}: agent name ${JSON.stringify(agentName)} is not a valid file name (no path separators) — skipping`,\n );\n return { created, changed, warnings };\n }\n\n log?.(`Installing git-agent: ${agentName} (${harness})`);\n\n // Phase 3: resolve ability refs — read description from installed SKILL.md files\n const abilityRefs = resolveAbilityRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 4: resolve contract refs — locate CONTRACT.md files in the skills dir\n const contractRefs = resolveContractRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 5: delegate sub-agents, fragment context, framework fragments + prompt extensions\n const delegates = resolveDelegates(manifest, agentName, srcDir, workspaceRoot, warnings);\n // A `role`, and a `delegate` sub-agent, is called by another agent: it is told so, and sees\n // only the connectors it composes.\n const subAgent = lifecycle === \"role\" || delegated;\n const fragmentCtx = buildFragmentContext(\n delegates.map((d) => d.name),\n harness,\n skillsRelDir,\n wsConfig,\n abilityRefs,\n contractRefs,\n subAgent ? { subAgent, connectorIds: boundConnectorIds(manifest, instance) } : undefined,\n );\n\n const frameworkFragments = resolveFragments(\n fragmentCtx,\n wsConfig?.agent?.fragments,\n workspaceRoot,\n );\n const promptExtensions = loadPromptExtensions(\n wsConfig?.agent?.[\"prompt-extensions\"],\n workspaceRoot,\n );\n\n const input: AgentRenderInput = {\n manifest,\n soul: readSoul(srcDir),\n rules: readFile(srcDir, \"RULES.md\"),\n duties: readFile(srcDir, \"DUTIES.md\"),\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n lifecycle,\n skills: composedNames(manifest, \"skill\"),\n mcpServers: boundMcpServers(manifest, instance),\n srcDir,\n };\n\n const result = renderAgentToFramework(input, harness, log);\n created.push(...result.created);\n changed.push(...result.changed);\n warnings.push(...result.warnings);\n\n // Recursively install delegate sub-agents as flat top-level agents\n if (includeSubAgents) {\n for (const delegate of delegates) {\n const sub = installAgent(\n delegate.srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n delegate.alias, // undefined → the sub-agent's own name from its agent.yaml\n includeSubAgents,\n visited,\n wsConfig,\n log,\n undefined,\n true,\n );\n created.push(...sub.created);\n changed.push(...sub.changed);\n warnings.push(...sub.warnings);\n }\n }\n\n return { created, changed, warnings };\n}\n","/**\n * Asset deployment — copies assets into framework dirs by default (self-contained,\n * cache-safe, portable); `--link` opts into a symlink for the local-path dev loop.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n mkdtempSync,\n readdirSync,\n readlinkSync,\n renameSync,\n rmSync,\n statSync,\n symlinkSync,\n type Stats,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir, tmpdir } from \"node:os\";\nimport { basename, dirname, join, normalize, relative, resolve, sep } from \"node:path\";\nimport type {\n AgentInstanceConfig,\n AiComponent,\n CatalogEntry,\n HarnessName,\n SourceDeclaration,\n} from \"@skaile/workspaces/core\";\nimport {\n agentSourceCacheDir,\n applyPatch,\n assetRefToStr,\n computeHash,\n HARNESS_TARGETS,\n deployedBase,\n deployedDir,\n deployedPaths,\n globalSkaileDir,\n isDeployed,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport {\n isEnvFileName,\n isNonAssetDir,\n isNonAssetFile,\n isSecretFileName,\n librarySymlinkMessage,\n listAssetFiles,\n listSecretFiles,\n listSkippedSymlinks,\n} from \"@skaile/workspaces/core/publish-manifest\";\nimport {\n AGENT_BODY_PLACEHOLDER,\n CONTRACT_BODY_PLACEHOLDER,\n FLOW_NODE_INSTRUCTION_PLACEHOLDER,\n PRESET_ITEM_PLACEHOLDER_REF,\n PROMPT_BODY_PLACEHOLDER,\n SKILL_BODY_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER,\n SKILL_DESCRIPTION_PLACEHOLDER_PREFIX,\n} from \"@skaile/workspaces/types/manifests\";\nimport type { IAssetKindProvider, IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { isMap, isSeq, parseDocument, stringify as stringifyYaml } from \"yaml\";\nimport { delegateNamesOf, installAgent, readManifest, readSoul } from \"./install-agent.js\";\nimport { CODEX_IDENTITY_DIR, type Log } from \"./renderers.js\";\n\nexport type { Log } from \"./renderers.js\";\n\nconst noop: Log = () => {};\n\n/**\n * The printable canonical ref of a resolved entry — `kind:@publisher/name#version`,\n * the one ref grammar the CLI shows. An entry whose `publisher` is a clone key\n * carries the real ref in `canonicalRef`; with neither a `canonicalRef` nor a\n * publisher there is nothing to namespace it by, so it falls back to `kind:name`.\n */\nexport function canonicalEntryRef(entry: CatalogEntry): string {\n if (entry.canonicalRef) return entry.canonicalRef;\n const publisher = entry.publisher?.replace(/^@/, \"\");\n if (!publisher) return `${entry.kind}:${entry.name}`;\n return assetRefToStr({\n kind: entry.kind,\n name: entry.name,\n publisher,\n pin: entry.version || undefined,\n });\n}\n\n// ── Filesystem helpers ────────────────────────────────────────────────────────\n\nfunction clearDest(dest: string): void {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {}\n}\n\n/**\n * A credential file (not an `.env*` file, which stays the owner's local file) inside a deployed\n * copy: releases before 5.17 deployed these (`.npmrc`, `id_rsa`, `token.json`, ...), a deploy now\n * withholds them (p1040). A re-deploy deletes the leftover and `check` reports it as extra, so a\n * leaked credential is not kept for good.\n */\nfunction isLeakedSecret(name: string): boolean {\n return isSecretFileName(name) && !isEnvFileName(name);\n}\n\n/**\n * Empty a deployed asset directory before a copy deploy, but keep what is not part of an\n * asset (`.env`, `.venv/`, `__pycache__/`, `*.pyc`, ...): those are the owner's local files, the\n * lock never covers them, so a re-deploy must not delete them. Anything else — including a\n * symlink — goes. A `dest` that is a symlink or a file is removed whole.\n */\nfunction clearDeployedAsset(dest: string): void {\n let s: ReturnType<typeof lstatSync>;\n try {\n s = lstatSync(dest);\n } catch {\n return;\n }\n if (!s.isDirectory()) {\n clearDest(dest);\n return;\n }\n const empty = (dir: string): boolean => {\n let kept = false;\n for (const e of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, e.name);\n if (e.isDirectory()) {\n if (isNonAssetDir(e.name)) kept = true;\n else if (!empty(path)) kept = true;\n else rmSync(path, { recursive: true, force: true });\n } else if (e.isFile() && isNonAssetFile(e.name) && !isLeakedSecret(e.name)) {\n kept = true;\n } else {\n rmSync(path, { force: true });\n }\n }\n return !kept;\n };\n try {\n empty(dest);\n } catch {\n clearDest(dest);\n }\n}\n\n/**\n * The harness component directory a kind installs into — the provider's\n * `installTarget` — or `undefined` for composition-only kinds (connector,\n * mcp-server, knowledge, persona, ruleset, preset) and unregistered kinds.\n * The registry is the only authority: there is no static list of deployable kinds.\n */\nexport function installTargetOf(\n registry: IAssetKindRegistry,\n kind: string,\n): AiComponent | undefined {\n return registry.getProvider(kind)?.installTarget;\n}\n\n/**\n * The manifest file of a resolved entry. `source` is normally the manifest file\n * itself; a directory source is searched for the provider's manifest.\n * `undefined` when `source` is a directory holding none.\n */\nfunction manifestFileOf(provider: IAssetKindProvider, source: string): string | undefined {\n if (!statSync(source).isDirectory()) return source;\n const hit = readdirSync(source).find((f) => provider.matchesPath(f));\n return hit ? join(source, hit) : undefined;\n}\n\n/**\n * A resolved entry ready to deploy: a {@link CatalogEntry} that may carry the\n * asset's authoritative file list.\n */\nexport interface DeployableEntry extends CatalogEntry {\n /**\n * Asset files relative to the manifest's directory. Set for store-staged\n * assets, whose verified pointer (not the provider's default filter) defines\n * what the asset is — a manifest-mode publish may list files the default filter\n * would not pick. Absent → the provider's `defaultFileFilter`.\n */\n files?: readonly string[];\n}\n\n/**\n * Throw when the asset's own folder holds a symlink the library would refuse. A lone manifest\n * file shares its directory with other assets, so only an asset that owns its directory (several\n * files, or a directory named after it) is checked.\n */\nfunction assertNoSymlinks(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n manifestPath: string | null | undefined,\n): void {\n let root = entry.source;\n if (manifestPath) {\n const filter = provider.defaultFileFilter(manifestPath);\n const files = entry.files ?? filter.files;\n if (files.length <= 1 && basename(filter.assetRoot) !== entry.name) return;\n root = filter.assetRoot;\n }\n const [rel] = listSkippedSymlinks(root);\n if (rel === undefined) return;\n const link = join(root, rel);\n throw new Error(\n `${canonicalEntryRef(entry)}: ${librarySymlinkMessage({ path: join(basename(root), rel), target: readlinkSync(link) })} Nothing was added.`,\n );\n}\n\n/**\n * Refuse, before anything is written, every entry whose own folder holds a symlink (p743).\n * `add`, `install` and `update` call this ahead of the first deploy and ahead of the removal of\n * stale assets, so `Nothing was added` is true: a refusal in the middle of {@link deployAll}\n * would leave the copies of the entries before it behind. Composition-only kinds, entries that a\n * `--link` deploy symlinks (no copy) and entries without a readable source are skipped. An agent\n * counts too: it is rendered, but its source is copied into the agent cache.\n */\nexport function assertNoLibrarySymlinks(\n entries: readonly DeployableEntry[],\n registry: IAssetKindRegistry,\n repositories: Record<string, SourceDeclaration> = {},\n link = false,\n): void {\n for (const entry of entries) {\n const provider = registry.getProvider(entry.kind);\n if (!provider?.installTarget) continue;\n if (link) {\n const decl = entry.publisher ? repositories[entry.publisher] : undefined;\n if (decl?.path != null && decl.factory !== true) continue;\n }\n let manifestPath: string | undefined;\n try {\n manifestPath = manifestFileOf(provider, entry.source);\n } catch {\n continue;\n }\n assertNoSymlinks(provider, entry, manifestPath);\n }\n}\n\n/**\n * Copy an asset into `dest`: the entry's explicit `files` when it has them, else\n * exactly the files the provider's `defaultFileFilter` selects (the same set the\n * store publishes and hashes). A directory source without a recognisable\n * manifest is copied whole.\n */\nfunction copyAsset(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n dest: string,\n onSecretFile?: (entry: DeployableEntry, path: string) => void,\n): void {\n const source = entry.source;\n const manifestPath = manifestFileOf(provider, source);\n // A library holds plain files: a symlink in the asset's folder refuses the deploy, as `library\n // index`, `validate` and the publish plan refuse the library (p743). Nothing is cleared or copied.\n assertNoSymlinks(provider, entry, manifestPath);\n clearDeployedAsset(dest);\n if (!manifestPath) {\n // Same ignore list as the content hash: leftovers and symlinks are not part of the asset.\n cpSync(source, dest, {\n recursive: true,\n filter: (src) => {\n if (src === source) return true;\n const name = basename(src);\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n // A directory is only left out by name; a file by `isNonAssetFile`: a folder called\n // `credentials` or `build.log` is an ordinary folder.\n if (stat.isDirectory() ? isNonAssetDir(name) : isNonAssetFile(name)) {\n if (stat.isFile() && isSecretFileName(name)) {\n onSecretFile?.(entry, join(basename(source), relative(source, src)));\n }\n return false;\n }\n return true;\n },\n });\n return;\n }\n const filter = provider.defaultFileFilter(manifestPath);\n const assetRoot = filter.assetRoot;\n const files = entry.files ?? filter.files;\n mkdirSync(dest, { recursive: true });\n for (const rel of files) {\n const target = join(dest, rel);\n mkdirSync(dirname(target), { recursive: true });\n cpSync(join(assetRoot, rel), target);\n }\n // A lone manifest file shares its directory with other assets: only an asset that owns its\n // directory (several files, or a directory named after it) can say which secrets it drops.\n if (files.length > 1 || basename(assetRoot) === entry.name) {\n if (onSecretFile) {\n for (const rel of listSecretFiles(assetRoot))\n onSecretFile(entry, join(basename(assetRoot), rel));\n }\n }\n}\n\n/**\n * Whether the source file is executable but its deployed copy is not: the bytes match, yet the\n * copy shows as a mode change in `git status`, so a repeat install writes it again (p1657).\n */\nfunction execBitLost(source: string, deployed: string): boolean {\n try {\n return (lstatSync(source).mode & 0o111) !== 0 && (lstatSync(deployed).mode & 0o100) === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Symlink an asset (the `--link` dev-loop). A multi-file asset, or one living in\n * a directory named after it, links its whole directory; a lone manifest file\n * links into `dest/`.\n */\nfunction symlinkAsset(\n provider: IAssetKindProvider,\n source: string,\n dest: string,\n name: string,\n): void {\n clearDest(dest);\n mkdirSync(dirname(dest), { recursive: true });\n const manifestPath = manifestFileOf(provider, source);\n if (!manifestPath) {\n symlinkSync(resolve(source), dest);\n return;\n }\n const { assetRoot, files } = provider.defaultFileFilter(manifestPath);\n if (files.length > 1 || basename(assetRoot) === name) {\n symlinkSync(resolve(assetRoot), dest);\n } else {\n mkdirSync(dest, { recursive: true });\n symlinkSync(resolve(manifestPath), join(dest, basename(manifestPath)));\n }\n}\n\n/** What differs between a deployed asset directory and the bytes a deploy of the entry writes. */\nexport interface DeployedDrift {\n /** Deployed files (relative to the deployed asset directory) whose bytes differ from the source. */\n modified: string[];\n /** Files in the deployed asset directory that the asset does not ship. */\n extra: string[];\n}\n\n/**\n * Compare the deployed copy of `entry` with the bytes a copy deploy writes from its source: the\n * same file set {@link copyAsset} copies, so a tool leftover (`__pycache__/`, `.env`) in the\n * deployed directory is not drift. `null` when there is nothing to compare: a kind that is\n * not copied into a harness directory (composition-only, or an agent, which is rendered), no\n * deployed directory, a symlinked deploy (`--link`) or an unreadable source.\n */\nexport function deployedAssetDrift(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): DeployedDrift | null {\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component || component === \"agent\") return null;\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n try {\n const deployed = lstatSync(dest);\n if (deployed.isSymbolicLink() || !deployed.isDirectory()) return null;\n const manifestPath = manifestFileOf(provider, entry.source);\n const filter = manifestPath ? provider.defaultFileFilter(manifestPath) : undefined;\n const assetRoot = filter ? filter.assetRoot : entry.source;\n const files = filter ? (entry.files ?? filter.files) : listAssetFiles(entry.source);\n const modified: string[] = [];\n for (const rel of files) {\n const deployedFile = join(dest, rel);\n if (!existsSync(deployedFile)) continue;\n if (computeHash(join(assetRoot, rel)) !== computeHash(deployedFile)) modified.push(rel);\n }\n const expected = new Set(files);\n const extra = [\n ...listAssetFiles(dest),\n ...listSecretFiles(dest).filter((rel) => isLeakedSecret(basename(rel))),\n ].filter((rel) => !expected.has(rel));\n return { modified, extra };\n } catch {\n return null;\n }\n}\n\n/**\n * Whether the deployed copy of `entry` is what a deploy would write, so the deploy skips it.\n * `current`: the manifest, every companion file and the file set match (or the manifest cannot be\n * compared). `stale`: something differs, a deploy rewrites the copy. `missing`: no manifest file\n * in the deployed directory. A companion that is a symlink in the source is no part of the copy\n * (a library holds plain files, `check` ignores it), so it never makes an intact copy stale\n * (p1857). The caller has checked that the entry is a copied kind and its directory exists.\n */\nfunction deployedCopyState(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\">,\n): \"current\" | \"stale\" | \"missing\" {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) return \"missing\";\n const dest = deployedDir(\n component,\n entry.name,\n opts.harness ?? \"claude-code\",\n opts.global ?? false,\n opts.cwd,\n );\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n // isDeployed() only lstats the dir, so a present-but-empty dir (manifest file deleted) reads as\n // deployed. A missing manifest must never count as \"already deployed\".\n // (existsSync follows symlinks, so for symlinked installs the manifest resolves through to the\n // live source and the hash check below still skips them.)\n if (!existsSync(deployedManifest)) return \"missing\";\n let manifestUnchanged: boolean;\n try {\n manifestUnchanged =\n computeHash(entry.source) === computeHash(deployedManifest) &&\n !execBitLost(entry.source, deployedManifest);\n } catch {\n // Deployed manifest unreadable (e.g. agent rendered to a different path) - skip\n return \"current\";\n }\n // Every other file the deploy writes must be present and identical too - the manifest alone\n // misses a deleted or stale companion (`.gitignore`, `resources/`, `scripts/`) the copy would\n // restore. A companion that cannot be compared counts as changed, so it is healed, not skipped.\n const srcRoot = dirname(entry.source);\n const companionsUnchanged = (entry.files ?? [])\n .filter((rel) => rel !== manifestName)\n .every((rel) => {\n const deployed = join(dest, rel);\n try {\n if (lstatSync(join(srcRoot, rel)).isSymbolicLink()) return true;\n return (\n existsSync(deployed) &&\n computeHash(join(srcRoot, rel)) === computeHash(deployed) &&\n !execBitLost(join(srcRoot, rel), deployed)\n );\n } catch {\n return false;\n }\n });\n // A file the asset does not ship (a stray `extra.txt`) is drift too: the copy clears the\n // directory, so a repeat install restores the asset exactly.\n const strayFiles = deployedAssetDrift(entry, opts)?.extra.length ?? 0;\n return manifestUnchanged && companionsUnchanged && strayFiles === 0 ? \"current\" : \"stale\";\n}\n\n/**\n * The entries a deploy would write: those without a current deployed copy. An intact copy\n * stays as it is, so a library change that does not reach it (a symlink added next to the\n * files) stops no `install` or `update` (p1857).\n */\nexport function entriesNeedingDeploy<T extends DeployableEntry>(\n entries: readonly T[],\n opts: Pick<DeployOptions, \"registry\" | \"harness\" | \"global\" | \"cwd\" | \"link\">,\n): T[] {\n return entries.filter((entry) => {\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component || component === \"agent\") return true;\n const harness = opts.harness ?? \"claude-code\";\n const global = opts.global ?? false;\n if (!isDeployed(component, entry.name, harness, global, opts.cwd)) return true;\n try {\n const dest = deployedDir(component, entry.name, harness, global, opts.cwd);\n if (lstatSync(dest).isSymbolicLink() && opts.link !== true) return true;\n } catch {\n return true;\n }\n return deployedCopyState(entry, { ...opts, harness, global }) !== \"current\";\n });\n}\n\n// ── Deploy options ───────────────────────────────────────────────────────────\n\n/**\n * Options controlling where and how assets are deployed.\n *\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport interface DeployOptions {\n /** Asset-kind registry — decides, per kind, the harness install target and file set. */\n registry: IAssetKindRegistry;\n /** Agent framework to target (determines framework-specific directory layout). Defaults to `\"claude-code\"`. */\n harness?: HarnessName;\n /** When `true`, deploy into the global Skaile cache rather than a project workspace. */\n global?: boolean;\n /** Absolute path to the workspace root. Defaults to `process.cwd()`. */\n cwd?: string;\n /**\n * Opt into a symlink (the author dev-loop) instead of a copy — honoured only\n * when the source has a real local path. Machine-local / not for committing;\n * for store/factory sources (no stable local path) it is a no-op (still copy).\n */\n link?: boolean;\n /**\n * Called once per secret file ({@link isSecretFileName}: `.env*`, private keys, credential\n * files) inside an asset's own directory that a copy deploy leaves out (secrets are never part\n * of an asset), with the path relative to the asset directory's parent.\n */\n onSecretFile?: (entry: DeployableEntry, path: string) => void;\n /**\n * The lock's record of an agent's `../` compose folders: project-relative paths under\n * `.skaile/cache/agents/<agent>/composes/` with sha256. While a record exists the cached\n * folders keep exactly those bytes: a deploy does not copy the library's newer ones (only\n * {@link DeployOptions.refreshComposed} does, p1511).\n */\n lockedComposed?: (agent: string) => ReadonlyArray<{ path: string; sha256: string }> | undefined;\n /** Copy every `../` compose folder from its source again, whatever the lock records (`update`, `add`). */\n refreshComposed?: boolean;\n /**\n * Called once per `../` compose folder the lock records but neither the cached copy nor the\n * source holds any more: the source moved on and only `update` moves the lock to it.\n */\n onComposedDrift?: (entry: DeployableEntry, ref: string) => void;\n}\n\n/**\n * Keep the agent's source (`agent.yaml`, `SOUL.md`, …) under\n * `<project>/.skaile/cache/agents/<name>/`, the one place `agents.<id>.ref:\n * agent:@pub/name` resolves an added library / source / store agent from: the\n * deployed copy is a rendering (`.claude/agents/<name>.md`) that has lost the\n * composition, triggers and slots an instance needs. An `AGENT.md` agent is stored\n * in the `agent.yaml` + `SOUL.md` form so every instance consumer reads one shape.\n * A failure is logged, never fatal: the rendered agent is deployed either way.\n */\nfunction materializeAgentSource(\n provider: IAssetKindProvider,\n entry: DeployableEntry,\n srcDir: string,\n workspaceRoot: string,\n log: Log,\n opts: DeployOptions,\n): void {\n const dest = join(agentSourceCacheDir(workspaceRoot), entry.name);\n // `skaile rebuild` (or the compile an earlier add/install made) pins the composition in\n // `compile_manifest.json`; the copy below clears the folder, the pin is put back after it.\n // The CLI recompiles a pin whose content the source no longer serves (p413, p1310).\n const pinFile = join(dest, COMPILE_PIN_FILENAME);\n const pin = existsSync(pinFile) ? readFileSync(pinFile) : undefined;\n // The cached `../` compose folders are locked: set them aside so the copy below does not\n // clear them, and put back what the lock still describes (p1511).\n const composesDir = join(dest, \"composes\");\n const keptDir = existsSync(composesDir)\n ? join(agentSourceCacheDir(workspaceRoot), `.${entry.name}.composes-kept`)\n : undefined;\n if (keptDir) {\n rmSync(keptDir, { recursive: true, force: true });\n renameSync(composesDir, keptDir);\n }\n // `bundleParentComposes` settles the kept folders (puts back or replaces each); only after it\n // ran are the leftovers safe to delete. Any earlier exit puts the locked bytes back.\n let bundled = false;\n try {\n copyAsset(provider, entry, dest);\n if (!existsSync(join(dest, \"agent.yaml\"))) {\n const manifest = readManifest(srcDir);\n if (!manifest) return;\n writeFileSync(\n join(dest, \"agent.yaml\"),\n stringifyYaml({ ...manifest, name: manifest.name ?? entry.name }),\n \"utf8\",\n );\n const soul = readSoul(srcDir);\n if (soul) writeFileSync(join(dest, \"SOUL.md\"), `${soul}\\n`, \"utf8\");\n }\n bundleParentComposes(dest, srcDir, { entry, workspaceRoot, keptDir, opts });\n bundled = true;\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n log(` warn: could not keep the source of agent ${entry.name}: ${reason}`);\n } finally {\n if (keptDir) {\n if (bundled || restoreKeptComposes(keptDir, composesDir)) {\n rmSync(keptDir, { recursive: true, force: true });\n }\n }\n if (pin && existsSync(dest) && !existsSync(pinFile)) writeFileSync(pinFile, pin);\n }\n}\n\n/**\n * Put the compose folders set aside by {@link materializeAgentSource} back under `composes/`\n * after a copy that did not finish, so the bytes the lock records are not lost (p1511). A folder\n * the failed run already placed there is left as it is. Returns `false` when a folder could not be moved back, so the caller keeps the set-aside copy.\n */\nfunction restoreKeptComposes(keptDir: string, composesDir: string): boolean {\n try {\n mkdirSync(composesDir, { recursive: true });\n for (const name of readdirSync(keptDir)) {\n const target = join(composesDir, name);\n if (!existsSync(target)) renameSync(join(keptDir, name), target);\n }\n return true;\n } catch {\n // the kept copy stays on disk next to the cache folder if it cannot be moved back\n return false;\n }\n}\n\n/** Name of the compile pin `skaile rebuild` writes (`COMPILE_MANIFEST_FILENAME` of the runner, which this layer cannot import). */\nconst COMPILE_PIN_FILENAME = \"compile_manifest.json\";\n\n/** Relative path → sha256 of the files of a compose folder (or of a lone file, under the key `\"\"`). */\nfunction composeRows(root: string): Map<string, string> {\n const out = new Map<string, string>();\n let top: Stats;\n try {\n top = lstatSync(root);\n } catch {\n return out;\n }\n if (top.isSymbolicLink()) return out;\n if (top.isFile()) {\n out.set(\"\", computeHash(root));\n return out;\n }\n const walk = (dir: string, rel: string): void => {\n for (const name of readdirSync(dir).sort()) {\n const abs = join(dir, name);\n const stat = lstatSync(abs);\n const here = rel ? `${rel}/${name}` : name;\n if (stat.isSymbolicLink()) continue;\n if (stat.isDirectory()) {\n if (!isNonAssetDir(name)) walk(abs, here);\n } else if (stat.isFile() && !isNonAssetFile(name)) {\n out.set(here, computeHash(abs));\n }\n }\n };\n walk(root, \"\");\n return out;\n}\n\nfunction sameRows(a: ReadonlyMap<string, string>, b: ReadonlyMap<string, string>): boolean {\n if (a.size !== b.size) return false;\n for (const [k, v] of a) if (b.get(k) !== v) return false;\n return true;\n}\n\n/** The rows of the lock record that lie under `targetRel` (project-relative, POSIX), keyed like {@link composeRows}. */\nfunction lockedRowsUnder(\n record: ReadonlyArray<{ path: string; sha256: string }> | undefined,\n targetRel: string,\n): Map<string, string> | undefined {\n if (!record) return undefined;\n const rows = new Map<string, string>();\n for (const f of record) {\n if (f.path === targetRel) rows.set(\"\", f.sha256);\n else if (f.path.startsWith(`${targetRel}/`))\n rows.set(f.path.slice(targetRel.length + 1), f.sha256);\n }\n return rows.size > 0 ? rows : undefined;\n}\n\n/** The `../` compose folders of an agent source: the cache folder name each one is copied to, its ref and its source folder. */\nfunction outerComposeFolders(\n srcDir: string,\n refs: readonly string[],\n): Array<{ ref: string; name: string; from: string }> {\n const taken = new Map<string, string>();\n const out: Array<{ ref: string; name: string; from: string }> = [];\n for (const ref of refs) {\n if (!normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n taken.set(name, from);\n out.push({ ref, name, from });\n }\n return out;\n}\n\n/**\n * The files (project-relative, with sha256) the `../` compose folders of the agent source at\n * `srcDir` would occupy in the project cache now: what a copy of the source would record in the\n * lock. `outdated` compares them with `LockEntry.composed` (p1511).\n */\nexport function sourceComposedFiles(\n srcDir: string,\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const out: Array<{ path: string; sha256: string }> = [];\n for (const { name, from } of outerComposeFolders(srcDir, refs)) {\n if (!existsSync(from)) continue;\n const base = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\", name);\n for (const [rel, sha256] of composeRows(from)) {\n out.push({\n path: relative(workspaceRoot, rel ? join(base, rel) : base)\n .split(sep)\n .join(\"/\"),\n sha256,\n });\n }\n }\n return out.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/** The files (project-relative, with sha256) the project cache holds for the `../` compose folders of agent `agentName`. */\nexport function cachedComposedFiles(\n agentName: string,\n workspaceRoot: string,\n): Array<{ path: string; sha256: string }> {\n const dir = join(agentSourceCacheDir(workspaceRoot), agentName, \"composes\");\n return [...composeRows(dir)]\n .map(([rel, sha256]) => ({\n path: relative(workspaceRoot, join(dir, rel)).split(sep).join(\"/\"),\n sha256,\n }))\n .sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/**\n * The `../` compose folders of the agent `entry` that a deploy with `opts.lockedComposed` would\n * report as drift ({@link DeployOptions.onComposedDrift}): the lock records the folder, the cache\n * no longer holds those bytes, and the source does not either. Reads only; nothing is written.\n * `install --locked` asks it before it deploys anything (p1642).\n *\n * @returns The `composes:` refs of the drifted folders (`../shared-rules/extra`).\n */\nexport function composedDriftRefs(\n entry: DeployableEntry,\n opts: Pick<DeployOptions, \"cwd\" | \"lockedComposed\">,\n): string[] {\n const workspaceRoot = opts.cwd ?? process.cwd();\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n const refs = (readManifest(srcDir)?.composes ?? []).map((c) => c.ref);\n const record = opts.lockedComposed?.(entry.name);\n const composesDir = join(agentSourceCacheDir(workspaceRoot), entry.name, \"composes\");\n const out: string[] = [];\n for (const { ref, name, from } of outerComposeFolders(srcDir, refs)) {\n const target = join(composesDir, name);\n const locked = lockedRowsUnder(record, relative(workspaceRoot, target).split(sep).join(\"/\"));\n const keptRows = existsSync(target) ? composeRows(target) : undefined;\n if (locked && keptRows && sameRows(keptRows, locked)) continue;\n if (!existsSync(from)) {\n if (locked) out.push(ref);\n continue;\n }\n if (locked && !sameRows(composeRows(from), locked)) out.push(ref);\n }\n return out;\n}\n\n/**\n * A `composes:` ref that climbs out of the agent folder (`../shared-rules/x`) names a folder\n * that does not exist beside the cache copy (`.skaile/cache/agents/<name>/`), so `skaile run`\n * could not serve it. Copy each such folder from the source into `composes/<name>/` and point\n * the ref there, as the omp rendering does (p1312).\n *\n * The folder is part of the lock (p1511): once the lock records its files, a deploy keeps the\n * cached copy while it still holds those bytes, writes the source's copy back only when it\n * holds them too, and otherwise reports the drift. Only `refreshComposed` (`update`, `add`)\n * copies the source's current bytes.\n */\nfunction bundleParentComposes(\n dest: string,\n srcDir: string,\n ctx: {\n entry: DeployableEntry;\n workspaceRoot: string;\n /** The previous `composes/` folder, set aside before the copy cleared the cache dir. */\n keptDir: string | undefined;\n opts: DeployOptions;\n },\n): void {\n const file = join(dest, \"agent.yaml\");\n const doc = parseDocument(readFileSync(file, \"utf8\"));\n const composes = doc.get(\"composes\");\n if (!isSeq(composes)) return;\n const record = ctx.opts.refreshComposed ? undefined : ctx.opts.lockedComposed?.(ctx.entry.name);\n const taken = new Map<string, string>();\n let changed = false;\n for (const item of composes.items) {\n if (!isMap(item)) continue;\n const ref = item.get(\"ref\");\n if (typeof ref !== \"string\" || !normalize(ref).startsWith(\"..\")) continue;\n const from = resolve(srcDir, ref);\n let name = basename(from);\n for (let n = 2; taken.has(name) && taken.get(name) !== from; n++) {\n name = `${basename(from)}-${n}`;\n }\n const target = join(dest, \"composes\", name);\n const targetRel = relative(ctx.workspaceRoot, target).split(sep).join(\"/\");\n const locked = lockedRowsUnder(record, targetRel);\n const kept = ctx.keptDir ? join(ctx.keptDir, name) : undefined;\n const keptRows = kept && existsSync(kept) ? composeRows(kept) : undefined;\n let how: \"copy\" | \"keep\" | \"drift\" | \"skip\";\n if (locked && keptRows && sameRows(keptRows, locked)) how = \"keep\";\n else if (!existsSync(from)) how = locked ? \"drift\" : \"skip\";\n else if (!locked || sameRows(composeRows(from), locked)) how = \"copy\";\n else how = \"drift\";\n taken.set(name, from);\n if (how === \"skip\") continue;\n rmSync(target, { recursive: true, force: true });\n mkdirSync(dirname(target), { recursive: true });\n if (how === \"copy\") {\n cpSync(from, target, {\n recursive: true,\n filter: (src) => {\n if (src === from) return true;\n const stat = lstatSync(src);\n if (stat.isSymbolicLink()) return false;\n return stat.isDirectory()\n ? !isNonAssetDir(basename(src))\n : !isNonAssetFile(basename(src));\n },\n });\n } else {\n // `keep` puts the locked bytes back; `drift` leaves what the cache held (hand edits\n // included) and says that only `update` moves the lock to the source.\n if (kept && existsSync(kept)) renameSync(kept, target);\n if (how === \"drift\") ctx.opts.onComposedDrift?.(ctx.entry, ref);\n }\n item.set(\"ref\", `./composes/${name}`);\n changed = true;\n }\n if (changed) writeFileSync(file, doc.toString(), \"utf8\");\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Copies by default — self-contained, cache-safe, and portable, so a deployed\n * asset survives a `cache clean` of its source and a committed `.claude/` stays\n * machine-independent. `opts.link` opts into a symlink (the live dev-loop), but\n * only when the source has a real local path; store/factory sources (no stable\n * local path) ignore it and still copy. Agents are rendered via the enriched\n * `installAgent` path which resolves abilities, contracts, and framework\n * fragments before writing the native agent file.\n *\n * @param entry - Catalog entry describing the asset to deploy.\n * @param repositories - Repository declarations from `skaile.yaml` (used to\n * determine whether the source is a local path or a remote clone).\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns `true` when the asset was deployed successfully.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAsset(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log = noop,\n): boolean {\n return deployEntry(entry, repositories, opts, log).deployed;\n}\n\n/**\n * {@link deployAsset} plus whether the deploy altered anything on disk. A copied asset always\n * counts as changed; an agent is re-rendered every time but counts as changed only when a\n * rendered file's bytes differ from the deployed one (an unchanged agent is left untouched).\n */\nfunction deployEntry(\n entry: DeployableEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions,\n log: Log,\n /** `true` when {@link deployAll} already kept this agent's source under `.skaile/cache/agents/`. */\n sourceKept = false,\n /** `true` when another agent deployed in this call composes this one as a `delegate` sub-agent. */\n delegated = false,\n): { deployed: boolean; changed: boolean } {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds (no `installTarget`) never land in a harness dir:\n // they are fetched + verified into the store cache and composed at session start.\n const provider = opts.registry.getProvider(entry.kind);\n const component = provider?.installTarget;\n if (!provider || !component) return { deployed: true, changed: false };\n\n // Agents need framework-specific rendering via the enriched installAgent path\n if (component === \"agent\") {\n const workspaceRoot = cwd ?? process.cwd();\n const agentDeployDir = deployedBase(component, harness as HarnessName, globalInstall, cwd);\n const targetMap = HARNESS_TARGETS[harness as HarnessName];\n const skillsRelDir = targetMap?.local.skill ?? \"\";\n const wsConfig = resolveSkWorkspaceConfig(workspaceRoot);\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n // A symlink at a path the render writes is the user's own wiring: replace the link, never\n // write through it into the file or folder it points at (p1060).\n for (const held of deployedPaths(component, entry.name, harness, globalInstall, cwd)) {\n try {\n if (lstatSync(held).isSymbolicLink()) unlinkSync(held);\n } catch {\n // nothing there\n }\n }\n const result = installAgent(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n harness,\n skillsRelDir,\n entry.name,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n undefined,\n delegated,\n );\n for (const w of result.warnings) log(` warn: ${w}`);\n if (result.created.length > 0) {\n let changed = result.changed.length > 0;\n // An `AGENT.md` agent used to deploy raw into `<base>/<name>/AGENT.md`, which no\n // harness but omp (whose rendering is that directory) reads: drop the stale copy.\n const staleRawCopy = join(agentDeployDir, entry.name);\n if (harness !== \"omp\" && existsSync(staleRawCopy)) {\n clearDest(staleRawCopy);\n changed = true;\n }\n if (!globalInstall && !sourceKept) {\n materializeAgentSource(provider, entry, srcDir, workspaceRoot, log, opts);\n }\n return { deployed: true, changed };\n }\n // Fall through to raw deploy if renderer produces no files (unsupported framework, etc.)\n }\n\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n mkdirSync(dirname(dest), { recursive: true });\n\n // Symlink only on explicit opt-in AND when the source has a real local path.\n // Factory sources have a `path` (the bundled dir under node_modules, replaced\n // on every upgrade) but no stable dev-loop, so they always copy. Default copy\n // keeps deploys cache-safe and portable.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const hasLocalPath = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (opts.link === true && hasLocalPath) {\n symlinkAsset(provider, entry.source, dest, entry.name);\n log(` symlink ${entry.kind}:${entry.name}`);\n } else {\n copyAsset(provider, entry, dest, opts.onSecretFile);\n log(` copy ${entry.kind}:${entry.name}`);\n }\n return { deployed: true, changed: true };\n}\n\n/**\n * Deploy all resolved assets, applying patches where configured.\n *\n * Already-deployed assets are skipped unless their deployed manifest content differs\n * from the source. This handles copies that have gone stale after a source update.\n * In copy mode (the default, `!opts.link`) an existing **symlink** dest is healed:\n * it is removed and re-deployed as a real copy, so an old/legacy symlink deploy is\n * silently upgraded. With `opts.link` an existing symlink is left alone.\n *\n * @param resolved - Catalog entries to deploy (output of `resolveAll`).\n * @param repositories - Repository declarations from `skaile.yaml`.\n * @param patches - Map of `kind:name` → patch file path for patch application.\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns Canonical refs (`kind:@publisher/name[#version]`; bare `kind:name`\n * when the entry carries no publisher) of the assets newly deployed in this call.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAll(\n resolved: DeployableEntry[],\n repositories: Record<string, SourceDeclaration>,\n patches: Record<string, string>,\n opts: DeployOptions,\n log: Log = noop,\n): string[] {\n // Before any copy: a symlink in a later entry must not leave the earlier ones behind (p743).\n assertNoLibrarySymlinks(\n entriesNeedingDeploy(resolved, opts),\n opts.registry,\n repositories,\n opts.link === true,\n );\n const deployed: string[] = [];\n const deployedAt: Array<[number, string]> = [];\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // An agent is rendered from its composed skills (`## Installed Abilities`), contracts and\n // delegate sub-agents, which `deployAll` deploys in this same call: render the agents last, with\n // every agent's source already kept, so one pass writes the file a later `install` would write.\n const isAgent = (entry: DeployableEntry): boolean =>\n installTargetOf(opts.registry, entry.kind) === \"agent\";\n const keptSources = new Set<DeployableEntry>();\n if (!globalInstall) {\n for (const entry of resolved.filter(isAgent)) {\n const provider = opts.registry.getProvider(entry.kind);\n if (!provider) continue;\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n materializeAgentSource(provider, entry, srcDir, cwd ?? process.cwd(), noop, opts);\n keptSources.add(entry);\n }\n }\n\n // `resolved` lists an asset before what it requires, so the agents go in reverse: a delegate\n // sub-agent is rendered by its own entry before its composer renders it again. Both renders\n // must write the same bytes, so an agent that another agent of this call delegates to is\n // rendered as a sub-agent by its own entry too (else the two writes alternate, and the file\n // is reported as changed on every run).\n const agentsLast = resolved.filter(isAgent).reverse();\n const delegatedNames = new Set<string>();\n for (const entry of agentsLast) {\n const srcDir = statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source);\n for (const name of delegateNamesOf(srcDir)) delegatedNames.add(name);\n }\n for (const entry of [...resolved.filter((e) => !isAgent(e)), ...agentsLast]) {\n // Skip composition-only kinds (no `installTarget`) — they live in the store\n // cache and are composed at session start, never copied into a harness dir.\n const component = installTargetOf(opts.registry, entry.kind);\n if (!component) continue;\n\n const ref = `${entry.kind}:${entry.name}`;\n\n // Agents are compiled artifacts: always re-rendered, never skipped on a manifest hash\n // (and a stale raw `<name>/AGENT.md` copy of the old layout must be replaced, not kept).\n if (component !== \"agent\" && isDeployed(component, entry.name, harness, globalInstall, cwd)) {\n // Heal: in copy mode an existing symlink dest is left to fall through to a\n // real copy below (cache-safe + portable) - bypass the hash skip entirely.\n // With --link a symlink dest is intentional, so it takes the normal skip path.\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n let destIsSymlink = false;\n try {\n destIsSymlink = lstatSync(dest).isSymbolicLink();\n } catch {}\n const healSymlink = destIsSymlink && opts.link !== true;\n // Surface the one-time symlink->copy migration so an author who relied on a\n // live symlink dev-loop knows why edits stopped reflecting.\n if (healSymlink) log(` healed symlink → copy: ${ref} (use --link for the dev-loop)`);\n if (!healSymlink) {\n const state = deployedCopyState(entry, { ...opts, harness, global: globalInstall, cwd });\n if (state === \"current\") {\n log(` already deployed: ${ref}`);\n continue;\n }\n if (state === \"stale\") log(` updating: ${ref} (content changed)`);\n }\n }\n\n // An agent is re-rendered every time; it is reported as deployed only when a rendered file\n // changed, so a repeat install leaves it (and the report) alone.\n const { changed } = deployEntry(\n entry,\n repositories,\n opts,\n log,\n keptSources.has(entry),\n isAgent(entry) && delegatedNames.has(entry.name),\n );\n if (changed) deployedAt.push([resolved.indexOf(entry), canonicalEntryRef(entry)]);\n\n // Apply patch if configured\n const patchFile = patches[ref];\n if (patchFile && existsSync(patchFile)) {\n const dest = deployedDir(component, entry.name, harness, globalInstall, cwd);\n if (applyPatch(dest, patchFile)) {\n log(` patched ${ref}`);\n } else {\n log(` patch failed for ${ref}`);\n }\n }\n }\n\n // Report in the order the assets were resolved, not the order they were rendered.\n deployed.push(...deployedAt.sort((a, b) => a[0] - b[0]).map(([, ref]) => ref));\n return deployed;\n}\n\n/**\n * Unified diff from a deployed agent to its source, `-` lines in the deployed copy only and `+`\n * lines in the source only. An agent is a rendering, not a copy, so the source is rendered the way\n * {@link deployAsset} renders it (same renderer, same workspace context) into a scratch directory\n * and that is compared with what the harness holds: `<name>.md` for claude-code, `<name>.toml`\n * plus the `skaile-agents/<name>.md` identity for codex, the `<name>/` directory for omp.\n *\n * @param entry - The agent's catalog entry (`source` is its `agent.yaml` / `AGENT.md`).\n * @param opts - Deployment target options (must match the options used at install time).\n * @param instance - Compare the rendering of one agent instance of `skaile.yaml` (named by its id,\n * with its settings) instead of the one named after the asset (p925).\n * @returns `null` when none of the agent's rendered files is deployed, else the diff text\n * (`\"\"` when the deployed agent matches its source).\n * @throws When `diff(1)` itself fails (exit status other than 0/1).\n */\nexport function diffDeployedAgent(\n entry: DeployableEntry,\n opts: DeployOptions,\n instance?: { id: string; srcDir: string; config: AgentInstanceConfig },\n): string | null {\n const harness = opts.harness ?? \"claude-code\";\n const workspaceRoot = opts.cwd ?? process.cwd();\n const deployedAgents = deployedBase(\"agent\", harness, opts.global ?? false, opts.cwd);\n const scratch = mkdtempSync(join(tmpdir(), \"skaile-diff-agent-\"));\n try {\n const renderedAgents = join(scratch, \"agents\");\n const srcDir =\n instance?.srcDir ??\n (statSync(entry.source).isDirectory() ? entry.source : dirname(entry.source));\n // An instance renders the way `install` renders it: named by its id, with its own settings.\n const rendered = installAgent(\n srcDir,\n renderedAgents,\n workspaceRoot,\n harness,\n HARNESS_TARGETS[harness]?.local.skill ?? \"\",\n instance?.id ?? entry.name,\n /* includeSubAgents */ instance !== undefined,\n new Set<string>(),\n resolveSkWorkspaceConfig(workspaceRoot),\n undefined,\n instance?.config,\n );\n if (rendered.created.length === 0) return null;\n\n // Each rendered top-level item pairs with the deployed item of the same name.\n const pairs: Array<[from: string, to: string]> = [];\n for (const [renderedRoot, deployedRoot] of [\n [renderedAgents, deployedAgents],\n [join(scratch, CODEX_IDENTITY_DIR), join(dirname(deployedAgents), CODEX_IDENTITY_DIR)],\n ] as const) {\n if (!existsSync(renderedRoot)) continue;\n for (const item of readdirSync(renderedRoot)) {\n pairs.push([join(deployedRoot, item), join(renderedRoot, item)]);\n }\n }\n if (!pairs.some(([from]) => existsSync(from))) return null;\n\n const diffs: string[] = [];\n for (const [from, to] of pairs) {\n const r = spawnSync(\"diff\", [\"-ruN\", from, to], { encoding: \"utf8\" });\n if (r.status === 1) diffs.push(r.stdout);\n else if (r.status !== 0) {\n throw new Error(\n `diff failed for agent:${entry.name}: ${r.stderr || r.error?.message || \"unknown error\"}`,\n );\n }\n }\n return diffs.join(\"\").split(`${scratch}${sep}`).join(`rendered${sep}`);\n } finally {\n rmSync(scratch, { recursive: true, force: true });\n }\n}\n\n/** The file that remembers the old `~/.omp/<dir>/<name>` folders a sweep decided are not skaile's. */\nfunction keptLegacyFile(): string {\n return join(globalSkaileDir(), \"kept-omp-copies.json\");\n}\n\n/** The old omp folders skaile never deletes (kept by an earlier run: it did not write them). */\nexport function readKeptLegacyCopies(): Set<string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(keptLegacyFile(), \"utf-8\"));\n return new Set(Array.isArray(parsed) ? parsed.filter((v) => typeof v === \"string\") : []);\n } catch {\n return new Set();\n }\n}\n\nexport function writeKeptLegacyCopies(paths: Set<string>): void {\n mkdirSync(dirname(keptLegacyFile()), { recursive: true });\n writeFileSync(keptLegacyFile(), `${JSON.stringify([...paths].sort(), null, 2)}\\n`);\n}\n\n/**\n * Remove a deployed asset from the framework directory.\n *\n * Removes symlinks with `unlink`; removes copied directories with `rm -rf`.\n *\n * @param kind - Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`).\n * @param name - Asset name as registered in the catalog.\n * @param opts - Deployment target options (must match the options used at install time).\n * @returns `true` if the asset existed and was removed; `false` if it was not deployed.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function removeAsset(kind: string, name: string, opts: DeployOptions): boolean {\n const harness = opts.harness ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Composition-only kinds have no harness dir — never resolve (and delete) one.\n const component = installTargetOf(opts.registry, kind);\n if (!component) return false;\n let removed = false;\n // Before 5.13.0 an omp global install wrote to `~/.omp/<skills|agents|…>/`, a place omp does\n // not read (it reads `~/.omp/agent/…`). Removing the asset removes that dead copy too.\n // A flow lives under `~/.skaile` in both layouts: nothing to add.\n // A folder an earlier sweep kept (skaile did not write it) is never deleted.\n const kept = globalInstall ? readKeptLegacyCopies() : new Set<string>();\n const legacyOmp =\n globalInstall && harness === \"omp\" && component !== \"flow\"\n ? deployedPaths(component, name, \"omp\", false, homedir()).filter((p) => !kept.has(p))\n : [];\n for (const dest of [\n ...deployedPaths(component, name, harness, globalInstall, cwd),\n ...legacyOmp,\n ]) {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n removed = true;\n } catch {\n // not deployed at this path\n }\n }\n if (component === \"agent\") {\n // The Codex identity file and the kept source live beside the deployed agent.\n const agentDir = deployedBase(component, harness, globalInstall, cwd);\n const extras = [join(dirname(agentDir), CODEX_IDENTITY_DIR, `${name}.md`)];\n if (!globalInstall) extras.push(join(agentSourceCacheDir(cwd ?? process.cwd()), name));\n for (const extra of extras) {\n if (existsSync(extra)) {\n rmSync(extra, { recursive: true, force: true });\n removed = true;\n }\n }\n }\n return removed;\n}\n\n// ── Scaffold ─────────────────────────────────────────────────────────────────\n\n/** Markdown-marker scaffold (SKILL.md / CONTRACT.md / `*.prompt.md`); `body` is the kind's placeholder. */\nfunction markdownTemplate(name: string, description: string, body: string): string {\n // JSON.stringify yields a valid YAML double-quoted scalar, so any\n // user-supplied description (colons, quotes, `#`) survives the round-trip.\n return `---\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\nmetadata:\n version: \"0.1.0\"\n---\n\n# ${name}\n\n${body}\n`;\n}\n\n/** `agent.yaml` (spec 0.2) scaffold; the system prompt lives in the `SOUL.md` next to it. */\nfunction agentTemplate(name: string, description: string): string {\n return `spec_version: \"0.2\"\nname: \"${name}\"\nversion: 0.1.0\ndescription: ${JSON.stringify(description)}\nlifecycle: standing\n`;\n}\n\nfunction soulTemplate(name: string): string {\n return `# ${name}\n\n${AGENT_BODY_PLACEHOLDER}\n`;\n}\n\nfunction presetTemplate(name: string, description: string): string {\n return `name: ${name}\ndescription: ${JSON.stringify(description)}\nversion: 0.1.0\nitems:\n - ref: ${PRESET_ITEM_PLACEHOLDER_REF}\n`;\n}\n\n/**\n * `<name>.flow.yaml` scaffold: a strict v2 flow (`schemaVersion: 2`) with one example `agent` node\n * and no edges. The instruction is a placeholder the checks of `validate` / `index` / the plan\n * refuse until the author replaces it, like every other scaffold.\n */\nfunction flowTemplate(name: string, description: string): string {\n return `schemaVersion: 2\nid: \"${name}\"\nversion: \"0.1.0\"\nname: \"${name}\"\ndescription: ${JSON.stringify(description)}\n\n# One node per step; join steps with edges (\\`type: flow\\`). Rename or replace the example node.\nnodes:\n - id: example\n label: Example step\n description: Replace this node with the first step of the flow.\n run:\n kind: agent\n instruction: ${JSON.stringify(FLOW_NODE_INSTRUCTION_PLACEHOLDER)}\n\nedges: []\n`;\n}\n\n/** Asset kinds {@link createScaffold} has a real template for. */\nexport const SCAFFOLD_KINDS = [\"skill\", \"agent\", \"prompt\", \"flow\", \"preset\", \"contract\"] as const;\n\n/** Options for {@link createScaffold}. */\nexport interface ScaffoldOptions {\n /**\n * Description written into the manifest. Omitted: every kind gets a\n * `TODO:` placeholder that `skaile validate` rejects until it is replaced.\n */\n description?: string;\n}\n\n/**\n * Create a minimal scaffold directory for a new asset.\n *\n * Writes the appropriate manifest file (`SKILL.md`, `agent.yaml` + `SOUL.md`, `CONTRACT.md`,\n * `<name>.preset.yaml`, `<name>.flow.yaml`, or `<name>.prompt.md`) inside a\n * new `<destDir>/<name>/` directory.\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `preset` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @param opts - Optional scaffold content ({@link ScaffoldOptions}).\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists or `kind` is not one of {@link SCAFFOLD_KINDS}\n * (`Cannot scaffold kind \"<kind>\". Expected: ...`); nothing is created then.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function createScaffold(\n name: string,\n kind: string,\n destDir: string,\n opts: ScaffoldOptions = {},\n): { ok: boolean; path: string } {\n if (!(SCAFFOLD_KINDS as readonly string[]).includes(kind)) {\n return {\n ok: false,\n path: `Cannot scaffold kind \"${kind}\". Expected: ${SCAFFOLD_KINDS.join(\", \")}.`,\n };\n }\n const dest = join(destDir, name);\n if (existsSync(dest)) {\n return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };\n }\n mkdirSync(dest, { recursive: true });\n\n const mdDescription =\n opts.description ??\n ([\"agent\", \"contract\", \"prompt\", \"flow\", \"preset\"].includes(kind)\n ? `${SKILL_DESCRIPTION_PLACEHOLDER_PREFIX} describe this ${kind}.`\n : SKILL_DESCRIPTION_PLACEHOLDER);\n\n if (kind === \"preset\") {\n writeFileSync(join(dest, `${name}.preset.yaml`), presetTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"flow\") {\n writeFileSync(join(dest, `${name}.flow.yaml`), flowTemplate(name, mdDescription), \"utf8\");\n } else if (kind === \"prompt\") {\n writeFileSync(\n join(dest, `${name}.prompt.md`),\n markdownTemplate(name, mdDescription, PROMPT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else if (kind === \"agent\") {\n writeFileSync(join(dest, \"agent.yaml\"), agentTemplate(name, mdDescription), \"utf8\");\n writeFileSync(join(dest, \"SOUL.md\"), soulTemplate(name), \"utf8\");\n } else if (kind === \"contract\") {\n writeFileSync(\n join(dest, \"CONTRACT.md\"),\n markdownTemplate(name, mdDescription, CONTRACT_BODY_PLACEHOLDER),\n \"utf8\",\n );\n } else {\n writeFileSync(\n join(dest, \"SKILL.md\"),\n markdownTemplate(name, mdDescription, SKILL_BODY_PLACEHOLDER),\n \"utf8\",\n );\n }\n\n return { ok: true, path: dest };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../asset-manager/src/renderers.ts"],"names":["stringifyYaml"],"mappings":"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","file":"chunk-DS6UUCFG.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"]}