@skaile/workspaces 6.14.0 → 6.16.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 (447) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/agent-file-refresh-76NNFB4W.js +89 -0
  3. package/dist/agent-file-refresh-76NNFB4W.js.map +1 -0
  4. package/dist/ai-sdk.js +8 -7
  5. package/dist/ai-sdk.js.map +1 -1
  6. package/dist/app-sdk/index.js +1 -1
  7. package/dist/{asset-feeds-DOG5FK7T.js → asset-feeds-ON7FYHHF.js} +25 -23
  8. package/dist/asset-feeds-ON7FYHHF.js.map +1 -0
  9. package/dist/asset-manager/catalog-deployer.js +8 -7
  10. package/dist/asset-manager/history.js +7 -6
  11. package/dist/asset-manager/index.js +17 -15
  12. package/dist/asset-manager/installer.js +16 -9
  13. package/dist/asset-manager/renderers.js +8 -8
  14. package/dist/asset-manager/src/add-remove/add.d.ts +134 -0
  15. package/dist/asset-manager/src/add-remove/add.d.ts.map +1 -0
  16. package/dist/asset-manager/src/add-remove/remove.d.ts +329 -0
  17. package/dist/asset-manager/src/add-remove/remove.d.ts.map +1 -0
  18. package/dist/asset-manager/src/agent-render.d.ts +116 -0
  19. package/dist/asset-manager/src/agent-render.d.ts.map +1 -0
  20. package/dist/asset-manager/src/composed-blocks.d.ts +40 -0
  21. package/dist/asset-manager/src/composed-blocks.d.ts.map +1 -0
  22. package/dist/asset-manager/src/config/core.d.ts +297 -0
  23. package/dist/asset-manager/src/config/core.d.ts.map +1 -0
  24. package/dist/asset-manager/src/config/edit.d.ts +161 -0
  25. package/dist/asset-manager/src/config/edit.d.ts.map +1 -0
  26. package/dist/asset-manager/src/index.d.ts +31 -2961
  27. package/dist/asset-manager/src/index.d.ts.map +1 -1
  28. package/dist/asset-manager/src/install/clone-commit-fetcher.d.ts +11 -0
  29. package/dist/asset-manager/src/install/clone-commit-fetcher.d.ts.map +1 -0
  30. package/dist/asset-manager/src/install/install.d.ts +151 -0
  31. package/dist/asset-manager/src/install/install.d.ts.map +1 -0
  32. package/dist/asset-manager/src/install/restore.d.ts +76 -0
  33. package/dist/asset-manager/src/install/restore.d.ts.map +1 -0
  34. package/dist/asset-manager/src/install-agent.d.ts +52 -4
  35. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  36. package/dist/asset-manager/src/install-instances.d.ts +70 -2
  37. package/dist/asset-manager/src/install-instances.d.ts.map +1 -1
  38. package/dist/asset-manager/src/installer.d.ts +54 -4
  39. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  40. package/dist/asset-manager/src/lock/copies.d.ts +156 -0
  41. package/dist/asset-manager/src/lock/copies.d.ts.map +1 -0
  42. package/dist/asset-manager/src/lock/library.d.ts +261 -0
  43. package/dist/asset-manager/src/lock/library.d.ts.map +1 -0
  44. package/dist/asset-manager/src/mcp-render.d.ts +86 -0
  45. package/dist/asset-manager/src/mcp-render.d.ts.map +1 -0
  46. package/dist/asset-manager/src/omp-sweep.d.ts +25 -0
  47. package/dist/asset-manager/src/omp-sweep.d.ts.map +1 -0
  48. package/dist/asset-manager/src/read/diff.d.ts +109 -0
  49. package/dist/asset-manager/src/read/diff.d.ts.map +1 -0
  50. package/dist/asset-manager/src/read/doctor.d.ts +116 -0
  51. package/dist/asset-manager/src/read/doctor.d.ts.map +1 -0
  52. package/dist/asset-manager/src/read/gaps.d.ts +120 -0
  53. package/dist/asset-manager/src/read/gaps.d.ts.map +1 -0
  54. package/dist/asset-manager/src/read/graph.d.ts +69 -0
  55. package/dist/asset-manager/src/read/graph.d.ts.map +1 -0
  56. package/dist/asset-manager/src/read/outdated.d.ts +152 -0
  57. package/dist/asset-manager/src/read/outdated.d.ts.map +1 -0
  58. package/dist/asset-manager/src/read/state.d.ts +265 -0
  59. package/dist/asset-manager/src/read/state.d.ts.map +1 -0
  60. package/dist/asset-manager/src/renderers.d.ts +11 -1
  61. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  62. package/dist/asset-manager/src/resolve/guards.d.ts +167 -0
  63. package/dist/asset-manager/src/resolve/guards.d.ts.map +1 -0
  64. package/dist/asset-manager/src/resolve/scan.d.ts +222 -0
  65. package/dist/asset-manager/src/resolve/scan.d.ts.map +1 -0
  66. package/dist/asset-manager/src/resolve/stores.d.ts +176 -0
  67. package/dist/asset-manager/src/resolve/stores.d.ts.map +1 -0
  68. package/dist/asset-manager/src/shared/files.d.ts +42 -0
  69. package/dist/asset-manager/src/shared/files.d.ts.map +1 -0
  70. package/dist/asset-manager/src/shared/library-hooks.d.ts +16 -0
  71. package/dist/asset-manager/src/shared/library-hooks.d.ts.map +1 -0
  72. package/dist/asset-manager/src/shared/library.d.ts +96 -0
  73. package/dist/asset-manager/src/shared/library.d.ts.map +1 -0
  74. package/dist/asset-manager/src/shared/refs.d.ts +101 -0
  75. package/dist/asset-manager/src/shared/refs.d.ts.map +1 -0
  76. package/dist/asset-manager/src/shared/types.d.ts +399 -0
  77. package/dist/asset-manager/src/shared/types.d.ts.map +1 -0
  78. package/dist/bridge/harnesses/claude-sdk.js +13 -19
  79. package/dist/bridge/harnesses/claude-sdk.js.map +1 -1
  80. package/dist/bridge/harnesses/codex.js +10 -10
  81. package/dist/bridge/harnesses/continue.js +12 -16
  82. package/dist/bridge/harnesses/continue.js.map +1 -1
  83. package/dist/bridge/harnesses/echo.js +5 -10
  84. package/dist/bridge/harnesses/echo.js.map +1 -1
  85. package/dist/bridge/harnesses/gemini.js +5 -5
  86. package/dist/bridge/harnesses/goose.js +13 -17
  87. package/dist/bridge/harnesses/goose.js.map +1 -1
  88. package/dist/bridge/harnesses/omp.js +7 -13
  89. package/dist/bridge/harnesses/omp.js.map +1 -1
  90. package/dist/bridge/harnesses/opencode.js +13 -17
  91. package/dist/bridge/harnesses/opencode.js.map +1 -1
  92. package/dist/bridge/harnesses/qwen.js +6 -11
  93. package/dist/bridge/harnesses/qwen.js.map +1 -1
  94. package/dist/bridge/index.js +18 -18
  95. package/dist/bridge/src/codex/managed-harness.d.ts.map +1 -1
  96. package/dist/bridge/src/driver-contract.d.ts +72 -0
  97. package/dist/bridge/src/driver-contract.d.ts.map +1 -0
  98. package/dist/bridge/src/harness-model-check.d.ts +1 -1
  99. package/dist/bridge/src/harness-model-check.d.ts.map +1 -1
  100. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts +8 -0
  101. package/dist/bridge/src/harnesses/_subprocess-cli.d.ts.map +1 -1
  102. package/dist/bridge/src/harnesses/claude-sdk.d.ts.map +1 -1
  103. package/dist/bridge/src/harnesses/codex.d.ts +2 -0
  104. package/dist/bridge/src/harnesses/codex.d.ts.map +1 -1
  105. package/dist/bridge/src/harnesses/continue.d.ts.map +1 -1
  106. package/dist/bridge/src/harnesses/echo.d.ts.map +1 -1
  107. package/dist/bridge/src/harnesses/gemini.d.ts.map +1 -1
  108. package/dist/bridge/src/harnesses/goose.d.ts.map +1 -1
  109. package/dist/bridge/src/harnesses/omp.d.ts.map +1 -1
  110. package/dist/bridge/src/harnesses/opencode.d.ts.map +1 -1
  111. package/dist/bridge/src/harnesses/qwen.d.ts.map +1 -1
  112. package/dist/bridge/src/index.d.ts +2 -0
  113. package/dist/bridge/src/index.d.ts.map +1 -1
  114. package/dist/bridge/src/preflight.d.ts +114 -0
  115. package/dist/bridge/src/preflight.d.ts.map +1 -0
  116. package/dist/bridge/src/registry.d.ts +12 -0
  117. package/dist/bridge/src/registry.d.ts.map +1 -1
  118. package/dist/{chunk-7UBCUKJO.js → chunk-2JUCWMIS.js} +8808 -8337
  119. package/dist/chunk-2JUCWMIS.js.map +1 -0
  120. package/dist/{chunk-VS6XC5JE.js → chunk-2MTRRK37.js} +3 -3
  121. package/dist/{chunk-VS6XC5JE.js.map → chunk-2MTRRK37.js.map} +1 -1
  122. package/dist/chunk-2PJYJPDE.js +3 -0
  123. package/dist/chunk-2PJYJPDE.js.map +1 -0
  124. package/dist/{chunk-ZQL6HGTW.js → chunk-2SSG5B24.js} +4 -4
  125. package/dist/{chunk-ZQL6HGTW.js.map → chunk-2SSG5B24.js.map} +1 -1
  126. package/dist/{chunk-WDG5IVEA.js → chunk-2ZDZJ7XQ.js} +3 -3
  127. package/dist/{chunk-WDG5IVEA.js.map → chunk-2ZDZJ7XQ.js.map} +1 -1
  128. package/dist/{chunk-V2VDTQ7A.js → chunk-3A7JUOY2.js} +3 -3
  129. package/dist/{chunk-V2VDTQ7A.js.map → chunk-3A7JUOY2.js.map} +1 -1
  130. package/dist/chunk-3LAJJURV.js +26 -0
  131. package/dist/chunk-3LAJJURV.js.map +1 -0
  132. package/dist/{chunk-X66KSHZF.js → chunk-3UYKT62L.js} +5 -5
  133. package/dist/{chunk-X66KSHZF.js.map → chunk-3UYKT62L.js.map} +1 -1
  134. package/dist/{chunk-J3FJTH3V.js → chunk-4X5WXQV7.js} +4 -4
  135. package/dist/{chunk-J3FJTH3V.js.map → chunk-4X5WXQV7.js.map} +1 -1
  136. package/dist/chunk-4ZNKEDYH.js +887 -0
  137. package/dist/chunk-4ZNKEDYH.js.map +1 -0
  138. package/dist/{chunk-DYH3VSPU.js → chunk-65SOXO7I.js} +20 -14
  139. package/dist/chunk-65SOXO7I.js.map +1 -0
  140. package/dist/{chunk-MVUXBWNW.js → chunk-6HTN2UIJ.js} +3 -3
  141. package/dist/{chunk-MVUXBWNW.js.map → chunk-6HTN2UIJ.js.map} +1 -1
  142. package/dist/{chunk-4SSTREBO.js → chunk-6KV34G6A.js} +8 -8
  143. package/dist/{chunk-4SSTREBO.js.map → chunk-6KV34G6A.js.map} +1 -1
  144. package/dist/{chunk-YNQRVTXH.js → chunk-6M44OQKH.js} +40 -44
  145. package/dist/chunk-6M44OQKH.js.map +1 -0
  146. package/dist/{chunk-B6W5DCH5.js → chunk-72DYHOO2.js} +24 -25
  147. package/dist/chunk-72DYHOO2.js.map +1 -0
  148. package/dist/{chunk-RRAXV5LE.js → chunk-7IW5E6LB.js} +43 -48
  149. package/dist/chunk-7IW5E6LB.js.map +1 -0
  150. package/dist/{chunk-BNLXZXZN.js → chunk-BRAOB37W.js} +97 -47
  151. package/dist/chunk-BRAOB37W.js.map +1 -0
  152. package/dist/{chunk-ZLDAPZIX.js → chunk-BTMSHGN3.js} +4 -4
  153. package/dist/{chunk-ZLDAPZIX.js.map → chunk-BTMSHGN3.js.map} +1 -1
  154. package/dist/{chunk-7K73MCI6.js → chunk-CU5WY6HN.js} +3 -3
  155. package/dist/{chunk-7K73MCI6.js.map → chunk-CU5WY6HN.js.map} +1 -1
  156. package/dist/{chunk-G2ZWIYZR.js → chunk-DFFJKGCW.js} +3 -3
  157. package/dist/{chunk-G2ZWIYZR.js.map → chunk-DFFJKGCW.js.map} +1 -1
  158. package/dist/{chunk-CG63XGVV.js → chunk-EGKCKWWE.js} +3 -3
  159. package/dist/{chunk-CG63XGVV.js.map → chunk-EGKCKWWE.js.map} +1 -1
  160. package/dist/{chunk-CJO3XKO7.js → chunk-ETGC2MEM.js} +4 -4
  161. package/dist/{chunk-CJO3XKO7.js.map → chunk-ETGC2MEM.js.map} +1 -1
  162. package/dist/{chunk-CFRHYD4C.js → chunk-FPG36VC4.js} +8 -13
  163. package/dist/chunk-FPG36VC4.js.map +1 -0
  164. package/dist/{chunk-SBAUZ7XH.js → chunk-H3PY5DFL.js} +4 -4
  165. package/dist/{chunk-SBAUZ7XH.js.map → chunk-H3PY5DFL.js.map} +1 -1
  166. package/dist/{chunk-7HRZACI4.js → chunk-HW4BDJPC.js} +17 -6
  167. package/dist/chunk-HW4BDJPC.js.map +1 -0
  168. package/dist/{chunk-GJT2Q5XD.js → chunk-HXST2IYJ.js} +3 -3
  169. package/dist/{chunk-GJT2Q5XD.js.map → chunk-HXST2IYJ.js.map} +1 -1
  170. package/dist/{chunk-7VBD5XUM.js → chunk-IG4YQ7ER.js} +32 -90
  171. package/dist/chunk-IG4YQ7ER.js.map +1 -0
  172. package/dist/{chunk-DWPQBMCY.js → chunk-JPV4WE5L.js} +2 -2
  173. package/dist/{chunk-DWPQBMCY.js.map → chunk-JPV4WE5L.js.map} +1 -1
  174. package/dist/{chunk-OC3AIMZH.js → chunk-KDRA6FYE.js} +120 -211
  175. package/dist/chunk-KDRA6FYE.js.map +1 -0
  176. package/dist/{chunk-KOI7QFDH.js → chunk-M7XIYHWB.js} +3 -3
  177. package/dist/{chunk-KOI7QFDH.js.map → chunk-M7XIYHWB.js.map} +1 -1
  178. package/dist/{chunk-7LJUK5JK.js → chunk-MG6QD7GE.js} +201 -43
  179. package/dist/chunk-MG6QD7GE.js.map +1 -0
  180. package/dist/{chunk-XHLRMUMO.js → chunk-NAQXDTF3.js} +3 -3
  181. package/dist/{chunk-XHLRMUMO.js.map → chunk-NAQXDTF3.js.map} +1 -1
  182. package/dist/{chunk-YJAKSCCN.js → chunk-NJ6UCY2B.js} +3 -3
  183. package/dist/{chunk-YJAKSCCN.js.map → chunk-NJ6UCY2B.js.map} +1 -1
  184. package/dist/{chunk-OKPITFE3.js → chunk-NNJQQYHY.js} +2 -2
  185. package/dist/{chunk-OKPITFE3.js.map → chunk-NNJQQYHY.js.map} +1 -1
  186. package/dist/{chunk-QNHW26AT.js → chunk-OD4N5O7V.js} +4 -4
  187. package/dist/{chunk-QNHW26AT.js.map → chunk-OD4N5O7V.js.map} +1 -1
  188. package/dist/{chunk-F7WMHDTV.js → chunk-P6FJDT35.js} +27 -7
  189. package/dist/chunk-P6FJDT35.js.map +1 -0
  190. package/dist/{chunk-IOXFT5D7.js → chunk-PD42JZWI.js} +3 -3
  191. package/dist/{chunk-IOXFT5D7.js.map → chunk-PD42JZWI.js.map} +1 -1
  192. package/dist/{chunk-MS2IXLTC.js → chunk-PMXTBWFD.js} +27 -7
  193. package/dist/chunk-PMXTBWFD.js.map +1 -0
  194. package/dist/{chunk-NAAFRZTA.js → chunk-PPSSDUN6.js} +3 -3
  195. package/dist/{chunk-NAAFRZTA.js.map → chunk-PPSSDUN6.js.map} +1 -1
  196. package/dist/{chunk-LMUNQYJQ.js → chunk-PRB67LCK.js} +127 -18
  197. package/dist/chunk-PRB67LCK.js.map +1 -0
  198. package/dist/{chunk-RLV3FF4I.js → chunk-QUIK7L3Z.js} +11 -11
  199. package/dist/{chunk-RLV3FF4I.js.map → chunk-QUIK7L3Z.js.map} +1 -1
  200. package/dist/{chunk-DRUAQ7IY.js → chunk-QUPZKTF3.js} +9 -8
  201. package/dist/chunk-QUPZKTF3.js.map +1 -0
  202. package/dist/{chunk-7FXOOUOC.js → chunk-RPRMD7XV.js} +27 -11
  203. package/dist/chunk-RPRMD7XV.js.map +1 -0
  204. package/dist/{chunk-3BRBTQ6M.js → chunk-S3UOZBGE.js} +20 -3
  205. package/dist/chunk-S3UOZBGE.js.map +1 -0
  206. package/dist/{chunk-LQWOU7S2.js → chunk-SFBLZOV5.js} +3 -3
  207. package/dist/{chunk-LQWOU7S2.js.map → chunk-SFBLZOV5.js.map} +1 -1
  208. package/dist/{chunk-EB2LKPI6.js → chunk-SMFZ5YGN.js} +4 -4
  209. package/dist/{chunk-EB2LKPI6.js.map → chunk-SMFZ5YGN.js.map} +1 -1
  210. package/dist/{chunk-243Z3BNB.js → chunk-SX54OQQT.js} +4 -4
  211. package/dist/{chunk-243Z3BNB.js.map → chunk-SX54OQQT.js.map} +1 -1
  212. package/dist/{chunk-2PVYDAFN.js → chunk-T65N4CIZ.js} +3 -3
  213. package/dist/{chunk-2PVYDAFN.js.map → chunk-T65N4CIZ.js.map} +1 -1
  214. package/dist/{chunk-QBLS7X3Z.js → chunk-TVRL3IPZ.js} +3 -3
  215. package/dist/{chunk-QBLS7X3Z.js.map → chunk-TVRL3IPZ.js.map} +1 -1
  216. package/dist/{chunk-2URJ7W5X.js → chunk-TW5AP6IF.js} +5 -5
  217. package/dist/{chunk-2URJ7W5X.js.map → chunk-TW5AP6IF.js.map} +1 -1
  218. package/dist/{chunk-F6LDWA2N.js → chunk-TYK752MU.js} +3 -3
  219. package/dist/{chunk-F6LDWA2N.js.map → chunk-TYK752MU.js.map} +1 -1
  220. package/dist/{chunk-HPQ2WDYC.js → chunk-U2WPJHRA.js} +5 -5
  221. package/dist/{chunk-HPQ2WDYC.js.map → chunk-U2WPJHRA.js.map} +1 -1
  222. package/dist/{chunk-MEU2HHGV.js → chunk-U7P22GEB.js} +386 -46
  223. package/dist/chunk-U7P22GEB.js.map +1 -0
  224. package/dist/{chunk-6ISJMEDX.js → chunk-VFEZUSB6.js} +4 -4
  225. package/dist/{chunk-6ISJMEDX.js.map → chunk-VFEZUSB6.js.map} +1 -1
  226. package/dist/{chunk-5FO4U3OL.js → chunk-WW22FS74.js} +75 -67
  227. package/dist/chunk-WW22FS74.js.map +1 -0
  228. package/dist/{chunk-WCUT3EQR.js → chunk-Z23I2JA6.js} +7 -7
  229. package/dist/{chunk-WCUT3EQR.js.map → chunk-Z23I2JA6.js.map} +1 -1
  230. package/dist/{chunk-VKGNMXGZ.js → chunk-Z7HLX4V2.js} +4 -4
  231. package/dist/{chunk-VKGNMXGZ.js.map → chunk-Z7HLX4V2.js.map} +1 -1
  232. package/dist/{chunk-LZCX2TCZ.js → chunk-ZII54C3E.js} +355 -1075
  233. package/dist/chunk-ZII54C3E.js.map +1 -0
  234. package/dist/{chunk-CVUMZTNO.js → chunk-ZQPBYLCS.js} +4 -4
  235. package/dist/{chunk-CVUMZTNO.js.map → chunk-ZQPBYLCS.js.map} +1 -1
  236. package/dist/{claude-code-LFAOJ3UQ.js → claude-code-VL6UM7BZ.js} +4 -4
  237. package/dist/{claude-code-LFAOJ3UQ.js.map → claude-code-VL6UM7BZ.js.map} +1 -1
  238. package/dist/cli/index.js +494 -301
  239. package/dist/cli/index.js.map +1 -1
  240. package/dist/cli/src/agent-file-refresh.d.ts +25 -0
  241. package/dist/cli/src/agent-file-refresh.d.ts.map +1 -0
  242. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  243. package/dist/cli/src/commands/catalog.d.ts +9 -2
  244. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  245. package/dist/cli/src/commands/config.d.ts.map +1 -1
  246. package/dist/cli/src/commands/harness.d.ts +1 -1
  247. package/dist/cli/src/commands/harness.d.ts.map +1 -1
  248. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  249. package/dist/cli/src/commands/library-index.d.ts +5 -7
  250. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  251. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  252. package/dist/cli/src/commands/preset-export.d.ts.map +1 -1
  253. package/dist/cli/src/commands/project.d.ts.map +1 -1
  254. package/dist/cli/src/commands/run.d.ts.map +1 -1
  255. package/dist/cli/src/commands/serve-preflight.d.ts +27 -48
  256. package/dist/cli/src/commands/serve-preflight.d.ts.map +1 -1
  257. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  258. package/dist/cli/src/commands/source.d.ts +6 -9
  259. package/dist/cli/src/commands/source.d.ts.map +1 -1
  260. package/dist/cli/src/commands/validate.d.ts +6 -0
  261. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  262. package/dist/cli/src/config-checks.d.ts.map +1 -1
  263. package/dist/cli/src/harness-error.d.ts +11 -9
  264. package/dist/cli/src/harness-error.d.ts.map +1 -1
  265. package/dist/cli/src/skill-checks.d.ts +48 -74
  266. package/dist/cli/src/skill-checks.d.ts.map +1 -1
  267. package/dist/connectors/config.js +5 -5
  268. package/dist/connectors/index.js +22 -22
  269. package/dist/{connectors-KPF4UUDS.js → connectors-7EPJRVLJ.js} +25 -25
  270. package/dist/{connectors-KPF4UUDS.js.map → connectors-7EPJRVLJ.js.map} +1 -1
  271. package/dist/connectors-shared/index.js +2 -2
  272. package/dist/core/index.js +7 -6
  273. package/dist/core/manifest.js +2 -2
  274. package/dist/core/models.js +1 -1
  275. package/dist/core/publish-manifest.js +3 -3
  276. package/dist/core/ref.js +1 -1
  277. package/dist/core/runtime-assets.js +5 -5
  278. package/dist/core/src/agent-prompt-sections.d.ts +96 -4
  279. package/dist/core/src/agent-prompt-sections.d.ts.map +1 -1
  280. package/dist/core/src/check-asset.d.ts +115 -0
  281. package/dist/core/src/check-asset.d.ts.map +1 -0
  282. package/dist/core/src/harness-model.d.ts +20 -0
  283. package/dist/core/src/harness-model.d.ts.map +1 -0
  284. package/dist/core/src/index.d.ts +10 -6
  285. package/dist/core/src/index.d.ts.map +1 -1
  286. package/dist/core/src/lock.d.ts +12 -10
  287. package/dist/core/src/lock.d.ts.map +1 -1
  288. package/dist/core/src/models.d.ts +42 -11
  289. package/dist/core/src/models.d.ts.map +1 -1
  290. package/dist/core/src/publish-manifest.d.ts +17 -0
  291. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  292. package/dist/core/src/repo-identity.d.ts +41 -0
  293. package/dist/core/src/repo-identity.d.ts.map +1 -0
  294. package/dist/core/src/repo-manager.d.ts +3 -9
  295. package/dist/core/src/repo-manager.d.ts.map +1 -1
  296. package/dist/core/src/walker.d.ts.map +1 -1
  297. package/dist/core/src/workspace-config.d.ts.map +1 -1
  298. package/dist/core/workspace-config.js +4 -4
  299. package/dist/deploy/index.js +7 -6
  300. package/dist/deploy/index.js.map +1 -1
  301. package/dist/discovery/index.js +5 -5
  302. package/dist/discovery/src/source-config.d.ts.map +1 -1
  303. package/dist/{ensure-sources-FOMEGCQ5.js → ensure-sources-CI3JQJST.js} +32 -30
  304. package/dist/ensure-sources-CI3JQJST.js.map +1 -0
  305. package/dist/factory-assets/connectors/box.js +22 -22
  306. package/dist/factory-assets/connectors/deploy.js +22 -22
  307. package/dist/factory-assets/connectors/devserver.js +22 -22
  308. package/dist/factory-assets/connectors/flow/adapter.js +22 -22
  309. package/dist/factory-assets/connectors/flow/engine.js +8 -7
  310. package/dist/factory-assets/connectors/flow/run-flow.js +24 -24
  311. package/dist/factory-assets/connectors/flow.js +22 -22
  312. package/dist/factory-assets/connectors/git.js +22 -22
  313. package/dist/factory-assets/connectors/gmail.js +22 -22
  314. package/dist/factory-assets/connectors/googledrive.js +22 -22
  315. package/dist/factory-assets/connectors/local.js +22 -22
  316. package/dist/factory-assets/connectors/mattermost.js +22 -22
  317. package/dist/factory-assets/connectors/memory.js +22 -22
  318. package/dist/factory-assets/connectors/minio.js +22 -22
  319. package/dist/factory-assets/connectors/postgres.js +22 -22
  320. package/dist/factory-assets/connectors/s3.js +22 -22
  321. package/dist/factory-assets/connectors/sharepoint.js +22 -22
  322. package/dist/factory-assets/connectors/sqlite.js +22 -22
  323. package/dist/factory-assets/connectors/static-server.js +22 -22
  324. package/dist/factory-assets/connectors/tunnel.js +22 -22
  325. package/dist/factory-assets/connectors/webdav.js +22 -22
  326. package/dist/factory-assets/connectors/xstate-store.js +22 -22
  327. package/dist/factory-assets/connectors/xstate.js +22 -22
  328. package/dist/{flows-J64L5MGJ.js → flows-6XQAYQS4.js} +12 -11
  329. package/dist/{flows-J64L5MGJ.js.map → flows-6XQAYQS4.js.map} +1 -1
  330. package/dist/{helpers-ZJ67FO3Z.js → helpers-26MR5QPO.js} +32 -30
  331. package/dist/{helpers-ZJ67FO3Z.js.map → helpers-26MR5QPO.js.map} +1 -1
  332. package/dist/library/index.js +10 -10
  333. package/dist/library/install.js +4 -4
  334. package/dist/library/src/index.d.ts +1 -1
  335. package/dist/library/src/index.d.ts.map +1 -1
  336. package/dist/library/src/local/db.d.ts.map +1 -1
  337. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  338. package/dist/library/src/local/library.d.ts.map +1 -1
  339. package/dist/library/src/local/schema.d.ts +19 -0
  340. package/dist/library/src/local/schema.d.ts.map +1 -1
  341. package/dist/library/src/user-library.d.ts +18 -0
  342. package/dist/library/src/user-library.d.ts.map +1 -1
  343. package/dist/{library-publish-RGVXGTY4.js → library-publish-F3AKF66O.js} +74 -68
  344. package/dist/library-publish-F3AKF66O.js.map +1 -0
  345. package/dist/model-endpoint/index.js +10 -9
  346. package/dist/{open-library-I5JHL37T.js → open-library-FVV6GG4I.js} +35 -33
  347. package/dist/{open-library-I5JHL37T.js.map → open-library-FVV6GG4I.js.map} +1 -1
  348. package/dist/{open-registry-4HNCWOCN.js → open-registry-VX2BVMS5.js} +16 -16
  349. package/dist/{open-registry-4HNCWOCN.js.map → open-registry-VX2BVMS5.js.map} +1 -1
  350. package/dist/{paths-PXBWY532.js → paths-PIWSSUUG.js} +10 -9
  351. package/dist/{paths-PXBWY532.js.map → paths-PIWSSUUG.js.map} +1 -1
  352. package/dist/{plugin-store-ZC3EGZ3D.js → plugin-store-MVTW6G7J.js} +10 -9
  353. package/dist/{plugin-store-ZC3EGZ3D.js.map → plugin-store-MVTW6G7J.js.map} +1 -1
  354. package/dist/{project-K5JWPIJ6.js → project-GFQP4TW6.js} +50 -48
  355. package/dist/{project-K5JWPIJ6.js.map → project-GFQP4TW6.js.map} +1 -1
  356. package/dist/resolver/index.js +8 -7
  357. package/dist/runner/composition-content.d.ts +2 -0
  358. package/dist/runner/composition-content.js +29 -0
  359. package/dist/runner/composition-content.js.map +1 -0
  360. package/dist/runner/index.js +40 -39
  361. package/dist/runner/src/compaction/prompt.d.ts.map +1 -1
  362. package/dist/runner/src/composition/content-entry.d.ts +15 -0
  363. package/dist/runner/src/composition/content-entry.d.ts.map +1 -0
  364. package/dist/runner/src/composition/content-source.d.ts +7 -0
  365. package/dist/runner/src/composition/content-source.d.ts.map +1 -1
  366. package/dist/runner/src/composition/dry-run.d.ts +5 -1
  367. package/dist/runner/src/composition/dry-run.d.ts.map +1 -1
  368. package/dist/runner/src/composition/index.d.ts +1 -1
  369. package/dist/runner/src/composition/index.d.ts.map +1 -1
  370. package/dist/runner/src/composition/prompt-sections.d.ts +47 -20
  371. package/dist/runner/src/composition/prompt-sections.d.ts.map +1 -1
  372. package/dist/runner/src/context-usage/compose.d.ts.map +1 -1
  373. package/dist/runner/src/session-builder.d.ts +3 -8
  374. package/dist/runner/src/session-builder.d.ts.map +1 -1
  375. package/dist/runner/src/work-practices.d.ts +9 -0
  376. package/dist/runner/src/work-practices.d.ts.map +1 -0
  377. package/dist/sdk/asset-manager.js +17 -15
  378. package/dist/sdk/bridge.js +18 -18
  379. package/dist/sdk/core.js +7 -6
  380. package/dist/sdk/flow.js +8 -7
  381. package/dist/sdk/index.js +40 -39
  382. package/dist/sdk/index.js.map +1 -1
  383. package/dist/sdk/resolver.js +8 -7
  384. package/dist/sdk/runner.js +40 -39
  385. package/dist/sdk/session.js +2 -2
  386. package/dist/sdk/transport/ws/server.js +8 -7
  387. package/dist/sdk/transport/ws.js +8 -7
  388. package/dist/sdk/transport.js +8 -7
  389. package/dist/sdk/types.js +1 -1
  390. package/dist/serve-preflight-XJS5OZML.js +138 -0
  391. package/dist/serve-preflight-XJS5OZML.js.map +1 -0
  392. package/dist/session/index.js +2 -2
  393. package/dist/{setup-RXTNGML5.js → setup-BFEBJLYF.js} +33 -31
  394. package/dist/setup-BFEBJLYF.js.map +1 -0
  395. package/dist/{skills-5D4KDVPJ.js → skills-OCG7B5CL.js} +13 -12
  396. package/dist/{skills-5D4KDVPJ.js.map → skills-OCG7B5CL.js.map} +1 -1
  397. package/dist/source-P6JPZYWP.js +93 -0
  398. package/dist/{source-2LP5W3ST.js.map → source-P6JPZYWP.js.map} +1 -1
  399. package/dist/{source-manifest-publish-EZNCTSQF.js → source-manifest-publish-XBFHEURV.js} +54 -52
  400. package/dist/source-manifest-publish-XBFHEURV.js.map +1 -0
  401. package/dist/transport/index.js +8 -7
  402. package/dist/transport/ws/server.js +8 -7
  403. package/dist/transport/ws.js +8 -7
  404. package/dist/tui/index.js +40 -39
  405. package/dist/tui/index.js.map +1 -1
  406. package/dist/types/index.js +1 -1
  407. package/dist/types/src/context-usage.d.ts +1 -1
  408. package/dist/types/src/events.d.ts +3 -2
  409. package/dist/types/src/events.d.ts.map +1 -1
  410. package/dist/types/src/runtime.d.ts +6 -0
  411. package/dist/types/src/runtime.d.ts.map +1 -1
  412. package/dist/workspace-plugin/adapters/mcp.js +29 -29
  413. package/dist/workspace-plugin/adapters/omp.js +14 -14
  414. package/dist/workspace-plugin/index.js +1 -1
  415. package/package.json +7 -1
  416. package/dist/asset-feeds-DOG5FK7T.js.map +0 -1
  417. package/dist/chunk-3BRBTQ6M.js.map +0 -1
  418. package/dist/chunk-5FO4U3OL.js.map +0 -1
  419. package/dist/chunk-7FXOOUOC.js.map +0 -1
  420. package/dist/chunk-7HRZACI4.js.map +0 -1
  421. package/dist/chunk-7LJUK5JK.js.map +0 -1
  422. package/dist/chunk-7UBCUKJO.js.map +0 -1
  423. package/dist/chunk-7VBD5XUM.js.map +0 -1
  424. package/dist/chunk-A7TM4PZZ.js +0 -110
  425. package/dist/chunk-A7TM4PZZ.js.map +0 -1
  426. package/dist/chunk-B6W5DCH5.js.map +0 -1
  427. package/dist/chunk-BNLXZXZN.js.map +0 -1
  428. package/dist/chunk-CFRHYD4C.js.map +0 -1
  429. package/dist/chunk-DRUAQ7IY.js.map +0 -1
  430. package/dist/chunk-DYH3VSPU.js.map +0 -1
  431. package/dist/chunk-F7WMHDTV.js.map +0 -1
  432. package/dist/chunk-LMUNQYJQ.js.map +0 -1
  433. package/dist/chunk-LZCX2TCZ.js.map +0 -1
  434. package/dist/chunk-MEU2HHGV.js.map +0 -1
  435. package/dist/chunk-MS2IXLTC.js.map +0 -1
  436. package/dist/chunk-OC3AIMZH.js.map +0 -1
  437. package/dist/chunk-RRAXV5LE.js.map +0 -1
  438. package/dist/chunk-YNQRVTXH.js.map +0 -1
  439. package/dist/cli/src/commands/harness-preflight.d.ts +0 -40
  440. package/dist/cli/src/commands/harness-preflight.d.ts.map +0 -1
  441. package/dist/ensure-sources-FOMEGCQ5.js.map +0 -1
  442. package/dist/library-publish-RGVXGTY4.js.map +0 -1
  443. package/dist/serve-preflight-L6VVCDM5.js +0 -61
  444. package/dist/serve-preflight-L6VVCDM5.js.map +0 -1
  445. package/dist/setup-RXTNGML5.js.map +0 -1
  446. package/dist/source-2LP5W3ST.js +0 -91
  447. package/dist/source-manifest-publish-EZNCTSQF.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/provider-materialize/opencode-config.ts"],"names":[],"mappings":"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","file":"chunk-6ISJMEDX.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link harnessProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link harnessSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/harnesses#one-shot-cli-harnesses-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvHarnessSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-harnesses.js\";\nimport {\n harnessSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_HARNESS_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the harness. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvHarnessSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `harnessProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? harnessModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the harness. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvHarnessSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = harnessSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/provider-materialize/opencode-config.ts"],"names":[],"mappings":"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","file":"chunk-VFEZUSB6.js","sourcesContent":["/**\n * OpenCode's `opencode.json` adapter — the file half of the OpenCode row\n * (§2.3).\n *\n * OpenCode names providers out of [models.dev](https://models.dev): a stock\n * endpoint is already in that list, so the env half's `-m <preset>/<model>`\n * reaches it with nothing written. An endpoint models.dev has never heard of —\n * a self-hosted gateway, a LiteLLM proxy, an Ollama box — exists for OpenCode\n * only if a `provider` block in `opencode.json` describes it:\n *\n * ```jsonc\n * {\n * \"provider\": {\n * \"corp-gateway\": {\n * \"npm\": \"@ai-sdk/openai-compatible\",\n * \"name\": \"Corp Gateway\",\n * \"options\": {\n * \"baseURL\": \"https://llm.corp.example/v1\",\n * \"apiKey\": \"{env:SKAILE_AIP_CORP_GATEWAY_KEY}\"\n * },\n * \"models\": { \"corp-fast-1\": { \"name\": \"corp-fast-1\" } }\n * }\n * }\n * }\n * ```\n *\n * The block is keyed by {@link harnessProviderName}, so the name in the file\n * is the name the env half already puts on `-m`. `npm` is the Vercel AI SDK\n * package for the entry's wire `surface`; OpenCode instantiates the provider\n * from it, which is why an entry on a surface with no package is left out\n * rather than guessed at.\n *\n * **Credentials never enter the file.** `options.apiKey` holds OpenCode's own\n * `{env:VAR}` indirection naming the per-entry variable\n * `SKAILE_AIP_<ID>_KEY`; the value rides in the child environment.\n *\n * The document is written to `<home>/opencode/opencode.json` and the child's\n * `XDG_CONFIG_HOME` is pointed at `<home>` — see\n * {@link harnessSessionConfigHome} for why that, and not the developer's\n * `~/.config/opencode`.\n *\n * @docLink packages/bridge/harnesses#one-shot-cli-harnesses-gemini-qwen-opencode-goose-continue\n */\n\nimport { join } from \"node:path\";\nimport type {\n AIProviderLlmEntry,\n AIProviderSurface,\n} from \"@skaile/workspaces/core/provider-registry\";\nimport { providerCredentialEnvName } from \"./credential-env.js\";\nimport {\n harnessModelSelector,\n entryBaseUrl,\n entryModelIds,\n entrySurface,\n type EnvHarnessSession,\n isStockCatalogEndpoint,\n resolveRegistryBinding,\n selectableEntries,\n versionedAnthropicBaseUrl,\n} from \"./env-harnesses.js\";\nimport {\n harnessSessionConfigHome,\n removeSessionConfigFile,\n writeSessionConfigFile,\n} from \"./session-config-home.js\";\n\n/**\n * `surface` → the Vercel AI SDK package OpenCode loads for it. These are the\n * four surfaces `BUILTIN_HARNESS_CATALOG.opencode.surfaces` declares; a surface\n * with no package here cannot be instantiated, so the entry is skipped.\n */\nconst OPENCODE_NPM_PACKAGE: Partial<Record<AIProviderSurface, string>> = {\n \"anthropic-messages\": \"@ai-sdk/anthropic\",\n \"openai-completions\": \"@ai-sdk/openai-compatible\",\n \"openai-responses\": \"@ai-sdk/openai\",\n \"google-generative-ai\": \"@ai-sdk/google\",\n};\n\n/** Credential kinds whose value the adapter hands over in an env var. */\nconst ENV_DELIVERED_CREDENTIALS: Record<string, true> = {\n api_key_header: true,\n bearer: true,\n command: true,\n};\n\n/** Subdirectory OpenCode reads its global config from, under the config home. */\nexport const OPENCODE_CONFIG_DIRNAME = \"opencode\";\n\n/** Filename OpenCode reads its global config from. */\nexport const OPENCODE_CONFIG_FILENAME = \"opencode.json\";\n\n/** One `provider.<id>` block, in OpenCode's own vocabulary. */\nexport interface OpenCodeProviderBlock {\n /** AI SDK package OpenCode instantiates the provider from. */\n npm: string;\n /** Display name in the `/models` picker. */\n name: string;\n options: {\n baseURL?: string;\n /** OpenCode's `{env:VAR}` indirection — never a secret. */\n apiKey?: string;\n headers?: Record<string, string>;\n };\n /** Provider-side model id → its display entry. */\n models: Record<string, { name: string }>;\n}\n\n/** The subset of `opencode.json` this adapter owns. */\nexport interface OpenCodeConfigDocument {\n $schema: string;\n /** `<provider>/<model>` the session selected, when it selected one. */\n model?: string;\n provider: Record<string, OpenCodeProviderBlock>;\n}\n\n/** An entry OpenCode cannot be taught, and why. */\nexport interface OpenCodeSkippedEntry {\n id: string;\n reason: string;\n}\n\n/** Result of {@link buildOpenCodeConfigDocument}. */\nexport interface OpenCodeConfigBuild {\n document: OpenCodeConfigDocument;\n /** Entries left out of the document — non-fatal, logged by the harness. */\n skipped: OpenCodeSkippedEntry[];\n}\n\n/**\n * Render one entry as a provider block, or explain why OpenCode cannot load\n * it.\n */\nexport function renderOpenCodeProvider(\n providerId: string,\n entry: AIProviderLlmEntry,\n): { block: OpenCodeProviderBlock } | { skipped: string } {\n const surface = entrySurface(entry);\n const npm = surface ? OPENCODE_NPM_PACKAGE[surface] : undefined;\n if (!npm)\n return {\n skipped: surface\n ? `OpenCode has no AI SDK package for surface '${surface}'`\n : \"entry declares no surface\",\n };\n const baseUrl = entryBaseUrl(entry);\n if (!baseUrl)\n return { skipped: \"entry states no base_url, and OpenCode does not know this provider\" };\n\n const models: Record<string, { name: string }> = {};\n for (const [logicalId, providerModelId] of entryModelIds(entry)) {\n models[providerModelId] = { name: `${entry.label ?? providerId} ${logicalId}` };\n }\n\n const block: OpenCodeProviderBlock = {\n npm,\n name: entry.label ?? providerId,\n // `@ai-sdk/anthropic` posts to `<baseURL>/messages`.\n options: { baseURL: versionedAnthropicBaseUrl(baseUrl, surface) },\n models,\n };\n const credentialKind = entry.credential?.kind;\n if (credentialKind && ENV_DELIVERED_CREDENTIALS[credentialKind])\n block.options.apiKey = `{env:${providerCredentialEnvName(providerId)}}`;\n if (entry.headers && Object.keys(entry.headers).length > 0)\n block.options.headers = { ...entry.headers };\n return { block };\n}\n\n/**\n * Build the document for a session: one block per entry OpenCode cannot name\n * on its own, plus the selected `<provider>/<model>`.\n *\n * The selected model is added to its provider's `models` map even when no\n * `model_map` declared it — a selector naming a model the registry did not\n * enumerate still has to resolve, and `-m` would otherwise name a model the\n * provider block does not list.\n *\n * An empty registry renders nothing — there is no endpoint of the session's\n * own to tell OpenCode about, and models.dev already covers the stock ones.\n */\nexport function buildOpenCodeConfigDocument(session: EnvHarnessSession): OpenCodeConfigBuild {\n const document: OpenCodeConfigDocument = {\n $schema: \"https://opencode.ai/config.json\",\n provider: {},\n };\n const skipped: OpenCodeSkippedEntry[] = [];\n\n for (const [providerId, entry] of selectableEntries(session.registry)) {\n // OpenCode already knows every catalog endpoint through models.dev, under\n // the same name `harnessProviderName` gives `-m`. What it cannot know is\n // an endpoint of the session's own, and that is exactly what this file is\n // for — one rule, read by both halves.\n if (isStockCatalogEndpoint(entry)) continue;\n const rendered = renderOpenCodeProvider(providerId, entry);\n if (\"skipped\" in rendered) skipped.push({ id: providerId, reason: rendered.skipped });\n else document.provider[providerId] = rendered.block;\n }\n\n const binding = resolveRegistryBinding(session);\n const selector = binding ? harnessModelSelector(binding) : undefined;\n if (binding && selector) {\n document.model = selector;\n const block = document.provider[binding.providerId];\n if (block && binding.providerModelId && !block.models[binding.providerModelId])\n block.models[binding.providerModelId] = { name: binding.providerModelId };\n }\n\n return { document, skipped };\n}\n\n/** What {@link materializeOpenCodeConfig} handed the harness. */\nexport interface OpenCodeMaterialization extends OpenCodeConfigBuild {\n /** Child env fragment: `XDG_CONFIG_HOME`, or empty when nothing was written. */\n env: Record<string, string>;\n /** Absolute path of the rendered file, when one was written. */\n path?: string;\n}\n\n/**\n * Render the session's custom endpoints and point the child at them.\n *\n * A session whose every endpoint is already a models.dev provider writes\n * nothing and leaves `XDG_CONFIG_HOME` alone: relocating it would hide the\n * developer's own `~/.config/opencode` for no gain. A file left by an earlier\n * render of the same session is removed in that case, so a session that drops\n * its custom endpoint stops answering to it.\n */\nexport function materializeOpenCodeConfig(\n session: EnvHarnessSession,\n config: { cwd: string; sessionId?: string },\n): OpenCodeMaterialization {\n const build = buildOpenCodeConfigDocument(session);\n const home = harnessSessionConfigHome(\"opencode\", config);\n const dir = join(home, OPENCODE_CONFIG_DIRNAME);\n if (Object.keys(build.document.provider).length === 0) {\n removeSessionConfigFile(dir, OPENCODE_CONFIG_FILENAME);\n return { ...build, env: {} };\n }\n const path = writeSessionConfigFile(\n dir,\n OPENCODE_CONFIG_FILENAME,\n `${JSON.stringify(build.document, null, 2)}\\n`,\n );\n return { ...build, env: { XDG_CONFIG_HOME: home }, path };\n}\n"]}
