@skaile/workspaces 4.36.0 → 4.38.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 (332) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/dist/app-sdk/index.js +1 -1
  3. package/dist/{asset-feeds-SJELMLNK.js → asset-feeds-UYIFZKKG.js} +16 -16
  4. package/dist/asset-feeds-UYIFZKKG.js.map +1 -0
  5. package/dist/asset-manager/catalog-deployer.js +9 -8
  6. package/dist/asset-manager/index.js +15 -14
  7. package/dist/asset-manager/installer.js +11 -10
  8. package/dist/asset-manager/renderers.js +2 -2
  9. package/dist/asset-manager/src/index.d.ts +77 -18
  10. package/dist/asset-manager/src/index.d.ts.map +1 -1
  11. package/dist/asset-manager/src/installer.d.ts +11 -1
  12. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  13. package/dist/bridge/drivers/claude-sdk.js +14 -13
  14. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  15. package/dist/bridge/drivers/codex.js +11 -10
  16. package/dist/bridge/drivers/codex.js.map +1 -1
  17. package/dist/bridge/drivers/continue.js +12 -11
  18. package/dist/bridge/drivers/continue.js.map +1 -1
  19. package/dist/bridge/drivers/echo.js +3 -3
  20. package/dist/bridge/drivers/gemini.js +6 -6
  21. package/dist/bridge/drivers/goose.js +12 -11
  22. package/dist/bridge/drivers/goose.js.map +1 -1
  23. package/dist/bridge/drivers/omp.js +4 -4
  24. package/dist/bridge/drivers/opencode.js +12 -11
  25. package/dist/bridge/drivers/opencode.js.map +1 -1
  26. package/dist/bridge/drivers/qwen.js +6 -6
  27. package/dist/bridge/index.js +15 -14
  28. package/dist/{chunk-3CLUU45N.js → chunk-27DN4DZD.js} +8 -8
  29. package/dist/{chunk-3CLUU45N.js.map → chunk-27DN4DZD.js.map} +1 -1
  30. package/dist/{chunk-VOEBLPXO.js → chunk-2EL2PBRC.js} +3 -3
  31. package/dist/{chunk-VOEBLPXO.js.map → chunk-2EL2PBRC.js.map} +1 -1
  32. package/dist/{chunk-VRFKCF3R.js → chunk-36ML6SFP.js} +4 -4
  33. package/dist/{chunk-VRFKCF3R.js.map → chunk-36ML6SFP.js.map} +1 -1
  34. package/dist/{chunk-O63QZ6XX.js → chunk-4WKZEMBD.js} +4 -4
  35. package/dist/{chunk-O63QZ6XX.js.map → chunk-4WKZEMBD.js.map} +1 -1
  36. package/dist/{chunk-2D3C4AJP.js → chunk-5CYEWBPB.js} +11 -4
  37. package/dist/chunk-5CYEWBPB.js.map +1 -0
  38. package/dist/{chunk-SQ7IN7KR.js → chunk-5K2VT6E2.js} +3 -3
  39. package/dist/{chunk-SQ7IN7KR.js.map → chunk-5K2VT6E2.js.map} +1 -1
  40. package/dist/{chunk-NTASYPDN.js → chunk-5NYBY6ZE.js} +3 -3
  41. package/dist/{chunk-NTASYPDN.js.map → chunk-5NYBY6ZE.js.map} +1 -1
  42. package/dist/{chunk-FQE2NBUH.js → chunk-6EMF4UZI.js} +8 -8
  43. package/dist/{chunk-FQE2NBUH.js.map → chunk-6EMF4UZI.js.map} +1 -1
  44. package/dist/{chunk-MQU632EK.js → chunk-6KPQDP7P.js} +2 -2
  45. package/dist/{chunk-MQU632EK.js.map → chunk-6KPQDP7P.js.map} +1 -1
  46. package/dist/{chunk-LVRKJW53.js → chunk-6VRZ6M2L.js} +10 -3
  47. package/dist/chunk-6VRZ6M2L.js.map +1 -0
  48. package/dist/{chunk-5L55HNNA.js → chunk-7FZSABQV.js} +5 -5
  49. package/dist/{chunk-5L55HNNA.js.map → chunk-7FZSABQV.js.map} +1 -1
  50. package/dist/{chunk-FLGLODDF.js → chunk-7RC37XFW.js} +3 -3
  51. package/dist/{chunk-FLGLODDF.js.map → chunk-7RC37XFW.js.map} +1 -1
  52. package/dist/{chunk-3VUHHDZW.js → chunk-7UL2SQQH.js} +4 -4
  53. package/dist/{chunk-3VUHHDZW.js.map → chunk-7UL2SQQH.js.map} +1 -1
  54. package/dist/{chunk-GEEW6SY2.js → chunk-A5EDMBFG.js} +2 -2
  55. package/dist/{chunk-GEEW6SY2.js.map → chunk-A5EDMBFG.js.map} +1 -1
  56. package/dist/{chunk-QABZZROM.js → chunk-ARUJBGAH.js} +3 -3
  57. package/dist/{chunk-QABZZROM.js.map → chunk-ARUJBGAH.js.map} +1 -1
  58. package/dist/{chunk-TILISP6X.js → chunk-BQ3HXZNT.js} +2 -2
  59. package/dist/{chunk-TILISP6X.js.map → chunk-BQ3HXZNT.js.map} +1 -1
  60. package/dist/{chunk-NVNKPWL4.js → chunk-CACCIOQL.js} +12 -12
  61. package/dist/{chunk-NVNKPWL4.js.map → chunk-CACCIOQL.js.map} +1 -1
  62. package/dist/{chunk-5JAO4MXA.js → chunk-DOVURNRK.js} +3 -3
  63. package/dist/{chunk-5JAO4MXA.js.map → chunk-DOVURNRK.js.map} +1 -1
  64. package/dist/{chunk-P4VHQA4N.js → chunk-DSB6X25D.js} +3 -3
  65. package/dist/{chunk-P4VHQA4N.js.map → chunk-DSB6X25D.js.map} +1 -1
  66. package/dist/{chunk-ZWTCXL3H.js → chunk-DV47JNI4.js} +3 -3
  67. package/dist/{chunk-ZWTCXL3H.js.map → chunk-DV47JNI4.js.map} +1 -1
  68. package/dist/{chunk-Q7SIVPM2.js → chunk-EETXMMZS.js} +3 -3
  69. package/dist/{chunk-Q7SIVPM2.js.map → chunk-EETXMMZS.js.map} +1 -1
  70. package/dist/{chunk-OEBAXTQ4.js → chunk-EOKAFBJ7.js} +3 -3
  71. package/dist/{chunk-OEBAXTQ4.js.map → chunk-EOKAFBJ7.js.map} +1 -1
  72. package/dist/{chunk-6BEGKO2Q.js → chunk-HUNZYTOS.js} +4 -3
  73. package/dist/chunk-HUNZYTOS.js.map +1 -0
  74. package/dist/{chunk-YOIENZHA.js → chunk-HXG6IZSF.js} +6 -6
  75. package/dist/{chunk-YOIENZHA.js.map → chunk-HXG6IZSF.js.map} +1 -1
  76. package/dist/{chunk-L22WTIIC.js → chunk-ILAZDNIA.js} +3 -3
  77. package/dist/{chunk-L22WTIIC.js.map → chunk-ILAZDNIA.js.map} +1 -1
  78. package/dist/{chunk-FWZTKSYI.js → chunk-J5UF3OOS.js} +10 -10
  79. package/dist/{chunk-FWZTKSYI.js.map → chunk-J5UF3OOS.js.map} +1 -1
  80. package/dist/{chunk-QKXDRBLL.js → chunk-JEPSP6XK.js} +11 -80
  81. package/dist/chunk-JEPSP6XK.js.map +1 -0
  82. package/dist/{chunk-KIFJWSNC.js → chunk-KAJH3XPW.js} +7 -3
  83. package/dist/chunk-KAJH3XPW.js.map +1 -0
  84. package/dist/chunk-LOHQTTUV.js +29 -0
  85. package/dist/chunk-LOHQTTUV.js.map +1 -0
  86. package/dist/{chunk-MDBAEEY5.js → chunk-MQ42OYKH.js} +159 -7
  87. package/dist/chunk-MQ42OYKH.js.map +1 -0
  88. package/dist/{chunk-5JJ5KQUM.js → chunk-MS2JK4V7.js} +6 -6
  89. package/dist/{chunk-5JJ5KQUM.js.map → chunk-MS2JK4V7.js.map} +1 -1
  90. package/dist/{chunk-JRSLMZOT.js → chunk-OKGUDNDT.js} +37 -7
  91. package/dist/chunk-OKGUDNDT.js.map +1 -0
  92. package/dist/{chunk-DFZDL62S.js → chunk-OLMNDIAU.js} +14 -9
  93. package/dist/chunk-OLMNDIAU.js.map +1 -0
  94. package/dist/{chunk-3SUWLY3H.js → chunk-OQRB7JUS.js} +3 -3
  95. package/dist/{chunk-3SUWLY3H.js.map → chunk-OQRB7JUS.js.map} +1 -1
  96. package/dist/{chunk-TTITGVXV.js → chunk-PRCUGFXV.js} +3 -3
  97. package/dist/{chunk-TTITGVXV.js.map → chunk-PRCUGFXV.js.map} +1 -1
  98. package/dist/{chunk-MRS5YHPI.js → chunk-QBQITQAM.js} +3 -3
  99. package/dist/{chunk-MRS5YHPI.js.map → chunk-QBQITQAM.js.map} +1 -1
  100. package/dist/{chunk-PKGI5QG7.js → chunk-QWWDDU5Z.js} +274 -67
  101. package/dist/chunk-QWWDDU5Z.js.map +1 -0
  102. package/dist/{chunk-NKYNDLCB.js → chunk-R2U346ER.js} +3 -3
  103. package/dist/{chunk-NKYNDLCB.js.map → chunk-R2U346ER.js.map} +1 -1
  104. package/dist/{chunk-KVDXSEQH.js → chunk-R5ARWJGE.js} +104 -63
  105. package/dist/chunk-R5ARWJGE.js.map +1 -0
  106. package/dist/chunk-TLKM4M47.js +78 -0
  107. package/dist/chunk-TLKM4M47.js.map +1 -0
  108. package/dist/{chunk-NFECHLV6.js → chunk-TNWXGHLD.js} +3 -3
  109. package/dist/{chunk-NFECHLV6.js.map → chunk-TNWXGHLD.js.map} +1 -1
  110. package/dist/{chunk-H3KXUUYQ.js → chunk-VDBP6Y5M.js} +4 -4
  111. package/dist/{chunk-H3KXUUYQ.js.map → chunk-VDBP6Y5M.js.map} +1 -1
  112. package/dist/{chunk-XN7DAZB7.js → chunk-VJNTB4DN.js} +5 -5
  113. package/dist/chunk-VJNTB4DN.js.map +1 -0
  114. package/dist/{chunk-BSIHJZKN.js → chunk-XU7JET5Z.js} +107 -26
  115. package/dist/chunk-XU7JET5Z.js.map +1 -0
  116. package/dist/{chunk-LIS5KT2X.js → chunk-YCJ3PJNB.js} +5 -5
  117. package/dist/{chunk-LIS5KT2X.js.map → chunk-YCJ3PJNB.js.map} +1 -1
  118. package/dist/{chunk-VCLN2IUM.js → chunk-YCMZHL4T.js} +31 -27
  119. package/dist/chunk-YCMZHL4T.js.map +1 -0
  120. package/dist/{chunk-JS7DCCDA.js → chunk-YNUBJY3L.js} +4 -4
  121. package/dist/chunk-YNUBJY3L.js.map +1 -0
  122. package/dist/{chunk-S63H4HDH.js → chunk-YQEF36D5.js} +4 -4
  123. package/dist/{chunk-S63H4HDH.js.map → chunk-YQEF36D5.js.map} +1 -1
  124. package/dist/{chunk-FJYOQMXT.js → chunk-YV3YI3TA.js} +32 -16
  125. package/dist/chunk-YV3YI3TA.js.map +1 -0
  126. package/dist/cli/index.js +755 -533
  127. package/dist/cli/index.js.map +1 -1
  128. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  129. package/dist/cli/src/commands/asset-cmd.d.ts.map +1 -1
  130. package/dist/cli/src/commands/cache.d.ts.map +1 -1
  131. package/dist/cli/src/commands/catalog.d.ts +28 -3
  132. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  133. package/dist/cli/src/commands/complete-resolvers.d.ts +1 -7
  134. package/dist/cli/src/commands/complete-resolvers.d.ts.map +1 -1
  135. package/dist/cli/src/commands/complete.d.ts.map +1 -1
  136. package/dist/cli/src/commands/diff.d.ts +3 -1
  137. package/dist/cli/src/commands/diff.d.ts.map +1 -1
  138. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  139. package/dist/cli/src/commands/library-index.d.ts +8 -0
  140. package/dist/cli/src/commands/library-index.d.ts.map +1 -1
  141. package/dist/cli/src/commands/library-publish.d.ts +7 -2
  142. package/dist/cli/src/commands/library-publish.d.ts.map +1 -1
  143. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  144. package/dist/cli/src/commands/outdated.d.ts +12 -2
  145. package/dist/cli/src/commands/outdated.d.ts.map +1 -1
  146. package/dist/cli/src/commands/project.d.ts +2 -2
  147. package/dist/cli/src/commands/publish-core.d.ts +21 -0
  148. package/dist/cli/src/commands/publish-core.d.ts.map +1 -1
  149. package/dist/cli/src/commands/skailify-lib.d.ts +18 -1
  150. package/dist/cli/src/commands/skailify-lib.d.ts.map +1 -1
  151. package/dist/cli/src/commands/source-manifest-publish.d.ts.map +1 -1
  152. package/dist/cli/src/commands/store.d.ts.map +1 -1
  153. package/dist/cli/src/commands/update.d.ts.map +1 -1
  154. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  155. package/dist/cli/src/paths.d.ts +1 -1
  156. package/dist/cli/src/paths.d.ts.map +1 -1
  157. package/dist/cli/src/store-auth.d.ts.map +1 -1
  158. package/dist/connectors/config.js +6 -5
  159. package/dist/connectors/index.js +19 -18
  160. package/dist/connectors-shared/index.js +2 -2
  161. package/dist/core/index.js +8 -7
  162. package/dist/core/manifest.js +2 -2
  163. package/dist/core/models.js +1 -1
  164. package/dist/core/publish-manifest.js +2 -2
  165. package/dist/core/ref.js +1 -1
  166. package/dist/core/runtime-assets.js +6 -5
  167. package/dist/core/src/asset-roots.d.ts +2 -12
  168. package/dist/core/src/asset-roots.d.ts.map +1 -1
  169. package/dist/core/src/cache-paths.d.ts +7 -3
  170. package/dist/core/src/cache-paths.d.ts.map +1 -1
  171. package/dist/core/src/index.d.ts +3 -3
  172. package/dist/core/src/index.d.ts.map +1 -1
  173. package/dist/core/src/lock.d.ts +27 -4
  174. package/dist/core/src/lock.d.ts.map +1 -1
  175. package/dist/core/src/models.d.ts +26 -6
  176. package/dist/core/src/models.d.ts.map +1 -1
  177. package/dist/core/src/repo-manager.d.ts.map +1 -1
  178. package/dist/core/src/settings.d.ts +2 -1
  179. package/dist/core/src/settings.d.ts.map +1 -1
  180. package/dist/core/src/store.d.ts.map +1 -1
  181. package/dist/core/src/workspace-config.d.ts.map +1 -1
  182. package/dist/core/store.js +2 -1
  183. package/dist/core/workspace-config.js +5 -4
  184. package/dist/deploy/index.js +8 -7
  185. package/dist/deploy/index.js.map +1 -1
  186. package/dist/discovery/index.js +5 -5
  187. package/dist/discovery/src/domains.d.ts +6 -1
  188. package/dist/discovery/src/domains.d.ts.map +1 -1
  189. package/dist/discovery/src/index.d.ts +1 -1
  190. package/dist/discovery/src/index.d.ts.map +1 -1
  191. package/dist/{ensure-sources-SYZO2HNP.js → ensure-sources-VX63EKY7.js} +18 -17
  192. package/dist/ensure-sources-VX63EKY7.js.map +1 -0
  193. package/dist/factory-assets/connectors/box.js +19 -18
  194. package/dist/factory-assets/connectors/deploy.js +19 -18
  195. package/dist/factory-assets/connectors/devserver.js +19 -18
  196. package/dist/factory-assets/connectors/flow/adapter.js +19 -18
  197. package/dist/factory-assets/connectors/flow/engine.js +9 -8
  198. package/dist/factory-assets/connectors/flow/run-flow.js +21 -20
  199. package/dist/factory-assets/connectors/flow.js +19 -18
  200. package/dist/factory-assets/connectors/git.js +19 -18
  201. package/dist/factory-assets/connectors/gmail.js +19 -18
  202. package/dist/factory-assets/connectors/googledrive.js +19 -18
  203. package/dist/factory-assets/connectors/local.js +19 -18
  204. package/dist/factory-assets/connectors/mattermost.js +19 -18
  205. package/dist/factory-assets/connectors/memory.js +19 -18
  206. package/dist/factory-assets/connectors/minio.js +19 -18
  207. package/dist/factory-assets/connectors/postgres.js +19 -18
  208. package/dist/factory-assets/connectors/s3.js +19 -18
  209. package/dist/factory-assets/connectors/sharepoint.js +19 -18
  210. package/dist/factory-assets/connectors/sqlite.js +19 -18
  211. package/dist/factory-assets/connectors/static-server.js +19 -18
  212. package/dist/factory-assets/connectors/tunnel.js +19 -18
  213. package/dist/factory-assets/connectors/webdav.js +19 -18
  214. package/dist/factory-assets/connectors/xstate-store.js +19 -18
  215. package/dist/factory-assets/connectors/xstate.js +19 -18
  216. package/dist/flows-PX53XFV7.js +25 -0
  217. package/dist/{flows-6MDMBQUZ.js.map → flows-PX53XFV7.js.map} +1 -1
  218. package/dist/{helpers-IMUCDNME.js → helpers-DF55G2YC.js} +18 -17
  219. package/dist/{helpers-IMUCDNME.js.map → helpers-DF55G2YC.js.map} +1 -1
  220. package/dist/library/index.js +12 -11
  221. package/dist/library/install.js +2 -2
  222. package/dist/library/src/config.d.ts +11 -9
  223. package/dist/library/src/config.d.ts.map +1 -1
  224. package/dist/library/src/index.d.ts +2 -2
  225. package/dist/library/src/index.d.ts.map +1 -1
  226. package/dist/library/src/local/db.d.ts.map +1 -1
  227. package/dist/library/src/local/library-manager.d.ts +7 -0
  228. package/dist/library/src/local/library-manager.d.ts.map +1 -1
  229. package/dist/library/src/local/library.d.ts +5 -4
  230. package/dist/library/src/local/library.d.ts.map +1 -1
  231. package/dist/library/src/local/schema.d.ts +2 -0
  232. package/dist/library/src/local/schema.d.ts.map +1 -1
  233. package/dist/library/src/local/sidecar-paths.d.ts.map +1 -1
  234. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  235. package/dist/library/src/remote/cache.d.ts.map +1 -1
  236. package/dist/library/src/sync/git-driver.d.ts +34 -0
  237. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  238. package/dist/{library-publish-XAIAHKRL.js → library-publish-2PNWJJOY.js} +95 -41
  239. package/dist/library-publish-2PNWJJOY.js.map +1 -0
  240. package/dist/open-library-SUVOMIWZ.js +38 -0
  241. package/dist/{open-library-6N3XZ2XL.js.map → open-library-SUVOMIWZ.js.map} +1 -1
  242. package/dist/paths-W4LDORQQ.js +21 -0
  243. package/dist/{paths-4MTICP3T.js.map → paths-W4LDORQQ.js.map} +1 -1
  244. package/dist/{plugin-store-GQ4WQZJ2.js → plugin-store-D45CREMJ.js} +10 -9
  245. package/dist/plugin-store-D45CREMJ.js.map +1 -0
  246. package/dist/project-RTLVOXUU.js +34 -0
  247. package/dist/{project-HESTMGPU.js.map → project-RTLVOXUU.js.map} +1 -1
  248. package/dist/resolver/index.js +9 -8
  249. package/dist/runner/index.js +28 -27
  250. package/dist/runner/src/composition/bootstrap.d.ts +1 -1
  251. package/dist/runner/src/composition/bootstrap.d.ts.map +1 -1
  252. package/dist/runner/src/prompt-turn-queue.d.ts +27 -4
  253. package/dist/runner/src/prompt-turn-queue.d.ts.map +1 -1
  254. package/dist/runner/src/runtime-session-emit.d.ts +2 -1
  255. package/dist/runner/src/runtime-session-emit.d.ts.map +1 -1
  256. package/dist/runner/src/serve.d.ts.map +1 -1
  257. package/dist/sdk/asset-manager.js +15 -14
  258. package/dist/sdk/bridge.js +15 -14
  259. package/dist/sdk/core.js +8 -7
  260. package/dist/sdk/flow.js +9 -8
  261. package/dist/sdk/index.js +28 -27
  262. package/dist/sdk/index.js.map +1 -1
  263. package/dist/sdk/resolver.js +9 -8
  264. package/dist/sdk/runner.js +28 -27
  265. package/dist/sdk/session.js +2 -2
  266. package/dist/sdk/store.js +1 -1
  267. package/dist/sdk/types.js +1 -1
  268. package/dist/secrets/index.js +18 -1
  269. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  270. package/dist/session/index.js +2 -2
  271. package/dist/session/src/dispatcher.d.ts.map +1 -1
  272. package/dist/{setup-PQG5DH5Z.js → setup-ZA7VZL72.js} +25 -24
  273. package/dist/setup-ZA7VZL72.js.map +1 -0
  274. package/dist/skills-R3RPIPWP.js +25 -0
  275. package/dist/{skills-JHUY4DFE.js.map → skills-R3RPIPWP.js.map} +1 -1
  276. package/dist/{source-PNYNVVPM.js → source-Y5YQ7M53.js} +21 -20
  277. package/dist/{source-PNYNVVPM.js.map → source-Y5YQ7M53.js.map} +1 -1
  278. package/dist/{source-manifest-publish-6O6H4T2P.js → source-manifest-publish-RZIJNRIW.js} +24 -25
  279. package/dist/source-manifest-publish-RZIJNRIW.js.map +1 -0
  280. package/dist/store/index.js +1 -1
  281. package/dist/store/src/store.d.ts +9 -0
  282. package/dist/store/src/store.d.ts.map +1 -1
  283. package/dist/store/src/types.d.ts +17 -0
  284. package/dist/store/src/types.d.ts.map +1 -1
  285. package/dist/tui/index.js +28 -27
  286. package/dist/tui/index.js.map +1 -1
  287. package/dist/types/index.js +1 -1
  288. package/dist/types/manifests.js +1 -1
  289. package/dist/types/src/events.d.ts +28 -3
  290. package/dist/types/src/events.d.ts.map +1 -1
  291. package/dist/types/src/index.d.ts +1 -1
  292. package/dist/types/src/index.d.ts.map +1 -1
  293. package/dist/types/src/manifests/index.d.ts +1 -1
  294. package/dist/types/src/manifests/index.d.ts.map +1 -1
  295. package/dist/types/src/manifests/skill.d.ts +10 -0
  296. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  297. package/dist/types/src/protocol.d.ts +2 -0
  298. package/dist/types/src/protocol.d.ts.map +1 -1
  299. package/dist/types/src/version.d.ts +12 -1
  300. package/dist/types/src/version.d.ts.map +1 -1
  301. package/dist/workspace-plugin/adapters/mcp.js +15 -14
  302. package/dist/workspace-plugin/adapters/omp.js +7 -7
  303. package/dist/workspace-plugin/index.js +1 -1
  304. package/package.json +1 -1
  305. package/dist/asset-feeds-SJELMLNK.js.map +0 -1
  306. package/dist/chunk-2D3C4AJP.js.map +0 -1
  307. package/dist/chunk-422WJ2QC.js +0 -158
  308. package/dist/chunk-422WJ2QC.js.map +0 -1
  309. package/dist/chunk-6BEGKO2Q.js.map +0 -1
  310. package/dist/chunk-BSIHJZKN.js.map +0 -1
  311. package/dist/chunk-DFZDL62S.js.map +0 -1
  312. package/dist/chunk-FJYOQMXT.js.map +0 -1
  313. package/dist/chunk-JRSLMZOT.js.map +0 -1
  314. package/dist/chunk-JS7DCCDA.js.map +0 -1
  315. package/dist/chunk-KIFJWSNC.js.map +0 -1
  316. package/dist/chunk-KVDXSEQH.js.map +0 -1
  317. package/dist/chunk-LVRKJW53.js.map +0 -1
  318. package/dist/chunk-MDBAEEY5.js.map +0 -1
  319. package/dist/chunk-PKGI5QG7.js.map +0 -1
  320. package/dist/chunk-QKXDRBLL.js.map +0 -1
  321. package/dist/chunk-VCLN2IUM.js.map +0 -1
  322. package/dist/chunk-XN7DAZB7.js.map +0 -1
  323. package/dist/ensure-sources-SYZO2HNP.js.map +0 -1
  324. package/dist/flows-6MDMBQUZ.js +0 -24
  325. package/dist/library-publish-XAIAHKRL.js.map +0 -1
  326. package/dist/open-library-6N3XZ2XL.js +0 -37
  327. package/dist/paths-4MTICP3T.js +0 -20
  328. package/dist/plugin-store-GQ4WQZJ2.js.map +0 -1
  329. package/dist/project-HESTMGPU.js +0 -33
  330. package/dist/setup-PQG5DH5Z.js.map +0 -1
  331. package/dist/skills-JHUY4DFE.js +0 -24
  332. package/dist/source-manifest-publish-6O6H4T2P.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../core/src/asset-roots.ts","../core/src/lock.ts","../core/src/manifest-yaml-editor.ts","../core/src/conformance.ts","../core/src/patch.ts","../core/src/provider-registry-files.ts","../core/src/settings.ts","../core/src/workspace-yaml-editor.ts"],"names":["existsSync","join","path","readFileSync","writeFileSync","dirname","parse","mkdirSync","stringify","SKAILE_DIR","parseDocument","Document","isMap","isSeq"],"mappings":"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","file":"chunk-FJYOQMXT.js","sourcesContent":["/**\n * asset-roots.ts — the single definition of *where* skaile-owned content lives.\n *\n * The policy sits in `core/` rather than next to either of its callers because\n * both layers that need it already depend on `core/`: the CLI's discovery\n * surfaces (`flow list`, completions, skill walking) and the flow connector's\n * resolution surfaces under `factory-assets/` (`resume`, sub-flow targets,\n * `serve`). Keeping it in `cli/` instead would force a `factory-assets → cli`\n * import, which is a real module cycle — and duplicating it there is exactly\n * how the two lists drifted apart in the first place.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { SUPPORTED_DRIVER_TARGETS } from \"./driver-targets.js\";\nimport { factoryAssetRoots } from \"./runtime-assets.js\";\nimport { deployedBase } from \"./store.js\";\n\n/**\n * Root of the per-user skaile data directory (`~/.skaile`).\n *\n * Deliberately **not** routed through `globalSkaileDir()`: that one honours\n * `$SKAILE_HOME`, this one is the fixed home-relative path the library, index\n * and config layers have always written to. Reconciling the two would move\n * users' data, so it is a behaviour change rather than a cleanup.\n *\n * @docLink packages/core/concepts#discovery\n */\nexport function skaileHomeDir(): string {\n return join(homedir(), \".skaile\");\n}\n\n/**\n * The library checkouts directory before any environment override — the value\n * `getConfigDefaults()` reports as the *default*, which must stay independent of\n * `SKAILE_LIBRARIES_DIR` so a config file can still be seen to override it.\n * Callers that want the effective directory want {@link resolveLibraryDir}.\n *\n * @docLink packages/core/concepts#discovery\n */\nexport function defaultLibraryDir(): string {\n return join(skaileHomeDir(), \"libraries\");\n}\n\n/**\n * Resolve the active library checkouts directory.\n *\n * `SKAILE_LIBRARIES_DIR` overrides the default `~/.skaile/libraries`.\n *\n * @docLink packages/core/concepts#discovery\n */\nexport function resolveLibraryDir(): string {\n if (process.env.SKAILE_LIBRARIES_DIR) return process.env.SKAILE_LIBRARIES_DIR;\n return defaultLibraryDir();\n}\n\n/**\n * The skaile-owned install roots for one scope — the parent of the directory\n * `skaile install` / `skaile add` deploy flows into.\n *\n * Derived through `deployedBase`, the same function the installer calls, so\n * discovery cannot drift from where the bytes land. Every driver target maps\n * `flow` to the same `.skaile/flows`, so the three results collapse in the\n * caller's `Set`.\n */\nfunction installRoots(globalInstall: boolean, projectDir: string): string[] {\n return SUPPORTED_DRIVER_TARGETS.map((target) =>\n dirname(deployedBase(\"flow\", target, globalInstall, projectDir)),\n );\n}\n\n/**\n * All content roots that skill / flow discovery should walk, in priority order,\n * filtered to those that exist on disk and de-duplicated.\n *\n * Four layers, in this order:\n * 1. The project-local install root `<projectDir>/.skaile/`, where\n * `skaile install` / `skaile add` deploy flows.\n * 2. The first-party `factory-assets/` roots from the shared `factoryAssetRoots()`\n * helper — the `SKAILE_FACTORY_ASSETS_DIR` override layer (when set) ahead of\n * the bundled tree (in-repo source in dev, `dist/factory-assets/` after\n * install). No monorepo special-case.\n * 3. The user-library dir `~/.skaile/libraries/`.\n * 4. The user-global install root `~/.skaile/`.\n *\n * Order is significant: `findSkills` / flow discovery dedupe first-root-wins, so\n * the env override shadows the bundled tree on a name clash. The project-local\n * install root leads because `deployAll` applies `patches:` to the deployed copy\n * — that copy, not the factory original, is the project's effective flow.\n *\n * Only `flow` installs into skaile's own `.skaile/` tree; every other asset kind\n * installs into the driver's directory (`.claude/`, `.omp/`, `.codex/`), which\n * the driver reads natively and skaile deliberately does not enumerate. So the\n * roots below are exactly the skaile-owned ones — an invariant asserted by\n * `cli/tests/installed-asset-roots.test.ts`.\n *\n * This is the discovery surface used by `findSkills`, flow discovery, and the\n * completion resolvers; flow *resolution* walks these same roots behind\n * `flowLookupRoots`, which only prepends the project's own `ai-assets/` tree.\n *\n * @param projectDir - Project directory whose local install root to include\n * (default: `process.cwd()`).\n * @docLink packages/core/concepts#discovery\n */\nexport function aiResourceRoots(projectDir: string = process.cwd()): string[] {\n const roots: string[] = [\n ...installRoots(false, projectDir),\n ...factoryAssetRoots(),\n // resolveLibraryDir honors SKAILE_LIBRARIES_DIR (the authoring side does too),\n // so a custom-dir library is visible to discovery instead of being missed.\n resolveLibraryDir(),\n ...installRoots(true, projectDir),\n ];\n return [...new Set(roots)].filter((r) => existsSync(r));\n}\n","/**\n * Lock file I/O and integrity verification (schema v3).\n *\n * The lock file (skaile.lock.yaml) captures the complete resolved state: every\n * asset keyed by its canonical ref `<kind>:@<publisher>/<name>#<version>`, the\n * upstream source + commit it resolved from, a per-file + composite content\n * hash for drift detection, and whether an `overrides[]` entry pinned it. A\n * top-level `sources:` block records every contributing source URL at its\n * resolved commit.\n *\n * Old v1 lockfiles (`lockfile_version: 1`, `repositories:`) are rejected with a\n * clear regenerate-from-scratch error.\n */\n\nimport { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport type { LockEntry, LockFile, LockPluginEntry, LockSourceEntry } from \"./models.js\";\nimport type { ProvenanceCandidate } from \"./walker.js\";\n\n// ── Lock file I/O ────────────────────────────────────────────────────────────\n\n/**\n * Serialize a `LockFile` to YAML and write it to disk.\n *\n * @param lockPath - Absolute path to write the lock file (e.g. `skaile.lock.yaml`)\n * @param data - Lock file data to serialize\n * @docLink packages/core/api-reference#write-lock\n */\nexport function writeLock(lockPath: string, data: LockFile): void {\n writeFileSync(lockPath, stringify(data, { lineWidth: 120 }));\n}\n\n/**\n * Read and parse a lock file from disk.\n *\n * @param lockPath - Absolute path to the lock file\n * @returns Parsed `LockFile`, or `null` if the file is missing or unparseable\n * @throws When the file is a legacy v1 lock — the shape changed and it must be regenerated.\n * @docLink packages/core/api-reference#read-lock\n */\nexport function readLock(lockPath: string): LockFile | null {\n if (!existsSync(lockPath)) return null;\n let raw: unknown;\n try {\n raw = parse(readFileSync(lockPath, \"utf8\"));\n } catch {\n return null;\n }\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n if (r.schema_version !== 3) {\n throw new Error(\n \"outdated lockfile schema detected — the lockfile shape changed. \" +\n \"Regenerate: `rm skaile.lock.yaml && skaile install`.\",\n );\n }\n return r as unknown as LockFile;\n}\n\n// ── Hashing ──────────────────────────────────────────────────────────────────\n\n/**\n * Compute the SHA-256 hash of a file's content (hex digest, no prefix).\n *\n * @param filePath - Absolute path to the file\n * @returns Hex-encoded SHA-256 hash string\n * @docLink packages/core/api-reference#compute-hash\n */\nexport function computeHash(filePath: string): string {\n const content = readFileSync(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\n/**\n * Composite hash: SHA-256 (bare 64-hex) over `localeCompare`-sorted\n * `<path>:<sha256>\\n` rows. Matches the walker's `compositeSha256`, the store's\n * `computeCompositeSha256`, and the `InstallManifest.sha256` rollup.\n */\nfunction compositeHash(files: Array<{ path: string; sha256: string }>): string {\n const lines = files\n .slice()\n .sort((a, b) => a.path.localeCompare(b.path))\n .map((f) => `${f.path}:${f.sha256}\\n`)\n .join(\"\");\n return createHash(\"sha256\").update(lines).digest(\"hex\");\n}\n\n// ── Lock file construction ───────────────────────────────────────────────────\n\n/**\n * Build a v3 `LockFile` from the resolver's output.\n *\n * Assets are keyed by canonical ref `<kind>:@<publisher>/<name>#<version>`; the\n * top-level `sources:` block lists every contributing source URL pinned to its\n * resolved commit.\n *\n * @param resolved - Resolved provenance candidates (the resolver's `resolved` array).\n * @param overridesApplied - Canonical refs that an `overrides[]` entry pinned.\n * @returns Complete v2 `LockFile` ready for serialization.\n * @docLink packages/core/api-reference#build-lock-file\n */\nexport function buildLockFile(\n resolved: ProvenanceCandidate[],\n overridesApplied: Set<string>,\n): LockFile {\n const assets: Record<string, LockEntry> = {};\n const sourceMap = new Map<string, LockSourceEntry>();\n\n for (const c of resolved) {\n const canonicalRef = `${c.kind}:@${c.publisher}/${c.name}#${c.version}`;\n assets[canonicalRef] = {\n sha256: c.sha256,\n source: { url: c.sourceUrl, commit: c.commit },\n files: c.files,\n override_applied: overridesApplied.has(canonicalRef),\n };\n if (!sourceMap.has(c.sourceUrl)) {\n sourceMap.set(c.sourceUrl, { url: c.sourceUrl, commit: c.commit });\n }\n }\n\n return {\n schema_version: 3,\n locked_at: new Date().toISOString(),\n assets,\n sources: Array.from(sourceMap.values()).sort((a, b) => a.url.localeCompare(b.url)),\n };\n}\n\n// ── Plugins slice ────────────────────────────────────────────────────────────\n\n/** Absolute path to a project's lock file. */\nfunction lockPathFor(projectDir: string): string {\n return join(projectDir, \"skaile.lock.yaml\");\n}\n\n/**\n * Read the `plugins` slice from a project's `skaile.lock.yaml`.\n *\n * Total — never throws on a missing/unparseable/legacy lock file (returns\n * `undefined`). The plugin-store reconciler folds this into its reconcile-hash\n * so a lock edit invalidates the hash even without a manifest change.\n *\n * @param projectDir - Project root containing `skaile.lock.yaml`\n * @returns The `plugins` record, or `undefined` when absent\n */\nexport function readPluginsLockSlice(\n projectDir: string,\n): Record<string, LockPluginEntry> | undefined {\n try {\n return readLock(lockPathFor(projectDir))?.plugins;\n } catch {\n // Legacy v1 lock — no usable plugins slice.\n return undefined;\n }\n}\n\n/**\n * Merge a `plugins` slice into a project's `skaile.lock.yaml`, preserving all\n * other fields. Creates a minimal v3 lock file when none exists (or the\n * existing one is an outdated schema that can't be read).\n *\n * @param projectDir - Project root containing `skaile.lock.yaml`\n * @param slice - The `plugins` record to persist\n */\nexport function writePluginsLockSlice(\n projectDir: string,\n slice: Record<string, LockPluginEntry>,\n): void {\n const lockPath = lockPathFor(projectDir);\n let existing: LockFile | null = null;\n try {\n existing = readLock(lockPath);\n } catch {\n existing = null; // outdated schema — overwrite with a fresh v3 shell\n }\n const next: LockFile = existing ?? {\n schema_version: 3,\n locked_at: new Date().toISOString(),\n assets: {},\n sources: [],\n };\n next.plugins = slice;\n writeLock(lockPath, next);\n}\n\n// ── Verification ─────────────────────────────────────────────────────────────\n\n/**\n * Result of verifying a lock file against the current repository state.\n * @docLink packages/core/api-reference#verify-result\n */\nexport interface VerifyResult {\n /** `true` when no drift or missing assets were found. */\n ok: boolean;\n /** Canonical refs whose content hash no longer matches. */\n drifted: string[];\n /** Canonical refs whose files cannot be found on disk. */\n missing: string[];\n}\n\n/**\n * Verify a v2 lock file against the current on-disk source clones.\n *\n * For each locked asset, resolve its source clone directory via `resolveCloneDir`\n * (URL → on-disk path), re-hash the recorded files, and compare the recomputed\n * composite against the locked `sha256`. Reports assets whose hash changed\n * (`drifted`) and assets whose files are missing (`missing`).\n *\n * @param lock - Previously generated v2 `LockFile`.\n * @param resolveCloneDir - Maps a source URL to its on-disk clone root (or null).\n * @returns `VerifyResult` indicating drift and missing assets.\n * @docLink packages/core/api-reference#verify-lock\n */\nexport function verifyLock(\n lock: LockFile,\n resolveCloneDir: (sourceUrl: string) => string | null,\n): VerifyResult {\n const drifted: string[] = [];\n const missing: string[] = [];\n\n for (const [ref, entry] of Object.entries(lock.assets)) {\n const cloneDir = resolveCloneDir(entry.source.url);\n if (!cloneDir) {\n missing.push(ref);\n continue;\n }\n let allPresent = true;\n const recomputed: Array<{ path: string; sha256: string }> = [];\n for (const f of entry.files) {\n const abs = join(cloneDir, f.path);\n if (!existsSync(abs)) {\n allPresent = false;\n break;\n }\n recomputed.push({ path: f.path, sha256: computeHash(abs) });\n }\n if (!allPresent) {\n missing.push(ref);\n continue;\n }\n if (compositeHash(recomputed) !== entry.sha256) {\n drifted.push(ref);\n }\n }\n\n return { ok: drifted.length === 0 && missing.length === 0, drifted, missing };\n}\n","/**\n * Comment-preserving editor for `skaile.manifest.yaml` files.\n *\n * The publication counterpart to {@link WorkspaceYamlEditor}: it owns the\n * `publisher` / `version` / `assets[]` accessors that used to sit on the\n * workspace editor before the 2026-06-03 manifest/workspace file split. Uses the\n * `yaml` library's Document AST so untouched sections stay byte-identical.\n *\n * Usage:\n *\n * import { ManifestYamlEditor } from '@skaile/workspaces/core'\n *\n * const editor = ManifestYamlEditor.load('/project/skaile.manifest.yaml')\n * editor.setPublisher('skaile-ai')\n * editor.setAsset({ kind: 'skill', name: 'audit', root: 'skills/audit' })\n * editor.save()\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { Document, isMap, isSeq, parseDocument, type YAMLMap } from \"yaml\";\nimport type { AssetEntry } from \"./publish-manifest.js\";\n\n/**\n * Comment-preserving editor for `skaile.manifest.yaml` files.\n * Create with `ManifestYamlEditor.load(filePath)` or `ManifestYamlEditor.create(filePath)`.\n * @docLink packages/core/publish-manifest#manifest-yaml-editor\n */\nexport class ManifestYamlEditor {\n readonly path: string;\n private doc: Document;\n\n private constructor(path: string, doc: Document) {\n this.path = path;\n this.doc = doc;\n }\n\n /** Load an existing skaile.manifest.yaml file. */\n static load(filePath: string): ManifestYamlEditor {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n const raw = readFileSync(filePath, \"utf-8\");\n return new ManifestYamlEditor(filePath, parseDocument(raw));\n }\n\n /** Create a new empty document (for use when no file exists yet). */\n static create(filePath: string): ManifestYamlEditor {\n return new ManifestYamlEditor(filePath, new Document({}));\n }\n\n /** Write the document back to disk, preserving comments and formatting. */\n save(): void {\n writeFileSync(this.path, this.doc.toString());\n }\n\n /** Return the serialized YAML string without writing to disk. */\n toString(): string {\n return this.doc.toString();\n }\n\n // ── Publisher / version / repo-level defaults ───────────────────────────────\n\n /** Get the `publisher:` field. */\n getPublisher(): string | undefined {\n const v = this.doc.get(\"publisher\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the `publisher:` field. */\n setPublisher(p: string): void {\n this.doc.set(\"publisher\", p);\n }\n\n /** Get the `version:` field. */\n getVersion(): string | undefined {\n const v = this.doc.get(\"version\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the `version:` field. */\n setVersion(v: string): void {\n this.doc.set(\"version\", v);\n }\n\n /** Get the repo-level `license:` default. */\n getLicense(): string | undefined {\n const v = this.doc.get(\"license\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the repo-level `license:` default. */\n setLicense(v: string): void {\n this.doc.set(\"license\", v);\n }\n\n /** Get the repo-level `homepage:` default. */\n getHomepage(): string | undefined {\n const v = this.doc.get(\"homepage\");\n return v != null ? String(v) : undefined;\n }\n\n /** Set the repo-level `homepage:` default. */\n setHomepage(v: string): void {\n this.doc.set(\"homepage\", v);\n }\n\n // ── Assets ──────────────────────────────────────────────────────────────────\n\n /** Get all `assets:` entries. */\n getAssets(): AssetEntry[] {\n const node = this.doc.get(\"assets\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as AssetEntry[];\n }\n\n /** Add or update an asset entry, matched by `kind` + `name`. */\n setAsset(entry: AssetEntry): void {\n const node = this.doc.get(\"assets\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"assets\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (\n isMap(item) &&\n (item as YAMLMap).get(\"kind\") === entry.kind &&\n (item as YAMLMap).get(\"name\") === entry.name\n ) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) node.add(this.doc.createNode(entry));\n }\n\n /** Remove an asset entry by kind + name. Returns true when removed. */\n removeAsset(kind: string, name: string): boolean {\n const node = this.doc.get(\"assets\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (\n isMap(item) &&\n (item as YAMLMap).get(\"kind\") === kind &&\n (item as YAMLMap).get(\"name\") === name\n ) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Raw access (escape hatch) ─────────────────────────────────────────────\n\n /** Get the underlying yaml Document for advanced manipulation. */\n get document(): Document {\n return this.doc;\n }\n}\n","/**\n * Agent Skills (agentskills.io) open-standard conformance lint for SKILL.md\n * frontmatter — pure, advisory, never a hard gate.\n * See devlog: 2026-06-21-agentskills-conformance-shipped.\n * @docLink core/conformance\n */\n\n/** A single agentskills.io conformance finding. */\nexport interface ConformanceFinding {\n /** `error` = hard standard violation; `warn` = portability risk. */\n level: \"error\" | \"warn\";\n /** Frontmatter field the finding concerns (e.g. \"name\", \"metadata.tags\"). */\n field: string;\n /** Human-readable, ready to print after a file path. */\n message: string;\n}\n\n/** Options for {@link checkAgentSkillConformance}. */\nexport interface ConformanceOptions {\n /**\n * Parent directory name, for the standard's `name === <dir>` rule.\n * Omit to skip that check (e.g. when validating a detached frontmatter blob).\n */\n dirName?: string;\n}\n\n// Standard limits — see https://agentskills.io/specification.\nconst NAME_MAX = 64;\nconst DESCRIPTION_MAX = 1024;\nconst COMPATIBILITY_MAX = 500;\n\n/**\n * Check a SKILL.md frontmatter object against the Agent Skills open standard.\n * Returns findings only — the caller maps severity to exit codes.\n *\n * @param frontmatter Parsed SKILL.md YAML frontmatter.\n * @param opts Optional context (`dirName` enables the name==dir rule).\n * @returns Zero or more {@link ConformanceFinding}s.\n */\nexport function checkAgentSkillConformance(\n frontmatter: Record<string, unknown>,\n opts: ConformanceOptions = {},\n): ConformanceFinding[] {\n const out: ConformanceFinding[] = [];\n const name = frontmatter.name;\n\n if (typeof name === \"string\") {\n if (name.length > NAME_MAX) {\n out.push({\n level: \"error\",\n field: \"name\",\n message: `name is ${name.length} chars (standard max ${NAME_MAX})`,\n });\n }\n if (opts.dirName !== undefined && name !== opts.dirName) {\n out.push({\n level: \"warn\",\n field: \"name\",\n message: `name \"${name}\" does not match parent directory \"${opts.dirName}\" (standard requires equality)`,\n });\n }\n }\n\n const description = frontmatter.description;\n if (typeof description === \"string\" && description.length > DESCRIPTION_MAX) {\n out.push({\n level: \"error\",\n field: \"description\",\n message: `description is ${description.length} chars (standard max ${DESCRIPTION_MAX})`,\n });\n }\n\n const compatibility = frontmatter.compatibility;\n if (typeof compatibility === \"string\" && compatibility.length > COMPATIBILITY_MAX) {\n out.push({\n level: \"error\",\n field: \"compatibility\",\n message: `compatibility is ${compatibility.length} chars (standard max ${COMPATIBILITY_MAX})`,\n });\n }\n\n // The standard defines metadata as a string→string map. skaile nests objects\n // here by design — report as a portability WARN, never an error, never rewrite.\n const metadata = frontmatter.metadata;\n if (metadata !== undefined && typeof metadata === \"object\" && metadata !== null) {\n for (const [k, v] of Object.entries(metadata as Record<string, unknown>)) {\n if (typeof v !== \"string\") {\n out.push({\n level: \"warn\",\n field: `metadata.${k}`,\n message: `metadata.${k} is ${Array.isArray(v) ? \"an array\" : typeof v}, not a string — non-portable to strict skills-ref consumers`,\n });\n }\n }\n }\n\n const allowedTools = frontmatter[\"allowed-tools\"];\n if (allowedTools !== undefined && typeof allowedTools !== \"string\") {\n out.push({\n level: \"warn\",\n field: \"allowed-tools\",\n message: \"allowed-tools must be a space-separated string\",\n });\n }\n\n return out;\n}\n","/**\n * Patch operations — extract, generate, apply patches for skill improvement.\n *\n * Patches allow editing deployed assets from remote repos and contributing\n * changes back upstream via PR.\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { cpSync, existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { CatalogEntry } from \"./models.js\";\n\n/**\n * Copy an asset's source directory into a patch working directory for editing.\n *\n * @param entry - The catalog entry to extract\n * @param patchDir - Base directory where extracted copies are placed\n * @returns Absolute path to the extracted copy (`<patchDir>/<kind>-<name>`)\n * @docLink packages/core/api-reference#extract-for-patch\n */\nexport function extractForPatch(entry: CatalogEntry, patchDir: string): string {\n const ref = `${entry.kind}-${entry.name}`;\n const dest = join(patchDir, ref);\n mkdirSync(dest, { recursive: true });\n\n // Copy the asset's source directory (or file) to the patch dir\n const sourceDir = dirname(entry.source);\n const sourceName = basename(entry.source);\n\n // If source is a file in a directory (e.g., skills/overview/SKILL.md), copy the whole dir\n if (existsSync(sourceDir)) {\n cpSync(sourceDir, dest, { recursive: true });\n }\n\n return dest;\n}\n\n/**\n * Generate a unified diff between an original and patched directory using `diff -ruN`.\n *\n * @param originalDir - Unmodified copy of the asset directory\n * @param patchedDir - Modified copy of the asset directory\n * @returns Patch content string, or `null` if there are no differences (or on error)\n * @docLink packages/core/api-reference#generate-patch\n */\nexport function generatePatch(originalDir: string, patchedDir: string): string | null {\n const r = spawnSync(\"diff\", [\"-ruN\", originalDir, patchedDir], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // diff returns 0 if no differences, 1 if differences, 2 on error\n if (r.status === 0) return null; // no differences\n if (r.status === 1) return r.stdout;\n return null; // error\n}\n\n/**\n * Apply a unified diff patch file to a directory using `patch -p1`.\n *\n * @param targetDir - Directory to apply the patch to\n * @param patchFile - Path to the `.patch` file\n * @returns `true` on success, `false` if the patch file is missing or the command fails\n * @docLink packages/core/api-reference#apply-patch\n */\nexport function applyPatch(targetDir: string, patchFile: string): boolean {\n if (!existsSync(patchFile)) return false;\n const r = spawnSync(\"patch\", [\"-p1\", \"-d\", targetDir, \"-i\", patchFile], {\n stdio: \"pipe\",\n });\n return r.status === 0;\n}\n\n/**\n * Return the paths of all `.patch` files in a directory.\n *\n * @param patchDir - Directory to scan for `.patch` files\n * @returns Array of absolute paths; empty array when `patchDir` does not exist\n * @docLink packages/core/api-reference#list-patches\n */\nexport function listPatches(patchDir: string): string[] {\n if (!existsSync(patchDir)) return [];\n return readdirSync(patchDir)\n .filter((f) => f.endsWith(\".patch\"))\n .map((f) => join(patchDir, f));\n}\n\n/**\n * Write patch content to a file, creating parent directories as needed.\n *\n * @param patchPath - Destination file path (including `.patch` extension)\n * @param content - Unified diff content to write\n * @docLink packages/core/api-reference#save-patch\n */\nexport function savePatch(patchPath: string, content: string): void {\n mkdirSync(dirname(patchPath), { recursive: true });\n writeFileSync(patchPath, content, \"utf8\");\n}\n\n/**\n * Read the content of a patch file.\n *\n * @param patchPath - Path to the `.patch` file\n * @returns File content as a string, or `null` if the file does not exist\n * @docLink packages/core/api-reference#read-patch\n */\nexport function readPatch(patchPath: string): string | null {\n if (!existsSync(patchPath)) return null;\n return readFileSync(patchPath, \"utf8\");\n}\n","/**\n * Reading and writing `providers.yml` — the two on-disk layers of the AI\n * provider registry (§1.5).\n *\n * `~/.skaile/providers.yml` is the default home for endpoint definitions;\n * `<workspace>/.skaile/providers.yml` overrides it per project and is\n * gitignored by `skaile init`. Higher layers (CLI/runtime overrides and the\n * control-plane session layer) never touch disk — callers pass them to\n * {@link loadProviderRegistry} as extra layers.\n *\n * @see PROVIDER-CONFIG-PLAN.md §1.5, §2.1\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport { globalSkaileDir } from \"./cache-paths.js\";\nimport {\n type AIProviderDiagnostic,\n type AIProviderRegistryDocument,\n type AIProviderRegistryLayer,\n type AIProviderRegistryPatch,\n type AIProviderRegistrySource,\n type MergedAIProviderRegistry,\n mergeRegistries,\n validateMergedRegistry,\n validateRegistry,\n} from \"./provider-registry.js\";\n\n/** The registry filename in both layers. */\nexport const PROVIDERS_FILENAME = \"providers.yml\";\n\nconst SKAILE_DIR = \".skaile\";\n\n/** `~/.skaile/providers.yml` — honours `$SKAILE_HOME`. */\nexport function userProviderRegistryPath(): string {\n return join(globalSkaileDir(), PROVIDERS_FILENAME);\n}\n\n/** `<projectDir>/.skaile/providers.yml`. */\nexport function workspaceProviderRegistryPath(projectDir: string): string {\n return join(resolve(projectDir), SKAILE_DIR, PROVIDERS_FILENAME);\n}\n\n/** One loaded registry file. */\nexport interface ProviderRegistryFile {\n /** Layer the file feeds. */\n layer: \"user\" | \"workspace\";\n path: string;\n exists: boolean;\n /**\n * The layer this file contributes. Entries may be partial: a file that names\n * `base_url` alone overrides that one field (§1.5). Empty when the file is\n * absent or every entry was malformed.\n */\n document: AIProviderRegistryDocument;\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Read one registry file as **one layer** of the §1.5 stack. A missing file is\n * not an error — it is an empty layer. A malformed one yields diagnostics,\n * never an exception.\n *\n * Only the checks that stand on their own run here (types, URLs, the\n * credential grammar, literal secrets); whether an entry is *complete* is\n * decided on the merged registry by {@link loadProviderRegistry}, because the\n * layer below may be the one that names its `kind`.\n */\nexport function loadProviderRegistryFile(\n filePath: string,\n layer: \"user\" | \"workspace\",\n): ProviderRegistryFile {\n const empty: AIProviderRegistryDocument = { version: 1, providers: {} };\n if (!existsSync(filePath)) {\n return { layer, path: filePath, exists: false, document: empty, diagnostics: [] };\n }\n let raw: unknown;\n try {\n raw = parse(readFileSync(filePath, \"utf-8\"));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n layer,\n path: filePath,\n exists: true,\n document: empty,\n diagnostics: [\n {\n code: \"yaml_parse_error\",\n severity: \"error\",\n path: \"\",\n message: `${filePath}: ${message}`,\n },\n ],\n };\n }\n const { document, diagnostics } = validateRegistry(raw, { source: filePath, layer });\n return { layer, path: filePath, exists: true, document, diagnostics };\n}\n\n/**\n * Write a registry document, creating `.skaile/` when needed.\n *\n * The document is serialized verbatim: the file holds references, never\n * secrets, so there is nothing to redact — and {@link validateRegistry} is the\n * gate that keeps it that way. Callers validate before writing.\n *\n * @returns the path written.\n */\nexport function saveProviderRegistryFile(\n filePath: string,\n document: AIProviderRegistryDocument,\n): string {\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, stringify({ version: 1, providers: document.providers }));\n return filePath;\n}\n\n/** Options for {@link loadProviderRegistry}. */\nexport interface LoadProviderRegistryOptions {\n /** Workspace whose `.skaile/providers.yml` is layered on top of the user file. */\n projectDir?: string;\n /**\n * Layers that do not come from these two files — the catalog layer from\n * `bridge/src/provider-catalog.ts`, CLI/runtime overrides, and the\n * control-plane session layer. Precedence follows each layer's id, not this\n * array's order.\n */\n extraLayers?: AIProviderRegistryLayer[];\n}\n\n/** The merged registry plus the files it came from. */\nexport interface LoadedProviderRegistry {\n /** Merged and gated: every entry here is complete. */\n registry: MergedAIProviderRegistry;\n /**\n * The same merge **before** the gate: every configured entry, complete or\n * not, as the layers left it. This is what a caller that has to see the\n * configured entries in order to build another layer reads — the catalog\n * layer expands the presets these entries name, and an entry whose `kind`\n * comes from its preset is still incomplete here, so it is absent from\n * `registry`.\n */\n patches: AIProviderRegistryPatch;\n files: ProviderRegistryFile[];\n /**\n * Every file's diagnostics in layer order, then the merge's own — an entry\n * no layer completed is reported here, naming the files that fed it.\n */\n diagnostics: AIProviderDiagnostic[];\n}\n\n/**\n * Load `~/.skaile/providers.yml` and, when a project directory is given,\n * `<projectDir>/.skaile/providers.yml`, then merge them with any extra layers\n * per §1.5 and gate the result.\n *\n * Merge *then* validate: each file is read as a patch, so a workspace entry\n * that sets one field of an entry the user file defines is applied over it\n * rather than dropped for being incomplete on its own.\n */\nexport function loadProviderRegistry(\n options: LoadProviderRegistryOptions = {},\n): LoadedProviderRegistry {\n const files: ProviderRegistryFile[] = [\n loadProviderRegistryFile(userProviderRegistryPath(), \"user\"),\n ];\n if (options.projectDir) {\n files.push(\n loadProviderRegistryFile(workspaceProviderRegistryPath(options.projectDir), \"workspace\"),\n );\n }\n\n const layers: AIProviderRegistryLayer[] = files.map((file) => ({\n layer: file.layer,\n providers: file.document.providers,\n }));\n const extraLayers = options.extraLayers ?? [];\n const merged = mergeRegistries([...layers, ...extraLayers]);\n const sources: AIProviderRegistrySource[] = [\n ...files.map((file) => ({ label: file.path, providers: file.document.providers })),\n ...extraLayers.map((layer) => ({ label: `${layer.layer} layer`, providers: layer.providers })),\n ];\n const { registry, diagnostics } = validateMergedRegistry(merged, { sources });\n\n return {\n registry,\n patches: merged.providers,\n files,\n diagnostics: [...files.flatMap((file) => file.diagnostics), ...diagnostics],\n };\n}\n","/**\n * User-layer runtime settings.\n *\n * SkaileSettings represents the personal, machine-specific overrides stored in\n * .skaile/settings.json (gitignored). Project-level defaults (framework, agent\n * definition, resource connections, hooks) belong in skaile.yaml via SkWorkspaceConfig.\n *\n * Resolution order (highest priority first):\n * 1. CLI flags / API overrides\n * 2. `PREFERRED_MODEL`\n * 3. .skaile/settings.json (project-local, walking upward)\n * 4. ~/.skaile/settings.json (user global)\n * 5. skaile.yaml defaults: (via resolveSkWorkspaceConfig — no duplicate YAML parser)\n * 6. Built-in SETTINGS_DEFAULTS\n *\n * Endpoints and credentials are NOT here: they are AI provider registry\n * entries in `~/.skaile/providers.yml` (`provider-registry-files.ts`). A\n * settings file that still carries the old `apiKeys{}` map is rejected on\n * load with the `skaile providers add` command that replaces it.\n */\n\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveSkWorkspaceConfig, type SkWorkspaceConfig } from \"./workspace-config.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Personal runtime settings — stored in .skaile/settings.json (gitignored).\n * Contains only user-specific overrides: credentials, preferred model/driver.\n *\n * Project-level config (framework, resources, hooks, agent definition) lives\n * in skaile.yaml as SkWorkspaceConfig. App-specific fields (voice, domains)\n * are added by forge-common-backend via AppSettings.\n * @docLink packages/core/settings#skaile-settings\n */\nexport interface SkaileSettings {\n /** Active model selector — `\"<providerId>/<modelId>\"`, a bare model id, or `\"@role\"`. */\n model?: string;\n /** Bridge driver to use: \"omp\", \"claude-sdk\", or \"codex\". */\n driver?: string;\n /**\n * Model role aliases (§9.8), sourced from `skaile.yaml` `roles:`. Consumed\n * by `parseModelRef` when a selector is `@role`.\n */\n roles?: Record<string, string>;\n /** Framework install path overrides. Normally derived from skaile.yaml defaults. */\n skillsDir?: string;\n /** Override for the agents directory. Normally derived from skaile.yaml defaults. */\n agentsDir?: string;\n /** Override for the prompts directory. Normally derived from skaile.yaml defaults. */\n promptsDir?: string;\n /** AI Asset Store API URL (default: https://store.skaile.ai) */\n storeUrl?: string;\n /** JWT access token for the AI Asset Store */\n storeJwt?: string;\n /** Refresh token for JWT renewal */\n storeRefreshToken?: string;\n}\n\n/**\n * Built-in default settings. Lowest-priority layer in resolveSettings().\n * Override via .skaile/settings.json, ~/.skaile/settings.json, or env vars.\n *\n * `model` is deliberately absent. A hardcoded default here is not a floor a\n * consumer can opt out of: because `loadSettings` and `resolveSettings` spread\n * these defaults *under* every other layer, deleting `model` from a settings\n * file does not unset it — the built-in comes back. A caller therefore cannot\n * express \"no model configured\" and cannot route an unconfigured session to its\n * own per-harness default; it silently inherits whichever id was pinned here,\n * however stale. Leaving it unset lets each driver apply its own current\n * default (omp omits `--model`; claude-sdk falls back to the `sonnet` rolling\n * alias), which is the one that ages correctly.\n *\n * @docLink packages/core/settings#settings-defaults\n */\nexport const SETTINGS_DEFAULTS: SkaileSettings = {\n driver: \"omp\",\n};\n\n// ── Legacy field mapping ───────────────────────────────────────────────────\n\nconst LEGACY_FIELD_MAP: Record<string, keyof SkaileSettings> = {\n defaultModel: \"model\",\n defaultAgentType: \"driver\",\n};\n\n/**\n * The one settings.json field that is neither renamed nor carried: `apiKeys{}`\n * put literal secrets in a file the runtime cannot rotate, scope or audit.\n * Registry entries reference a credential (`credential.ref: env:NAME`), and a\n * file that still has the field is rejected — silently dropping it would start\n * the session without the keys the operator believes are configured.\n */\nconst APIKEYS_REJECTION =\n \"settings.json: `apiKeys` is no longer read — endpoints and credentials are AI provider \" +\n \"registry entries in ~/.skaile/providers.yml. Run `skaile providers add <id> --preset \" +\n \"<preset> --credential env:NAME` for each provider, then delete the field.\";\n\n/**\n * Rename legacy field names in a raw parsed settings object to their current equivalents.\n * Maps `defaultModel` → `model`, `defaultAgentType` → `driver`. A present\n * `apiKeys` key (even an empty map) throws with the command that replaces it.\n *\n * @param raw - Raw object from JSON.parse of a settings file\n * @returns Settings with legacy keys renamed to current ones\n * @docLink packages/core/settings#map-legacy-fields\n */\nexport function mapLegacyFields(raw: Record<string, unknown>): SkaileSettings {\n if (\"apiKeys\" in raw) throw new Error(APIKEYS_REJECTION);\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n const mapped = LEGACY_FIELD_MAP[key];\n if (mapped) {\n if (!(mapped in result) || result[mapped] == null) result[mapped] = value;\n } else {\n result[key] = value;\n }\n }\n return result as SkaileSettings;\n}\n\n// ── Paths ──────────────────────────────────────────────────────────────────\n\nconst SKAILE_DIR = \".skaile\";\nconst SETTINGS_FILE = \"settings.json\";\n\n/**\n * Return the path to the user-global settings file: `~/.skaile/settings.json`.\n * @docLink packages/core/settings#global-settings-path\n */\nexport function globalSettingsPath(): string {\n return path.join(os.homedir(), SKAILE_DIR, SETTINGS_FILE);\n}\n\n/**\n * Return the path to the project-local settings file: `<projectDir>/.skaile/settings.json`.\n *\n * @param projectDir - Absolute path to the project root\n * @returns Absolute path to the project settings file\n * @docLink packages/core/settings#project-settings-path\n */\nexport function projectSettingsPath(projectDir: string): string {\n return path.join(projectDir, SKAILE_DIR, SETTINGS_FILE);\n}\n\n// ── I/O ────────────────────────────────────────────────────────────────────\n\n/**\n * Read and parse one settings JSON file. `undefined` when the file is missing\n * or not JSON — those are the cases a layer may skip. What it must not skip is\n * a rejected field, which `mapLegacyFields` throws for outside this guard.\n */\nfunction readSettingsJson(filePath: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Load and parse a settings JSON file, merging over SETTINGS_DEFAULTS.\n * Returns defaults if the file does not exist or cannot be parsed; throws\n * when it carries a rejected field (`apiKeys`).\n *\n * @param filePath - Absolute path to a settings.json file\n * @returns Parsed settings merged with built-in defaults\n * @docLink packages/core/settings#load-settings\n */\nexport async function loadSettings(filePath: string): Promise<SkaileSettings> {\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(await fsp.readFile(filePath, \"utf-8\"));\n } catch {\n return { ...SETTINGS_DEFAULTS };\n }\n return { ...SETTINGS_DEFAULTS, ...mapLegacyFields(raw) };\n}\n\n/**\n * Persist settings to a JSON file, creating parent directories as needed.\n *\n * @param settings - Settings object to serialize\n * @param filePath - Absolute path to write the settings.json file\n * @docLink packages/core/settings#save-settings\n */\nexport async function saveSettings(settings: SkaileSettings, filePath: string): Promise<void> {\n await fsp.mkdir(path.dirname(filePath), { recursive: true });\n await fsp.writeFile(filePath, JSON.stringify(settings, null, 2), \"utf-8\");\n}\n\n/**\n * Walk upward from `projectDir` (max 10 levels) and collect all\n * `.skaile/settings.json` paths found along the way.\n * Results are ordered nearest-to-root first.\n *\n * @param projectDir - Starting directory for the upward walk\n * @returns Array of absolute paths to settings files found\n * @docLink packages/core/settings#walk-for-settings\n */\nexport function walkForSettings(projectDir: string): string[] {\n const found: string[] = [];\n let dir = path.resolve(projectDir);\n const root = path.parse(dir).root;\n for (let i = 0; i < 10; i++) {\n const candidate = path.join(dir, SKAILE_DIR, SETTINGS_FILE);\n if (fs.existsSync(candidate)) found.push(candidate);\n const parent = path.dirname(dir);\n if (parent === dir || parent === root) break;\n dir = parent;\n }\n return found;\n}\n\n// ── Resolution ─────────────────────────────────────────────────────────────\n\nfunction mergeSettings(base: SkaileSettings, source: Partial<SkaileSettings>): SkaileSettings {\n const result: SkaileSettings = { ...base };\n for (const [key, value] of Object.entries(source) as [keyof SkaileSettings, unknown][]) {\n if (value === undefined || value === null || value === \"\") continue;\n if (key === \"roles\" && typeof value === \"object\") {\n // Per-key merge: a project that redefines `smol` must not have to\n // restate the roles its user-scope config already provides.\n result[key] = { ...result[key], ...(value as Record<string, string>) };\n } else {\n Object.assign(result, { [key]: value });\n }\n }\n return result;\n}\n\n/**\n * Derive a SkaileSettings-compatible layer from `skaile.yaml` — the default\n * profile's selection plus the workspace `roles:` table.\n *\n * A `skaile.yaml` that still defines a provider or an endpoint is a parse\n * error, and that one error is re-thrown rather than swallowed: silently\n * resolving an empty layer would start the session against the wrong model\n * instead of printing the command that fixes the file.\n */\nfunction settingsFromWorkspaceConfig(projectDir: string): SkaileSettings {\n let ws: SkWorkspaceConfig;\n try {\n ws = resolveSkWorkspaceConfig(projectDir);\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"skaile migrate providers\")) throw error;\n return {};\n }\n const result: SkaileSettings = {};\n if (ws.roles && Object.keys(ws.roles).length > 0) result.roles = ws.roles;\n const p = ws.agent_config?.default;\n if (!p) return result;\n if (p.driver) result.driver = p.driver;\n if (p.model) result.model = p.model;\n if (p.skills_dir) result.skillsDir = p.skills_dir;\n if (p.agents_dir) result.agentsDir = p.agents_dir;\n if (p.prompts_dir) result.promptsDir = p.prompts_dir;\n return result;\n}\n\n// ── Migration ──────────────────────────────────────────────────────────────\n\nconst _migrated = new Set<string>();\n\n/**\n * One-time migration from old config locations to .skaile/settings.json.\n * Does not delete old files — user can do that manually.\n * @docLink packages/core/settings#migrate-settings\n */\nexport async function migrateSettings(projectDir: string): Promise<void> {\n const resolved = path.resolve(projectDir);\n if (_migrated.has(resolved)) return;\n\n const targetPath = projectSettingsPath(resolved);\n if (fs.existsSync(targetPath)) {\n _migrated.add(resolved);\n return;\n }\n\n // Old locations: data/settings.json (forge-project), .cf/settings.json\n // (forge-concept), .skaile/config.json (old SkailConfig).\n const sources = [\n path.join(resolved, \"data\", \"settings.json\"),\n path.join(resolved, \".cf\", \"settings.json\"),\n path.join(resolved, \".skaile\", \"config.json\"),\n ]\n .map(readSettingsJson)\n .filter((raw): raw is Record<string, unknown> => raw !== undefined);\n\n if (sources.length > 0) {\n let merged: SkaileSettings = {};\n for (const source of sources) {\n merged = mergeSettings(merged, mapLegacyFields(source));\n }\n await saveSettings(merged, targetPath);\n }\n\n _migrated.add(resolved);\n}\n\n/**\n * Resolve effective settings through the 6-layer priority chain:\n * overrides > env vars (PREFERRED_MODEL) >\n * .skaile/settings.json (walks upward) > ~/.skaile/settings.json >\n * skaile.yaml agent_config defaults > SETTINGS_DEFAULTS.\n *\n * @param projectDir - Root directory of the project being operated on\n * @param overrides - Optional top-priority overrides (CLI flags, API body)\n * @returns Merged effective settings\n * @docLink packages/core/settings#resolve-settings\n */\nexport async function resolveSettings(\n projectDir: string,\n overrides?: Partial<SkaileSettings>,\n): Promise<SkaileSettings> {\n await migrateSettings(projectDir);\n\n // Base: built-in defaults\n let merged: SkaileSettings = { ...SETTINGS_DEFAULTS };\n\n // Layer: workspace config defaults (skaile.yaml via resolveSkWorkspaceConfig)\n merged = mergeSettings(merged, settingsFromWorkspaceConfig(projectDir));\n\n // Layer: user global settings\n const globalPath = globalSettingsPath();\n const globalRaw = readSettingsJson(globalPath);\n if (globalRaw) merged = mergeSettings(merged, mapLegacyFields(globalRaw));\n\n // Layer: project-local .skaile/settings.json (walking upward, farthest first)\n const settingsFiles = walkForSettings(projectDir);\n for (const filePath of settingsFiles.reverse()) {\n if (path.resolve(filePath) === path.resolve(globalPath)) continue;\n const raw = readSettingsJson(filePath);\n if (raw) merged = mergeSettings(merged, mapLegacyFields(raw));\n }\n\n // Layer: environment variable model override\n if (process.env.PREFERRED_MODEL) merged.model = process.env.PREFERRED_MODEL;\n\n // Layer: explicit overrides\n if (overrides) merged = mergeSettings(merged, overrides);\n\n return merged;\n}\n\n// ── API key helpers ────────────────────────────────────────────────────────\n\n/**\n * Return a masked version of an API key for safe logging.\n * Shows only the last four characters (e.g. `'****abc1'`).\n *\n * @param key - Raw API key to mask\n * @returns Masked key string, or empty string if key is falsy\n * @docLink packages/core/settings#mask-api-key\n */\nexport function maskApiKey(key: string): string {\n return key ? `****${key.slice(-4)}` : \"\";\n}\n","/**\n * Comment-preserving editor for skaile.yaml files.\n *\n * Uses the `yaml` library's Document API to parse into an AST that retains\n * comments, blank lines, and formatting. Mutations are applied to the AST\n * and serialized back — untouched sections remain byte-identical.\n *\n * Usage:\n *\n * import { WorkspaceYamlEditor } from '@skaile/workspaces/core'\n *\n * const editor = WorkspaceYamlEditor.load('/project/skaile.yaml')\n * editor.setAgentConfig('default', { driver: 'claude-sdk', model: 'claude-sonnet-4-6' })\n * editor.setSource({ url: 'https://github.com/skaile-ai/ai-assets' })\n * editor.save()\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { Document, isMap, isSeq, parseDocument, type YAMLMap } from \"yaml\";\nimport type {\n AgentConfigProfile,\n ConnectorDeclaration,\n McpServerDeclaration,\n OverrideEntry,\n SourceEntry,\n StoreEntry,\n} from \"./workspace-config.js\";\n\n/**\n * Comment-preserving editor for `skaile.yaml` files.\n * Uses the `yaml` library's Document AST so untouched sections remain byte-identical.\n * Create with `WorkspaceYamlEditor.load(filePath)` or `WorkspaceYamlEditor.create(filePath)`.\n * @docLink packages/core/workspace-config#workspace-yaml-editor\n */\nexport class WorkspaceYamlEditor {\n readonly path: string;\n private doc: Document;\n\n private constructor(path: string, doc: Document) {\n this.path = path;\n this.doc = doc;\n }\n\n /** Load an existing skaile.yaml file. */\n static load(filePath: string): WorkspaceYamlEditor {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n const raw = readFileSync(filePath, \"utf-8\");\n const doc = parseDocument(raw);\n return new WorkspaceYamlEditor(filePath, doc);\n }\n\n /** Create a new empty document (for use when no file exists yet). */\n static create(filePath: string): WorkspaceYamlEditor {\n const doc = new Document({});\n return new WorkspaceYamlEditor(filePath, doc);\n }\n\n /** Write the document back to disk, preserving comments and formatting. */\n save(): void {\n writeFileSync(this.path, this.doc.toString());\n }\n\n /** Return the serialized YAML string without writing to disk. */\n toString(): string {\n return this.doc.toString();\n }\n\n // ── Scalar fields ──────────────────────────────────────────────────────────\n\n /** Get a top-level scalar field (name, description). */\n get(key: \"name\" | \"description\"): string | undefined {\n const val = this.doc.get(key);\n return val != null ? String(val) : undefined;\n }\n\n /** Set a top-level scalar field. */\n set(key: \"name\" | \"description\", value: string): void {\n this.doc.set(key, value);\n }\n\n // ── Agent config ──────────────────────────────────────────────────────────\n\n /**\n * Get an agent config profile by name (usually \"default\").\n * Reads from `agent-config` (canonical YAML key).\n */\n getAgentConfig(profile = \"default\"): AgentConfigProfile | undefined {\n const section = this._getAgentConfigSection();\n if (!section) return undefined;\n const node = section.get(profile, true);\n // `.toJSON()` — a YAMLMap's own properties are AST internals, not the\n // profile's fields, so returning the node would make every read undefined.\n return isMap(node) ? (node.toJSON() as AgentConfigProfile) : undefined;\n }\n\n /**\n * Set fields on an agent config profile. Merges with existing values —\n * only the provided fields are overwritten.\n */\n setAgentConfig(profile: string, values: Partial<AgentConfigProfile>): void {\n let section = this._getAgentConfigSection();\n if (!section) {\n // `createNode` — `doc.set(key, plainObject)` stores the object itself,\n // which is not a YAMLMap, and every later `section.get`/`set` would\n // throw on it.\n this.doc.set(\"agent-config\", this.doc.createNode({ [profile]: {} }));\n section = this._getAgentConfigSection();\n if (!section) throw new Error(\"failed to create the agent-config section\");\n }\n\n const existing = section.get(profile, true);\n if (!existing || !isMap(existing)) {\n section.set(profile, { ...values });\n return;\n }\n\n for (const [k, v] of Object.entries(values)) {\n if (v === undefined) continue;\n existing.set(k, v);\n }\n }\n\n /**\n * Delete a field from an agent config profile.\n */\n deleteAgentConfigField(profile: string, field: string): void {\n const section = this._getAgentConfigSection();\n if (!section) return;\n const profileNode = section.get(profile, true);\n if (isMap(profileNode)) {\n profileNode.delete(field);\n }\n }\n\n private _getAgentConfigSection(): YAMLMap | undefined {\n // Try canonical 'agent-config' first, then 'agent_config'\n const node = this.doc.get(\"agent-config\", true) ?? this.doc.get(\"agent_config\", true);\n return isMap(node) ? (node as YAMLMap) : undefined;\n }\n\n // ── Connectors ─────────────────────────────────────────────────────────────\n\n /** Get all connectors. */\n getConnectors(): ConnectorDeclaration[] {\n const node = this.doc.get(\"connectors\", true) ?? this.doc.get(\"data_resources\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as ConnectorDeclaration[];\n }\n\n /** Add or update a connector by id. */\n setConnector(connector: ConnectorDeclaration): void {\n const key = \"connectors\";\n const node = this.doc.get(key, true);\n\n if (!node || !isSeq(node)) {\n this.doc.set(key, this.doc.createNode([connector]));\n return;\n }\n\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === connector.id) {\n node.set(i, this.doc.createNode(connector));\n found = true;\n break;\n }\n }\n\n if (!found) {\n node.add(this.doc.createNode(connector));\n }\n }\n\n /** Remove a connector by id. */\n removeConnector(id: string): boolean {\n const key = this.doc.has(\"connectors\") ? \"connectors\" : \"data_resources\";\n const node = this.doc.get(key, true);\n if (!node || !isSeq(node)) return false;\n\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === id) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── MCP servers ────────────────────────────────────────────────────────────\n\n /**\n * Add or replace an mcp server entry, matched by `id`.\n * Mirrors {@link setConnector}: an existing entry with the same `id` is\n * replaced in place; otherwise the declaration is appended.\n */\n setMcpServer(mcp: McpServerDeclaration): void {\n const key = \"mcp_servers\";\n const node = this.doc.get(key, true);\n\n if (!node || !isSeq(node)) {\n this.doc.set(key, this.doc.createNode([mcp]));\n return;\n }\n\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"id\") === mcp.id) {\n node.set(i, this.doc.createNode(mcp));\n found = true;\n break;\n }\n }\n\n if (!found) {\n node.add(this.doc.createNode(mcp));\n }\n }\n\n // ── Dependencies ───────────────────────────────────────────────────────────\n\n /**\n * Append a dependency ref to `dependencies:`, deduped by exact ref string.\n *\n * @param ref - Canonical dependency ref (e.g. `skill:@skaile/foo#1.0.0`).\n * @returns `true` when the ref was newly added, `false` when it was already present.\n */\n addDependency(ref: string): boolean {\n const node = this.doc.get(\"dependencies\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"dependencies\", this.doc.createNode([ref]));\n return true;\n }\n for (const item of node.items) {\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (cur === ref) return false;\n }\n node.add(this.doc.createNode(ref));\n return true;\n }\n\n // ── Plugins ────────────────────────────────────────────────────────────────\n\n /** Get all `plugins:` specifiers. */\n getPlugins(): string[] {\n const node = this.doc.get(\"plugins\", true);\n if (!isSeq(node)) return [];\n const out: string[] = [];\n for (const item of node.items) {\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\") out.push(cur);\n }\n return out;\n }\n\n /**\n * Add a plugin specifier to `plugins:`, deduped by package name.\n * If an entry with the same package name exists it is replaced (so a version\n * bump re-pins in place); otherwise the spec is appended.\n *\n * @param spec - npm specifier, e.g. `\"@skaile/provider-fly@^0.1.0\"`.\n * @param nameOf - Extracts the package name from a spec (caller passes `parseSpec`-derived names).\n * @returns `true` when an existing entry was replaced, `false` when appended.\n */\n addPlugin(spec: string, nameOf: (s: string) => string): boolean {\n const node = this.doc.get(\"plugins\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"plugins\", this.doc.createNode([spec]));\n return false;\n }\n\n const wantName = nameOf(spec);\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\" && nameOf(cur) === wantName) {\n node.set(i, this.doc.createNode(spec));\n return true;\n }\n }\n node.add(this.doc.createNode(spec));\n return false;\n }\n\n /**\n * Remove the `plugins:` entry whose package name matches `name`.\n *\n * @param name - Package name to remove (e.g. `\"@skaile/provider-fly\"`).\n * @param nameOf - Extracts the package name from a spec.\n * @returns `true` when an entry was removed.\n */\n removePlugin(name: string, nameOf: (s: string) => string): boolean {\n const node = this.doc.get(\"plugins\", true);\n if (!node || !isSeq(node)) return false;\n\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n const cur = item != null && typeof item === \"object\" && \"value\" in item ? item.value : item;\n if (typeof cur === \"string\" && nameOf(cur) === name) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Sources ────────────────────────────────────────────────────────────────\n\n /** Get all source entries (`{url, pin?}`). */\n getSources(): SourceEntry[] {\n const node = this.doc.get(\"sources\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as SourceEntry[];\n }\n\n /**\n * Add or update a source entry, matched by `url`.\n * If an entry with the same url exists, it is replaced.\n */\n setSource(entry: SourceEntry): void {\n const node = this.doc.get(\"sources\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"sources\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === entry.url) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) node.add(this.doc.createNode(entry));\n }\n\n /** Remove a source entry by url. Returns true when an entry was removed. */\n removeSource(url: string): boolean {\n const node = this.doc.get(\"sources\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === url) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Stores ─────────────────────────────────────────────────────────────────\n\n /** Get all store entries (`{url}`). */\n getStores(): StoreEntry[] {\n const node = this.doc.get(\"stores\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as StoreEntry[];\n }\n\n /** Add or update a store entry, matched by `url`. */\n setStore(entry: StoreEntry): void {\n const node = this.doc.get(\"stores\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"stores\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === entry.url) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) node.add(this.doc.createNode(entry));\n }\n\n /** Remove a store entry by url. Returns true when an entry was removed. */\n removeStore(url: string): boolean {\n const node = this.doc.get(\"stores\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"url\") === url) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Overrides ────────────────────────────────────────────────────────────────\n\n /** Get all override entries (`{ref, source, reason}`). */\n getOverrides(): OverrideEntry[] {\n const node = this.doc.get(\"overrides\", true);\n if (!isSeq(node)) return [];\n return node.toJSON() as OverrideEntry[];\n }\n\n /** Add or update an override entry, matched by `ref`. */\n setOverride(entry: OverrideEntry): void {\n const node = this.doc.get(\"overrides\", true);\n if (!node || !isSeq(node)) {\n this.doc.set(\"overrides\", this.doc.createNode([entry]));\n return;\n }\n let found = false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"ref\") === entry.ref) {\n node.set(i, this.doc.createNode(entry));\n found = true;\n break;\n }\n }\n if (!found) node.add(this.doc.createNode(entry));\n }\n\n /** Remove an override entry by ref. Returns true when an entry was removed. */\n removeOverride(ref: string): boolean {\n const node = this.doc.get(\"overrides\", true);\n if (!node || !isSeq(node)) return false;\n for (let i = 0; i < node.items.length; i++) {\n const item = node.items[i];\n if (isMap(item) && (item as YAMLMap).get(\"ref\") === ref) {\n node.delete(i);\n return true;\n }\n }\n return false;\n }\n\n // ── Raw access (escape hatch) ─────────────────────────────────────────────\n\n /** Get the underlying yaml Document for advanced manipulation. */\n get document(): Document {\n return this.doc;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../store/src/resource-client.ts","../store/src/store.ts"],"names":[],"mappings":"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","file":"chunk-JRSLMZOT.js","sourcesContent":["import type {\n AgentEvent,\n ConnectorContent,\n ConnectorEntry,\n ConnectorInfo,\n ConnectorOperation,\n ConnectorResponseEvent,\n ConnectorResponseFailureCode,\n ConnectorStat,\n ConnectorStatusEvent,\n ListOptions,\n MountInfo,\n ReadOptions,\n SearchOptions,\n StatOptions,\n} from \"@skaile/workspaces/types\";\nimport type {\n ConnectorStatus,\n ResourceClientSnapshot,\n StoreTransport,\n SubscribableStore,\n} from \"./types.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Rejection for a `resource_response` that carried an `error`. `code` is the\n * runner's machine-readable failure class, absent from runners older than\n * protocol 4.2.0.\n */\nexport class ResourceRequestError extends Error {\n readonly code: ConnectorResponseFailureCode | undefined;\n\n constructor(message: string, code?: ConnectorResponseFailureCode) {\n super(message);\n this.name = \"ResourceRequestError\";\n this.code = code;\n }\n}\n\n/**\n * Lazy resource browser for agent connectors.\n *\n * Provides a reactive list of connected mounts and connectors, and\n * request/response methods for browsing connector contents. Shares\n * the same transport (`send` + `onEvent`) as `AgentStore`.\n * @docLink packages/store/concepts#resource-client\n */\nexport class ResourceClient implements SubscribableStore<ResourceClientSnapshot> {\n private readonly _send: StoreTransport[\"send\"];\n private _mounts: readonly MountInfo[] = [];\n private _connectors: readonly ConnectorInfo[] = [];\n\n /** Live connection status per connector, keyed by connector ID. Updated by connector_status events. */\n connectorStatus: Map<string, ConnectorStatus> = new Map();\n\n private _snapshot: ResourceClientSnapshot | null = null;\n private readonly _listeners = new Set<() => void>();\n private readonly _pendingRequests = new Map<\n string,\n {\n resolve: (event: ConnectorResponseEvent) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private readonly _unsubEvent: () => void;\n\n /**\n * @param transport - Shared transport (same instance as the AgentStore for this session).\n */\n constructor(transport: StoreTransport) {\n this._send = transport.send;\n this._unsubEvent = transport.onEvent((event) => this._handleEvent(event));\n }\n\n // -- Reactive state --------------------------------------------------------\n\n /** Mounts available in this session, populated from `resources_available` events. */\n get mounts(): readonly MountInfo[] {\n return this._mounts;\n }\n\n /** Tool-based connectors available in this session, populated from `resources_available` events. */\n get connectors(): readonly ConnectorInfo[] {\n return this._connectors;\n }\n\n // -- Resource operations ---------------------------------------------------\n\n /**\n * List directory entries at the given path within a connector.\n *\n * @param connectorId - ID of the connector to query.\n * @param path - Directory path to list. Omit for the connector root.\n * @param opts - Optional pagination and filter options.\n * @returns Array of entries (files, directories, etc.) at the given path.\n * @throws If the request times out or the connector returns an error.\n */\n async list(connectorId: string, path?: string, opts?: ListOptions): Promise<ConnectorEntry[]> {\n const response = await this._request(connectorId, \"list\", path, opts);\n return (response.data as ConnectorEntry[]) ?? [];\n }\n\n /**\n * Read the content of a single resource.\n *\n * @param connectorId - ID of the connector to query.\n * @param path - Full path to the resource within the connector.\n * @param opts - `{ encoding: \"binary\" }` asks a filesystem mount for base64\n * of the bytes instead of text guessed from a NUL sniff (protocol 4.6.0;\n * an older runner ignores it).\n * @returns The resource content object.\n * @throws If the request times out or the connector returns an error.\n */\n async read(connectorId: string, path: string, opts?: ReadOptions): Promise<ConnectorContent> {\n const response = await this._request(connectorId, \"read\", path, opts);\n return response.data as ConnectorContent;\n }\n\n /**\n * Write content to a resource, creating it if it does not exist.\n *\n * @param connectorId - ID of the connector to write to.\n * @param path - Full path to the resource within the connector.\n * @param content - Content to write.\n * @throws If the request times out or the connector returns an error.\n */\n async write(connectorId: string, path: string, content: ConnectorContent): Promise<void> {\n await this._request(connectorId, \"write\", path, undefined, content);\n }\n\n /**\n * Delete a resource from a connector.\n *\n * @param connectorId - ID of the connector to delete from.\n * @param path - Full path to the resource within the connector.\n * @throws If the request times out or the connector returns an error.\n */\n async delete(connectorId: string, path: string): Promise<void> {\n await this._request(connectorId, \"delete\", path);\n }\n\n /**\n * Full-text search within a connector.\n *\n * @param connectorId - ID of the connector to search.\n * @param query - Search query string.\n * @param opts - Optional search options (e.g. path prefix, result limit).\n * @returns Matching entries, ordered by relevance as determined by the connector.\n * @throws If the request times out or the connector returns an error.\n */\n async search(\n connectorId: string,\n query: string,\n opts?: SearchOptions,\n ): Promise<ConnectorEntry[]> {\n const response = await this._request(connectorId, \"search\", query, opts);\n return (response.data as ConnectorEntry[]) ?? [];\n }\n\n /**\n * Create an empty directory on a filesystem mount, parents included.\n *\n * @param connectorId - ID of the mount.\n * @param path - Directory path within the mount.\n * @throws {ResourceRequestError} with `code: \"already_exists\"` if something\n * is already at `path`; also if the target is not a filesystem mount or the\n * runner predates protocol 4.2.0 (then `code` is absent).\n */\n async mkdir(connectorId: string, path: string): Promise<void> {\n await this._request(connectorId, \"mkdir\", path);\n }\n\n /**\n * Describe one path on a filesystem mount; with `opts.recursive`, a\n * directory also carries capped recursive totals.\n *\n * @param connectorId - ID of the mount.\n * @param path - Path within the mount; omit for the mount root.\n * @param opts - Optional stat options.\n * @throws If the path does not exist, the target is not a filesystem mount,\n * or the runner predates protocol 4.2.0.\n */\n async stat(connectorId: string, path?: string, opts?: StatOptions): Promise<ConnectorStat> {\n const response = await this._request(connectorId, \"stat\", path, opts);\n return response.data as ConnectorStat;\n }\n\n // -- useSyncExternalStore interface ----------------------------------------\n\n /**\n * Register a change listener. Called after every resource availability change.\n *\n * Conforms to the `subscribe` parameter of React's `useSyncExternalStore`.\n *\n * @param listener - Callback invoked whenever mounts or connectors change.\n * @returns Unsubscribe function — call to stop receiving notifications.\n */\n subscribe = (listener: () => void): (() => void) => {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n };\n\n /**\n * Return the current immutable resource snapshot.\n *\n * A new object is produced lazily after each `resources_available` event.\n * Conforms to the `getSnapshot` parameter of React's `useSyncExternalStore`.\n */\n getSnapshot = (): ResourceClientSnapshot => {\n if (!this._snapshot) {\n this._snapshot = { mounts: this._mounts, connectors: this._connectors };\n }\n return this._snapshot;\n };\n\n // -- Connector config mutations --------------------------------------------\n\n /**\n * Send a `connector_config` add command to wire a new connector at runtime,\n * without restarting the session. The runner receives this command and\n * calls `ConnectorManager.connect()`, which fires a `connector_status` event\n * back to the store once the connector is live.\n *\n * @param declaration - Connector declaration (id, driver, access level, options).\n */\n addConnector(declaration: {\n id: string;\n driver: string;\n access?: \"read-only\" | \"read-write\";\n options?: Record<string, unknown>;\n }): void {\n this._send({ type: \"connector_config\", action: \"add\", declaration });\n }\n\n /**\n * Send a `connector_config` remove command to disconnect a connector by ID\n * without restarting the session.\n *\n * @param connectorId - ID of the connector to disconnect and remove.\n */\n removeConnector(connectorId: string): void {\n this._send({ type: \"connector_config\", action: \"remove\", connectorId });\n }\n\n /**\n * Send a `connector_config` refresh command to reconnect all configured\n * connectors (e.g. after a credentials change).\n */\n refreshConnectors(): void {\n this._send({ type: \"connector_config\", action: \"refresh\" });\n }\n\n // -- Cleanup ---------------------------------------------------------------\n\n /**\n * Unsubscribe from transport events, reject all pending requests, and\n * clear all change listeners.\n *\n * All in-flight resource requests will reject\n * with `\"ResourceClient disposed\"`.\n */\n dispose(): void {\n this._unsubEvent();\n for (const [, pending] of this._pendingRequests) {\n clearTimeout(pending.timer);\n pending.reject(new Error(\"ResourceClient disposed\"));\n }\n this._pendingRequests.clear();\n this._listeners.clear();\n }\n\n // -- Internal --------------------------------------------------------------\n\n private _handleEvent(event: AgentEvent): void {\n if (event.type === \"connector_status\") {\n const e = event as ConnectorStatusEvent;\n const existing = this.connectorStatus.get(e.connectorId);\n const next = new Map(this.connectorStatus);\n next.set(e.connectorId, {\n id: e.connectorId,\n driver:\n existing?.driver ?? this._connectors.find((c) => c.id === e.connectorId)?.driver ?? \"\",\n state: e.status,\n ...(e.error !== undefined ? { error: e.error } : {}),\n ...(e.errorKind !== undefined ? { errorKind: e.errorKind } : {}),\n ...(e.latencyMs !== undefined ? { latencyMs: e.latencyMs } : {}),\n lastUpdated: new Date(),\n });\n this.connectorStatus = next;\n for (const listener of this._listeners) {\n listener();\n }\n return;\n }\n\n if (event.type === \"resources_available\") {\n this._mounts = event.mounts;\n this._connectors = event.connectors;\n this._snapshot = null;\n for (const listener of this._listeners) {\n listener();\n }\n return;\n }\n\n if (event.type === \"resource_response\") {\n const pending = this._pendingRequests.get(event.requestId);\n if (!pending) return;\n\n clearTimeout(pending.timer);\n this._pendingRequests.delete(event.requestId);\n\n if (event.error) {\n pending.reject(new ResourceRequestError(event.error, event.code));\n } else {\n pending.resolve(event);\n }\n }\n }\n\n private _request(\n connectorId: string,\n operation: ConnectorOperation,\n path?: string,\n options?: ListOptions | SearchOptions | StatOptions | ReadOptions,\n content?: ConnectorContent,\n ): Promise<ConnectorResponseEvent> {\n const requestId = crypto.randomUUID();\n\n return new Promise<ConnectorResponseEvent>((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingRequests.delete(requestId);\n reject(\n new Error(\n `Resource request timed out after ${DEFAULT_TIMEOUT_MS}ms: ${operation} ${connectorId}${path ? ` ${path}` : \"\"}`,\n ),\n );\n }, DEFAULT_TIMEOUT_MS);\n\n this._pendingRequests.set(requestId, { resolve, reject, timer });\n\n this._send({\n type: \"resource_request\",\n requestId,\n connectorId,\n operation,\n ...(path !== undefined ? { path } : {}),\n ...(options ? { options } : {}),\n ...(content ? { content } : {}),\n });\n });\n }\n}\n","import type {\n AgentCommand,\n AgentEvent,\n AgentPhase,\n Capability,\n IncompatibleProtocolEvent,\n Message,\n ProtocolInfoEvent,\n QuestionEvent,\n RenderInvokedEvent,\n} from \"@skaile/workspaces/types\";\nimport type {\n AgentClientLike,\n AgentStoreOptions,\n AgentStoreSnapshot,\n ConnectionStatus,\n SubscribableStore,\n} from \"./types.js\";\n\nconst DEFAULT_PAGE_SIZE = 50;\n\n/** Conservative equality for plain JSON data; unsupported or unverifiable values fail open. */\nfunction isSameJsonValue<T>(a: T | undefined, b: T, conservativeCommandInput = false): boolean {\n const aObjects = new WeakSet<object>();\n const bObjects = new WeakSet<object>();\n\n const compare = (left: unknown, right: unknown): boolean => {\n if (left === null || right === null) return left === right;\n if (typeof left !== typeof right) return false;\n\n switch (typeof left) {\n case \"string\":\n case \"boolean\":\n return left === right;\n case \"number\":\n return (\n Number.isFinite(left) &&\n Number.isFinite(right) &&\n !Object.is(left, -0) &&\n !Object.is(right, -0) &&\n left === right\n );\n case \"object\":\n break;\n default:\n return false;\n }\n\n const leftObject = left as object;\n const rightObject = right as object;\n if (aObjects.has(leftObject) || bObjects.has(rightObject)) return false;\n if (conservativeCommandInput) {\n if (leftObject === rightObject || bObjects.has(leftObject) || aObjects.has(rightObject)) {\n return false;\n }\n }\n aObjects.add(leftObject);\n bObjects.add(rightObject);\n\n const leftIsArray = Array.isArray(leftObject);\n if (leftIsArray !== Array.isArray(rightObject)) return false;\n\n const leftPrototype = Object.getPrototypeOf(leftObject);\n const rightPrototype = Object.getPrototypeOf(rightObject);\n const leftHasPlainPrototype = leftIsArray\n ? leftPrototype === Array.prototype\n : leftPrototype === Object.prototype || leftPrototype === null;\n const rightHasPlainPrototype = leftIsArray\n ? rightPrototype === Array.prototype\n : rightPrototype === Object.prototype || rightPrototype === null;\n if (\n !leftHasPlainPrototype ||\n !rightHasPlainPrototype ||\n leftPrototype !== rightPrototype ||\n !Object.isExtensible(leftObject) ||\n !Object.isExtensible(rightObject)\n ) {\n return false;\n }\n\n const leftKeys = Reflect.ownKeys(leftObject);\n const rightKeys = Reflect.ownKeys(rightObject);\n if (\n leftKeys.length !== rightKeys.length ||\n leftKeys.some((key) => typeof key !== \"string\") ||\n rightKeys.some((key) => typeof key !== \"string\")\n ) {\n return false;\n }\n\n if (leftIsArray) {\n const leftLengthDescriptor = Object.getOwnPropertyDescriptor(leftObject, \"length\");\n const rightLengthDescriptor = Object.getOwnPropertyDescriptor(rightObject, \"length\");\n const leftLength = leftLengthDescriptor?.value;\n const rightLength = rightLengthDescriptor?.value;\n if (\n !leftLengthDescriptor ||\n !(\"value\" in leftLengthDescriptor) ||\n !leftLengthDescriptor.writable ||\n leftLengthDescriptor.enumerable ||\n leftLengthDescriptor.configurable ||\n !rightLengthDescriptor ||\n !(\"value\" in rightLengthDescriptor) ||\n !rightLengthDescriptor.writable ||\n rightLengthDescriptor.enumerable ||\n rightLengthDescriptor.configurable ||\n typeof leftLength !== \"number\" ||\n leftLength !== rightLength ||\n leftKeys.length !== leftLength + 1\n ) {\n return false;\n }\n\n for (let index = 0; index < leftLength; index++) {\n const key = String(index);\n const leftDescriptor = Object.getOwnPropertyDescriptor(leftObject, key);\n const rightDescriptor = Object.getOwnPropertyDescriptor(rightObject, key);\n if (\n !leftDescriptor?.enumerable ||\n !(\"value\" in leftDescriptor) ||\n !leftDescriptor.writable ||\n !leftDescriptor.configurable ||\n !rightDescriptor?.enumerable ||\n !(\"value\" in rightDescriptor) ||\n !rightDescriptor.writable ||\n !rightDescriptor.configurable ||\n !compare(leftDescriptor.value, rightDescriptor.value)\n ) {\n return false;\n }\n }\n return true;\n }\n\n for (let index = 0; index < leftKeys.length; index++) {\n const leftKey = leftKeys[index] as string;\n const rightKey = rightKeys[index] as string;\n if (leftKey !== rightKey) return false;\n\n const leftDescriptor = Object.getOwnPropertyDescriptor(leftObject, leftKey);\n const rightDescriptor = Object.getOwnPropertyDescriptor(rightObject, rightKey);\n if (\n !leftDescriptor?.enumerable ||\n !(\"value\" in leftDescriptor) ||\n !leftDescriptor.writable ||\n !leftDescriptor.configurable ||\n !rightDescriptor?.enumerable ||\n !(\"value\" in rightDescriptor) ||\n !rightDescriptor.writable ||\n !rightDescriptor.configurable ||\n !compare(leftDescriptor.value, rightDescriptor.value)\n ) {\n return false;\n }\n }\n return true;\n };\n\n try {\n const same = compare(a, b);\n if (!same || !conservativeCommandInput) return same;\n structuredClone(a);\n structuredClone(b);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Headless reactive store for agent conversation state.\n *\n * Framework-agnostic — works with React (`useSyncExternalStore`),\n * Vue (`shallowRef` + `subscribe`), or any other UI framework.\n *\n * Accepts a minimal transport interface (`send` + `onEvent`) so it works\n * with WebSocket, tRPC, SSE, or any other delivery mechanism.\n * @docLink packages/store/concepts#agent-store\n */\nexport class AgentStore implements SubscribableStore<AgentStoreSnapshot> {\n private readonly _options: AgentStoreOptions;\n private _messages: Message[];\n private _streamingText = \"\";\n private _cancelledText = \"\";\n private _status: ConnectionStatus = \"idle\";\n private _phase: AgentPhase = \"idle\";\n private _pendingQuestion: AgentStoreSnapshot[\"pendingQuestion\"] = null;\n /**\n * Unanswered sub-questions of the parked ask, oldest first. Drivers resume\n * only once every one has an answer; `_pendingQuestion` is its last entry.\n */\n private _openQuestions: QuestionEvent[] = [];\n /** Every sub-question text of the parked ask, answered or not. */\n private _askQuestions = new Set<string>();\n /**\n * Own unnamed replies whose runner echo has not arrived yet. Best effort: a\n * reply the driver rejects is never echoed, and its count lingers until the\n * ask ends.\n */\n private _unnamedEchoesOwed = 0;\n private _error: AgentStoreSnapshot[\"error\"] = null;\n private _isAllLoaded: boolean;\n private _seq: number;\n private _streamingFlushed = true;\n /** Shared state per store namespace — new Map instance on every mutation. */\n private _sharedState: Map<string, Record<string, unknown>> = new Map();\n /** Protocol v2 capability registry — new Map instance on every mutation. */\n private _capabilities: Map<string, Capability> = new Map();\n /** Protocol v2 active render invocations — new Map instance on every mutation. */\n private _activeRenderInvocations: Map<string, RenderInvokedEvent> = new Map();\n /** Protocol v2 — most recent `protocol_info` event from the runner. */\n private _protocolInfo: ProtocolInfoEvent | null = null;\n /** Protocol v2 — latest incompatible-protocol notice. */\n private _incompatibleProtocol: IncompatibleProtocolEvent | null = null;\n\n private _snapshot: AgentStoreSnapshot | null = null;\n private readonly _listeners = new Set<() => void>();\n private readonly _unsubEvent: () => void;\n private readonly _unsubStatus: (() => void) | undefined;\n\n /**\n * @param options - Store configuration including transport and optional pagination support.\n */\n constructor(options: AgentStoreOptions) {\n this._options = options;\n this._messages = options.initialMessages ? [...options.initialMessages] : [];\n this._isAllLoaded = !options.loadMessages;\n this._seq = this._messages.reduce((max, m) => Math.max(max, m.seq), 0);\n\n this._unsubEvent = options.onEvent((event) => this._handleEvent(event));\n this._unsubStatus = options.onStatusChange?.((status) => this.setStatus(status));\n }\n\n // -- Reactive state --------------------------------------------------------\n\n /** Accumulated conversation messages, oldest first. */\n get messages(): readonly Message[] {\n return this._messages;\n }\n\n /** Text currently streaming from the agent. Empty when not streaming. */\n get streamingText(): string {\n return this._streamingText;\n }\n\n /** Current connection lifecycle state. */\n get status(): ConnectionStatus {\n return this._status;\n }\n\n /** Current agent execution phase (e.g. `\"idle\"`, `\"thinking\"`, `\"executing\"`). */\n get phase(): AgentPhase {\n return this._phase;\n }\n\n /** The pending question the agent is waiting for the user to answer, or null. */\n get pendingQuestion(): AgentStoreSnapshot[\"pendingQuestion\"] {\n return this._pendingQuestion;\n }\n\n /** Most recent error, or null when no error is active. */\n get error(): AgentStoreSnapshot[\"error\"] {\n return this._error;\n }\n\n /** Partial text that was visible when the user cancelled. Empty when not cancelled. */\n get cancelledText(): string {\n return this._cancelledText;\n }\n\n /** True when there are no more older messages to load via pagination. */\n get isAllLoaded(): boolean {\n return this._isAllLoaded;\n }\n\n // -- Commands --------------------------------------------------------------\n\n /**\n * Send a user prompt to the agent and optimistically update local state.\n *\n * Clears any previous error and cancelled text, sets phase to `\"thinking\"`,\n * and appends the prompt as a local message before forwarding to the agent.\n *\n * @param text - The user's prompt text.\n */\n prompt(text: string): void {\n // A prompt sent mid-turn (sender interjecting while the agent streams) is a\n // boundary: finalize the in-flight text before this prompt so the two don't\n // merge into one bubble. No-op at turn start (nothing streaming).\n this._flushStreaming();\n this._error = null;\n this._cancelledText = \"\";\n this._streamingFlushed = false;\n // A free-form prompt abandons any unanswered question: the turn it belonged\n // to is over. Left set, it would gate every status of the new turn.\n this._setOpenQuestions([]);\n this._phase = \"thinking\";\n this._appendMessage({ type: \"prompt\", prompt: text }, \"user\");\n this._options.send({ type: \"prompt\", prompt: text });\n this._notify();\n }\n\n /**\n * Send a reply to the agent's pending question.\n *\n * Closes the answered sub-question locally before forwarding the reply command.\n *\n * @param answer - The user's answer text.\n * @param question - The sub-question being answered, verbatim from its\n * `question` event. Required for correctness in hosts that surface several\n * queued questions at once ({@link pendingQuestion} tracks only the latest,\n * so those hosts drive this from their own message history): without it the\n * agent files the answer under its next unanswered sub-question, which\n * mismatches any non-sequential reply.\n * @param requestId - Exact identity from the rendered question; never inferred from pending state.\n *\n * A multi-question ask stays parked until every sub-question has an answer:\n * until the last one, the phase stays idle and {@link pendingQuestion} moves\n * to the latest sub-question still open.\n */\n reply(answer: string, question?: string, requestId?: string): void {\n // A reply to a stale card must not clear a newer request in this client.\n if (this._pendingQuestion?.requestId && this._pendingQuestion.requestId !== requestId) return;\n if (this._openQuestions.length > 0) {\n // Same slot rule as the drivers: a name from this ask binds to its own\n // sub-question (re-answering a closed one closes nothing else), anything\n // else fills the oldest open one.\n const known = question !== undefined && this._askQuestions.has(question);\n const index = known ? this._openIndexOf(question) : 0;\n if (index !== -1) {\n this._setOpenQuestions(this._openQuestions.filter((_, i) => i !== index));\n }\n if (question === undefined && this._openQuestions.length > 0) this._unnamedEchoesOwed++;\n }\n // Answering the last open question resumes the agent turn — restore the\n // busy phase (mirrors prompt()) so the thinking indicator reappears at once\n // rather than after the agent's first resumed event lands.\n if (this._openQuestions.length === 0) this._phase = \"thinking\";\n const command = {\n type: \"reply\",\n answer,\n ...(question !== undefined ? { question } : {}),\n ...(requestId !== undefined ? { requestId } : {}),\n } as const;\n this._appendMessage(command, \"user\");\n this._options.send(command);\n this._notify();\n }\n\n /**\n * Cancel the current agent turn.\n *\n * Preserves partial streaming text in {@link cancelledText} so the UI can\n * display it. Clears streaming state, sets phase to `\"cancelling\"` (not\n * yet confirmed idle — see {@link AgentPhase}), and sends a `cancel`\n * command to the agent.\n */\n cancel(): void {\n // Preserve partial streaming text so the UI can still display it\n this._cancelledText = this._streamingText;\n this._streamingText = \"\";\n this._streamingFlushed = true;\n this._phase = \"cancelling\";\n this._options.send({ type: \"cancel\" });\n this._notify();\n }\n\n /**\n * Update shared state for a store namespace.\n *\n * Sends a `state_update` command to the agent and optimistically\n * updates local state so the change is reflected immediately.\n *\n * @param store - Store namespace (e.g. \"app\", \"component:render-123\").\n * @param state - Full state snapshot (replaces previous).\n */\n updateState(store: string, state: Record<string, unknown>): void {\n this._options.send({ type: \"state_update\", store, state });\n if (isSameJsonValue(this._sharedState.get(store), state, true)) return;\n // Optimistic local update\n this._sharedState = new Map(this._sharedState);\n this._sharedState.set(store, state);\n this._notify();\n }\n\n /**\n * Send an arbitrary command to the agent.\n *\n * Use this for commands that don't have a dedicated convenience method\n * (e.g. `ui_interaction`). No local state changes — the command is\n * forwarded as-is to the transport.\n *\n * @param cmd - The command to send.\n */\n send(cmd: AgentCommand): void {\n this._options.send(cmd);\n }\n\n /**\n * Load the previous page of messages and prepend them to the current list.\n *\n * No-op when `loadMessages` was not provided at construction time or when\n * all history has already been loaded ({@link isAllLoaded} is true).\n * Sets {@link isAllLoaded} to true once the server returns fewer messages\n * than the configured page size.\n */\n async loadPreviousMessages(): Promise<void> {\n if (!this._options.loadMessages || this._isAllLoaded) return;\n\n const pageSize = this._options.pageSize ?? DEFAULT_PAGE_SIZE;\n const before = this._messages.length > 0 ? this._messages[0].seq : undefined;\n const older = await this._options.loadMessages({ before, limit: pageSize });\n\n if (older.length < pageSize) this._isAllLoaded = true;\n\n const existingIds = new Set(this._messages.map((m) => m.id));\n const unique = older.filter((m) => !existingIds.has(m.id));\n this._messages = [...unique, ...this._messages];\n\n this._notify();\n }\n\n // -- External control ------------------------------------------------------\n\n /**\n * Programmatically update the connection status.\n *\n * Called by transport wrappers that cannot use the `onStatusChange`\n * callback (e.g. tRPC subscriptions that track status externally).\n *\n * Writing the status the store already holds is a no-op: it neither rotates\n * the snapshot nor notifies listeners.\n *\n * @param status - The new connection status.\n */\n setStatus(status: ConnectionStatus): void {\n if (this._status === status) return;\n this._status = status;\n this._notify();\n }\n\n // -- useSyncExternalStore interface ----------------------------------------\n\n /**\n * Register a change listener. Called synchronously after every state change.\n *\n * Conforms to the `subscribe` parameter of React's `useSyncExternalStore`.\n *\n * @param listener - Callback invoked whenever state changes.\n * @returns Unsubscribe function — call to stop receiving notifications.\n */\n subscribe = (listener: () => void): (() => void) => {\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n };\n\n /**\n * Return the current immutable state snapshot.\n *\n * A new object is produced lazily on the first call after each state change.\n * Subsequent calls return the same cached object until the next change.\n * Conforms to the `getSnapshot` parameter of React's `useSyncExternalStore`.\n */\n getSnapshot = (): AgentStoreSnapshot => {\n if (!this._snapshot) {\n this._snapshot = {\n messages: this._messages,\n streamingText: this._streamingText,\n cancelledText: this._cancelledText,\n status: this._status,\n phase: this._phase,\n pendingQuestion: this._pendingQuestion,\n error: this._error,\n isAllLoaded: this._isAllLoaded,\n sharedState: this._sharedState,\n capabilities: this._capabilities,\n activeRenderInvocations: this._activeRenderInvocations,\n protocolInfo: this._protocolInfo,\n incompatibleProtocol: this._incompatibleProtocol,\n };\n }\n return this._snapshot;\n };\n\n // -- Cleanup ---------------------------------------------------------------\n\n /**\n * Unsubscribe from transport events and clear all change listeners.\n *\n * Call this when the component or service that owns the store unmounts or\n * shuts down to prevent memory leaks.\n */\n dispose(): void {\n this._unsubEvent();\n this._unsubStatus?.();\n this._listeners.clear();\n }\n\n // -- Factory ---------------------------------------------------------------\n\n /**\n * Create an {@link AgentStore} connected to a duck-typed agent client.\n *\n * Adapts the client's `send`/`onEvent`/`offEvent` API to the\n * {@link StoreTransport} interface expected by the constructor, without\n * creating a hard runtime dependency on `@skaile/workspaces/client`.\n *\n * @param client - Any object implementing {@link AgentClientLike}.\n * @param opts - Optional store configuration.\n * @param opts.sessionId - Session ID for message envelopes (defaults to a new UUID).\n * @param opts.initialMessages - Messages to pre-populate the store with.\n *\n * @example\n * ```ts\n * const store = AgentStore.fromClient(agentClient, { sessionId: 'sess-123' })\n * ```\n */\n static fromClient(\n client: AgentClientLike,\n opts?: { sessionId?: string; initialMessages?: Message[] },\n ): AgentStore {\n return new AgentStore({\n sessionId: opts?.sessionId ?? crypto.randomUUID(),\n send: (cmd) => client.send(cmd),\n onEvent: (handler) => {\n client.onEvent(handler);\n return () => client.offEvent(handler);\n },\n initialMessages: opts?.initialMessages,\n });\n }\n\n // -- Internal --------------------------------------------------------------\n\n /** Replace the open sub-questions; `pendingQuestion` follows the latest one. */\n private _setOpenQuestions(open: QuestionEvent[]): void {\n this._openQuestions = open;\n this._pendingQuestion = open.at(-1) ?? null;\n if (open.length === 0) {\n this._askQuestions = new Set();\n this._unnamedEchoesOwed = 0;\n }\n }\n\n private _openIndexOf(question: string): number {\n return this._openQuestions.findIndex((q) => q.question === question);\n }\n\n private _handleEvent(event: AgentEvent): void {\n switch (event.type) {\n case \"text\":\n this._cancelledText = \"\";\n this._streamingText += event.content;\n this._streamingFlushed = false;\n break;\n\n case \"text_retract\":\n // The driver abandoned an attempt mid-message and is replaying it. Cut\n // only a matching tail: text already flushed into a message, or a\n // stream that no longer ends in the fragment, is left as it is.\n if (!event.content || !this._streamingText.endsWith(event.content)) return;\n this._streamingText = this._streamingText.slice(\n 0,\n this._streamingText.length - event.content.length,\n );\n break;\n\n case \"finished\":\n this._cancelledText = \"\";\n this._flushStreaming();\n this._appendMessage(event);\n // A cancelled finished is synthetic (persisted immediately for reload-\n // durability) and precedes the driver's real abort/kill sequence — stay\n // \"cancelling\" until the later, genuine status event reports \"idle\".\n if (!event.cancelled) this._phase = \"idle\";\n this._setOpenQuestions([]);\n break;\n\n case \"status\":\n // While cancelling, the driver's interrupt/unwind window can still emit\n // stale \"working\" statuses for already-buffered tool activity — ignore\n // anything but the genuine idle confirmation.\n if (this._phase === \"cancelling\" && event.phase !== \"idle\") return;\n // A parked question is the same shape: the driver re-emits the turn's\n // buffered tool activity — including one call for the question tool\n // itself — while nothing is actually running. Only the genuine idle\n // confirmation may move the phase until the user answers.\n if (this._pendingQuestion !== null && event.phase !== \"idle\") return;\n // The bridge re-emits phase:\"working\" on every tool call, so most status\n // events in a turn carry the phase we already hold. `_notify()` rotates\n // the snapshot, so notifying for them re-renders consumers for nothing.\n if (this._phase === event.phase) return;\n this._phase = event.phase;\n break;\n\n case \"user_message\":\n // A peer's message mid-turn is a boundary: finalize the in-flight text\n // so it renders before the interjection. Flush-only — the peer message\n // is delivered via the host's history, not this transient echo. The\n // flush is internally conditional, so an echo arriving while nothing is\n // streaming (the common case — peers talk between turns) changed no\n // state and notifying for it was a pure fanout.\n if (!this._flushStreaming()) return;\n break;\n\n case \"question_reply\": {\n // A peer answered: close its sub-question the same way `reply()` does.\n // The runner echoes every reply to all clients, so the replier's own\n // echo (its sub-question already closed) must leave this client\n // untouched. A named echo finds nothing left to close; an unnamed one\n // is matched by count. A complete arm rather than a fall through into\n // the group below: sharing that body once let a tool_call clear the flag.\n const pending = this._pendingQuestion;\n if (pending === null) return;\n if (pending.requestId !== undefined && pending.requestId !== event.requestId) return;\n let index = 0;\n if (event.question !== undefined) {\n index = this._openIndexOf(event.question);\n if (index === -1) return;\n } else if (this._unnamedEchoesOwed > 0) {\n this._unnamedEchoesOwed--;\n return;\n }\n this._setOpenQuestions(this._openQuestions.filter((_, i) => i !== index));\n this._flushStreaming();\n this._appendMessage(event);\n break;\n }\n\n case \"tool_call\":\n case \"tool_result\":\n case \"file_changed\":\n case \"subagent\":\n case \"dev_server\":\n case \"handoff\":\n // Flush in-flight text first so each text block becomes its own\n // Message, interleaved with tool activity in order — otherwise text\n // before and after a tool call merges into one wall-of-text blob.\n this._flushStreaming();\n this._appendMessage(event);\n break;\n\n case \"question\":\n // A pending question is a human-in-the-loop pause — the agent is waiting\n // for the user, not working. Reset to idle (like finished/error) so any\n // phase-derived busy indicator clears until the user replies.\n this._flushStreaming();\n this._phase = \"idle\";\n // One event arrives per sub-question. A different requestId is a new\n // ask; the same one (or none, as claude-sdk sends) extends the open set.\n if (this._openQuestions[0]?.requestId !== event.requestId) this._setOpenQuestions([]);\n this._setOpenQuestions([\n ...this._openQuestions.filter((q) => q.question !== event.question),\n event,\n ]);\n this._askQuestions.add(event.question);\n this._appendMessage(event);\n break;\n\n case \"error\":\n this._error = { message: event.message, fatal: event.fatal };\n this._streamingText = \"\";\n this._streamingFlushed = true;\n this._phase = \"idle\";\n // A fatal error ends the turn like `finished`; a surviving question would\n // keep the status gate shut. Non-fatal side-channel errors leave it parked.\n if (event.fatal) this._setOpenQuestions([]);\n this._appendMessage(event);\n break;\n\n case \"state_changed\": {\n // Accumulate state per store namespace (notify only — no message).\n // Re-emits of unchanged state are routine, not exceptional: `serve.ts`\n // replays every namespace on connect (`buildStoreSnapshotReplay`), on a\n // seeded execution, on re-registering an already-registered store, and\n // immediately after registration — and the `xstate-store` adapter is\n // equality-free, so writing a key its current value emits too. Each of\n // those rebuilt the Map and rotated the snapshot for identical state.\n if (isSameJsonValue(this._sharedState.get(event.store), event.state)) return;\n this._sharedState = new Map(this._sharedState);\n this._sharedState.set(event.store, event.state);\n break;\n }\n\n // ── Protocol v2 ────────────────────────────────────────────────────────\n\n case \"capability_register\": {\n // TRANSIENT — accumulate v2 capabilities into the registry (no message).\n // The gateway replays the whole set on every (re)attach; a byte-identical\n // replay must not rotate the Map identity or notify, or a reconnect storm\n // compounds into an unbounded render loop in consumers.\n if (\n event.capabilities.every((cap) => isSameJsonValue(this._capabilities.get(cap.name), cap))\n ) {\n return;\n }\n this._capabilities = new Map(this._capabilities);\n for (const cap of event.capabilities) {\n this._capabilities.set(cap.name, cap);\n }\n break;\n }\n\n case \"capability_deregister\": {\n // TRANSIENT — drop capabilities by name. Names we never had are a no-op:\n // rebuilding the Map for them would notify with an identical registry.\n const present = event.names.filter((name) => this._capabilities.has(name));\n if (present.length === 0) return;\n this._capabilities = new Map(this._capabilities);\n for (const name of present) {\n this._capabilities.delete(name);\n }\n break;\n }\n\n case \"render_invoked\":\n // TRANSIENT — record latest render invocation (frontend pairs with\n // the matching `Capability.render` for placement).\n this._activeRenderInvocations = new Map(this._activeRenderInvocations);\n this._activeRenderInvocations.set(event.callId, event);\n break;\n\n case \"protocol_info\": {\n // TRANSIENT — runner announced its protocol version. It announces on\n // every attach, so tab mounts, StrictMode remounts and SSE reconnects\n // almost always carry the version we already hold. `ProtocolInfoEvent`\n // is nothing but `version`, and `ProtocolVersion` is exactly three\n // numbers, so the field comparison is complete, not conservative.\n //\n // A fresh announcement also retires any incompatibility notice: the\n // platform restarts the session on `incompatible_protocol`, and this\n // event is the replacement container introducing itself. Nothing cleared\n // `_incompatibleProtocol` before, so the restart banner was sticky for\n // the life of the store even though the platform's debug pane documents\n // this clear as already happening. Guarding without clearing would make\n // that permanent, since a repeat announcement would never get here.\n const held = this._protocolInfo?.version;\n const sameVersion =\n held !== undefined &&\n held.major === event.version.major &&\n held.minor === event.version.minor &&\n held.patch === event.version.patch;\n if (sameVersion && this._incompatibleProtocol === null) return;\n // Keep the held event object when the version is unchanged so consumers\n // with an effect keyed on `snapshot.protocolInfo` do not re-fire.\n if (!sameVersion) this._protocolInfo = event;\n this._incompatibleProtocol = null;\n break;\n }\n\n case \"incompatible_protocol\":\n // TRANSIENT — runner detected version drift; platform restarts session.\n this._incompatibleProtocol = event;\n break;\n\n case \"capability_invoked\":\n // Backend intercepts client-side invocations and dispatches them\n // through V2CapabilityRegistryService — frontends should not see\n // these. Drop silently if one slips through.\n return;\n\n case \"resource_response\":\n case \"resources_available\":\n // Transient — handled by ResourceClient, not AgentStore\n return;\n\n default:\n // The switch names 22 of `AgentEvent`'s 56 members. The other 34 —\n // `log_entry` above all, one per line of container output — hold no\n // AgentStore state, so falling through to the trailing `_notify()`\n // rotated the snapshot and re-rendered every consumer for state that\n // had not changed. Unlike the guarded cases this was not a replay\n // artifact: it happened on every single occurrence. Hosts that need\n // these events (log panels, mount indicators, typing bubbles) read them\n // off the transport upstream of the store, not out of the snapshot.\n //\n // Deliberately not an `assertNever` exhaustiveness check: that is a\n // compile error while 34 members are unnamed, and naming all 56 would\n // enumerate events the store holds no state for just to satisfy it.\n return;\n }\n\n this._notify();\n }\n\n /**\n * Finalize buffered streaming text as a `text` Message.\n *\n * @returns true when text was flushed; false when there was nothing to flush,\n * so callers can skip a notify that would change nothing.\n */\n private _flushStreaming(): boolean {\n if (this._streamingFlushed || !this._streamingText) return false;\n this._appendMessage({ type: \"text\", content: this._streamingText });\n this._streamingText = \"\";\n this._streamingFlushed = true;\n return true;\n }\n\n private _appendMessage(payload: AgentCommand | AgentEvent, senderId?: string): void {\n this._seq++;\n this._messages = [\n ...this._messages,\n {\n id: crypto.randomUUID(),\n seq: this._seq,\n timestamp: new Date().toISOString(),\n sessionId: this._options.sessionId,\n ...(senderId ? { senderId } : {}),\n payload,\n },\n ];\n }\n\n private _notify(): void {\n this._snapshot = null;\n for (const listener of this._listeners) {\n listener();\n }\n }\n}\n"]}