@@ -1,9 +1,10 @@
1
- import { loadDeclaredPlugins } from './chunk-2PVYDAFN.js';
2
- import { listHarnesses } from './chunk-3BRBTQ6M.js';
3
- import { softDepName } from './chunk-7UBCUKJO.js';
4
- import { readLock, LockParseError } from './chunk-MEU2HHGV.js';
5
- import { resolveRuntimeAssets } from './chunk-CJO3XKO7.js';
6
- import { resolveAgentDefinitionDir, AgentRefResolutionError, normalizeAgentInstances, agentBlockKeyDiagnostics, agentInstanceDiagnostics, localConnectorMountDir, symlinkEscapeOfProject, isInsideProject, loadSkWorkspaceConfig, SKAILE_YAML_DEFAULT, resolveSkWorkspaceConfig } from './chunk-BNLXZXZN.js';
1
+ import { loadDeclaredPlugins } from './chunk-T65N4CIZ.js';
2
+ import { preflight } from './chunk-PRB67LCK.js';
3
+ import { listHarnesses } from './chunk-S3UOZBGE.js';
4
+ import { softDepName } from './chunk-2JUCWMIS.js';
5
+ import { readLock, LockParseError } from './chunk-U7P22GEB.js';
6
+ import { resolveRuntimeAssets } from './chunk-ETGC2MEM.js';
7
+ import { resolveAgentDefinitionDir, AgentRefResolutionError, normalizeAgentInstances, agentBlockKeyDiagnostics, agentInstanceDiagnostics, localConnectorMountDir, symlinkEscapeOfProject, isInsideProject, loadSkWorkspaceConfig, SKAILE_YAML_DEFAULT, resolveSkWorkspaceConfig } from './chunk-BRAOB37W.js';
7
8
  import { SUPPORTED_HARNESSES } from './chunk-VTETQCR6.js';
8
9
  import fs, { existsSync, readdirSync, readFileSync } from 'fs';
9
10
  import { homedir } from 'os';
@@ -252,57 +253,6 @@ function checkAgentInstances(projectDir, parsed) {
252
253
  }
253
254
  return diagnostics;
254
255
  }
255
- function unknownHarnessMessage(harness) {
256
- const known = listHarnesses().map((d) => d.id);
257
- if (known.includes(harness)) return void 0;
258
- return `Unknown agent harness: "${harness}". Available: ${known.join(", ")}. ${DEPLOY_COMMANDS} take: ${SUPPORTED_HARNESSES.join(", ")}.`;
259
- }
260
- var DEPLOY_COMMANDS = "harness set, init --harness and add --harness";
261
- function unknownHarnessTargetMessage(harness, extra = []) {
262
- const targets = [...SUPPORTED_HARNESSES, ...extra];
263
- const registered = listHarnesses().map((d) => d.id);
264
- return `Unknown agent harness: "${harness}". Available: ${targets.join(", ")}. run, repl and config set harness take: ${registered.join(", ")}.`;
265
- }
266
- function canonicalHarnessId(harness) {
267
- return harness === "claude-code" ? "claude-sdk" : harness;
268
- }
269
- var warnedDriverFlag = false;
270
- function warnDriverFlagDeprecated() {
271
- if (warnedDriverFlag) return;
272
- warnedDriverFlag = true;
273
- console.error("--driver is deprecated; use --harness");
274
- }
275
- function driverAliasOption() {
276
- return new Option("--driver <name>", "Deprecated alias of --harness").hideHelp();
277
- }
278
- function foldDriverFlag(opts, fallback) {
279
- const { driver, ...rest } = opts;
280
- if (driver !== void 0) warnDriverFlagDeprecated();
281
- return { ...rest, harness: rest.harness ?? driver ?? fallback };
282
- }
283
- function friendlyHarnessError(err2) {
284
- const e = err2;
285
- if (!e) return null;
286
- const isSpawnEnoent = e.code === "ENOENT" && (e.syscall?.startsWith("spawn") === true || /^spawn .*ENOENT/.test(e.message ?? ""));
287
- const isConfig = e.category === "config" || e.detail?.category === "config";
288
- if (!isSpawnEnoent && !isConfig) return null;
289
- const hint = e.hint ?? e.detail?.hint;
290
- const base = hint ?? "The configured agent binary is not installed or not on your PATH.";
291
- return `${base}
292
- Try a different harness with \`--harness claude-sdk\`.`;
293
- }
294
- function harnessErrorNotes(err2) {
295
- const e = err2;
296
- const notes = [];
297
- const category = e?.category ?? e?.detail?.category;
298
- const hint = e?.hint ?? e?.detail?.hint;
299
- if (hint && category !== "config") notes.push(hint);
300
- else if (category === "auth") notes.push("Check your API key or login.");
301
- if (e?.logSessionId) {
302
- notes.push(`Full records: .skaile/logs.db (skaile session logs ${e.logSessionId}).`);
303
- }
304
- return notes;
305
- }
306
256
 
307
257
  // cli/src/config-checks.ts
308
258
  function unknownKeyWarnings(diagnostics, label) {
@@ -363,14 +313,21 @@ async function unknownHarnessErrors(projectDir, config, label) {
363
313
  const profiles = Object.entries(config.agent_config ?? {}).filter(
364
314
  (e) => typeof e[1]?.harness === "string"
365
315
  );
366
- if (profiles.every(([, p]) => unknownHarnessMessage(p.harness) === void 0)) return [];
316
+ const refusals = () => Promise.all(
317
+ profiles.map(
318
+ async ([name, p]) => [
319
+ name,
320
+ (await preflight({ projectDir }, p.harness, void 0, void 0, {
321
+ checks: ["harness"]
322
+ }))[0]?.line
323
+ ]
324
+ )
325
+ );
326
+ if ((await refusals()).every(([, line]) => line === void 0)) return [];
367
327
  await loadDeclaredPlugins(projectDir);
368
- const errors = [];
369
- for (const [name, p] of profiles) {
370
- const refusal = unknownHarnessMessage(p.harness);
371
- if (refusal) errors.push(`${label}: agent-config.${name}.harness: ${refusal}`);
372
- }
373
- return errors;
328
+ return (await refusals()).flatMap(
329
+ ([name, line]) => line ? [`${label}: agent-config.${name}.harness: ${line}`] : []
330
+ );
374
331
  }
375
332
  async function reportUnknownHarnesses(projectDir) {
376
333
  let file;
@@ -445,6 +402,57 @@ async function reportProjectConfig(projectDir, opts) {
445
402
  for (const line of errors) logErr(line);
446
403
  return errors.length;
447
404
  }
405
+ var EXPERIMENTAL_HARNESS_NOTICE = "experimental: not covered by the release tests";
406
+ function noteExperimentalHarness(harness) {
407
+ if (listHarnesses().find((d) => d.id === harness)?.stability === "experimental") {
408
+ console.error(EXPERIMENTAL_HARNESS_NOTICE);
409
+ }
410
+ }
411
+ function unknownHarnessTargetMessage(harness, extra = []) {
412
+ const targets = [...SUPPORTED_HARNESSES, ...extra];
413
+ const registered = listHarnesses().map((d) => d.id);
414
+ return `Unknown agent harness: "${harness}". Available: ${targets.join(", ")}. run, repl and config set harness take: ${registered.join(", ")}.`;
415
+ }
416
+ function canonicalHarnessId(harness) {
417
+ return harness === "claude-code" ? "claude-sdk" : harness;
418
+ }
419
+ var warnedDriverFlag = false;
420
+ function warnDriverFlagDeprecated() {
421
+ if (warnedDriverFlag) return;
422
+ warnedDriverFlag = true;
423
+ console.error("--driver is deprecated; use --harness");
424
+ }
425
+ function driverAliasOption() {
426
+ return new Option("--driver <name>", "Deprecated alias of --harness").hideHelp();
427
+ }
428
+ function foldDriverFlag(opts, fallback) {
429
+ const { driver, ...rest } = opts;
430
+ if (driver !== void 0) warnDriverFlagDeprecated();
431
+ return { ...rest, harness: rest.harness ?? driver ?? fallback };
432
+ }
433
+ function friendlyHarnessError(err2) {
434
+ const e = err2;
435
+ if (!e) return null;
436
+ const isSpawnEnoent = e.code === "ENOENT" && (e.syscall?.startsWith("spawn") === true || /^spawn .*ENOENT/.test(e.message ?? ""));
437
+ const isConfig = e.category === "config" || e.detail?.category === "config";
438
+ if (!isSpawnEnoent && !isConfig) return null;
439
+ const hint = e.hint ?? e.detail?.hint;
440
+ const base = hint ?? "The configured agent binary is not installed or not on your PATH.";
441
+ return `${base}
442
+ Try a different harness with \`--harness claude-sdk\`.`;
443
+ }
444
+ function harnessErrorNotes(err2) {
445
+ const e = err2;
446
+ const notes = [];
447
+ const category = e?.category ?? e?.detail?.category;
448
+ const hint = e?.hint ?? e?.detail?.hint;
449
+ if (hint && category !== "config") notes.push(hint);
450
+ else if (category === "auth") notes.push("Check your API key or login.");
451
+ if (e?.logSessionId) {
452
+ notes.push(`Full records: .skaile/logs.db (skaile session logs ${e.logSessionId}).`);
453
+ }
454
+ return notes;
455
+ }
448
456
 
449
457
  // cli/src/helpers.ts
450
458
  var S = {
@@ -683,6 +691,6 @@ function warnFilesOnlyDelegates(projectDir, target) {
683
691
  );
684
692
  }
685
693
 
686
- export { KIND_COL_WIDTH, S, TARGET_DEFAULT_HINT, agentDefinitionProblem, agentInstanceErrorLines, bareSoftDepName, canonicalHarnessId, checkAgentInstances, colorRef, connectorErrorLines, connectorMountPathChecks, deferredWarnings, driverAliasOption, fitWidth, foldDriverFlag, formatRelativeTime, formatSoftDepAddPreview, formatSoftDepHint, formatSoftDepRemovePreview, formatSoftDepSection, friendlyHarnessError, harnessErrorNotes, instanceRefProblem, isRecord, kindColor, kindColorPad, logErr, logInfo, logNoProject, logOk, logWarn, logWarnErr, parseHarnessFilter, reportLegacyOmpCopies, reportProjectConfig, reportUnknownHarnesses, requireProjectConfig, setActiveCommand, unknownConnectorDriverErrors, unknownHarnessErrors, unknownHarnessMessage, unknownHarnessTargetMessage, unknownKeyWarnings, warnFilesOnlyDelegates, warnPlaceholderBodies, warnProjectConfig, warnStaleHarnessCopies };
687
- //# sourceMappingURL=chunk-5FO4U3OL.js.map
688
- //# sourceMappingURL=chunk-5FO4U3OL.js.map
694
+ export { KIND_COL_WIDTH, S, TARGET_DEFAULT_HINT, agentDefinitionProblem, agentInstanceErrorLines, bareSoftDepName, canonicalHarnessId, checkAgentInstances, colorRef, connectorErrorLines, connectorMountPathChecks, deferredWarnings, driverAliasOption, fitWidth, foldDriverFlag, formatRelativeTime, formatSoftDepAddPreview, formatSoftDepHint, formatSoftDepRemovePreview, formatSoftDepSection, friendlyHarnessError, harnessErrorNotes, instanceRefProblem, isRecord, kindColor, kindColorPad, logErr, logInfo, logNoProject, logOk, logWarn, logWarnErr, noteExperimentalHarness, parseHarnessFilter, reportLegacyOmpCopies, reportProjectConfig, reportUnknownHarnesses, requireProjectConfig, setActiveCommand, unknownConnectorDriverErrors, unknownHarnessErrors, unknownHarnessTargetMessage, unknownKeyWarnings, warnFilesOnlyDelegates, warnPlaceholderBodies, warnProjectConfig, warnStaleHarnessCopies };
695
+ //# sourceMappingURL=chunk-WW22FS74.js.map
696
+ //# sourceMappingURL=chunk-WW22FS74.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli/src/type-guards.ts","../cli/src/commands/validate-instances.ts","../cli/src/config-checks.ts","../cli/src/harness-error.ts","../cli/src/helpers.ts"],"names":["path","parseYaml","fs","agentInstanceDiagnostics","err"],"mappings":"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","file":"chunk-WW22FS74.js","sourcesContent":["/** Narrow to a plain-object-shaped value (not `null`, not an array); fields stay `unknown`. */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","/**\n * `skaile validate` rules for the root `agents:` map of one `skaile.yaml`.\n *\n * Normalisation errors, the `agent:` + `agents.default` conflict, and the\n * asset-dependent rules: every `ref` resolves to an `agent.yaml`, role\n * instances need the asset's `io`, `connectors` bind real connector slots to\n * real `connectors[]` ids, and trigger ids are unique and known.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport {\n AgentRefResolutionError,\n type AgentInstanceConfig,\n type AgentInstanceTrigger,\n agentBlockKeyDiagnostics,\n agentInstanceDiagnostics,\n type Diagnostic,\n normalizeAgentInstances,\n resolveAgentDefinitionDir,\n} from \"@skaile/workspaces/core\";\nimport { parse as parseYaml } from \"yaml\";\nimport { isRecord } from \"../type-guards.ts\";\n\nconst AGENT_MANIFEST_FILE = \"agent.yaml\";\n\n/** Fields a trigger needs when it declares itself in full (no asset trigger to override). */\nconst TRIGGER_REQUIRED_FIELDS: Record<NonNullable<AgentInstanceTrigger[\"kind\"]>, string[]> = {\n schedule: [\"cron\", \"prompt\"],\n webhook: [\"prompt\"],\n channel: [\"when\"],\n event: [\"event\"],\n};\n\nconst err = (code: string, message: string, at: string): Diagnostic => ({\n code,\n severity: \"error\",\n message,\n path: at,\n});\n\n/** The parts of an agent asset the instance rules read. */\ninterface AssetFacts {\n lifecycle: unknown;\n hasIo: boolean;\n /** `composes[].id` of `kind: connector` items. */\n connectorSlots: string[];\n /** `composes[].id` of every other item that has one. */\n otherSlots: string[];\n triggerIds: string[];\n}\n\nfunction readAssetFacts(manifest: Record<string, unknown>): AssetFacts {\n const facts: AssetFacts = {\n lifecycle: manifest.lifecycle,\n hasIo: manifest.io !== undefined && manifest.io !== null,\n connectorSlots: [],\n otherSlots: [],\n triggerIds: [],\n };\n for (const item of Array.isArray(manifest.composes) ? manifest.composes : []) {\n if (!isRecord(item) || typeof item.id !== \"string\") continue;\n (item.kind === \"connector\" ? facts.connectorSlots : facts.otherSlots).push(item.id);\n }\n for (const t of Array.isArray(manifest.triggers) ? manifest.triggers : []) {\n if (isRecord(t) && typeof t.id === \"string\") facts.triggerIds.push(t.id);\n }\n return facts;\n}\n\n/**\n * Why `agent.definition` does not resolve to an agent directory, or `null` when it does. One\n * rule for `validate` and `serve`, so the two print the same line (p1733): an `agent:` ref no\n * manifest declares, a path with no `agent.yaml`, an `ai-assets://` ref with no `ai-assets/`.\n */\nexport function agentDefinitionProblem(projectDir: string, definition: string): string | null {\n let dir: string | undefined;\n try {\n dir = resolveAgentDefinitionDir(projectDir, definition);\n } catch (e) {\n if (!(e instanceof AgentRefResolutionError)) throw e;\n return e.message;\n }\n if (dir === undefined) {\n return `agent.definition \"${definition}\": no ai-assets/ directory above the project`;\n }\n if (path.basename(dir) === AGENT_MANIFEST_FILE) dir = path.dirname(dir);\n if (!fs.existsSync(path.join(dir, AGENT_MANIFEST_FILE))) {\n return `agent.definition \"${definition}\": no ${AGENT_MANIFEST_FILE} in ${dir}`;\n }\n return null;\n}\n\n/** Resolve an instance `ref` to its parsed `agent.yaml`, or an error diagnostic. */\nfunction loadAsset(\n projectDir: string,\n id: string,\n ref: string,\n): { facts: AssetFacts } | { diagnostic: Diagnostic } {\n const at = `agents.${id}.ref`;\n let dir: string | undefined;\n try {\n dir = resolveAgentDefinitionDir(projectDir, ref);\n } catch (e) {\n if (!(e instanceof AgentRefResolutionError)) throw e;\n return { diagnostic: err(\"agent_ref_unresolved\", `agents.${id}: ${e.message}`, at) };\n }\n if (dir === undefined) {\n return {\n diagnostic: err(\n \"agent_ref_unresolved\",\n `agents.${id}: ref \"${ref}\" cannot be resolved — no ai-assets/ directory above the project`,\n at,\n ),\n };\n }\n const manifestPath = path.join(dir, AGENT_MANIFEST_FILE);\n let text: string;\n try {\n text = fs.readFileSync(manifestPath, \"utf-8\");\n } catch {\n return {\n diagnostic: err(\n \"agent_ref_unresolved\",\n `agents.${id}: ref \"${ref}\" resolves to ${dir}, which has no ${AGENT_MANIFEST_FILE}`,\n at,\n ),\n };\n }\n let manifest: unknown;\n try {\n manifest = parseYaml(text);\n } catch (e) {\n return {\n diagnostic: err(\n \"agent_manifest_invalid\",\n `agents.${id}: ${manifestPath} is not valid YAML: ${e instanceof Error ? e.message : String(e)}`,\n at,\n ),\n };\n }\n if (!isRecord(manifest)) {\n return {\n diagnostic: err(\n \"agent_manifest_invalid\",\n `agents.${id}: ${manifestPath} is not a mapping`,\n at,\n ),\n };\n }\n return { facts: readAssetFacts(manifest) };\n}\n\n/**\n * Why the `ref` of an `agents:` instance does not resolve, as the `agent_ref_unresolved` line\n * `validate` prints (`agents.<id>: …`), or `null` when it resolves. `serve` refuses a project\n * with such an instance like `validate` does.\n */\nexport function instanceRefProblem(projectDir: string, id: string, ref: string): string | null {\n const loaded = loadAsset(projectDir, id, ref);\n return \"diagnostic\" in loaded && loaded.diagnostic.code === \"agent_ref_unresolved\"\n ? loaded.diagnostic.message\n : null;\n}\n\n/**\n * Trigger rules. Duplicate ids are always an error; the asset-dependent rules\n * (known id, complete full declaration) run only when `assetTriggerIds` is\n * known — i.e. the instance's `ref` resolved.\n */\nfunction checkTriggers(\n id: string,\n triggers: AgentInstanceTrigger[],\n assetTriggerIds: string[] | undefined,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n const seen = new Set<string>();\n triggers.forEach((trigger, i) => {\n const at = `agents.${id}.triggers[${i}]`;\n if (seen.has(trigger.id)) {\n out.push(\n err(\n \"agent_trigger_duplicate\",\n `agents.${id}: trigger id \"${trigger.id}\" is declared twice`,\n `${at}.id`,\n ),\n );\n return;\n }\n seen.add(trigger.id);\n if (!assetTriggerIds || assetTriggerIds.includes(trigger.id)) return;\n if (!trigger.kind) {\n out.push(\n err(\n \"agent_trigger_unknown\",\n `agents.${id}: trigger \"${trigger.id}\" is not declared by the agent asset (${assetTriggerIds.length > 0 ? `has: ${assetTriggerIds.join(\", \")}` : \"it declares no triggers\"}) — add \\`kind\\` and the trigger's fields to declare a new one`,\n `${at}.id`,\n ),\n );\n return;\n }\n const missing = TRIGGER_REQUIRED_FIELDS[trigger.kind].filter(\n (field) => (trigger as unknown as Record<string, unknown>)[field] === undefined,\n );\n if (missing.length > 0) {\n out.push(\n err(\n \"agent_trigger_incomplete\",\n `agents.${id}: trigger \"${trigger.id}\" (kind ${trigger.kind}) is not in the asset, so it must declare ${missing.join(\", \")}`,\n at,\n ),\n );\n }\n });\n return out;\n}\n\nfunction checkConnectors(\n id: string,\n instance: AgentInstanceConfig,\n facts: AssetFacts,\n connectorIds: string[],\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n for (const [slot, connectorId] of Object.entries(instance.connectors ?? {})) {\n const at = `agents.${id}.connectors.${slot}`;\n if (!facts.connectorSlots.includes(slot)) {\n const hint = facts.otherSlots.includes(slot)\n ? `\"${slot}\" is a slot of a non-connector item`\n : facts.connectorSlots.length > 0\n ? `the asset's connector slots are: ${facts.connectorSlots.join(\", \")}`\n : \"the asset declares no connector slots\";\n out.push(\n err(\n \"agent_connector_slot_unknown\",\n `agents.${id}: connectors.${slot} is not a connector slot id of the agent asset (${hint})`,\n at,\n ),\n );\n }\n if (!connectorIds.includes(connectorId)) {\n out.push(\n err(\n \"agent_connector_unknown\",\n `agents.${id}: connectors.${slot} points at \"${connectorId}\", which is not in skaile.yaml connectors[]${connectorIds.length > 0 ? ` (has: ${connectorIds.join(\", \")})` : \"\"}`,\n at,\n ),\n );\n }\n }\n return out;\n}\n\n/**\n * Diagnostics for the `agents:` map of a parsed `skaile.yaml`.\n *\n * @param projectDir - Directory of the `skaile.yaml`; local and catalog refs resolve against it.\n * @param parsed - The raw YAML document.\n */\nexport function checkAgentInstances(\n projectDir: string,\n parsed: Record<string, unknown>,\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const instances = normalizeAgentInstances(parsed.agents, diagnostics);\n const agent = isRecord(parsed.agent) ? parsed.agent : undefined;\n diagnostics.push(...agentBlockKeyDiagnostics(parsed.agent));\n if (agent?.subagents !== undefined) {\n diagnostics.push(\n err(\n \"agent_subagents_removed\",\n \"`agent.subagents` was removed — declare each subagent as an agent asset and bind it under `agents:` with `lifecycle: role`\",\n \"agent.subagents\",\n ),\n );\n }\n if (agent?.instances !== undefined) {\n diagnostics.push(\n err(\n \"misplaced_agent_instances\",\n \"`agent.instances` is not a skaile.yaml key — declare instances under root `agents:`\",\n \"agent.instances\",\n ),\n );\n }\n diagnostics.push(\n ...agentInstanceDiagnostics({\n agent: {\n definition: typeof agent?.definition === \"string\" ? agent.definition : undefined,\n instances,\n },\n }),\n );\n // `serve` refuses an `agent.definition` that does not resolve, so `validate` must too (p1733).\n if (typeof agent?.definition === \"string\" && agent.definition !== \"\") {\n const problem = agentDefinitionProblem(projectDir, agent.definition);\n if (problem) diagnostics.push(err(\"agent_ref_unresolved\", problem, \"agent.definition\"));\n }\n if (!instances) return diagnostics;\n\n const connectorIds = (Array.isArray(parsed.connectors) ? parsed.connectors : []).flatMap((c) =>\n isRecord(c) && typeof c.id === \"string\" ? [c.id] : [],\n );\n\n for (const [id, instance] of Object.entries(instances)) {\n const loaded = loadAsset(projectDir, id, instance.ref);\n if (\"diagnostic\" in loaded) {\n // Asset-independent trigger rules still apply when the ref is broken.\n diagnostics.push(loaded.diagnostic, ...checkTriggers(id, instance.triggers ?? [], undefined));\n continue;\n }\n const { facts } = loaded;\n const lifecycle = instance.lifecycle ?? facts.lifecycle ?? \"standing\";\n if (lifecycle === \"role\" && !facts.hasIo) {\n diagnostics.push(\n err(\n \"agent_role_missing_io\",\n `agents.${id}: lifecycle \"role\" needs the agent asset to declare \\`io\\` ({ input, output } JSON Schemas)`,\n `agents.${id}.lifecycle`,\n ),\n );\n }\n diagnostics.push(...checkConnectors(id, instance, facts, connectorIds));\n diagnostics.push(...checkTriggers(id, instance.triggers ?? [], facts.triggerIds));\n }\n return diagnostics;\n}\n","/**\n * Checks of a project's `skaile.yaml` that `validate`, `check`, `doctor` and `run` share:\n * keys nothing reads (p1474) and a `harness:` no harness registers (p1022).\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport type {\n ConnectorDeclaration,\n Diagnostic,\n SkWorkspaceConfig,\n SkWorkspaceConfigFile,\n} from \"@skaile/workspaces/core\";\nimport {\n isInsideProject,\n loadSkWorkspaceConfig,\n localConnectorMountDir,\n resolveRuntimeAssets,\n SKAILE_YAML_DEFAULT,\n symlinkEscapeOfProject,\n} from \"@skaile/workspaces/core\";\nimport { parse as parseYaml } from \"yaml\";\nimport { checkAgentInstances } from \"./commands/validate-instances.ts\";\nimport { preflight } from \"@skaile/workspaces/bridge\";\nimport { logErr, logWarn, logWarnErr } from \"./helpers.ts\";\nimport { loadDeclaredPlugins } from \"./plugin-store/index.ts\";\n\n/** One warning line per key of the file that nothing reads. */\nexport function unknownKeyWarnings(diagnostics: readonly Diagnostic[], label: string): string[] {\n return diagnostics\n .filter((d) => d.code === \"unknown_config_key\" || d.code === \"unknown_profile_key\")\n .map((d) => `${label}: ${d.message}`);\n}\n\n/** `skaile.yaml` connector diagnostics that fail `validate` and refuse `serve` (the runner cannot mount it right). */\nexport const CONNECTOR_ERROR_CODES: readonly string[] = [\n \"connector_missing_driver\",\n \"connector_missing_id\",\n \"connector_duplicate_id\",\n \"connector_invalid_access\",\n];\n\n/**\n * One error line per connector the runner cannot mount or mounts wrongly: no `driver`, no `id`, a\n * duplicate `id`, an unknown `access`. `validate` and `serve` print the same lines.\n */\nexport function connectorErrorLines(diagnostics: readonly Diagnostic[], label: string): string[] {\n return diagnostics\n .filter((d) => CONNECTOR_ERROR_CODES.includes(d.code))\n .map((d) => `${label} [connectors] — ${d.code}: ${d.path ? `${d.path}: ` : \"\"}${d.message}`);\n}\n\n/**\n * A `local` connector's `mountPath` is mounted read-write as given: one that does not exist\n * fails, one that reaches outside the project through a symlink fails, one outside the project\n * only warns. `validate` and `serve` print the same lines.\n *\n * @param projectDir - Directory a relative `mountPath` is read from.\n * @param label - File name for the line.\n * @param connectors - The declared connectors.\n */\nexport function connectorMountPathChecks(\n projectDir: string,\n label: string,\n connectors: ReadonlyArray<ConnectorDeclaration>,\n): { errors: string[]; warnings: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n for (const c of connectors) {\n // A connector without an id is reported once, as `connector_missing_id`; it has no\n // `connectors.<id>` to name in a second error.\n if (typeof c.id !== \"string\" || c.id === \"\") continue;\n if (c.driver !== \"local\" || c.mount) continue;\n const dir = localConnectorMountDir(c, projectDir);\n if (!dir) continue;\n const escapesTo = symlinkEscapeOfProject(dir, projectDir);\n if (!fs.existsSync(dir)) {\n errors.push(\n `${label} [connectors] — connector_mount_path_missing: connectors.${c.id}.mountPath: ${dir} does not exist; create the directory or fix the path`,\n );\n } else if (escapesTo !== null) {\n errors.push(\n `${label} [connectors] — connector_mount_path_symlink: connectors.${c.id}.mountPath: ${dir} is a symlink to ${escapesTo}, outside the project ${projectDir}; point mountPath at the real directory`,\n );\n } else if (!isInsideProject(dir, projectDir)) {\n warnings.push(\n `${label} [connectors] — connectors.${c.id}.mountPath: ${dir} is outside the project ${projectDir}; the agent reads${c.access === \"read-write\" ? \" and writes\" : \"\"} there`,\n );\n }\n }\n return { errors, warnings };\n}\n\n/**\n * One error line per connector whose `driver` no catalog entry and no loaded plugin provides.\n * The text is the one `serve` logs as a `validation_warning`. An unreachable source (not cloned\n * yet) may hold the driver, so nothing is reported while one is missing. The project's plugins\n * are loaded first, as `serve` loads them.\n *\n * @param projectDir - Project whose sources and plugins are read.\n * @param label - File name for the line.\n * @param connectors - The declared connectors.\n */\nexport async function unknownConnectorDriverErrors(\n projectDir: string,\n label: string,\n connectors: ReadonlyArray<ConnectorDeclaration>,\n): Promise<string[]> {\n if (connectors.length === 0) return [];\n await loadDeclaredPlugins(projectDir);\n // Lazy: only a project with connectors loads the connectors package.\n const { listConnectors } = await import(\"@skaile/workspaces/connectors\");\n const assets = await resolveRuntimeAssets(projectDir, {\n isDriverRegistered: (driver) => listConnectors().includes(driver),\n });\n if (assets.warnings.some((w) => w.code === \"repo_unavailable\")) return [];\n return assets.warnings\n .filter((w) => w.code === \"missing_driver\" && w.name)\n .map((w) => `${label} [connectors] — ${w.code}: ${w.message}`);\n}\n\n/** The `agent-config` key diagnostics that name a replacement: the old `driver` and the retired `agent`. */\nexport const AGENT_CONFIG_KEY_CODES = [\"deprecated_harness_key\", \"retired_agent_key\"] as const;\n\n/**\n * One warning line per `agent-config` key that is deprecated (`driver`, p1873) or retired\n * (`agent`, p1874): still read or ignored, and `skaile migrate harness` fixes it. `validate`,\n * `check`, `doctor`, `run` and `config show` print the same line.\n */\nexport function agentConfigKeyWarnings(\n diagnostics: readonly Diagnostic[],\n label: string,\n): string[] {\n return diagnostics\n .filter((d) => (AGENT_CONFIG_KEY_CODES as readonly string[]).includes(d.code))\n .map((d) => `${label} [agent-config] — ${d.code}: ${d.message}`);\n}\n\n/**\n * One error line per `agent-config` profile that sets both `harness` and `driver`: `harness` wins,\n * but the file is wrong, so every command that reads it says so as `validate` does.\n */\nexport function harnessKeyConflictErrors(\n diagnostics: readonly Diagnostic[],\n label: string,\n): string[] {\n return diagnostics\n .filter((d) => d.code === \"harness_key_conflict\")\n .map((d) => `${label} [agent-config] — ${d.code}: ${d.message}`);\n}\n\n/**\n * One error line per `agent-config` profile whose `harness:` nothing registers. The harnesses of\n * the plugins the project declares count, so they are loaded before the verdict, and only when\n * some profile names a harness the built-in ones do not.\n *\n * @param projectDir - Project whose `plugins:` are loaded.\n * @param config - The decoded config file.\n * @param label - File name for the line.\n */\nexport async function unknownHarnessErrors(\n projectDir: string,\n config: SkWorkspaceConfig,\n label: string,\n): Promise<string[]> {\n const profiles = Object.entries(config.agent_config ?? {}).filter(\n (e): e is [string, { harness: string }] => typeof e[1]?.harness === \"string\",\n );\n // Only the harness name is judged: a missing program or SDK is not a `validate` error.\n const refusals = () =>\n Promise.all(\n profiles.map(\n async ([name, p]) =>\n [\n name,\n (\n await preflight({ projectDir }, p.harness, undefined, undefined, {\n checks: [\"harness\"],\n })\n )[0]?.line,\n ] as const,\n ),\n );\n if ((await refusals()).every(([, line]) => line === undefined)) return [];\n await loadDeclaredPlugins(projectDir);\n return (await refusals()).flatMap(([name, line]) =>\n line ? [`${label}: agent-config.${name}.harness: ${line}`] : [],\n );\n}\n\n/**\n * Print the `✗` line for each `agent-config` profile whose `harness:` nothing registers or that\n * sets both `harness` and `driver`, and return how many were printed. The harness check `install`, `list` and `config show` share with\n * `validate`, `check` and `run` (p1754); a file that does not load is not this function's to\n * report.\n */\nexport async function reportUnknownHarnesses(projectDir: string): Promise<number> {\n let file: SkWorkspaceConfigFile | null;\n try {\n file = loadSkWorkspaceConfig(projectDir);\n } catch {\n return 0;\n }\n const config = file?.config;\n if (!config) return 0;\n const errors = [\n ...harnessKeyConflictErrors(file?.diagnostics ?? [], \"skaile.yaml\"),\n ...(await unknownHarnessErrors(projectDir, config, \"skaile.yaml\")),\n ];\n for (const line of errors) logErr(line);\n return errors.length;\n}\n\n/** The `agents:` / `agent:` diagnostics of the project's `skaile.yaml` as `validate` gives them. */\nfunction agentInstanceDiagnostics(projectDir: string): Diagnostic[] {\n let parsed: unknown;\n try {\n parsed = parseYaml(fs.readFileSync(path.join(projectDir, SKAILE_YAML_DEFAULT), \"utf-8\"));\n } catch {\n return [];\n }\n if (typeof parsed !== \"object\" || parsed === null) return [];\n return checkAgentInstances(projectDir, parsed as Record<string, unknown>);\n}\n\n/** One line the way `validate` prints a diagnostic of the `agents:` map. */\nfunction agentInstanceLine(d: Diagnostic): string {\n return `${SKAILE_YAML_DEFAULT} [agents] — ${d.code}: ${d.path ? `${d.path}: ` : \"\"}${d.message}`;\n}\n\n/**\n * The errors `skaile validate` gives the `agents:` map of the project's `skaile.yaml`, as the\n * lines `validate` prints (p1512): a lifecycle or memory scope that is none of the known ones, a\n * `role` instance whose agent declares no `io`, a connector or trigger the agent does not have.\n * `install`, `check`, `run`, `repl` and `rebuild` refuse the project with them, so they never\n * accept what `validate` rejects. A ref that does not resolve is left out: `install` resolves a\n * catalog ref itself and `check` reports an unbound ref as a gap.\n *\n * @param projectDir - Project directory.\n */\nexport function agentInstanceErrorLines(projectDir: string): string[] {\n return agentInstanceDiagnostics(projectDir)\n .filter((d) => d.severity === \"error\" && d.code !== \"agent_ref_unresolved\")\n .map(agentInstanceLine);\n}\n\n/**\n * The warnings `skaile validate` gives for keys of `agent:` and `agents:` that nothing reads\n * (p1712), as the lines `validate` prints: `agents.audit.colour`, `agent.modle`,\n * `agents.<id>.model.preffered`. Without them a typo leaves the default model or budget in\n * place and says nothing.\n *\n * @param projectDir - Project directory.\n */\nexport function agentInstanceWarningLines(projectDir: string): string[] {\n return agentInstanceDiagnostics(projectDir)\n .filter(\n (d) =>\n d.severity === \"warning\" &&\n (d.code === \"unknown_agent_instance_key\" || d.code === \"unknown_agent_key\"),\n )\n .map(agentInstanceLine);\n}\n\n/** Projects whose key warnings this process printed already (a command can reach the check twice). */\nconst warnedProjects = new Set<string>();\n\n/**\n * Print the warnings for keys of the project's `skaile.yaml` that nothing reads: top-level and\n * `agent-config` keys, `agent:` and `agents:` keys. Every command that loads the file prints\n * them through here (`requireProjectConfig` calls it), so a typo shows in whichever command the\n * user runs first. Prints once per project and process. A file that is missing or does not load\n * prints nothing: the command says so itself.\n *\n * @param projectDir - Project directory.\n * @param opts.file - The loaded file, when the caller has it.\n * @param opts.stderr - Print on stderr, for a command whose stdout a script reads (`list --json`).\n */\nexport function warnProjectConfig(\n projectDir: string,\n opts: { file?: SkWorkspaceConfigFile | null; stderr?: boolean } = {},\n): void {\n const key = path.resolve(projectDir);\n if (warnedProjects.has(key)) return;\n let file = opts.file;\n if (file === undefined) {\n try {\n file = loadSkWorkspaceConfig(projectDir);\n } catch {\n return;\n }\n }\n if (!file) return;\n warnedProjects.add(key);\n const warn = opts.stderr ? logWarnErr : logWarn;\n for (const line of unknownKeyWarnings(file.diagnostics ?? [], \"skaile.yaml\")) warn(line);\n for (const line of agentConfigKeyWarnings(file.diagnostics ?? [], \"skaile.yaml\")) warn(line);\n for (const line of agentInstanceWarningLines(projectDir)) warn(line);\n}\n\n/**\n * The checks of the project's own `skaile.yaml`, printed: `!` lines for unknown keys (also the\n * ones of `agent:` and `agents:`, p1712), `✗` lines for a profile that sets both `harness` and\n * `driver`, for an unknown harness and for an `agents:` map `validate` rejects. Returns the number of errors printed. A file that does not load is not\n * this function's to report: the command reads it again and says so.\n *\n * @param projectDir - Project directory.\n * @param opts.harness - Also refuse an unknown `harness:` (`check`, `doctor`).\n * @param opts.instances - Also refuse an `agents:` map `validate` rejects (p1512).\n */\nexport async function reportProjectConfig(\n projectDir: string,\n opts: { harness: boolean; instances?: boolean },\n): Promise<number> {\n let file: SkWorkspaceConfigFile | null;\n try {\n file = loadSkWorkspaceConfig(projectDir);\n } catch {\n return 0;\n }\n if (!file) return 0;\n warnProjectConfig(projectDir, { file });\n const errors = [\n ...harnessKeyConflictErrors(file.diagnostics ?? [], \"skaile.yaml\"),\n ...(opts.harness ? await unknownHarnessErrors(projectDir, file.config, \"skaile.yaml\") : []),\n ...(opts.instances ? agentInstanceErrorLines(projectDir) : []),\n ];\n for (const line of errors) logErr(line);\n return errors.length;\n}\n","import { listHarnesses } from \"@skaile/workspaces/bridge\";\nimport { SUPPORTED_HARNESSES } from \"@skaile/workspaces/core\";\nimport { Option } from \"commander\";\n\n/**\n/** The line printed once when the harness a command resolves is `experimental`. */\nexport const EXPERIMENTAL_HARNESS_NOTICE = \"experimental: not covered by the release tests\";\n\n/**\n * Print {@link EXPERIMENTAL_HARNESS_NOTICE} to stderr when `harness` is an experimental one\n * (`stability` in the bridge catalog). No exit code or output on stdout changes. Call it where\n * the harness name is resolved and known to be registered.\n */\nexport function noteExperimentalHarness(harness: string): void {\n if (listHarnesses().find((d) => d.id === harness)?.stability === \"experimental\") {\n console.error(EXPERIMENTAL_HARNESS_NOTICE);\n }\n}\n\n/**\n * The refusal for a name that is no harness target, for the commands that deploy files\n * (`harness set`, `init --harness`, `add --harness`, `integration --harness`). The line `run`,\n * `repl`, `serve`, `validate` and `config set harness` print for an unregistered name is the\n * `preflight` one in the bridge: it lists the registered harnesses, and names the commands that\n * deploy files and take the targets only (p1753).\n *\n * @param harness - The name the user typed.\n * @param extra - Further names the command takes, such as `all`.\n */\nexport function unknownHarnessTargetMessage(\n harness: string,\n extra: readonly string[] = [],\n): string {\n const targets = [...SUPPORTED_HARNESSES, ...extra];\n const registered = listHarnesses().map((d) => d.id);\n return (\n `Unknown agent harness: \"${harness}\". Available: ${targets.join(\", \")}. ` +\n `run, repl and config set harness take: ${registered.join(\", \")}.`\n );\n}\n\n/**\n * The bridge harness id of a name a user typed: `claude-code`, the name `init --harness` and\n * `harness set` take, is `claude-sdk` for the commands that run a session. Any other name is\n * returned as it is.\n */\nexport function canonicalHarnessId<T extends string | undefined>(harness: T): T {\n return (harness === \"claude-code\" ? \"claude-sdk\" : harness) as T;\n}\n\nlet warnedDriverFlag = false;\n\n/** Print the `--driver` deprecation line to stderr, once per process. */\nexport function warnDriverFlagDeprecated(): void {\n if (warnedDriverFlag) return;\n warnedDriverFlag = true;\n console.error(\"--driver is deprecated; use --harness\");\n}\n\n/**\n * The hidden `--driver <name>` option every command with `--harness <name>` keeps for one\n * major release: an alias that sets the same value (`--harness` wins when both are given).\n */\nexport function driverAliasOption(): Option {\n return new Option(\"--driver <name>\", \"Deprecated alias of --harness\").hideHelp();\n}\n\n/**\n * Fold a parsed `--driver` alias into `harness`: when `--driver` was given, print the\n * deprecation line once and use its value unless `--harness` (or `fallback`, when neither\n * flag was given) already decided. Returns `opts` with `harness` set and `driver` removed.\n * The name is kept as typed: the commands that run a session apply {@link canonicalHarnessId}.\n */\nexport function foldDriverFlag<T extends { harness?: string; driver?: string }>(\n opts: T,\n fallback?: string,\n): Omit<T, \"driver\"> & { harness?: string } {\n const { driver, ...rest } = opts;\n if (driver !== undefined) warnDriverFlagDeprecated();\n return { ...rest, harness: rest.harness ?? driver ?? fallback };\n}\n\n/**\n * Turn a harness-start/prompt failure into a friendly, actionable message when the\n * cause is a missing/unusable agent binary; otherwise return `null` so the caller\n * surfaces the raw error unchanged.\n *\n * The bridge classifies these as `category: \"config\"` and carries a `hint`, but the\n * shape reaching the CLI varies: omp's `start()` rejects with the raw spawn error\n * (`code === \"ENOENT\"`), while the subprocess CLI harnesses reject with the classified\n * `AgentError` attached under `.detail`. Duck-type across all of them.\n */\nexport function friendlyHarnessError(err: unknown): string | null {\n const e = err as\n | {\n code?: string;\n syscall?: string;\n message?: string;\n category?: string;\n hint?: string;\n detail?: { category?: string; hint?: string };\n }\n | null\n | undefined;\n if (!e) return null;\n\n // A missing binary is a *spawn* ENOENT (`syscall: \"spawn <bin>\"` / \"spawn … ENOENT\");\n // a bare ENOENT from connector/mount setup is a different failure, not the harness.\n const isSpawnEnoent =\n e.code === \"ENOENT\" &&\n (e.syscall?.startsWith(\"spawn\") === true || /^spawn .*ENOENT/.test(e.message ?? \"\"));\n const isConfig = e.category === \"config\" || e.detail?.category === \"config\";\n if (!isSpawnEnoent && !isConfig) return null;\n\n const hint = e.hint ?? e.detail?.hint;\n const base = hint ?? \"The configured agent binary is not installed or not on your PATH.\";\n return `${base}\\nTry a different harness with \\`--harness claude-sdk\\`.`;\n}\n\n/**\n * Lines that follow the single `✗` line of a failed turn: the classifier's hint\n * (or, for a rejected credential, a pointer at the key), and where the full\n * records are. The JSON records themselves are not printed on the terminal:\n * they live in the project's log database. The pointer names the session whose records\n * the failure left (`logSessionId`); a failure before any session started has none and\n * gets no pointer.\n */\nexport function harnessErrorNotes(err: unknown): string[] {\n const e = err as\n | {\n category?: string;\n hint?: string;\n logSessionId?: string;\n detail?: { category?: string; hint?: string };\n }\n | null\n | undefined;\n const notes: string[] = [];\n const category = e?.category ?? e?.detail?.category;\n const hint = e?.hint ?? e?.detail?.hint;\n if (hint && category !== \"config\") notes.push(hint);\n else if (category === \"auth\") notes.push(\"Check your API key or login.\");\n if (e?.logSessionId) {\n notes.push(`Full records: .skaile/logs.db (skaile session logs ${e.logSessionId}).`);\n }\n return notes;\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { softDepName } from \"@skaile/workspaces/asset-manager\";\nimport {\n type HarnessName,\n LockParseError,\n readLock,\n resolveSkWorkspaceConfig,\n SKAILE_YAML_DEFAULT,\n SUPPORTED_HARNESSES,\n} from \"@skaile/workspaces/core\";\nimport pc from \"picocolors\";\nimport { warnProjectConfig } from \"./config-checks.ts\";\nimport { unknownHarnessTargetMessage } from \"./harness-error.ts\";\n\n/**\n * Terminal styling helpers used across all CLI commands.\n *\n * @docLink cli/dev-guide#helpers\n */\nexport const S = {\n brand: (s: string) => pc.cyan(pc.bold(s)),\n cmd: (s: string) => pc.cyan(s),\n heading: (s: string) => pc.bold(s),\n bold: (s: string) => pc.bold(s),\n dim: (s: string) => pc.dim(s),\n ok: (s: string) => pc.green(s),\n warn: (s: string) => pc.yellow(s),\n err: (s: string) => pc.red(s),\n label: (s: string) => pc.dim(s),\n rule: (w = 40) => pc.dim(\"─\".repeat(w)),\n};\n\nconst KIND_COLORS: Record<string, (s: string) => string> = {\n skill: pc.blue,\n agent: pc.magenta,\n prompt: pc.yellow,\n flow: pc.green,\n preset: pc.cyan,\n contract: pc.red,\n connector: pc.green,\n knowledge: pc.cyan,\n persona: pc.cyan,\n ruleset: pc.cyan,\n \"mcp-server\": pc.magenta,\n};\n\n/**\n * Fit a plain (ANSI-free) string into exactly `width` columns: truncate with a\n * trailing `…` when too long, pad with spaces when too short. Keeps fixed-width\n * columns from overflowing the row when a value (e.g. an asset name) is wider\n * than its budget.\n */\nexport function fitWidth(s: string, width: number): string {\n if (width <= 0) return \"\";\n if (s.length > width) return width === 1 ? \"…\" : `${s.slice(0, width - 1)}…`;\n return s.padEnd(width);\n}\n\n/** Color-code an asset kind string. */\nexport function kindColor(kind: string): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(kind);\n}\n\n/**\n * Widest kind label (`mcp-server`); the default kind-column width fits it so\n * long kinds don't shove the rest of the row out of alignment.\n */\nexport const KIND_COL_WIDTH = 10;\n\n/**\n * Shared `--target` help suffix: with no flag, the manager deploys into the\n * harness the project is configured for (the harness `skaile config show`\n * resolves), and only then falls back to `claude-code`.\n */\nexport const TARGET_DEFAULT_HINT = \"default: the project's configured harness, else claude-code\";\n\n/**\n * Color-code an asset kind string fit to exactly `width` columns — pads short\n * kinds, truncates over-long ones (via {@link fitWidth}) so the column can never\n * overflow and break row alignment.\n */\nexport function kindColorPad(kind: string, width = KIND_COL_WIDTH): string {\n const colorFn = KIND_COLORS[kind] ?? pc.dim;\n return colorFn(fitWidth(kind, width));\n}\n\n/** Color-code a \"kind:name\" reference string. */\nexport function colorRef(ref: string): string {\n const colonIdx = ref.indexOf(\":\");\n if (colonIdx === -1) return ref;\n const kind = ref.slice(0, colonIdx);\n const rest = ref.slice(colonIdx);\n return `${kindColor(kind)}${rest}`;\n}\n\n/**\n * Print a success line prefixed with a green check mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logOk(msg: string) {\n console.log(` ${pc.green(\"✓\")} ${msg}`);\n}\n/**\n * Print an error line prefixed with a red cross to stderr.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logErr(msg: string) {\n console.error(` ${pc.red(\"✗\")} ${msg}`);\n}\n/**\n * Print a warning line prefixed with a yellow exclamation mark.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logWarn(msg: string) {\n console.log(` ${pc.yellow(\"!\")} ${msg}`);\n}\n/**\n * Like {@link logWarn}, on stderr: a warning about the run itself (an asset scan that stopped\n * early) that must not land in the output a script reads from stdout.\n *\n * @param msg - Message to display.\n */\nexport function logWarnErr(msg: string) {\n console.error(` ${pc.yellow(\"!\")} ${msg}`);\n}\n/**\n * One `!` line per deployed library asset whose body or description is still the untouched\n * `library create` scaffold: `validate` and the publish plan fail both, so `add`, `install` and\n * `update` name every placeholder they fail (p926).\n *\n * @param bodies - Canonical refs the asset manager reported as placeholder bodies.\n * @param descriptions - Canonical refs the asset manager reported as placeholder descriptions.\n */\nexport function warnPlaceholderBodies(\n bodies: readonly string[] | undefined,\n descriptions?: readonly string[],\n) {\n const refs = [...new Set([...(bodies ?? []), ...(descriptions ?? [])])];\n for (const ref of refs) {\n const parts = [\n ...(descriptions?.includes(ref) ? [\"description\"] : []),\n ...(bodies?.includes(ref) ? [\"body\"] : []),\n ];\n const both = parts.length > 1;\n logWarn(\n `${ref} ${parts.join(\" and \")} ${both ? \"are\" : \"is\"} still the scaffold placeholder; write ${both ? \"them\" : \"it\"} (\\`skaile validate\\` fails ${both ? \"them\" : \"it\"})`,\n );\n }\n}\n/**\n * Print an info line prefixed with a dim dot.\n *\n * @param msg - Message to display.\n * @docLink cli/dev-guide#helpers\n */\nexport function logInfo(msg: string) {\n console.log(` ${pc.dim(\"·\")} ${msg}`);\n}\n\n/** Full command path of the command being run (`harness set`), set before its action runs. */\nlet activeCommandPath: string | undefined;\n\n/**\n * Record the command that is about to run, as the path of subcommand names from the root\n * (`harness set`), so advice that repeats the command shows the whole path (p1656).\n */\nexport function setActiveCommand(cmd: { name(): string; parent: unknown }): void {\n const names: string[] = [];\n for (\n let c: { name(): string; parent: unknown } | null = cmd;\n c && c.parent;\n c = c.parent as { name(): string; parent: unknown } | null\n ) {\n names.unshift(c.name());\n }\n activeCommandPath = names.length > 0 ? names.join(\" \") : undefined;\n}\n\n/** The nearest parent directory of `dir` that holds a `skaile.yaml`, or `undefined`. */\nfunction nearestParentProject(dir: string): string | undefined {\n for (let up = path.dirname(dir); up !== dir; dir = up, up = path.dirname(dir)) {\n if (existsSync(path.join(up, SKAILE_YAML_DEFAULT))) return up;\n }\n return undefined;\n}\n\n/**\n * Print the `No skaile.yaml found` line for `projectDir`, plus a second line naming the nearest\n * parent directory that holds a `skaile.yaml`, when there is one: skaile does not search parent\n * directories. The line shows `--project-dir` after the full command path (`skaile harness set\n * --project-dir /x`), the only place the option is accepted (p1656).\n */\nexport function logNoProject(projectDir: string): void {\n const dir = path.resolve(projectDir);\n logErr(`No ${S.cmd(\"skaile.yaml\")} found. Run ${S.cmd(\"skaile init\")} to create one.`);\n const parent = nearestParentProject(dir);\n if (parent) {\n const command =\n activeCommandPath ?? process.argv.slice(2).find((a) => !a.startsWith(\"-\")) ?? \"<command>\";\n logErr(\n `${S.cmd(parent)} holds a ${S.cmd(\"skaile.yaml\")}: run from there or put the option after the command name: ${S.cmd(`skaile ${command} --project-dir ${parent}`)}.`,\n );\n }\n}\n\n/**\n * Stop a project command that has no usable project: print one `✗` line and exit 1, before\n * the command deploys, undeploys, locks or clones anything. Two causes: no `skaile.yaml` in\n * `projectDir` (`No skaile.yaml found`), or a `skaile.yaml` — project, app or user scope —\n * that does not parse (`<file> — parse error: …`, a duplicate key included). Without this a\n * broken file would read as \"nothing declared\" and `install` would undeploy every asset.\n *\n * Library-level commands (`library …`, `search`, `init`) have no project and do not call it.\n */\nexport function requireProjectConfig(\n projectDir: string,\n opts: { allowMissing?: boolean } = {},\n): void {\n const dir = path.resolve(projectDir);\n if (!existsSync(path.join(dir, SKAILE_YAML_DEFAULT))) {\n if (opts.allowMissing) return;\n logNoProject(dir);\n process.exit(1);\n }\n try {\n resolveSkWorkspaceConfig(dir);\n } catch (err) {\n logErr(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n // A lock that is not valid YAML is not \"nothing locked\": `update` would overwrite it and\n // `outdated`/`why`/`check` would call every asset unlocked. One line, exit 1 (p1892).\n try {\n readLock(path.join(dir, \"skaile.lock.yaml\"));\n } catch (err) {\n if (err instanceof LockParseError) {\n logErr(err.message);\n process.exit(1);\n }\n // Another lock problem (an old schema) has its own message where the lock is used.\n }\n // Keys of the file that nothing reads: every command that loads it says so, not only\n // `validate` and `check`, so a typo is seen in whichever command runs first.\n warnProjectConfig(dir);\n}\n\n/**\n * Hold warnings raised while a spinner animates and print them once it stops:\n * on a TTY a line written mid-spin is overwritten by the next frame. Pass\n * `push` as `AssetManager`'s `onLibraryCollision`, call `flush()` after\n * `spinner.stop(...)`. Warnings pushed after `flush()` print immediately.\n */\nexport function deferredWarnings(): { push: (msg: string) => void; flush: () => void } {\n const held: string[] = [];\n let live = false;\n return {\n push: (msg) => {\n if (live) logWarn(msg);\n else held.push(msg);\n },\n flush: () => {\n for (const msg of held.splice(0)) logWarn(msg);\n live = true;\n },\n };\n}\n\n/** Max stale copies of one harness named inline by {@link warnStaleHarnessCopies}. */\nconst STALE_COPY_LIST_MAX = 5;\n\n/**\n * Print one warning per harness whose project dir (`.claude/`, `.omp/`, `.codex/`) still holds\n * copies of tracked assets although the project deploys to another harness: after `skaile\n * harness set`, or when a project moved off the old default. Those copies are orphans: `remove`\n * / `clean` / `list` only look in the active harness dir. Every file a deploy created is named\n * (p1671). Nothing is deleted here; `skaile harness set <name> --clean` deletes them. Silent when\n * there are none.\n */\nexport function warnStaleHarnessCopies(am: {\n projectDir: string;\n harness: string;\n listStaleHarnessCopies(): Array<{ harness: HarnessName; path: string }>;\n}): void {\n let stale: Array<{ harness: HarnessName; path: string }>;\n try {\n stale = am.listStaleHarnessCopies();\n } catch {\n return; // advisory only — never fail the command\n }\n for (const harness of SUPPORTED_HARNESSES) {\n const rel = stale\n .filter((s) => s.harness === harness)\n .map((s) => path.relative(am.projectDir, s.path));\n if (rel.length === 0) continue;\n const dir = `${rel[0]?.split(path.sep)[0] ?? harness}/`;\n const shown = rel.slice(0, STALE_COPY_LIST_MAX).join(\", \");\n const more =\n rel.length > STALE_COPY_LIST_MAX ? `, +${rel.length - STALE_COPY_LIST_MAX} more` : \"\";\n logWarn(\n `Stale ${S.cmd(dir)} copies no longer managed (deploying to ${am.harness}): ${shown}${more}. ` +\n `Delete them with ${S.cmd(`skaile harness set ${am.harness} --clean`)}, or pass ${S.cmd(`--target ${harness}`)} to keep using ${dir}.`,\n );\n }\n}\n\n/**\n * Bare asset name of a canonical soft-dep target ref (`@pub/name@ver` → `name`),\n * for compact rendering in `info` / `tree` / `why`. Delegates to the asset-manager\n * parser (the soft-dep read surface) so the two never diverge.\n */\nexport function bareSoftDepName(ref: string): string {\n return softDepName(ref);\n}\n\n/**\n * The report-only soft-dep hint line shared by the `add` no-TTY branch and the\n * `install` surface, so the two user-facing wordings can't drift. Appends a\n * runnable `skaile add` suffix only when the target has a parseable ref.\n */\nexport function formatSoftDepHint(edge: { from: string; to: string; toRef?: string }): string {\n const suffix = edge.toRef ? ` — run \\`skaile add ${edge.toRef}\\` to include it.` : \"\";\n return `${bareSoftDepName(edge.from)} references ${bareSoftDepName(edge.to)} (soft dependency)${suffix}`;\n}\n\n/**\n * Build the \"Soft dependencies (inferred)\" section for `skaile info`. Returns one\n * header line plus one line per soft-dep target, each marked `(soft)` to read\n * differently from a typed `requires`. Empty array when there are no soft deps,\n * so the caller prints nothing.\n */\nexport function formatSoftDepSection(targets: string[]): string[] {\n if (targets.length === 0) return [];\n const out = [` ${S.label(\"Soft dependencies (inferred)\")}:`];\n for (const t of targets) out.push(` ${S.dim(\"·\")} ${t} ${S.dim(\"(soft)\")}`);\n return out;\n}\n\n/**\n * Footer line previewing the soft deps that *adding* the highlighted asset would\n * reference (manage TUI). \"references\" + \"not auto-added\" makes clear the pull is\n * report-only. Empty string when there are no targets, so the caller clears.\n */\nexport function formatSoftDepAddPreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`${name} references ${targets.join(\", \")} (soft dep, not auto-added)`);\n}\n\n/**\n * Footer line previewing the soft deps that *removing* the highlighted asset\n * would orphan (manage TUI) — symmetric with {@link formatSoftDepAddPreview}.\n * Empty string when nothing would be orphaned, so the caller clears.\n */\nexport function formatSoftDepRemovePreview(name: string, targets: string[]): string {\n if (targets.length === 0) return \"\";\n return S.dim(`removing ${name} would orphan ${targets.join(\", \")} (soft dep)`);\n}\n\n/** Format a Date as a human-readable relative time string (e.g. \"5m ago\"). */\nexport function formatRelativeTime(date: Date): string {\n const diff = Date.now() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n if (seconds < 60) return \"just now\";\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n\n/** Name the old `~/.omp/<dir>` copies a global deploy replaced (omp reads `~/.omp/agent/<dir>`). */\nexport function reportLegacyOmpCopies(removed: string[], kept: string[] = []): void {\n for (const p of removed) {\n logInfo(\n S.dim(`removed the old omp copy ${p.replace(homedir(), \"~\")} (omp reads ~/.omp/agent)`),\n );\n }\n for (const p of kept) {\n logWarn(\n `${p.replace(homedir(), \"~\")} is an old omp location and skaile did not write this copy, so it was kept: delete it if you do not need it`,\n );\n }\n}\n\n/**\n * Parse a `--harness a,b` value into validated {@link HarnessName}s, exiting on\n * an unknown id. Returns `undefined` when the flag is absent (the caller then\n * resolves the full global harness set).\n */\nexport function parseHarnessFilter(raw: string | undefined): HarnessName[] | undefined {\n if (!raw) return undefined;\n const ids = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n const out: HarnessName[] = [];\n for (const id of ids) {\n if (!(SUPPORTED_HARNESSES as string[]).includes(id)) {\n logErr(unknownHarnessTargetMessage(id));\n process.exit(1);\n }\n out.push(id as HarnessName);\n }\n return out.length > 0 ? out : undefined;\n}\n\n/** The sentence the agent renderer puts into a delegate sub-agent's file (`asset-manager` fragments). */\nconst SUB_AGENT_MARKER = \"You are a sub-agent:\";\n\n/**\n * One line when a Codex project holds delegate sub-agents. Codex does not load\n * `.codex/agents/*.toml` as spawnable agents (its `spawn_agent` has no `agent_type`), so the\n * delegate exists only as a file there and the orchestrator cannot call it (p428). A delegate is\n * found by the sentence the renderer writes into its file. Silent for every other harness.\n */\nexport function warnFilesOnlyDelegates(projectDir: string, target: string): void {\n if (target !== \"codex\") return;\n const dir = path.join(projectDir, \".codex\", \"skaile-agents\");\n let names: string[];\n try {\n names = readdirSync(dir).filter((f) => f.endsWith(\".md\"));\n } catch {\n return;\n }\n const delegates = names\n .filter((f) => {\n try {\n return readFileSync(path.join(dir, f), \"utf8\").includes(SUB_AGENT_MARKER);\n } catch {\n return false;\n }\n })\n .map((f) => f.replace(/\\.md$/, \"\"))\n .sort();\n if (delegates.length === 0) return;\n logWarn(\n `codex: delegate agents are files only (${delegates.join(\", \")}): Codex does not load .codex/agents as sub-agents, so the orchestrator cannot call them`,\n );\n}\n"]}
@@ -1,10 +1,10 @@
1
- import { mountList, mountSync, mountStatus, mountRead, connectorList, connectorRead, connectorWrite, connectorSearch, connectorExec, connectorLoadSkill, connectorDescribe } from './chunk-QBLS7X3Z.js';
2
- import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from './chunk-IOXFT5D7.js';
1
+ import { mountList, mountSync, mountStatus, mountRead, connectorList, connectorRead, connectorWrite, connectorSearch, connectorExec, connectorLoadSkill, connectorDescribe } from './chunk-TVRL3IPZ.js';
2
+ import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from './chunk-PD42JZWI.js';
3
3
  import { sessionList, sessionGet } from './chunk-WYZXSJBK.js';
4
- import { skillList, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from './chunk-EB2LKPI6.js';
4
+ import { skillList, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from './chunk-SMFZ5YGN.js';
5
5
  import { workspaceValidate, workspaceInfo, workspaceTestSecret, workspaceReload } from './chunk-KW37WNXY.js';
6
- import { withActivityLabelDefs } from './chunk-DWPQBMCY.js';
7
- import { loadHarnessSdk } from './chunk-MEU2HHGV.js';
6
+ import { withActivityLabelDefs } from './chunk-JPV4WE5L.js';
7
+ import { loadHarnessSdk } from './chunk-U7P22GEB.js';
8
8
  import { DEFAULT_HARNESS_ID } from './chunk-C5HFK34M.js';
9
9
  import * as zNS from 'zod';
10
10
 
@@ -251,5 +251,5 @@ async function runMcpServerStdio(plugin) {
251
251
  }
252
252
 
253
253
  export { buildWorkspaceMcpServer, buildWorkspaceMcpStdioServer, buildWorkspaceToolDefs, runMcpServerStdio };
254
- //# sourceMappingURL=chunk-WCUT3EQR.js.map
255
- //# sourceMappingURL=chunk-WCUT3EQR.js.map
254
+ //# sourceMappingURL=chunk-Z23I2JA6.js.map
255
+ //# sourceMappingURL=chunk-Z23I2JA6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"chunk-WCUT3EQR.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport { loadHarnessSdk } from \"@skaile/workspaces/core\";\nimport { DEFAULT_HARNESS_ID } from \"@skaile/workspaces/core/framework\";\nimport { withActivityLabelDefs } from \"@skaile/workspaces/types\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 27 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 5 skill tools (`skill_list`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 27 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const harness = plugin.harness ?? DEFAULT_HARNESS_ID;\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get harness metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n inputSchema: {},\n handler: async () => skillList(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, harness binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, harness),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: harness, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, harness, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n plugin.projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n );\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: withActivityLabelDefs(buildWorkspaceToolDefs(plugin), zStatic),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 27 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
1
+ {"version":3,"sources":["../workspace-plugin/src/adapters/mcp.ts"],"names":["z"],"mappings":"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","file":"chunk-Z23I2JA6.js","sourcesContent":["// Static namespace import so bun --compile bundles zod into the binary.\n// Dynamic import(\"zod\") via a string variable evades bun's static analysis\n// and fails at runtime inside /$bunfs/. The unwrap (zNS.z ?? zNS.default\n// ?? zNS) handles both bun's native ESM and vitest's CJS-interop resolver,\n// which return the zod namespace at different keys.\nimport * as zNS from \"zod\";\nimport { loadHarnessSdk } from \"@skaile/workspaces/core\";\nimport { DEFAULT_HARNESS_ID } from \"@skaile/workspaces/core/framework\";\nimport { withActivityLabelDefs } from \"@skaile/workspaces/types\";\nimport type { WorkspacePlugin } from \"../plugin.js\";\nimport {\n connectorDescribe,\n connectorExec,\n connectorList,\n connectorLoadSkill,\n connectorRead,\n connectorSearch,\n connectorWrite,\n mountList,\n mountRead,\n mountStatus,\n mountSync,\n} from \"../tools/connectors.js\";\nimport {\n flowFindFlowForSession,\n flowGetSession,\n flowList,\n flowListSessions,\n flowShow,\n} from \"../tools/flows.js\";\nimport { sessionGet, sessionList } from \"../tools/sessions.js\";\nimport {\n skillCheckRequirements,\n skillGetPreamble,\n skillList,\n skillSearch,\n skillShow,\n} from \"../tools/skills.js\";\nimport {\n workspaceInfo,\n workspaceReload,\n workspaceTestSecret,\n workspaceValidate,\n} from \"../tools/validator.js\";\n\nconst zStatic: any = (zNS as any).z ?? (zNS as any).default ?? zNS;\n\n/**\n * One workspace plugin tool — name, description, a zod raw-shape input schema,\n * and an async handler returning a `ToolResult`.\n *\n * Carries **zero MCP/SDK dependency**: the same definitions feed both the\n * in-process Claude Agent SDK server ({@link buildWorkspaceMcpServer}) and the\n * raw stdio MCP server ({@link buildWorkspaceMcpStdioServer}).\n */\nexport interface WorkspaceToolDef {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n handler: (args: any) => Promise<unknown>;\n}\n\n/**\n * Build the 27 workspace plugin tool definitions.\n *\n * Tool groups:\n * - 4 mount tools (`mount_list`, `mount_sync`, `mount_status`, `mount_read`)\n * - 5 flow tools (`flow_list`, `flow_show`, `flow_list_sessions`, `flow_get_session`, `flow_find_flow_for_session`)\n * - 5 skill tools (`skill_list`, `skill_show`, `skill_search`, `skill_check_requirements`, `skill_get_preamble`)\n * - 2 session tools (`session_list`, `session_get`)\n * - 7 connector tools (`connector_list`, `connector_read`, `connector_write`, `connector_search`, `connector_exec`, `connector_load_skill`, `connector_describe`)\n * - 4 workspace tools (`workspace_validate`, `workspace_info`, `workspace_test_secret`, `workspace_reload`)\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The 27 tool definitions, free of any MCP/SDK coupling.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport function buildWorkspaceToolDefs(plugin: WorkspacePlugin): WorkspaceToolDef[] {\n const z: any = zStatic;\n\n const harness = plugin.harness ?? DEFAULT_HARNESS_ID;\n const p = plugin.projectDir;\n\n return [\n // Mount tools\n {\n name: \"mount_list\",\n description: \"List all mounts declared in skaile.yaml with their mount status.\",\n inputSchema: {},\n handler: async () => mountList(plugin.connectorManager),\n },\n {\n name: \"mount_sync\",\n description: \"Sync a mount — pull latest from remote (git, S3, WebDAV).\",\n inputSchema: { mount_id: z.string().describe(\"Mount ID from mount_list\") },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountSync(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_status\",\n description: \"Get the mount status and last sync time for a mount.\",\n inputSchema: { mount_id: z.string() },\n handler: async ({ mount_id }: { mount_id: string }) =>\n mountStatus(plugin.connectorManager, mount_id),\n },\n {\n name: \"mount_read\",\n description: \"Read a file from a mounted mount by path.\",\n inputSchema: {\n mount_id: z.string(),\n path: z.string().describe(\"Relative path within the mount\"),\n },\n handler: async ({ mount_id, path }: { mount_id: string; path: string }) =>\n mountRead(plugin.connectorManager, mount_id, path),\n },\n // Flow tools\n {\n name: \"flow_list\",\n description: \"List all available flow definitions from ai-assets.\",\n inputSchema: {},\n handler: async () => flowList(p),\n },\n {\n name: \"flow_show\",\n description: \"Show full flow definition (nodes + edges) for a flow ID.\",\n inputSchema: { flow_id: z.string().describe(\"Flow ID from flow_list\") },\n handler: async ({ flow_id }: { flow_id: string }) => flowShow(p, flow_id),\n },\n {\n name: \"flow_list_sessions\",\n description: \"List past and active flow run sessions for this workspace.\",\n inputSchema: {},\n handler: async () => flowListSessions(p),\n },\n {\n name: \"flow_get_session\",\n description: \"Get harness metadata for a specific flow run session.\",\n inputSchema: { run_id: z.string().describe(\"Run ID from flow_list_sessions\") },\n handler: async ({ run_id }: { run_id: string }) => flowGetSession(p, run_id),\n },\n {\n name: \"flow_find_flow_for_session\",\n description: \"Resolve and return the flow definition used in a past session.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => flowFindFlowForSession(p, run_id),\n },\n // Skill tools\n {\n name: \"skill_list\",\n description: \"List all skills in the ai-assets catalog.\",\n inputSchema: {},\n handler: async () => skillList(p),\n },\n {\n name: \"skill_show\",\n description: \"Show the full SKILL.md content for a skill ID.\",\n inputSchema: { skill_id: z.string().describe(\"Skill ID from skill_list\") },\n handler: async ({ skill_id }: { skill_id: string }) => skillShow(p, skill_id),\n },\n {\n name: \"skill_search\",\n description: \"Search skills by name, description, or keywords.\",\n inputSchema: { query: z.string() },\n handler: async ({ query }: { query: string }) => skillSearch(p, query),\n },\n {\n name: \"skill_check_requirements\",\n description: \"Validate that all skill prerequisites are met in the target directory.\",\n inputSchema: {\n skill_id: z.string(),\n target_dir: z\n .string()\n .optional()\n .describe(\"Directory to check against (default: projectDir)\"),\n },\n handler: async ({ skill_id, target_dir }: { skill_id: string; target_dir?: string }) =>\n skillCheckRequirements(p, skill_id, target_dir ?? p),\n },\n {\n name: \"skill_get_preamble\",\n description: \"Get the REQUIRES/INPUT/READS/WRITES DSL preamble for a skill.\",\n inputSchema: { skill_id: z.string() },\n handler: async ({ skill_id }: { skill_id: string }) => skillGetPreamble(p, skill_id),\n },\n // Session tools\n {\n name: \"session_list\",\n description: \"List all past agent run sessions for this workspace, sorted newest first.\",\n inputSchema: {},\n handler: async () => sessionList(p),\n },\n {\n name: \"session_get\",\n description: \"Get full metadata for a specific session by run ID.\",\n inputSchema: { run_id: z.string() },\n handler: async ({ run_id }: { run_id: string }) => sessionGet(p, run_id),\n },\n // Connector tools\n {\n name: \"connector_list\",\n description:\n \"List connectors declared in skaile.yaml as {connected, failed, notice?}. A host-managed mount in `connected` carries `health` {status: ok|stale|failed, errorClass, checkedAt}; if it is not ok, tell the user and do not write to it. `failed` holds connectors that did not connect this session, with the failure reason — their mount paths are dead directories, not synced workspaces.\",\n inputSchema: {},\n handler: async () => connectorList(plugin.connectorManager),\n },\n {\n name: \"connector_read\",\n description: \"Read content from a connector by path.\",\n inputSchema: {\n connector_id: z.string().describe(\"Connector ID from connector_list\"),\n path: z.string().describe(\"Path within the connector\"),\n },\n handler: async ({ connector_id, path }: { connector_id: string; path: string }) =>\n connectorRead(plugin.connectorManager, connector_id, path),\n },\n {\n name: \"connector_write\",\n description: \"Write content to a connector by path.\",\n inputSchema: {\n connector_id: z.string(),\n path: z.string(),\n content: z.string().describe(\"Content to write\"),\n },\n handler: async ({\n connector_id,\n path,\n content,\n }: {\n connector_id: string;\n path: string;\n content: string;\n }) => connectorWrite(plugin.connectorManager, connector_id, path, content),\n },\n {\n name: \"connector_search\",\n description: \"Search within a connector by query string.\",\n inputSchema: {\n connector_id: z.string(),\n query: z.string().describe(\"Search query\"),\n },\n handler: async ({ connector_id, query }: { connector_id: string; query: string }) =>\n connectorSearch(plugin.connectorManager, connector_id, query),\n },\n {\n name: \"connector_exec\",\n description: \"Execute a custom operation on a connector.\",\n inputSchema: {\n connector_id: z.string(),\n operation: z.string().describe(\"Operation name from connector_describe\"),\n args: z.record(z.string(), z.unknown()).describe(\"Operation arguments\"),\n },\n handler: async ({\n connector_id,\n operation,\n args,\n }: {\n connector_id: string;\n operation: string;\n args: Record<string, unknown>;\n }) => connectorExec(plugin.connectorManager, connector_id, operation, args),\n },\n {\n name: \"connector_load_skill\",\n description: \"Load the rendered skill body for a connector (operations + usage).\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorLoadSkill(plugin.connectorManager, connector_id),\n },\n {\n name: \"connector_describe\",\n description: \"Describe a connector's capabilities via its RuntimeSkillDescriptor.\",\n inputSchema: {\n connector_id: z.string(),\n },\n handler: async ({ connector_id }: { connector_id: string }) =>\n connectorDescribe(plugin.connectorManager, connector_id),\n },\n // Validator tools\n {\n name: \"workspace_validate\",\n description: \"Run a full health check: connectors, mounts, secrets, harness binary.\",\n inputSchema: {},\n handler: async () => workspaceValidate(plugin, harness),\n },\n {\n name: \"workspace_info\",\n description: \"Show workspace configuration: harness, model, provider, resource counts.\",\n inputSchema: {},\n handler: async () => workspaceInfo(plugin, harness, plugin.model),\n },\n {\n name: \"workspace_test_secret\",\n description: \"Test resolution of one secret reference (env:VAR, forge:key).\",\n inputSchema: { ref: z.string().describe(\"Secret ref e.g. env:ANTHROPIC_API_KEY\") },\n handler: async ({ ref }: { ref: string }) => workspaceTestSecret(ref),\n },\n {\n name: \"workspace_reload\",\n description: \"Re-read skaile.yaml and re-sync the plugin state.\",\n inputSchema: {},\n handler: async () => workspaceReload(plugin),\n },\n ];\n}\n\n/**\n * Build the **in-process** workspace MCP server via the Claude Agent SDK's\n * `createSdkMcpServer`. This shape is what the runner embeds into a Claude\n * Agent SDK `query()` call — the runner *is* the Claude Agent SDK host.\n *\n * Returns `null` when `@anthropic-ai/claude-agent-sdk` is not installed\n * (graceful degradation for non-Claude-Code environments).\n *\n * For the standalone `skaile mcp-server` stdio subprocess use\n * {@link buildWorkspaceMcpStdioServer} / {@link runMcpServerStdio} instead —\n * those carry no Claude Agent SDK dependency.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns The SDK MCP server object or `null` if the SDK is unavailable.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpServer(plugin: WorkspacePlugin): Promise<unknown | null> {\n let sdk: any;\n try {\n sdk = await loadHarnessSdk(\n \"@anthropic-ai/claude-agent-sdk\",\n plugin.projectDir,\n () => import(\"@anthropic-ai/claude-agent-sdk\"),\n );\n } catch {\n return null;\n }\n return sdk.createSdkMcpServer({\n name: \"skaile-workspace\",\n tools: withActivityLabelDefs(buildWorkspaceToolDefs(plugin), zStatic),\n });\n}\n\n/**\n * Build a **raw stdio** workspace MCP server on `@modelcontextprotocol/sdk` —\n * no Claude Agent SDK. This is the correct shape for the `skaile mcp-server`\n * stdio subprocess that MCP-client agents (Claude Code, Codex, …) spawn.\n * Runs on plain Node.\n *\n * The returned server is not yet connected — call `.connect(transport)` (or\n * use {@link runMcpServerStdio}).\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n * @returns A `McpServer` with all 27 workspace tools registered.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function buildWorkspaceMcpStdioServer(plugin: WorkspacePlugin): Promise<any> {\n const { McpServer } = await import(\"@modelcontextprotocol/sdk/server/mcp.js\" as string);\n const server = new McpServer({ name: \"skaile-workspace\", version: \"1.0.0\" });\n for (const def of buildWorkspaceToolDefs(plugin)) {\n server.registerTool(\n def.name,\n { description: def.description, inputSchema: def.inputSchema },\n def.handler,\n );\n }\n return server;\n}\n\n/**\n * Start the workspace MCP server over stdio transport.\n *\n * Builds the raw `@modelcontextprotocol/sdk` server via\n * {@link buildWorkspaceMcpStdioServer} and connects a `StdioServerTransport`.\n * No `@anthropic-ai/claude-agent-sdk` dependency anywhere on this path.\n *\n * @param plugin - A booted `WorkspacePlugin` instance.\n *\n * @docLink packages/workspace-plugin/concepts#adapters\n */\nexport async function runMcpServerStdio(plugin: WorkspacePlugin): Promise<void> {\n const server = await buildWorkspaceMcpStdioServer(plugin);\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\" as string\n );\n await server.connect(new StdioServerTransport());\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { getKindRegistry } from './chunk-HPQ2WDYC.js';
2
- import { logErr } from './chunk-5FO4U3OL.js';
1
+ import { getKindRegistry } from './chunk-U2WPJHRA.js';
2
+ import { logErr } from './chunk-WW22FS74.js';
3
3
  import { userConfigPath } from './chunk-L5VSIPQD.js';
4
4
 
5
5
  // cli/src/open-library.ts
@@ -90,5 +90,5 @@ async function openLibraryManager() {
90
90
  }
91
91
 
92
92
  export { LocalCatalogDisabledError, openCatalogSource, openLibrary, openLibraryManager, resolveCatalogSource };
93
- //# sourceMappingURL=chunk-VKGNMXGZ.js.map
94
- //# sourceMappingURL=chunk-VKGNMXGZ.js.map
93
+ //# sourceMappingURL=chunk-Z7HLX4V2.js.map
94
+ //# sourceMappingURL=chunk-Z7HLX4V2.js.map