@skaile/workspaces 0.29.1 → 0.30.1

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 (472) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/{asset-feeds-2V7LZIG7.js → asset-feeds-IWOBYROH.js} +14 -13
  3. package/dist/asset-feeds-IWOBYROH.js.map +1 -0
  4. package/dist/asset-manager/index.js +12 -12
  5. package/dist/asset-manager/installer.js +11 -11
  6. package/dist/asset-manager/renderers.js +2 -2
  7. package/dist/asset-manager/src/index.d.ts +27 -0
  8. package/dist/asset-manager/src/index.d.ts.map +1 -1
  9. package/dist/asset-manager/src/install-agent.d.ts.map +1 -1
  10. package/dist/asset-manager/src/installer.d.ts +1 -2
  11. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  12. package/dist/asset-manager/src/renderers.d.ts.map +1 -1
  13. package/dist/bridge/drivers/claude-sdk.js +324 -226
  14. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  15. package/dist/bridge/drivers/codex.js +3 -3
  16. package/dist/bridge/drivers/codex.js.map +1 -1
  17. package/dist/bridge/drivers/continue.js +4 -4
  18. package/dist/bridge/drivers/echo.js +2 -2
  19. package/dist/bridge/drivers/echo.js.map +1 -1
  20. package/dist/bridge/drivers/gemini.js +5 -5
  21. package/dist/bridge/drivers/goose.js +4 -4
  22. package/dist/bridge/drivers/omp.js +3 -3
  23. package/dist/bridge/drivers/opencode.js +4 -4
  24. package/dist/bridge/drivers/qwen.js +5 -5
  25. package/dist/bridge/index.js +4 -4
  26. package/dist/bridge/src/drivers/claude-sdk.d.ts +64 -0
  27. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  28. package/dist/bridge/src/drivers/echo.d.ts +1 -1
  29. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  30. package/dist/bridge/src/error-classifier.d.ts.map +1 -1
  31. package/dist/bridge/src/normalizer.d.ts +5 -0
  32. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  33. package/dist/{chunk-LDUNTZB6.js → chunk-26L2B6P6.js} +2 -2
  34. package/dist/{chunk-LDUNTZB6.js.map → chunk-26L2B6P6.js.map} +1 -1
  35. package/dist/{chunk-FWHOU3CX.js → chunk-2VKVWN5E.js} +6 -6
  36. package/dist/{chunk-FWHOU3CX.js.map → chunk-2VKVWN5E.js.map} +1 -1
  37. package/dist/{chunk-2FS4FPZ7.js → chunk-4AGIEU7V.js} +44 -62
  38. package/dist/chunk-4AGIEU7V.js.map +1 -0
  39. package/dist/{chunk-ZONCCO5N.js → chunk-4R6DROGN.js} +30 -32
  40. package/dist/chunk-4R6DROGN.js.map +1 -0
  41. package/dist/{chunk-3QQSSRYN.js → chunk-5DQOZFWJ.js} +416 -345
  42. package/dist/chunk-5DQOZFWJ.js.map +1 -0
  43. package/dist/{chunk-LD4QIVBY.js → chunk-5MJJYIL4.js} +3 -3
  44. package/dist/{chunk-LD4QIVBY.js.map → chunk-5MJJYIL4.js.map} +1 -1
  45. package/dist/{chunk-AKSR434V.js → chunk-5XAQDOMU.js} +79 -56
  46. package/dist/chunk-5XAQDOMU.js.map +1 -0
  47. package/dist/{chunk-MBOR7D65.js → chunk-67MFR5LS.js} +3 -3
  48. package/dist/{chunk-MBOR7D65.js.map → chunk-67MFR5LS.js.map} +1 -1
  49. package/dist/{chunk-7GWYRVAX.js → chunk-6LW7Q53Z.js} +162 -165
  50. package/dist/chunk-6LW7Q53Z.js.map +1 -0
  51. package/dist/{chunk-SF4GWVR5.js → chunk-6TCOYFVJ.js} +86 -55
  52. package/dist/chunk-6TCOYFVJ.js.map +1 -0
  53. package/dist/{chunk-QMONOHXT.js → chunk-74UKG2LA.js} +3 -3
  54. package/dist/{chunk-QMONOHXT.js.map → chunk-74UKG2LA.js.map} +1 -1
  55. package/dist/{chunk-JIQLLZ65.js → chunk-7MANNJ3U.js} +534 -235
  56. package/dist/chunk-7MANNJ3U.js.map +1 -0
  57. package/dist/{chunk-7R6W5EQR.js → chunk-ACXLKNIM.js} +2 -2
  58. package/dist/{chunk-7R6W5EQR.js.map → chunk-ACXLKNIM.js.map} +1 -1
  59. package/dist/{chunk-72IA6BTP.js → chunk-AKYEI3D6.js} +9 -9
  60. package/dist/{chunk-72IA6BTP.js.map → chunk-AKYEI3D6.js.map} +1 -1
  61. package/dist/{chunk-CMG3GJ6B.js → chunk-DAI754GK.js} +4 -4
  62. package/dist/{chunk-CMG3GJ6B.js.map → chunk-DAI754GK.js.map} +1 -1
  63. package/dist/{chunk-OTFG5Q7H.js → chunk-FRRTUVUM.js} +4594 -4480
  64. package/dist/chunk-FRRTUVUM.js.map +1 -0
  65. package/dist/{chunk-TV72ZJYN.js → chunk-GXC3TYMQ.js} +60 -47
  66. package/dist/chunk-GXC3TYMQ.js.map +1 -0
  67. package/dist/{chunk-IERB3UXJ.js → chunk-H5YXL4KI.js} +83 -69
  68. package/dist/chunk-H5YXL4KI.js.map +1 -0
  69. package/dist/{chunk-QDJKE557.js → chunk-HRKB2ATT.js} +64 -64
  70. package/dist/chunk-HRKB2ATT.js.map +1 -0
  71. package/dist/{chunk-ZEKWHJBB.js → chunk-IZIFMNTI.js} +3 -3
  72. package/dist/{chunk-ZEKWHJBB.js.map → chunk-IZIFMNTI.js.map} +1 -1
  73. package/dist/{chunk-24UIWON4.js → chunk-JB35MVBN.js} +167 -156
  74. package/dist/chunk-JB35MVBN.js.map +1 -0
  75. package/dist/{chunk-UIZKIUC6.js → chunk-KHZI44SS.js} +3 -3
  76. package/dist/chunk-KHZI44SS.js.map +1 -0
  77. package/dist/{chunk-5YO3H5Q4.js → chunk-KY5NY7LB.js} +3 -3
  78. package/dist/chunk-KY5NY7LB.js.map +1 -0
  79. package/dist/{chunk-MIH45XPY.js → chunk-LA2YSXEE.js} +1974 -1919
  80. package/dist/chunk-LA2YSXEE.js.map +1 -0
  81. package/dist/{chunk-IEJ5IOC3.js → chunk-LFDZYCEO.js} +4 -2
  82. package/dist/chunk-LFDZYCEO.js.map +1 -0
  83. package/dist/{chunk-2NOE4AGD.js → chunk-LIK75OJ5.js} +3 -3
  84. package/dist/{chunk-2NOE4AGD.js.map → chunk-LIK75OJ5.js.map} +1 -1
  85. package/dist/{chunk-PAYAFNXG.js → chunk-NGJ6E344.js} +104 -74
  86. package/dist/chunk-NGJ6E344.js.map +1 -0
  87. package/dist/{chunk-5V5KZQIC.js → chunk-PVMAIVNL.js} +4 -4
  88. package/dist/{chunk-5V5KZQIC.js.map → chunk-PVMAIVNL.js.map} +1 -1
  89. package/dist/{chunk-HK5FRWG6.js → chunk-R6O6YWU7.js} +2 -2
  90. package/dist/{chunk-HK5FRWG6.js.map → chunk-R6O6YWU7.js.map} +1 -1
  91. package/dist/{chunk-PRLD7EXG.js → chunk-SBGHNXJD.js} +2 -2
  92. package/dist/{chunk-PRLD7EXG.js.map → chunk-SBGHNXJD.js.map} +1 -1
  93. package/dist/{chunk-5RBPPBEK.js → chunk-SCJD3FMO.js} +4 -4
  94. package/dist/{chunk-5RBPPBEK.js.map → chunk-SCJD3FMO.js.map} +1 -1
  95. package/dist/{chunk-BZ2JU7IP.js → chunk-TU4VZULO.js} +5 -5
  96. package/dist/{chunk-BZ2JU7IP.js.map → chunk-TU4VZULO.js.map} +1 -1
  97. package/dist/{chunk-DVMSGGCM.js → chunk-VGFYUD3T.js} +158 -108
  98. package/dist/chunk-VGFYUD3T.js.map +1 -0
  99. package/dist/{chunk-Z3XXKR5E.js → chunk-WDMH4UMD.js} +4 -6
  100. package/dist/chunk-WDMH4UMD.js.map +1 -0
  101. package/dist/{chunk-W7W66MDZ.js → chunk-X46FY45B.js} +44 -42
  102. package/dist/chunk-X46FY45B.js.map +1 -0
  103. package/dist/{chunk-JKNWJ64A.js → chunk-XGCXFX7X.js} +2 -2
  104. package/dist/{chunk-JKNWJ64A.js.map → chunk-XGCXFX7X.js.map} +1 -1
  105. package/dist/{chunk-MLJKA3S6.js → chunk-XOAF5QAE.js} +2094 -1901
  106. package/dist/chunk-XOAF5QAE.js.map +1 -0
  107. package/dist/{chunk-FQHHCICT.js → chunk-XVDXGQ55.js} +226 -226
  108. package/dist/chunk-XVDXGQ55.js.map +1 -0
  109. package/dist/{chunk-M4KLIEIJ.js → chunk-YBJLYT4S.js} +3 -3
  110. package/dist/chunk-YBJLYT4S.js.map +1 -0
  111. package/dist/{chunk-OKRUTSG7.js → chunk-ZDKJHQY2.js} +2 -2
  112. package/dist/{chunk-OKRUTSG7.js.map → chunk-ZDKJHQY2.js.map} +1 -1
  113. package/dist/{chunk-UBCZVONU.js → chunk-ZME3JDA6.js} +3 -3
  114. package/dist/{chunk-UBCZVONU.js.map → chunk-ZME3JDA6.js.map} +1 -1
  115. package/dist/cli/index.js +2811 -2662
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/src/asset-feeds.d.ts +0 -9
  118. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  119. package/dist/cli/src/commands/catalog-cmd.d.ts.map +1 -1
  120. package/dist/cli/src/commands/catalog.d.ts.map +1 -1
  121. package/dist/cli/src/commands/config.d.ts.map +1 -1
  122. package/dist/cli/src/commands/deploy.d.ts.map +1 -1
  123. package/dist/cli/src/commands/integration.d.ts.map +1 -1
  124. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  125. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  126. package/dist/cli/src/commands/preset-cmd.d.ts.map +1 -1
  127. package/dist/cli/src/commands/project.d.ts +1 -1
  128. package/dist/cli/src/commands/project.d.ts.map +1 -1
  129. package/dist/cli/src/commands/show.d.ts.map +1 -1
  130. package/dist/cli/src/commands/source.d.ts.map +1 -1
  131. package/dist/cli/src/commands/validate.d.ts.map +1 -1
  132. package/dist/cli/src/ensure-sources.d.ts.map +1 -1
  133. package/dist/cli/src/flow-discovery.d.ts.map +1 -1
  134. package/dist/cli/src/open-registry.d.ts.map +1 -1
  135. package/dist/cli/src/plugin-store/index.d.ts +4 -6
  136. package/dist/cli/src/plugin-store/index.d.ts.map +1 -1
  137. package/dist/cli/src/plugin-store/paths.d.ts +0 -2
  138. package/dist/cli/src/plugin-store/paths.d.ts.map +1 -1
  139. package/dist/cli/src/setup.d.ts.map +1 -1
  140. package/dist/connectors/config.js +9 -9
  141. package/dist/connectors/index.js +12 -12
  142. package/dist/connectors/rclone.js +2 -2
  143. package/dist/connectors/src/connector-prompt.d.ts.map +1 -1
  144. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  145. package/dist/connectors/src/connector-types.d.ts +1 -1
  146. package/dist/connectors/src/connector-types.d.ts.map +1 -1
  147. package/dist/connectors/src/index.d.ts +5 -5
  148. package/dist/connectors/src/index.d.ts.map +1 -1
  149. package/dist/connectors/src/managed-gitconfig.d.ts.map +1 -1
  150. package/dist/{connectors-PTCSHCHZ.js → connectors-DY7UBBV5.js} +3 -3
  151. package/dist/{connectors-PTCSHCHZ.js.map → connectors-DY7UBBV5.js.map} +1 -1
  152. package/dist/connectors-shared/src/index.d.ts +1 -1
  153. package/dist/connectors-shared/src/index.d.ts.map +1 -1
  154. package/dist/core/index.js +8 -8
  155. package/dist/core/logging.js +1 -1
  156. package/dist/core/manifest.js +2 -2
  157. package/dist/core/models.js +1 -1
  158. package/dist/core/publish-manifest.js +2 -2
  159. package/dist/core/runtime-assets.js +5 -5
  160. package/dist/core/src/lock.d.ts +0 -9
  161. package/dist/core/src/lock.d.ts.map +1 -1
  162. package/dist/core/src/logging/create-logger.d.ts.map +1 -1
  163. package/dist/core/src/logging/index.d.ts +11 -11
  164. package/dist/core/src/logging/index.d.ts.map +1 -1
  165. package/dist/core/src/logging/log-store.d.ts.map +1 -1
  166. package/dist/core/src/logging/sinks/no-op-sink.d.ts.map +1 -1
  167. package/dist/core/src/logging/sinks/sqlite-sink.d.ts.map +1 -1
  168. package/dist/core/src/manifest.d.ts.map +1 -1
  169. package/dist/core/src/models.d.ts +6 -0
  170. package/dist/core/src/models.d.ts.map +1 -1
  171. package/dist/core/src/publish-manifest.d.ts.map +1 -1
  172. package/dist/core/src/repo-manager.d.ts +0 -12
  173. package/dist/core/src/repo-manager.d.ts.map +1 -1
  174. package/dist/core/src/runtime-assets.d.ts.map +1 -1
  175. package/dist/core/src/store.d.ts +1 -1
  176. package/dist/core/src/store.d.ts.map +1 -1
  177. package/dist/core/src/walker.d.ts.map +1 -1
  178. package/dist/core/src/workspace-config.d.ts +0 -27
  179. package/dist/core/src/workspace-config.d.ts.map +1 -1
  180. package/dist/core/store.js +1 -1
  181. package/dist/core/workspace-config.js +4 -4
  182. package/dist/deploy/index.js +8 -8
  183. package/dist/discovery/index.js +6 -6
  184. package/dist/discovery/src/asset-kind-registry.d.ts +1 -1
  185. package/dist/discovery/src/asset-kind-registry.d.ts.map +1 -1
  186. package/dist/discovery/src/builtin-providers.d.ts.map +1 -1
  187. package/dist/discovery/src/discover-manifest.d.ts +1 -1
  188. package/dist/discovery/src/discover-manifest.d.ts.map +1 -1
  189. package/dist/discovery/src/discover.d.ts +30 -3
  190. package/dist/discovery/src/discover.d.ts.map +1 -1
  191. package/dist/discovery/src/domains.d.ts +144 -0
  192. package/dist/discovery/src/domains.d.ts.map +1 -0
  193. package/dist/discovery/src/index.d.ts +9 -7
  194. package/dist/discovery/src/index.d.ts.map +1 -1
  195. package/dist/discovery/src/source-config.d.ts +1 -1
  196. package/dist/discovery/src/source-config.d.ts.map +1 -1
  197. package/dist/discovery/src/tree-entries.d.ts +13 -1
  198. package/dist/discovery/src/tree-entries.d.ts.map +1 -1
  199. package/dist/ensure-sources-6GW6UBXY.js +84 -0
  200. package/dist/ensure-sources-6GW6UBXY.js.map +1 -0
  201. package/dist/factory-assets/connectors/deploy/adapter.d.ts +1 -1
  202. package/dist/factory-assets/connectors/deploy/adapter.d.ts.map +1 -1
  203. package/dist/factory-assets/connectors/deploy.js +12 -12
  204. package/dist/factory-assets/connectors/devserver/adapter.d.ts +1 -1
  205. package/dist/factory-assets/connectors/devserver/adapter.d.ts.map +1 -1
  206. package/dist/factory-assets/connectors/devserver.js +12 -12
  207. package/dist/factory-assets/connectors/flow/adapter.d.ts +16 -2
  208. package/dist/factory-assets/connectors/flow/adapter.d.ts.map +1 -1
  209. package/dist/factory-assets/connectors/flow/adapter.js +12 -12
  210. package/dist/factory-assets/connectors/flow/engine/flow-kind-provider.d.ts.map +1 -1
  211. package/dist/factory-assets/connectors/flow/engine/index.d.ts +3 -3
  212. package/dist/factory-assets/connectors/flow/engine/index.d.ts.map +1 -1
  213. package/dist/factory-assets/connectors/flow/engine.js +9 -9
  214. package/dist/factory-assets/connectors/flow/index.d.ts +1 -1
  215. package/dist/factory-assets/connectors/flow/index.d.ts.map +1 -1
  216. package/dist/factory-assets/connectors/flow/run-flow.js +15 -15
  217. package/dist/factory-assets/connectors/flow.js +12 -12
  218. package/dist/factory-assets/connectors/git/driver.d.ts +32 -0
  219. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  220. package/dist/factory-assets/connectors/git.js +12 -12
  221. package/dist/factory-assets/connectors/gmail/adapter.d.ts +1 -1
  222. package/dist/factory-assets/connectors/gmail/adapter.d.ts.map +1 -1
  223. package/dist/factory-assets/connectors/gmail.js +12 -12
  224. package/dist/factory-assets/connectors/googledrive.js +12 -12
  225. package/dist/factory-assets/connectors/local/driver.d.ts +1 -2
  226. package/dist/factory-assets/connectors/local/driver.d.ts.map +1 -1
  227. package/dist/factory-assets/connectors/local.js +12 -12
  228. package/dist/factory-assets/connectors/mattermost/adapter.d.ts +1 -1
  229. package/dist/factory-assets/connectors/mattermost/adapter.d.ts.map +1 -1
  230. package/dist/factory-assets/connectors/mattermost.js +12 -12
  231. package/dist/factory-assets/connectors/memory/adapter.d.ts.map +1 -1
  232. package/dist/factory-assets/connectors/memory.js +12 -12
  233. package/dist/factory-assets/connectors/minio/adapter.d.ts +1 -1
  234. package/dist/factory-assets/connectors/minio/adapter.d.ts.map +1 -1
  235. package/dist/factory-assets/connectors/minio.js +12 -12
  236. package/dist/factory-assets/connectors/postgres/adapter.d.ts +6 -1
  237. package/dist/factory-assets/connectors/postgres/adapter.d.ts.map +1 -1
  238. package/dist/factory-assets/connectors/postgres.js +12 -12
  239. package/dist/factory-assets/connectors/s3/driver.d.ts.map +1 -1
  240. package/dist/factory-assets/connectors/s3.js +12 -12
  241. package/dist/factory-assets/connectors/sharepoint.js +12 -12
  242. package/dist/factory-assets/connectors/sqlite/adapter.d.ts +1 -1
  243. package/dist/factory-assets/connectors/sqlite/adapter.d.ts.map +1 -1
  244. package/dist/factory-assets/connectors/sqlite.js +12 -12
  245. package/dist/factory-assets/connectors/static-server/adapter.d.ts +6 -1
  246. package/dist/factory-assets/connectors/static-server/adapter.d.ts.map +1 -1
  247. package/dist/factory-assets/connectors/static-server.js +12 -12
  248. package/dist/factory-assets/connectors/tunnel/adapter.d.ts +1 -1
  249. package/dist/factory-assets/connectors/tunnel/adapter.d.ts.map +1 -1
  250. package/dist/factory-assets/connectors/tunnel.js +12 -12
  251. package/dist/factory-assets/connectors/webdav.js +12 -12
  252. package/dist/factory-assets/connectors/xstate/adapter.d.ts +1 -1
  253. package/dist/factory-assets/connectors/xstate/adapter.d.ts.map +1 -1
  254. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts +7 -0
  255. package/dist/factory-assets/connectors/xstate-store/adapter.d.ts.map +1 -1
  256. package/dist/factory-assets/connectors/xstate-store.js +12 -12
  257. package/dist/factory-assets/connectors/xstate.js +12 -12
  258. package/dist/flows-JXO3KGC2.js +7 -0
  259. package/dist/{flows-L3GHQD7F.js.map → flows-JXO3KGC2.js.map} +1 -1
  260. package/dist/library/index.js +13 -13
  261. package/dist/library/install.js +9 -9
  262. package/dist/library/src/config.d.ts.map +1 -1
  263. package/dist/library/src/index.d.ts +27 -27
  264. package/dist/library/src/index.d.ts.map +1 -1
  265. package/dist/library/src/install/index.d.ts +2 -2
  266. package/dist/library/src/install/index.d.ts.map +1 -1
  267. package/dist/library/src/install/install-from-manifest.d.ts +0 -21
  268. package/dist/library/src/install/install-from-manifest.d.ts.map +1 -1
  269. package/dist/library/src/knowledge/index.d.ts +2 -2
  270. package/dist/library/src/knowledge/index.d.ts.map +1 -1
  271. package/dist/library/src/knowledge/knowledge-kind-provider.d.ts.map +1 -1
  272. package/dist/library/src/local/library.d.ts +2 -2
  273. package/dist/library/src/local/library.d.ts.map +1 -1
  274. package/dist/library/src/local/store-paths.d.ts.map +1 -1
  275. package/dist/library/src/pin-resolver.d.ts.map +1 -1
  276. package/dist/library/src/preset/apply.d.ts +2 -2
  277. package/dist/library/src/preset/apply.d.ts.map +1 -1
  278. package/dist/library/src/preset/index.d.ts +10 -10
  279. package/dist/library/src/preset/index.d.ts.map +1 -1
  280. package/dist/library/src/preset/parse.d.ts.map +1 -1
  281. package/dist/library/src/preset/resolve-item.d.ts +1 -1
  282. package/dist/library/src/preset/resolve-item.d.ts.map +1 -1
  283. package/dist/library/src/preset/upgrade.d.ts +1 -1
  284. package/dist/library/src/preset/upgrade.d.ts.map +1 -1
  285. package/dist/library/src/remote/index.d.ts +5 -5
  286. package/dist/library/src/remote/index.d.ts.map +1 -1
  287. package/dist/library/src/remote/remote-catalog-source.d.ts +1 -1
  288. package/dist/library/src/remote/remote-catalog-source.d.ts.map +1 -1
  289. package/dist/library/src/remote/rest-catalog-source.d.ts +1 -1
  290. package/dist/library/src/remote/rest-catalog-source.d.ts.map +1 -1
  291. package/dist/library/src/sync/driver.d.ts +1 -1
  292. package/dist/library/src/sync/driver.d.ts.map +1 -1
  293. package/dist/library/src/sync/git-driver.d.ts +1 -1
  294. package/dist/library/src/sync/git-driver.d.ts.map +1 -1
  295. package/dist/library/src/sync/local-driver.d.ts +1 -1
  296. package/dist/library/src/sync/local-driver.d.ts.map +1 -1
  297. package/dist/library/src/workspace-config.d.ts +0 -9
  298. package/dist/library/src/workspace-config.d.ts.map +1 -1
  299. package/dist/open-library-SH6NCJM2.js +23 -0
  300. package/dist/{open-library-3VJY74LQ.js.map → open-library-SH6NCJM2.js.map} +1 -1
  301. package/dist/paths-YSXGJ7TO.js +15 -0
  302. package/dist/{paths-CE66L3AL.js.map → paths-YSXGJ7TO.js.map} +1 -1
  303. package/dist/plugin-registry/src/targets.d.ts +2 -3
  304. package/dist/plugin-registry/src/targets.d.ts.map +1 -1
  305. package/dist/{plugin-store-GL5VKYUA.js → plugin-store-2KMDUF7R.js} +11 -14
  306. package/dist/plugin-store-2KMDUF7R.js.map +1 -0
  307. package/dist/plugins/index.js +1 -1
  308. package/dist/plugins/src/asset-kind-registry.d.ts +1 -1
  309. package/dist/plugins/src/asset-kind-registry.d.ts.map +1 -1
  310. package/dist/plugins/src/catalog-source.d.ts +5 -0
  311. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  312. package/dist/plugins/src/index.d.ts +5 -5
  313. package/dist/plugins/src/index.d.ts.map +1 -1
  314. package/dist/{provider-GAWKFQ3T.js → provider-ZPT443IX.js} +18 -16
  315. package/dist/provider-ZPT443IX.js.map +1 -0
  316. package/dist/resolver/index.js +1 -1
  317. package/dist/resolver/src/preamble.d.ts.map +1 -1
  318. package/dist/runner/index.js +17 -17
  319. package/dist/runner/src/builtin-capabilities.d.ts +12 -0
  320. package/dist/runner/src/builtin-capabilities.d.ts.map +1 -1
  321. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  322. package/dist/runner/src/compaction/index.d.ts +0 -4
  323. package/dist/runner/src/compaction/index.d.ts.map +1 -1
  324. package/dist/runner/src/compaction/orchestrator.d.ts +23 -2
  325. package/dist/runner/src/compaction/orchestrator.d.ts.map +1 -1
  326. package/dist/runner/src/composition/compile.d.ts.map +1 -1
  327. package/dist/runner/src/composition/index.d.ts +4 -4
  328. package/dist/runner/src/composition/index.d.ts.map +1 -1
  329. package/dist/runner/src/composition/resolve.d.ts.map +1 -1
  330. package/dist/runner/src/composition/types.d.ts +2 -2
  331. package/dist/runner/src/composition/types.d.ts.map +1 -1
  332. package/dist/runner/src/config.d.ts +2 -2
  333. package/dist/runner/src/config.d.ts.map +1 -1
  334. package/dist/runner/src/define-capability.d.ts +1 -1
  335. package/dist/runner/src/define-capability.d.ts.map +1 -1
  336. package/dist/runner/src/external-mcp.d.ts.map +1 -1
  337. package/dist/runner/src/index.d.ts +9 -9
  338. package/dist/runner/src/index.d.ts.map +1 -1
  339. package/dist/runner/src/logging-bootstrap.d.ts +1 -1
  340. package/dist/runner/src/logging-bootstrap.d.ts.map +1 -1
  341. package/dist/runner/src/manifest.d.ts.map +1 -1
  342. package/dist/runner/src/resource-handler.d.ts.map +1 -1
  343. package/dist/runner/src/resources.d.ts.map +1 -1
  344. package/dist/runner/src/runner-capabilities.d.ts +25 -0
  345. package/dist/runner/src/runner-capabilities.d.ts.map +1 -1
  346. package/dist/runner/src/serve.d.ts.map +1 -1
  347. package/dist/runner/src/session-builder.d.ts.map +1 -1
  348. package/dist/sdk/asset-manager.js +12 -12
  349. package/dist/sdk/bridge.js +4 -4
  350. package/dist/sdk/core.js +8 -8
  351. package/dist/sdk/flow.js +9 -9
  352. package/dist/sdk/index.js +92 -76
  353. package/dist/sdk/index.js.map +1 -1
  354. package/dist/sdk/resolver.js +1 -1
  355. package/dist/sdk/runner.js +17 -17
  356. package/dist/sdk/session.js +1 -1
  357. package/dist/sdk/src/agent-session.d.ts +8 -0
  358. package/dist/sdk/src/agent-session.d.ts.map +1 -1
  359. package/dist/sdk/src/factory.d.ts.map +1 -1
  360. package/dist/sdk/src/index.d.ts +2 -2
  361. package/dist/sdk/src/index.d.ts.map +1 -1
  362. package/dist/sdk/store.js +1 -1
  363. package/dist/sdk/telemetry.js +1 -1
  364. package/dist/secrets/index.js +2 -2
  365. package/dist/secrets/src/index.d.ts +8 -8
  366. package/dist/secrets/src/index.d.ts.map +1 -1
  367. package/dist/secrets/src/lifecycle.d.ts +1 -2
  368. package/dist/secrets/src/lifecycle.d.ts.map +1 -1
  369. package/dist/secrets/src/providers/env.d.ts +1 -1
  370. package/dist/secrets/src/providers/env.d.ts.map +1 -1
  371. package/dist/secrets/src/providers/local.d.ts +1 -1
  372. package/dist/secrets/src/providers/local.d.ts.map +1 -1
  373. package/dist/secrets/src/router.d.ts +1 -1
  374. package/dist/secrets/src/router.d.ts.map +1 -1
  375. package/dist/session/index.js +1 -1
  376. package/dist/session/src/mentions.d.ts.map +1 -1
  377. package/dist/{sessions-2IUX4P3P.js → sessions-DICDEONJ.js} +3 -3
  378. package/dist/{sessions-2IUX4P3P.js.map → sessions-DICDEONJ.js.map} +1 -1
  379. package/dist/{setup-4YMN2BDU.js → setup-6MQ6QWML.js} +198 -175
  380. package/dist/setup-6MQ6QWML.js.map +1 -0
  381. package/dist/skills-BMI6H7HI.js +7 -0
  382. package/dist/{skills-6HJ3WINN.js.map → skills-BMI6H7HI.js.map} +1 -1
  383. package/dist/store/index.js +1 -1
  384. package/dist/store/src/index.d.ts +1 -1
  385. package/dist/store/src/index.d.ts.map +1 -1
  386. package/dist/store/src/resource-client.d.ts +1 -1
  387. package/dist/store/src/resource-client.d.ts.map +1 -1
  388. package/dist/store/src/vue.d.ts.map +1 -1
  389. package/dist/store/vue.js.map +1 -1
  390. package/dist/store-client-LDYF4TK4.js +15 -0
  391. package/dist/{store-client-BCP5LCAZ.js.map → store-client-LDYF4TK4.js.map} +1 -1
  392. package/dist/telemetry/index.js +1 -1
  393. package/dist/telemetry/src/context.d.ts.map +1 -1
  394. package/dist/telemetry/src/index.d.ts +3 -3
  395. package/dist/telemetry/src/index.d.ts.map +1 -1
  396. package/dist/telemetry/src/otel/gen-ai.d.ts +1 -1
  397. package/dist/telemetry/src/otel/gen-ai.d.ts.map +1 -1
  398. package/dist/telemetry/src/otel/provider.d.ts.map +1 -1
  399. package/dist/transport/src/index.d.ts +1 -1
  400. package/dist/transport/src/index.d.ts.map +1 -1
  401. package/dist/tui/index.js +251 -218
  402. package/dist/tui/index.js.map +1 -1
  403. package/dist/tui/src/index.d.ts +2 -2
  404. package/dist/tui/src/index.d.ts.map +1 -1
  405. package/dist/tui/src/repl-renderer.d.ts.map +1 -1
  406. package/dist/tui/src/repl-session.d.ts +1 -1
  407. package/dist/tui/src/repl-session.d.ts.map +1 -1
  408. package/dist/tui/src/repl.d.ts.map +1 -1
  409. package/dist/types/manifests.js +1 -1
  410. package/dist/types/src/envelope.d.ts +1 -1
  411. package/dist/types/src/envelope.d.ts.map +1 -1
  412. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  413. package/dist/types/src/manifests/connector.d.ts.map +1 -1
  414. package/dist/types/src/manifests/contract.d.ts.map +1 -1
  415. package/dist/types/src/manifests/index.d.ts +16 -16
  416. package/dist/types/src/manifests/index.d.ts.map +1 -1
  417. package/dist/types/src/manifests/mcp-server.d.ts.map +1 -1
  418. package/dist/types/src/manifests/mount.d.ts.map +1 -1
  419. package/dist/types/src/manifests/persona.d.ts.map +1 -1
  420. package/dist/types/src/manifests/preset.d.ts +0 -18
  421. package/dist/types/src/manifests/preset.d.ts.map +1 -1
  422. package/dist/types/src/manifests/prompt.d.ts.map +1 -1
  423. package/dist/types/src/manifests/ruleset.d.ts.map +1 -1
  424. package/dist/types/src/manifests/skill.d.ts.map +1 -1
  425. package/dist/validator-VF5M764T.js +5 -0
  426. package/dist/{validator-47SQUW3J.js.map → validator-VF5M764T.js.map} +1 -1
  427. package/dist/workspace-plugin/adapters/mcp.js +6 -6
  428. package/dist/workspace-plugin/adapters/omp.js +76 -69
  429. package/dist/workspace-plugin/adapters/omp.js.map +1 -1
  430. package/dist/workspace-plugin/index.js +2 -2
  431. package/dist/workspace-plugin/src/adapters/omp.d.ts.map +1 -1
  432. package/dist/workspace-plugin/src/tools/connectors.d.ts.map +1 -1
  433. package/dist/workspace-plugin/src/tools/flows.d.ts.map +1 -1
  434. package/dist/workspace-plugin/src/tools/sessions.d.ts.map +1 -1
  435. package/dist/workspace-plugin/src/tools/skills.d.ts.map +1 -1
  436. package/dist/workspace-plugin/src/tools/validator.d.ts.map +1 -1
  437. package/package.json +1 -2
  438. package/dist/asset-feeds-2V7LZIG7.js.map +0 -1
  439. package/dist/chunk-24UIWON4.js.map +0 -1
  440. package/dist/chunk-2FS4FPZ7.js.map +0 -1
  441. package/dist/chunk-3QQSSRYN.js.map +0 -1
  442. package/dist/chunk-5YO3H5Q4.js.map +0 -1
  443. package/dist/chunk-7GWYRVAX.js.map +0 -1
  444. package/dist/chunk-AKSR434V.js.map +0 -1
  445. package/dist/chunk-DVMSGGCM.js.map +0 -1
  446. package/dist/chunk-FQHHCICT.js.map +0 -1
  447. package/dist/chunk-IEJ5IOC3.js.map +0 -1
  448. package/dist/chunk-IERB3UXJ.js.map +0 -1
  449. package/dist/chunk-JIQLLZ65.js.map +0 -1
  450. package/dist/chunk-M4KLIEIJ.js.map +0 -1
  451. package/dist/chunk-MIH45XPY.js.map +0 -1
  452. package/dist/chunk-MLJKA3S6.js.map +0 -1
  453. package/dist/chunk-OTFG5Q7H.js.map +0 -1
  454. package/dist/chunk-PAYAFNXG.js.map +0 -1
  455. package/dist/chunk-QDJKE557.js.map +0 -1
  456. package/dist/chunk-SF4GWVR5.js.map +0 -1
  457. package/dist/chunk-TV72ZJYN.js.map +0 -1
  458. package/dist/chunk-UIZKIUC6.js.map +0 -1
  459. package/dist/chunk-W7W66MDZ.js.map +0 -1
  460. package/dist/chunk-Z3XXKR5E.js.map +0 -1
  461. package/dist/chunk-ZONCCO5N.js.map +0 -1
  462. package/dist/ensure-sources-BNSRO5G7.js +0 -74
  463. package/dist/ensure-sources-BNSRO5G7.js.map +0 -1
  464. package/dist/flows-L3GHQD7F.js +0 -7
  465. package/dist/open-library-3VJY74LQ.js +0 -23
  466. package/dist/paths-CE66L3AL.js +0 -15
  467. package/dist/plugin-store-GL5VKYUA.js.map +0 -1
  468. package/dist/provider-GAWKFQ3T.js.map +0 -1
  469. package/dist/setup-4YMN2BDU.js.map +0 -1
  470. package/dist/skills-6HJ3WINN.js +0 -7
  471. package/dist/store-client-BCP5LCAZ.js +0 -15
  472. package/dist/validator-47SQUW3J.js +0 -5
@@ -47,6 +47,7 @@ function entryFromRaw(d) {
47
47
  // catalog.yaml cache written before this release still groups sanely.
48
48
  // The cache self-heals on next write (entryToRaw stops writing `domain`).
49
49
  repo: d.repo != null ? String(d.repo) : d.domain != null ? String(d.domain) : void 0,
50
+ domainSlug: d.domainSlug != null ? String(d.domainSlug) : void 0,
50
51
  version: String(d.version ?? ""),
51
52
  requires: Array.isArray(d.requires) ? d.requires.filter(Boolean).map(parseDep) : [],
52
53
  dependencies: deps
@@ -71,6 +72,7 @@ function entryToRaw(e) {
71
72
  publisher: e.publisher,
72
73
  repo: e.repo,
73
74
  version: e.version,
75
+ ...e.domainSlug != null ? { domainSlug: e.domainSlug } : {},
74
76
  requires: e.requires.map(depToStr),
75
77
  dependencies: e.dependencies
76
78
  };
@@ -155,5 +157,5 @@ function repositoryToRaw(r) {
155
157
  }
156
158
 
157
159
  export { ASSET_KINDS, ASSET_NAME_HINT, INDIVIDUAL_KINDS, assetRefToDep, assetRefToStr, depToStr, entryFromRaw, entryToRaw, isValidAssetName, parseAssetRef, parseDep, repositoryFromRaw, repositoryToRaw };
158
- //# sourceMappingURL=chunk-IEJ5IOC3.js.map
159
- //# sourceMappingURL=chunk-IEJ5IOC3.js.map
160
+ //# sourceMappingURL=chunk-LFDZYCEO.js.map
161
+ //# sourceMappingURL=chunk-LFDZYCEO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/src/models.ts"],"names":[],"mappings":"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","file":"chunk-LFDZYCEO.js","sourcesContent":["/**\n * Pure data models — no I/O, no side effects.\n */\n\nimport semver from \"semver\";\n\n/**\n * Discriminator for catalog entries and asset references.\n * Used in asset ref strings (e.g. `'skill:my-skill'`, `'agent:my-agent'`).\n * @docLink packages/core/concepts#asset-kind\n */\nexport type AssetKind =\n | \"skill\"\n | \"agent\"\n | \"prompt\"\n | \"bundle\"\n | \"flow\"\n | \"contract\"\n | \"mcp-server\"\n | \"persona\" // identity fragment — replaces SOUL.md in composition\n | \"ruleset\" // behavioral constraints — replaces RULES.md in composition\n | \"knowledge\" // knowledge bundle directory\n | \"connector\"; // connector descriptor (CONNECTOR.md)\n\n/**\n * All valid AssetKind values as a readonly array.\n * @docLink packages/core/concepts#asset-kinds\n */\nexport const ASSET_KINDS: readonly AssetKind[] = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"bundle\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n \"persona\",\n \"ruleset\",\n \"knowledge\",\n \"connector\",\n];\n/**\n * Asset kinds that represent individually installable assets (excludes \"bundle\").\n * Note: persona, ruleset, and knowledge are valid AssetKind values but are not\n * individually installable — they are resolved at session creation time via the\n * mixin-resolver, not through the install/deploy pipeline.\n * @docLink packages/core/concepts#individual-kinds\n */\nexport const INDIVIDUAL_KINDS = [\n \"skill\",\n \"agent\",\n \"prompt\",\n \"flow\",\n \"contract\",\n \"mcp-server\",\n] as const satisfies AssetKind[];\n\n// ── Dependency ────────────────────────────────────────────────────────────────\n\n/**\n * Declared dependency on another catalog asset.\n * @docLink packages/core/concepts#dependency\n */\nexport interface Dependency {\n /** Asset kind (e.g. \"skill\", \"agent\", \"contract\"). */\n kind: string;\n /** Asset name within that kind. */\n name: string;\n /** Canonical publisher namespace (when known). */\n publisher?: string;\n}\n\n/**\n * Parse a `\"kind:name\"` dependency string, or a bare `\"name\"` (defaults kind to `\"skill\"`).\n *\n * @param s - Dependency string, e.g. `\"skill:use-exa\"` or `\"use-exa\"`\n * @returns Parsed `{ kind, name }` dependency object\n * @docLink packages/core/concepts#parse-dep\n */\nexport function parseDep(s: string): Dependency {\n const i = s.indexOf(\":\");\n if (i !== -1) {\n const kind = s.slice(0, i).trim();\n const name = s.slice(i + 1).trim();\n return { kind, name };\n }\n return { kind: \"skill\", name: s.trim() };\n}\n\n/**\n * Serialize a Dependency back to its `\"kind:name\"` string form.\n *\n * @param d - Dependency to serialize\n * @returns String in `\"kind:name\"` format\n * @docLink packages/core/concepts#dep-to-str\n */\nexport function depToStr(d: Dependency): string {\n return `${d.kind}:${d.name}`;\n}\n\n// ── CatalogEntry ──────────────────────────────────────────────────────────────\n\n/**\n * A resolved catalog entry describing an installable asset.\n * Produced by manifest parsers and stored in the catalog YAML.\n * @docLink packages/core/concepts#catalog-entry\n */\nexport interface CatalogEntry {\n /** Unique asset name within its kind. */\n name: string;\n /** Asset kind discriminator. */\n kind: AssetKind;\n /** Short description of what this asset does. */\n description: string;\n /** Absolute path to manifest file */\n source: string;\n /** Canonical publisher namespace this asset belongs to (formerly `repository`). */\n publisher?: string;\n /**\n * `\"<org>/<repo>\"` coordinate the asset came from. Absent → the asset groups\n * directly under its publisher (local library with no git remote, or a\n * non-GitHub source). Replaces the former derived `domain` axis.\n */\n repo?: string;\n /**\n * Navigational domain slug (from a sidecar `DOMAIN.md`), or absent when no\n * domain claims this asset. Display-only — groups assets under their publisher\n * in the manage TUI; never part of identity or the install layout.\n */\n domainSlug?: string;\n /** Semantic version string (may be empty if not declared in the manifest). */\n version: string;\n /** Skills, agents, or other assets this entry depends on. */\n requires: Dependency[];\n /** Bundle dependencies — asset refs to install (bundles only). */\n dependencies: string[];\n /**\n * Kind-specific metadata extracted from the manifest frontmatter.\n * Used by MCP servers to carry default config (transport, command, args, env, url, headers)\n * so that `mcp:name` dependency refs resolve to a runnable declaration without\n * requiring verbose inline config in `skaile.yaml`.\n */\n metadata?: Record<string, unknown>;\n /** Curated facet, surfaced as a badge in the manage TUI (not a tree axis). */\n category?: string;\n /** Store-listing keywords (manifest `assets[].keywords`, else frontmatter). */\n keywords?: string[];\n /** Store-listing license (manifest `assets[].license`, else repo-level default). */\n license?: string;\n /** Store-listing homepage (manifest `assets[].homepage`, else repo-level default). */\n homepage?: string;\n}\n\n/**\n * Construct a CatalogEntry from a raw deserialized record (e.g. from catalog.yaml).\n *\n * @param d - Raw object with loosely typed fields\n * @returns Normalized CatalogEntry\n * @docLink packages/core/concepts#entry-from-raw\n */\nexport function entryFromRaw(d: Record<string, unknown>): CatalogEntry {\n const rawDeps = d.dependencies;\n const deps = Array.isArray(rawDeps) ? (rawDeps as string[]).filter(Boolean) : [];\n const entry: CatalogEntry = {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"skill\") as AssetKind,\n description: String(d.description ?? \"\"),\n source: String(d.source ?? \"\"),\n publisher: d.publisher != null ? String(d.publisher) : undefined,\n // Read `repo`, falling back to the legacy `domain` key so a stale\n // catalog.yaml cache written before this release still groups sanely.\n // The cache self-heals on next write (entryToRaw stops writing `domain`).\n repo: d.repo != null ? String(d.repo) : d.domain != null ? String(d.domain) : undefined,\n domainSlug: d.domainSlug != null ? String(d.domainSlug) : undefined,\n version: String(d.version ?? \"\"),\n requires: Array.isArray(d.requires)\n ? (d.requires as string[]).filter(Boolean).map(parseDep)\n : [],\n dependencies: deps,\n };\n if (d.metadata != null && typeof d.metadata === \"object\" && !Array.isArray(d.metadata)) {\n entry.metadata = d.metadata as Record<string, unknown>;\n }\n if (d.category != null) entry.category = String(d.category);\n if (Array.isArray(d.keywords)) {\n entry.keywords = (d.keywords as unknown[]).filter((k): k is string => typeof k === \"string\");\n }\n if (d.license != null) entry.license = String(d.license);\n if (d.homepage != null) entry.homepage = String(d.homepage);\n return entry;\n}\n\n/**\n * Serialize a CatalogEntry to a plain record suitable for YAML/JSON persistence.\n *\n * @param e - CatalogEntry to serialize\n * @returns Plain object with string-serialized requires and dependencies\n * @docLink packages/core/concepts#entry-to-raw\n */\nexport function entryToRaw(e: CatalogEntry): Record<string, unknown> {\n const raw: Record<string, unknown> = {\n name: e.name,\n kind: e.kind,\n description: e.description,\n source: e.source,\n publisher: e.publisher,\n repo: e.repo,\n version: e.version,\n ...(e.domainSlug != null ? { domainSlug: e.domainSlug } : {}),\n requires: e.requires.map(depToStr),\n dependencies: e.dependencies,\n };\n if (e.metadata) raw.metadata = e.metadata;\n if (e.category != null) raw.category = e.category;\n if (e.keywords && e.keywords.length > 0) raw.keywords = e.keywords;\n if (e.license != null) raw.license = e.license;\n if (e.homepage != null) raw.homepage = e.homepage;\n return raw;\n}\n\n// ── AssetRef ─────────────────────────────────────────────────────────────────\n\n/**\n * A parsed asset reference: `kind:@<publisher>/name[#pin]`.\n *\n * `publisher` is the canonical, GitHub-shaped publisher namespace (≤39 chars,\n * alphanumeric+hyphen). `pin` is a SemVer constraint, exact SHA, or absent.\n * Floating refs (`main`, `latest`, `HEAD`) are rejected at parse time.\n *\n * Produced by `parseAssetRef`; consumed by `resolveAsset` and `resolveAll`.\n * @docLink packages/core/concepts#asset-ref\n */\nexport interface AssetRef {\n kind: string;\n name: string;\n /** Canonical publisher namespace. Optional only for ambiguity-resolution\n * during migration; new manifests require it. */\n publisher?: string;\n /** SemVer constraint (^1.4.0, ~1.4, 1.x, exact 1.4.0), 40-char SHA, or undefined. */\n pin?: string;\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n// Scoped grammar: `kind:@publisher/name[#version]`. The publisher sub-pattern is\n// GitHub-shaped (1-39 chars, alphanumeric + single hyphens, no leading/trailing or\n// double hyphen); `@` is the scope sigil and `#` the version sigil. `name` is\n// intentionally permissive (`[^/#\\s]+` — only the structural separators are\n// forbidden); floating-ref rejection stays in `isValidPin`, so `#main`/`#latest`\n// match here and fail there with a clear message.\nconst SCOPED_REF_RE =\n /^(?:([a-z][a-z0-9-]*):)?@([A-Za-z0-9](?:[A-Za-z0-9]|-(?!-)){0,37}[A-Za-z0-9]|[A-Za-z0-9])\\/([^/#\\s]+)(?:#(.+))?$/;\n\n// Canonical asset-name grammar: lowercase kebab-case (npm-style, scope-free) —\n// `a-z` / `0-9` segments joined by single hyphens, no leading/trailing hyphen,\n// no uppercase, spaces, dots, or underscores. Names become directory names,\n// lock keys, and CLI args, so the constraint is intentionally narrow.\nconst ASSET_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\n// Diagnostic-only matcher: a ref carrying a `kind:@publisher/` scope prefix,\n// capturing whatever follows (sans `#pin`) as the candidate name. Used solely\n// to tell \"missing publisher\" apart from \"malformed name\" when the strict\n// grammar above fails (e.g. a space in the name).\nconst SCOPE_PREFIX_RE = /^(?:[a-z][a-z0-9-]*:)?@[^/\\s]+\\/([^#]+?)(?:#.*)?$/;\n\n/** Human-readable statement of the canonical asset-name rule. */\nexport const ASSET_NAME_HINT =\n 'names must be lowercase kebab-case (a-z, 0-9, single hyphens; e.g. \"cli-concept\")';\n\n/**\n * True when `name` is a canonical asset name: lowercase kebab-case, scope-free.\n *\n * This is the single source of truth for asset-name validity — `parseAssetRef`\n * enforces it, and `skaile validate` reports violations across a repo tree.\n * @docLink packages/core/concepts#is-valid-asset-name\n */\nexport function isValidAssetName(name: string): boolean {\n return ASSET_NAME_RE.test(name);\n}\n\n/** True when `pin` is a SemVer constraint, exact SemVer, or 40-char SHA. */\nfunction isValidPin(pin: string): boolean {\n if (SHA_RE.test(pin)) return true;\n if (semver.valid(pin)) return true;\n if (semver.validRange(pin)) return true;\n return false;\n}\n\n/** Throw the canonical non-canonical-pin error for a ref `s` carrying `pin`. */\nfunction rejectFloatingPin(s: string, pin: string): never {\n throw new Error(\n `non-canonical pin \"${pin}\" in \"${s}\" — pin must be a SemVer ` +\n \"constraint (1.4.0, ^1.4, ~1.4, 1.x), a 40-char SHA, or absent. \" +\n \"Floating refs (main/latest/HEAD) are not allowed.\",\n );\n}\n\n/** Throw the canonical malformed-name error for a ref `s` carrying `name`. */\nfunction rejectInvalidName(s: string, name: string): never {\n throw new Error(\n `invalid asset name \"${name}\" in ref \"${s}\" — ${ASSET_NAME_HINT}. ` +\n \"Run the `migrate-skaile-manifest` skill on legacy manifests.\",\n );\n}\n\n/**\n * Parse a canonical asset reference string into an `AssetRef` object.\n *\n * Grammar: `kind:@<publisher>/name[#version]`\n * \"skill:@skaile-ai/audit\" → { kind: \"skill\", name: \"audit\", publisher: \"skaile-ai\" }\n * \"skill:@skaile-ai/audit#^1.4.0\" → { …, pin: \"^1.4.0\" }\n * \"skill:@skaile-ai/audit#<40-sha>\" → { …, pin: \"<40-sha>\" }\n *\n * `@` is the scope sigil and `#` the version sigil. `<publisher>` is GitHub-shaped\n * (≤39 chars, alphanumeric+hyphen, no leading/trailing or double hyphen). `pin`\n * accepts a SemVer constraint (`^`, `~`, `x`, exact), a 40-char SHA, or is absent.\n * Floating refs (`main`/`latest`/`HEAD`/anything non-canonical) are parse-time errors.\n *\n * The shorthand `mcp:` is normalized to `mcp-server:`. `kind` defaults to `\"skill\"`.\n *\n * @param s - Asset reference string\n * @returns Parsed `AssetRef`\n * @throws When the ref matches no grammar, the publisher is malformed, or the pin\n * is a floating ref.\n * @docLink packages/core/concepts#parse-asset-ref\n */\nexport function parseAssetRef(s: string): AssetRef {\n const trimmed = s.trim();\n const m = SCOPED_REF_RE.exec(trimmed);\n if (m) {\n const kindRaw = m[1] ?? \"skill\";\n const kind = kindRaw === \"mcp\" ? \"mcp-server\" : kindRaw;\n const publisher = m[2];\n const name = m[3];\n const pin = m[4]?.trim() || undefined;\n if (!isValidAssetName(name)) rejectInvalidName(s, name);\n if (pin !== undefined && !isValidPin(pin)) rejectFloatingPin(s, pin);\n return { kind, name, publisher, pin };\n }\n\n // The strict grammar failed. If the ref nonetheless carries a `@publisher/`\n // scope and the fault is the name (e.g. an embedded space), surface a\n // name-specific error rather than the misleading \"publisher required\" — the\n // publisher is plainly present. A *valid* captured name means the publisher\n // itself is malformed, so fall through to the publisher error below.\n const scoped = SCOPE_PREFIX_RE.exec(trimmed);\n if (scoped) {\n const candidate = scoped[1].trim();\n if (!isValidAssetName(candidate)) rejectInvalidName(s, candidate);\n }\n\n throw new Error(\n `publisher required in asset ref \"${s}\" — use \\`kind:@<publisher>/name\\`. ` +\n \"Run the `migrate-skaile-manifest` skill on legacy manifests.\",\n );\n}\n\n/**\n * Serialize an AssetRef back to its canonical string form.\n *\n * Emits the scope form `kind:@publisher/name[#pin]` when `publisher` is present,\n * and the bare `kind:name[#pin]` form for transitive refs that inherit it.\n *\n * @param ref - AssetRef to serialize\n * @returns String in `\"kind:@publisher/name[#pin]\"` (or bare `\"kind:name[#pin]\"`) format\n * @docLink packages/core/concepts#asset-ref-to-str\n */\nexport function assetRefToStr(ref: AssetRef): string {\n const scope = ref.publisher ? `@${ref.publisher}/${ref.name}` : ref.name;\n return `${ref.kind}:${scope}${ref.pin ? `#${ref.pin}` : \"\"}`;\n}\n\n/**\n * Convert an AssetRef to a simple Dependency, dropping the repository and pin qualifiers.\n *\n * @param ref - Full asset reference (may include repository and pin)\n * @returns Dependency with only kind and name\n * @docLink packages/core/concepts#asset-ref-to-dep\n */\nexport function assetRefToDep(ref: AssetRef): Dependency {\n // Grammar-agnostic — drops publisher/pin, so the scope-sigil change doesn't touch it.\n return { kind: ref.kind, name: ref.name };\n}\n\n// ── Lock File ────────────────────────────────────────────────────────────────\n\n/** A path/sha256 pair recorded for one file inside a locked asset. */\nexport interface LockFileEntry {\n path: string;\n sha256: string;\n}\n\n/**\n * Per-asset entry in the lock file (v3 schema).\n * Keyed in `LockFile.assets` by canonical ref (`<kind>:@<publisher>/<name>#<version>`).\n * @docLink packages/core/api-reference#lock-entry\n */\nexport interface LockEntry {\n /** Composite sha256 over sorted `<path>:<sha256>\\n` rows. */\n sha256: string;\n /** Resolved upstream source + commit. */\n source: { url: string; commit: string };\n /** Files that constitute the asset. */\n files: LockFileEntry[];\n /** True when an `overrides[]` entry pinned this resolution. */\n override_applied: boolean;\n}\n\n/** Per-source-URL entry in `LockFile.sources`. */\nexport interface LockSourceEntry {\n url: string;\n commit: string;\n}\n\n/**\n * Full skaile.lock.yaml structure (v3 schema).\n * @docLink packages/core/api-reference#lock-file\n */\nexport interface LockFile {\n /** Lock file schema version. v3 is canonical. */\n schema_version: 3;\n /** ISO timestamp of when the lock was generated. */\n locked_at: string;\n /** Resolved assets keyed by canonical ref `<kind>:@<publisher>/<name>#<version>`. */\n assets: Record<string, LockEntry>;\n /** Every source URL that contributed at least one resolved asset. */\n sources: LockSourceEntry[];\n /**\n * Resolved plugin packages (from `skaile.yaml` `plugins:`), keyed by package\n * name. The plugin-store reconciler reads this slice into its reconcile-hash\n * so a lock change reinstalls even when the manifest list is unchanged.\n */\n plugins?: Record<string, LockPluginEntry>;\n}\n\n/** One pinned plugin package in the lock file's `plugins` slice. */\nexport interface LockPluginEntry {\n /** Resolved exact version (e.g. \"0.1.3\"). */\n version: string;\n /** Package integrity hash (e.g. \"sha512-...\"); may be empty until populated from bun's output. */\n integrity: string;\n}\n\n// ── AgentManifest ────────────────────────────────────────────────────────────\n\n/**\n * Agent package manifest — parsed from `agent.yaml` in an agent directory.\n * Defines the agent's identity, model preferences, capability requirements, and composition mixins.\n * @docLink packages/core/concepts#agent-manifest\n */\nexport interface AgentManifest {\n spec_version?: string;\n name?: string;\n version?: string;\n description?: string;\n model?: {\n preferred?: string;\n fallback?: string[];\n constraints?: { temperature?: number; max_tokens?: number };\n };\n tools?: {\n allowed?: string[];\n denied?: string[];\n };\n delegation?: { mode?: string };\n requires?: Array<{ name: string; source: string; version?: string; mount: string }>;\n tags?: string[];\n author?: string;\n metadata?: Record<string, unknown>;\n /**\n * @deprecated Use `persona`, `rules`, and `knowledge` mixin arrays instead.\n * This field is declared but was never resolved at runtime.\n */\n extends?: string;\n abilities?: string[];\n /**\n * Identity fragments to compose into the agent persona.\n * Each entry is a catalog ref (`persona:name@repo#pin`), a bare name\n * (defaults to kind \"persona\"), or a local path (`./my.persona.md`).\n * Resolved in order — concatenated with \\n\\n---\\n\\n separator.\n */\n persona?: string[];\n /**\n * Behavioral rule sets to compose into the agent's constraints.\n * Each entry is a catalog ref (`ruleset:name@repo#pin`), bare name,\n * or local path. All rules apply (union).\n */\n rules?: string[];\n /**\n * Knowledge bundles to compose into the agent's domain knowledge.\n * Each entry is a catalog ref (`knowledge:name@repo#pin`), bare name,\n * or local path to a knowledge directory. Loaded in declaration order.\n */\n knowledge?: string[];\n contracts?: string[];\n /**\n * v2 composition items. Each entry references an asset (skill, connector,\n * soul, ruleset, etc.) with binding semantics (discoverable, inline-live,\n * inline-snapshot). Resolved at session start via the composition module.\n */\n composes?: Array<{\n kind: string;\n ref: string;\n instance?: string;\n binding?: \"discoverable\" | \"inline-live\" | \"inline-snapshot\";\n }>;\n runtime?: {\n max_turns?: number;\n timeout?: number;\n [key: string]: unknown;\n };\n}\n\n// ── Repository ───────────────────────────────────────────────────────────────\n\ntype RepositoryKind = \"local\" | \"github\";\n\n/**\n * A registered asset repository (local path or cloned GitHub repo).\n * Stored in the catalog; consumed by `repo-manager` for cloning and scanning.\n * @docLink packages/core/concepts#repository\n */\nexport interface Repository {\n /** Logical repository name. */\n name: string;\n /** Storage kind: \"local\" for paths, \"github\" for remote URLs. */\n kind: RepositoryKind;\n /** Absolute path (local) or remote URL (github). */\n path: string;\n /** Active branch. */\n branch: string;\n /** Upstream fork URL (for fork-based workflows). */\n upstream?: string;\n}\n\n/**\n * Construct a `Repository` from a raw deserialized record.\n *\n * @param d - Raw object from YAML/JSON\n * @returns Normalized `Repository`\n * @docLink packages/core/concepts#repository-from-raw\n */\nexport function repositoryFromRaw(d: Record<string, unknown>): Repository {\n return {\n name: String(d.name ?? \"\"),\n kind: String(d.kind ?? \"local\") as RepositoryKind,\n path: String(d.path ?? \"\"),\n branch: String(d.branch ?? \"main\"),\n upstream: d.upstream != null ? String(d.upstream) : undefined,\n };\n}\n\n/**\n * Serialize a `Repository` to a plain record for YAML/JSON persistence.\n * Omits the `branch` field when it equals `\"main\"` to keep serialized output clean.\n *\n * @param r - Repository to serialize\n * @returns Plain object suitable for YAML/JSON\n * @docLink packages/core/concepts#repository-to-raw\n */\nexport function repositoryToRaw(r: Repository): Record<string, unknown> {\n const d: Record<string, unknown> = {\n name: r.name,\n kind: r.kind,\n path: r.path,\n };\n if (r.branch !== \"main\") d.branch = r.branch;\n if (r.upstream != null) d.upstream = r.upstream;\n return d;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { globalSettingsPath, mapLegacyFields } from './chunk-M4KLIEIJ.js';
1
+ import { globalSettingsPath, mapLegacyFields } from './chunk-YBJLYT4S.js';
2
2
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
3
3
  import { homedir } from 'os';
4
4
  import { join } from 'path';
@@ -89,5 +89,5 @@ function isStoreAuthenticated(config) {
89
89
  }
90
90
 
91
91
  export { clearStoreTokens, getStoreConfig, isStoreAuthenticated, saveStoreTokens, storeFetch };
92
- //# sourceMappingURL=chunk-2NOE4AGD.js.map
93
- //# sourceMappingURL=chunk-2NOE4AGD.js.map
92
+ //# sourceMappingURL=chunk-LIK75OJ5.js.map
93
+ //# sourceMappingURL=chunk-LIK75OJ5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/store-client.ts"],"names":[],"mappings":";;;;;AAuBO,SAAS,cAAA,GAA8B;AAC5C,EAAA,MAAM,eAAe,kBAAA,EAAmB;AACxC,EAAA,IAAI,WAAgC,EAAC;AACrC,EAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,gBAAgB,IAAA,CAAK,KAAA,CAAM,aAAa,YAAA,EAAc,OAAO,CAAC,CAAC,CAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,EAAC;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAA,CAAS,QAAA,IAAY,OAAA,CAAQ,IAAI,gBAAA,IAAoB,yBAAA;AAAA,IAC1D,GAAA,EAAK,SAAS,QAAA,IAAY,IAAA;AAAA,IAC1B,YAAA,EAAc,SAAS,iBAAA,IAAqB;AAAA,GAC9C;AACF;AAGA,SAAS,gBAAA,GAA2B;AAClC,EAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,eAAe,CAAA;AACnD;AASO,SAAS,eAAA,CAAgB,KAAa,YAAA,EAA4B;AACvE,EAAA,MAAM,eAAe,gBAAA,EAAiB;AACtC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AACnC,EAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAElC,EAAA,IAAI,UAA+B,EAAC;AACpC,EAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,IAC1D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,GAAU,EAAC;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,QAAA,GAAW,GAAA;AACnB,EAAA,OAAA,CAAQ,iBAAA,GAAoB,YAAA;AAC5B,EAAA,aAAA,CAAc,cAAc,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AACvE;AAOO,SAAS,gBAAA,GAAyB;AACvC,EAAA,MAAM,eAAe,gBAAA,EAAiB;AACtC,EAAA,IAAI,CAAC,UAAA,CAAW,YAAY,CAAA,EAAG;AAE/B,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,OAAO,CAAC,CAAA;AAC9D,IAAA,OAAO,OAAA,CAAQ,QAAA;AACf,IAAA,OAAO,OAAA,CAAQ,iBAAA;AACf,IAAA,aAAA,CAAc,cAAc,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAWA,eAAsB,UAAA,CACpB,MAAA,EACA,IAAA,EACA,IAAA,EAMY;AACZ,EAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,GAAG,GAAG,IAAI,CAAA,CAAA;AAC9B,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,MAAM,EAAA,GAAK,IAAI,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAC1C,IAAA,GAAA,IAAO,IAAI,EAAE,CAAA,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB,kBAAA;AAAA,IAChB,MAAA,EAAQ,kBAAA;AAAA,IACR,GAAI,IAAA,EAAM,OAAA,IAAW;AAAC,GACxB;AACA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,OAAA,CAAQ,aAAA,GAAgB,CAAA,OAAA,EAAU,MAAA,CAAO,GAAG,CAAA,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,SAAA,GAAyB;AAAA,IAC7B,MAAA,EAAQ,MAAM,MAAA,IAAU,KAAA;AAAA,IACxB;AAAA,GACF;AACA,EAAA,IAAI,MAAM,IAAA,EAAM;AACd,IAAA,SAAA,CAAU,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,IAAK,CAAA;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,SAAA,EAAW,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AACxE,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,IAAG,CAAE,CAAA;AAC3E,MAAA,MAAM,IAAI,KAAA,CAAO,IAAA,CAAa,SAAS,CAAA,iBAAA,EAAoB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,OAAO,CAAA;AAAA,EACtB;AACF;AAQO,SAAS,qBAAqB,MAAA,EAA+B;AAClE,EAAA,MAAM,CAAA,GAAI,UAAU,cAAA,EAAe;AACnC,EAAA,OAAO,CAAC,CAAC,CAAA,CAAE,GAAA;AACb","file":"chunk-2NOE4AGD.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { globalSettingsPath, mapLegacyFields } from \"@skaile/workspaces/core\";\n\n/**\n * Connection configuration for the AI Asset Store API.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport interface StoreConfig {\n url: string;\n jwt: string | null;\n refreshToken: string | null;\n}\n\n/**\n * Read store connection config from global user settings, falling back to\n * `SKAILE_STORE_URL` env var and the default store URL.\n *\n * @returns Populated {@link StoreConfig} with `url`, `jwt`, and `refreshToken`.\n * @docLink cli/dev-guide#store-client\n */\nexport function getStoreConfig(): StoreConfig {\n const settingsPath = globalSettingsPath();\n let settings: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n settings = mapLegacyFields(JSON.parse(readFileSync(settingsPath, \"utf-8\")));\n } catch {\n settings = {};\n }\n }\n return {\n url: settings.storeUrl ?? process.env.SKAILE_STORE_URL ?? \"https://store.skaile.ai\",\n jwt: settings.storeJwt ?? null,\n refreshToken: settings.storeRefreshToken ?? null,\n };\n}\n\n/** Path to user-level settings */\nfunction userSettingsPath(): string {\n return join(homedir(), \".skaile\", \"settings.json\");\n}\n\n/**\n * Persist store authentication tokens to `~/.skaile/settings.json`.\n *\n * @param jwt - The JWT access token returned by the store login endpoint.\n * @param refreshToken - The refresh token for obtaining new JWTs.\n * @docLink cli/dev-guide#store-client\n */\nexport function saveStoreTokens(jwt: string, refreshToken: string): void {\n const settingsPath = userSettingsPath();\n const dir = join(settingsPath, \"..\");\n mkdirSync(dir, { recursive: true });\n\n let current: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n } catch {\n current = {};\n }\n }\n\n current.storeJwt = jwt;\n current.storeRefreshToken = refreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n}\n\n/**\n * Remove store authentication tokens from `~/.skaile/settings.json`.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport function clearStoreTokens(): void {\n const settingsPath = userSettingsPath();\n if (!existsSync(settingsPath)) return;\n\n try {\n const current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n delete current.storeJwt;\n delete current.storeRefreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n } catch {\n // ignore\n }\n}\n\n/**\n * Make an authenticated HTTP request to the store REST API with a 1.5s timeout.\n *\n * @param config - Store connection config (URL + auth token).\n * @param path - API path (e.g. `/api/assets`).\n * @param opts - Optional method, body, query params, and extra headers.\n * @returns Parsed JSON response body.\n * @docLink cli/dev-guide#store-client\n */\nexport async function storeFetch<T = any>(\n config: StoreConfig,\n path: string,\n opts?: {\n method?: string;\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n): Promise<T> {\n let url = `${config.url}${path}`;\n if (opts?.params) {\n const sp = new URLSearchParams(opts.params);\n url += `?${sp}`;\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(opts?.headers ?? {}),\n };\n if (config.jwt) {\n headers.Authorization = `Bearer ${config.jwt}`;\n }\n\n const fetchOpts: RequestInit = {\n method: opts?.method ?? \"GET\",\n headers,\n };\n if (opts?.body) {\n fetchOpts.body = JSON.stringify(opts.body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1_500);\n try {\n const res = await fetch(url, { ...fetchOpts, signal: controller.signal });\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error((body as any).error ?? `Store API error: ${res.status}`);\n }\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Return `true` if a JWT token is present in the provided (or default) store config.\n *\n * @param config - Optional pre-loaded config; if omitted, calls {@link getStoreConfig}.\n * @docLink cli/dev-guide#store-client\n */\nexport function isStoreAuthenticated(config?: StoreConfig): boolean {\n const c = config ?? getStoreConfig();\n return !!c.jwt;\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/store-client.ts"],"names":[],"mappings":"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","file":"chunk-LIK75OJ5.js","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { globalSettingsPath, mapLegacyFields } from \"@skaile/workspaces/core\";\n\n/**\n * Connection configuration for the AI Asset Store API.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport interface StoreConfig {\n url: string;\n jwt: string | null;\n refreshToken: string | null;\n}\n\n/**\n * Read store connection config from global user settings, falling back to\n * `SKAILE_STORE_URL` env var and the default store URL.\n *\n * @returns Populated {@link StoreConfig} with `url`, `jwt`, and `refreshToken`.\n * @docLink cli/dev-guide#store-client\n */\nexport function getStoreConfig(): StoreConfig {\n const settingsPath = globalSettingsPath();\n let settings: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n settings = mapLegacyFields(JSON.parse(readFileSync(settingsPath, \"utf-8\")));\n } catch {\n settings = {};\n }\n }\n return {\n url: settings.storeUrl ?? process.env.SKAILE_STORE_URL ?? \"https://store.skaile.ai\",\n jwt: settings.storeJwt ?? null,\n refreshToken: settings.storeRefreshToken ?? null,\n };\n}\n\n/** Path to user-level settings */\nfunction userSettingsPath(): string {\n return join(homedir(), \".skaile\", \"settings.json\");\n}\n\n/**\n * Persist store authentication tokens to `~/.skaile/settings.json`.\n *\n * @param jwt - The JWT access token returned by the store login endpoint.\n * @param refreshToken - The refresh token for obtaining new JWTs.\n * @docLink cli/dev-guide#store-client\n */\nexport function saveStoreTokens(jwt: string, refreshToken: string): void {\n const settingsPath = userSettingsPath();\n const dir = join(settingsPath, \"..\");\n mkdirSync(dir, { recursive: true });\n\n let current: Record<string, any> = {};\n if (existsSync(settingsPath)) {\n try {\n current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n } catch {\n current = {};\n }\n }\n\n current.storeJwt = jwt;\n current.storeRefreshToken = refreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n}\n\n/**\n * Remove store authentication tokens from `~/.skaile/settings.json`.\n *\n * @docLink cli/dev-guide#store-client\n */\nexport function clearStoreTokens(): void {\n const settingsPath = userSettingsPath();\n if (!existsSync(settingsPath)) return;\n\n try {\n const current = JSON.parse(readFileSync(settingsPath, \"utf-8\"));\n delete current.storeJwt;\n delete current.storeRefreshToken;\n writeFileSync(settingsPath, JSON.stringify(current, null, 2), \"utf-8\");\n } catch {\n // ignore\n }\n}\n\n/**\n * Make an authenticated HTTP request to the store REST API with a 1.5s timeout.\n *\n * @param config - Store connection config (URL + auth token).\n * @param path - API path (e.g. `/api/assets`).\n * @param opts - Optional method, body, query params, and extra headers.\n * @returns Parsed JSON response body.\n * @docLink cli/dev-guide#store-client\n */\nexport async function storeFetch<T = any>(\n config: StoreConfig,\n path: string,\n opts?: {\n method?: string;\n body?: unknown;\n params?: Record<string, string>;\n headers?: Record<string, string>;\n },\n): Promise<T> {\n let url = `${config.url}${path}`;\n if (opts?.params) {\n const sp = new URLSearchParams(opts.params);\n url += `?${sp}`;\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...(opts?.headers ?? {}),\n };\n if (config.jwt) {\n headers.Authorization = `Bearer ${config.jwt}`;\n }\n\n const fetchOpts: RequestInit = {\n method: opts?.method ?? \"GET\",\n headers,\n };\n if (opts?.body) {\n fetchOpts.body = JSON.stringify(opts.body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1_500);\n try {\n const res = await fetch(url, { ...fetchOpts, signal: controller.signal });\n if (!res.ok) {\n const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));\n throw new Error((body as any).error ?? `Store API error: ${res.status}`);\n }\n return res.json() as Promise<T>;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Return `true` if a JWT token is present in the provided (or default) store config.\n *\n * @param config - Optional pre-loaded config; if omitted, calls {@link getStoreConfig}.\n * @docLink cli/dev-guide#store-client\n */\nexport function isStoreAuthenticated(config?: StoreConfig): boolean {\n const c = config ?? getStoreConfig();\n return !!c.jwt;\n}\n"]}
@@ -12,6 +12,33 @@ var MODEL_TERMINAL_REASONS = /* @__PURE__ */ new Set(["model_error", "image_erro
12
12
  function classifyClaudeSdkError(input) {
13
13
  const opts = typeof input === "string" ? { errors: [input] } : input;
14
14
  const message = (opts.errors ?? []).join("; ") || "Unknown agent error";
15
+ const byTerminalReason = classifyByTerminalReason(message, opts);
16
+ if (byTerminalReason) {
17
+ return byTerminalReason;
18
+ }
19
+ const structured = tryParseEmbeddedAnthropicError(message);
20
+ if (structured) {
21
+ const byStructured = classifyByStructuredError(message, structured, opts);
22
+ if (byStructured) {
23
+ return byStructured;
24
+ }
25
+ }
26
+ const lower = message.toLowerCase();
27
+ const byKeyword = classifyByKeyword(message, lower, opts);
28
+ if (byKeyword) {
29
+ return byKeyword;
30
+ }
31
+ const bySubtype = classifyBySubtype(message, opts);
32
+ if (bySubtype) {
33
+ return bySubtype;
34
+ }
35
+ return {
36
+ message,
37
+ category: "unknown",
38
+ retryable: true
39
+ };
40
+ }
41
+ function classifyByTerminalReason(message, opts) {
15
42
  if (opts.terminalReason && RATE_LIMIT_TERMINAL_REASONS.has(opts.terminalReason)) {
16
43
  return {
17
44
  message,
@@ -36,55 +63,57 @@ function classifyClaudeSdkError(input) {
36
63
  hint: "The model rejected this turn. Try again or switch models."
37
64
  };
38
65
  }
39
- const structured = tryParseEmbeddedAnthropicError(message);
40
- if (structured) {
41
- if (structured.errorType === "rate_limit_error") {
42
- return {
43
- message,
44
- category: "rate_limit",
45
- statusCode: structured.statusCode ?? 429,
46
- retryable: true,
47
- hint: oauthQuotaHint(opts.oauthCredential)
48
- };
49
- }
50
- if (structured.errorType === "overloaded_error") {
51
- return {
52
- message,
53
- category: "rate_limit",
54
- statusCode: structured.statusCode ?? 529,
55
- retryable: true,
56
- hint: "Anthropic is overloaded. Try again in a moment."
57
- };
58
- }
59
- if (structured.errorType === "authentication_error") {
60
- return {
61
- message,
62
- category: "auth",
63
- statusCode: structured.statusCode ?? 401,
64
- retryable: false,
65
- hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : "Anthropic rejected the API key. Check it in Settings -> AI Providers."
66
- };
67
- }
68
- if (structured.errorType === "permission_error") {
69
- return {
70
- message,
71
- category: "auth",
72
- statusCode: structured.statusCode ?? 403,
73
- retryable: false,
74
- hint: "The configured credential does not have access to the requested model."
75
- };
76
- }
77
- if (structured.errorType === "invalid_request_error") {
78
- return {
79
- message,
80
- category: "validation",
81
- statusCode: structured.statusCode ?? 400,
82
- retryable: false,
83
- hint: "Anthropic rejected the request shape. This is likely a bug \u2014 please report it."
84
- };
85
- }
66
+ return null;
67
+ }
68
+ function classifyByStructuredError(message, structured, opts) {
69
+ if (structured.errorType === "rate_limit_error") {
70
+ return {
71
+ message,
72
+ category: "rate_limit",
73
+ statusCode: structured.statusCode ?? 429,
74
+ retryable: true,
75
+ hint: oauthQuotaHint(opts.oauthCredential)
76
+ };
86
77
  }
87
- const lower = message.toLowerCase();
78
+ if (structured.errorType === "overloaded_error") {
79
+ return {
80
+ message,
81
+ category: "rate_limit",
82
+ statusCode: structured.statusCode ?? 529,
83
+ retryable: true,
84
+ hint: "Anthropic is overloaded. Try again in a moment."
85
+ };
86
+ }
87
+ if (structured.errorType === "authentication_error") {
88
+ return {
89
+ message,
90
+ category: "auth",
91
+ statusCode: structured.statusCode ?? 401,
92
+ retryable: false,
93
+ hint: opts.oauthCredential ? "Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token \u2014 wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install." : "Anthropic rejected the API key. Check it in Settings -> AI Providers."
94
+ };
95
+ }
96
+ if (structured.errorType === "permission_error") {
97
+ return {
98
+ message,
99
+ category: "auth",
100
+ statusCode: structured.statusCode ?? 403,
101
+ retryable: false,
102
+ hint: "The configured credential does not have access to the requested model."
103
+ };
104
+ }
105
+ if (structured.errorType === "invalid_request_error") {
106
+ return {
107
+ message,
108
+ category: "validation",
109
+ statusCode: structured.statusCode ?? 400,
110
+ retryable: false,
111
+ hint: "Anthropic rejected the request shape. This is likely a bug \u2014 please report it."
112
+ };
113
+ }
114
+ return null;
115
+ }
116
+ function classifyByKeyword(message, lower, opts) {
88
117
  if (lower.includes("rate limit") || lower.includes("rate_limit") || lower.includes("too many requests") || lower.includes("429") || lower.includes("quota") || lower.includes("blocking_limit") || lower.includes("rapid_refill")) {
89
118
  return {
90
119
  message,
@@ -151,6 +180,9 @@ function classifyClaudeSdkError(input) {
151
180
  hint: "Network error reaching Anthropic. The runner will retry \u2014 try again if it persists."
152
181
  };
153
182
  }
183
+ return null;
184
+ }
185
+ function classifyBySubtype(message, opts) {
154
186
  if (opts.subtype === "error_max_turns") {
155
187
  return {
156
188
  message,
@@ -167,11 +199,7 @@ function classifyClaudeSdkError(input) {
167
199
  hint: "The agent stopped because it hit the configured per-turn budget. Raise the budget or split the work."
168
200
  };
169
201
  }
170
- return {
171
- message,
172
- category: "unknown",
173
- retryable: true
174
- };
202
+ return null;
175
203
  }
176
204
  function classifyGenericErrorMessage(msg) {
177
205
  const lower = msg.toLowerCase();
@@ -203,10 +231,28 @@ function tryParseEmbeddedAnthropicError(text) {
203
231
  if (braceStart < 0) {
204
232
  return null;
205
233
  }
234
+ const braceEnd = findMatchingCloseBrace(text, braceStart);
235
+ if (braceEnd < 0) {
236
+ return null;
237
+ }
238
+ let parsed;
239
+ try {
240
+ parsed = JSON.parse(text.slice(braceStart, braceEnd));
241
+ } catch {
242
+ return null;
243
+ }
244
+ const errorType = parsed?.error?.type;
245
+ if (typeof errorType !== "string") {
246
+ return null;
247
+ }
248
+ const statusMatch = text.match(/API Error:\s*(\d{3})/i);
249
+ const statusCode = statusMatch ? Number(statusMatch[1]) : void 0;
250
+ return { errorType, statusCode };
251
+ }
252
+ function findMatchingCloseBrace(text, braceStart) {
206
253
  let depth = 0;
207
254
  let inString = false;
208
255
  let escaped = false;
209
- let braceEnd = -1;
210
256
  for (let i = braceStart; i < text.length; i++) {
211
257
  const ch = text.charCodeAt(i);
212
258
  if (inString) {
@@ -226,29 +272,13 @@ function tryParseEmbeddedAnthropicError(text) {
226
272
  } else if (ch === 125) {
227
273
  depth--;
228
274
  if (depth === 0) {
229
- braceEnd = i + 1;
230
- break;
275
+ return i + 1;
231
276
  }
232
277
  }
233
278
  }
234
- if (braceEnd < 0) {
235
- return null;
236
- }
237
- let parsed;
238
- try {
239
- parsed = JSON.parse(text.slice(braceStart, braceEnd));
240
- } catch {
241
- return null;
242
- }
243
- const errorType = parsed?.error?.type;
244
- if (typeof errorType !== "string") {
245
- return null;
246
- }
247
- const statusMatch = text.match(/API Error:\s*(\d{3})/i);
248
- const statusCode = statusMatch ? Number(statusMatch[1]) : void 0;
249
- return { errorType, statusCode };
279
+ return -1;
250
280
  }
251
281
 
252
282
  export { AuthError, classifyClaudeSdkError, classifyGenericErrorMessage };
253
- //# sourceMappingURL=chunk-PAYAFNXG.js.map
254
- //# sourceMappingURL=chunk-PAYAFNXG.js.map
283
+ //# sourceMappingURL=chunk-NGJ6E344.js.map
284
+ //# sourceMappingURL=chunk-NGJ6E344.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bridge/src/error-classifier.ts"],"names":[],"mappings":"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","file":"chunk-NGJ6E344.js","sourcesContent":["/**\n * Error classification for the Claude Agent SDK driver.\n *\n * Wraps the Anthropic API error patterns surfaced through the bundled\n * `claude-cli.js`. The CLI flattens upstream HTTP errors into terse strings\n * like:\n *\n * `Claude Code returned an error result: Failed to authenticate. API Error:\n * 401 {\"type\":\"error\",\"error\":{\"type\":\"authentication_error\",\"message\":\n * \"Invalid authentication credentials\"}}`\n *\n * Word-for-word that reads as an auth failure, but in practice it also\n * fires when a Claude Max OAuth subscription has exhausted its current\n * quota window — Anthropic returns a non-200 that the CLI relabels as\n * \"Failed to authenticate\" without preserving the original error type.\n *\n * The classifier here:\n * 1. Parses an embedded JSON body when the upstream included one\n * (e.g. `{\"type\":\"error\",\"error\":{\"type\":\"rate_limit_error\",...}}`)\n * so we believe the structured `error.type` over the surrounding\n * free-text wrapper.\n * 2. Honours the SDK's `terminal_reason` when it explicitly indicates\n * a blocking-limit / rapid-refill / model-error condition — those\n * are authoritative even if the textual error reads as auth.\n * 3. Falls back to keyword heuristics on the message text.\n * 4. For OAuth-style credentials (Claude Code subscriptions), adds a\n * hint that bounces user attention to quota rather than credentials,\n * because that's overwhelmingly the cause when a CredentialsFile\n * provider that worked yesterday now returns \"Invalid authentication\n * credentials\" without anyone touching the file.\n */\n\nimport type { AgentError } from \"./types.js\";\n\n/**\n * Error thrown by drivers when the upstream provider rejects the credential\n * with an authentication-shaped failure (HTTP 401 / `authentication_error`\n * structured body). Carries the structured {@link AgentError} produced by\n * {@link classifyClaudeSdkError} so the runner can mediate without\n * re-classifying string text.\n *\n * The runner's 401-mediation handler `instanceof`-discriminates on this\n * subclass so the auth-vs-rate_limit fork stays in one place.\n *\n * Spec: `_devlog/specs/2026-05-07-unified-credential-mediation.md`\n * § \"Runner-side handling on 401\".\n *\n * @category Errors\n * @since 3.3.0\n */\nexport class AuthError extends Error {\n readonly detail: AgentError;\n constructor(detail: AgentError) {\n super(detail.message);\n this.name = \"AuthError\";\n this.detail = detail;\n }\n}\n\n/**\n * `terminal_reason` values from the Claude Agent SDK that imply the failure\n * is a rate / quota / blocking condition rather than a credential problem.\n */\nconst RATE_LIMIT_TERMINAL_REASONS = new Set<string>([\"blocking_limit\", \"rapid_refill_breaker\"]);\n\n/**\n * `terminal_reason` values that indicate a generic, retryable model failure.\n * `prompt_too_long` is handled separately (not retryable, different hint).\n */\nconst MODEL_TERMINAL_REASONS = new Set<string>([\"model_error\", \"image_error\"]);\n\n/**\n * Input shape for {@link classifyClaudeSdkError} when decoding an `SDKResultError`.\n *\n * All fields are optional; `classifyClaudeSdkError` also accepts a plain `string`\n * (a thrown exception message) for the common non-SDK code paths.\n *\n * @docLink packages/bridge/api-reference#error-classifier\n */\nexport interface ClaudeSdkResultErrorInput {\n /** `errors` array from `SDKResultError`. Empty when not provided. */\n errors?: string[];\n /**\n * `terminal_reason` from `SDKResultError`. Authoritative when set to a\n * blocking/rapid-refill value, regardless of message text.\n */\n terminalReason?: string;\n /** `subtype` from `SDKResultError` — `error_max_turns` etc. */\n subtype?: string;\n /**\n * `true` when the configured Anthropic credential is a Claude Code\n * subscription (`CredentialsFile` provider) rather than a raw API key.\n * Changes the hint copy because `Invalid authentication credentials`\n * on an OAuth subscription almost always means quota.\n */\n oauthCredential?: boolean;\n}\n\n/**\n * Classify a Claude SDK result-error or thrown error into a structured\n * {@link AgentError}. Pure function — safe to call from any layer.\n *\n * @param input - Either a free-text error message (from a thrown exception)\n * or a partially-decoded `SDKResultError` shape with `errors[]`,\n * `terminal_reason`, and `subtype`.\n * @returns A category, retryable flag, and human-readable hint.\n * @docLink packages/bridge/api-reference#error-classifier\n */\nexport function classifyClaudeSdkError(input: string | ClaudeSdkResultErrorInput): AgentError {\n const opts: ClaudeSdkResultErrorInput = typeof input === \"string\" ? { errors: [input] } : input;\n\n const message = (opts.errors ?? []).join(\"; \") || \"Unknown agent error\";\n\n // ── 1. Honour authoritative `terminal_reason` ──────────────────────────\n const byTerminalReason = classifyByTerminalReason(message, opts);\n if (byTerminalReason) {\n return byTerminalReason;\n }\n\n // ── 2. Inspect embedded JSON body for a structured error.type ──────────\n const structured = tryParseEmbeddedAnthropicError(message);\n if (structured) {\n const byStructured = classifyByStructuredError(message, structured, opts);\n if (byStructured) {\n return byStructured;\n }\n }\n\n // ── 3. Heuristic keyword classification on the wrapper text ────────────\n const lower = message.toLowerCase();\n\n const byKeyword = classifyByKeyword(message, lower, opts);\n if (byKeyword) {\n return byKeyword;\n }\n\n // ── 4. SDK result subtypes ─────────────────────────────────────────────\n const bySubtype = classifyBySubtype(message, opts);\n if (bySubtype) {\n return bySubtype;\n }\n\n return {\n message,\n category: \"unknown\",\n retryable: true,\n };\n}\n\n/**\n * Phase 1: classify on the SDK's authoritative `terminal_reason`. Returns\n * `null` when the reason is unset or not one of the recognised values.\n */\nfunction classifyByTerminalReason(\n message: string,\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (opts.terminalReason && RATE_LIMIT_TERMINAL_REASONS.has(opts.terminalReason)) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n if (opts.terminalReason === \"prompt_too_long\") {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long for the configured model. Start a new session or compact the existing one.\",\n };\n }\n if (opts.terminalReason && MODEL_TERMINAL_REASONS.has(opts.terminalReason)) {\n return {\n message,\n category: \"model\",\n retryable: true,\n hint: \"The model rejected this turn. Try again or switch models.\",\n };\n }\n return null;\n}\n\n/**\n * Phase 2: classify on the structured `error.type` parsed from an embedded\n * Anthropic JSON body. Returns `null` for an unrecognised `errorType`.\n */\nfunction classifyByStructuredError(\n message: string,\n structured: { errorType: string; statusCode?: number },\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (structured.errorType === \"rate_limit_error\") {\n return {\n message,\n category: \"rate_limit\",\n statusCode: structured.statusCode ?? 429,\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n if (structured.errorType === \"overloaded_error\") {\n return {\n message,\n category: \"rate_limit\",\n statusCode: structured.statusCode ?? 529,\n retryable: true,\n hint: \"Anthropic is overloaded. Try again in a moment.\",\n };\n }\n if (structured.errorType === \"authentication_error\") {\n // Anthropic genuinely says it's an auth failure. But for OAuth\n // credentials with the `oauth-2025-04-20` beta flow, this still\n // overwhelmingly correlates with quota. Surface both possibilities\n // in the hint so the user does not first re-upload a perfectly\n // good credentials file.\n return {\n message,\n category: \"auth\",\n statusCode: structured.statusCode ?? 401,\n retryable: false,\n hint: opts.oauthCredential\n ? \"Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token — wait a few minutes before re-uploading the credentials file. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install.\"\n : \"Anthropic rejected the API key. Check it in Settings -> AI Providers.\",\n };\n }\n if (structured.errorType === \"permission_error\") {\n return {\n message,\n category: \"auth\",\n statusCode: structured.statusCode ?? 403,\n retryable: false,\n hint: \"The configured credential does not have access to the requested model.\",\n };\n }\n if (structured.errorType === \"invalid_request_error\") {\n return {\n message,\n category: \"validation\",\n statusCode: structured.statusCode ?? 400,\n retryable: false,\n hint: \"Anthropic rejected the request shape. This is likely a bug — please report it.\",\n };\n }\n return null;\n}\n\n/**\n * Phase 3: heuristic keyword classification on the lowercased wrapper text.\n * `lower` is the pre-lowercased `message`. Returns `null` when no bucket hits.\n */\nfunction classifyByKeyword(\n message: string,\n lower: string,\n opts: ClaudeSdkResultErrorInput,\n): AgentError | null {\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"rate_limit\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"429\") ||\n lower.includes(\"quota\") ||\n lower.includes(\"blocking_limit\") ||\n lower.includes(\"rapid_refill\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: oauthQuotaHint(opts.oauthCredential),\n };\n }\n\n if (\n lower.includes(\"credit balance\") ||\n lower.includes(\"insufficient credit\") ||\n lower.includes(\"out of credits\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: false,\n hint: \"The configured Anthropic account is out of credits. Top up at https://console.anthropic.com/ or switch providers.\",\n };\n }\n\n if (lower.includes(\"oauth authentication is currently not supported\")) {\n return {\n message,\n category: \"auth\",\n statusCode: 401,\n retryable: false,\n hint: \"The Claude Code CLI did not send the OAuth beta header. The bundled CLI in this image is too old — rebuild the agent image.\",\n };\n }\n\n // The Claude Code CLI emits this terse, JSON-less string when it finds no\n // usable credential — most commonly because the OAuth access token in\n // `~/.claude/.credentials.json` expired and the file carries no refresh token\n // (the platform provisions access-token-only files by design). It MUST be\n // classified as `auth` so the driver promotes it to `AuthError` and the\n // `onAuthError` self-heal re-mints the credential. Without this branch the\n // message falls through to `unknown`, the self-heal never fires, and every\n // subsequent turn dead-ends on \"please /login\". The check sits ahead of the\n // generic auth keywords because the string contains none of them.\n if (lower.includes(\"not logged in\") || lower.includes(\"please run /login\")) {\n return {\n message,\n category: \"auth\",\n statusCode: 401,\n retryable: false,\n hint: opts.oauthCredential\n ? \"The Claude Code OAuth credential expired and could not be auto-refreshed in-container. The runner will re-mint it — retry the prompt. If it persists, re-export `~/.claude/.credentials.json` from a working Claude Code install.\"\n : \"No Anthropic credential is configured for this provider. Add one in Settings -> AI Providers.\",\n };\n }\n\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"invalid authentication\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"401\") ||\n lower.includes(\"403\")\n ) {\n return {\n message,\n category: \"auth\",\n retryable: false,\n hint: opts.oauthCredential\n ? \"Anthropic rejected the OAuth credential. With Claude Code subscriptions this is usually a quota or rate-limit issue rather than an invalid token — wait a few minutes before re-uploading the credentials file.\"\n : \"Check the API key configured for this AI provider in Settings.\",\n };\n }\n\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The selected model is not available for this credential. Change the model in the AI provider config.\",\n };\n }\n\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\") ||\n lower.includes(\"prompt is too long\") ||\n lower.includes(\"prompt_too_long\")\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long for the model. Start a new session or compact this one.\",\n };\n }\n\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"fetch failed\") ||\n lower.includes(\"network\")\n ) {\n return {\n message,\n category: \"network\",\n retryable: true,\n hint: \"Network error reaching Anthropic. The runner will retry — try again if it persists.\",\n };\n }\n\n return null;\n}\n\n/**\n * Phase 4: classify on the SDK result `subtype` (`error_max_turns` etc).\n * Returns `null` when the subtype is unset or unrecognised.\n */\nfunction classifyBySubtype(message: string, opts: ClaudeSdkResultErrorInput): AgentError | null {\n if (opts.subtype === \"error_max_turns\") {\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"The agent stopped after reaching `max_turns`. Resume the session or raise `max_turns` in the agent config.\",\n };\n }\n if (opts.subtype === \"error_max_budget_usd\") {\n return {\n message,\n category: \"rate_limit\",\n retryable: false,\n hint: \"The agent stopped because it hit the configured per-turn budget. Raise the budget or split the work.\",\n };\n }\n return null;\n}\n\n/**\n * The shared keyword buckets matched by {@link classifyGenericErrorMessage}.\n * Drivers layer a provider-specific `hint` on top of the returned category.\n */\nexport type GenericErrorCategory = \"auth\" | \"rate_limit\" | \"model\" | \"network\";\n\n/**\n * Classify a free-text driver error against the keyword buckets common to the\n * subprocess/SDK drivers (omp, codex). Returns the matched `category` +\n * `retryable` flag, or `null` when no shared bucket matches so the caller can\n * fall through to its own provider-specific buckets (e.g. codex sandbox) and\n * `unknown` default. The driver supplies the user-facing `hint` — only the\n * bucketing logic is shared, not the copy.\n */\nexport function classifyGenericErrorMessage(\n msg: string,\n): { category: GenericErrorCategory; retryable: boolean } | null {\n const lower = msg.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return { category: \"auth\", retryable: false };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return { category: \"rate_limit\", retryable: true };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return { category: \"model\", retryable: false };\n }\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"too long\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\")\n ) {\n return { category: \"model\", retryable: false };\n }\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"network\") ||\n lower.includes(\"fetch failed\") ||\n lower.includes(\"fetch\") ||\n lower.includes(\"connection\")\n ) {\n return { category: \"network\", retryable: true };\n }\n return null;\n}\n\n/**\n * Returns the rate-limit hint copy, branched on whether the active\n * credential is a Claude Code OAuth subscription.\n */\nfunction oauthQuotaHint(oauthCredential?: boolean): string {\n if (oauthCredential) {\n return \"Quota exhausted on this Claude Code subscription. Wait for the rate-limit window to reset (typically a few minutes for short windows, longer for daily/weekly limits) before retrying. The credential itself is fine.\";\n }\n return \"The Anthropic account hit a rate limit. Wait a moment and try again.\";\n}\n\n/**\n * Try to extract a structured Anthropic error body from a free-text wrapper.\n * The bundled `claude-cli.js` typically formats failures as\n * `... API Error: <status> {\"type\":\"error\",\"error\":{\"type\":\"<errorType>\",...}}`\n * with optional trailing garbage after the JSON.\n *\n * Strategy: find the first `{`, then forward-scan tracking brace depth (with\n * string-literal awareness so braces inside quoted values do not throw the\n * count). The substring from `braceStart` to the matching `}` is the JSON\n * candidate; one `JSON.parse` does the rest. O(n) in the input length.\n *\n * Returns `null` when nothing parseable is found.\n */\nfunction tryParseEmbeddedAnthropicError(\n text: string,\n): { errorType: string; statusCode?: number } | null {\n const braceStart = text.indexOf(\"{\");\n if (braceStart < 0) {\n return null;\n }\n\n const braceEnd = findMatchingCloseBrace(text, braceStart);\n if (braceEnd < 0) {\n return null;\n }\n\n let parsed: { type?: string; error?: { type?: string; message?: string } };\n try {\n parsed = JSON.parse(text.slice(braceStart, braceEnd));\n } catch {\n return null;\n }\n const errorType = parsed?.error?.type;\n if (typeof errorType !== \"string\") {\n return null;\n }\n const statusMatch = text.match(/API Error:\\s*(\\d{3})/i);\n const statusCode = statusMatch ? Number(statusMatch[1]) : undefined;\n return { errorType, statusCode };\n}\n\n/**\n * Forward-scan `text` from `braceStart` (a `{`) with brace counting, returning\n * the index just past the matching close brace, or `-1` if unbalanced.\n * String-literal awareness: skip braces between unescaped double quotes.\n */\nfunction findMatchingCloseBrace(text: string, braceStart: number): number {\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = braceStart; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (ch === 92 /* \\ */) {\n escaped = true;\n } else if (ch === 34 /* \" */) {\n inString = false;\n }\n continue;\n }\n if (ch === 34 /* \" */) {\n inString = true;\n } else if (ch === 123 /* { */) {\n depth++;\n } else if (ch === 125 /* } */) {\n depth--;\n if (depth === 0) {\n return i + 1;\n }\n }\n }\n return -1;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { classifyGenericErrorMessage } from './chunk-PAYAFNXG.js';
2
- import { AgentDriver } from './chunk-ZEKWHJBB.js';
1
+ import { classifyGenericErrorMessage } from './chunk-NGJ6E344.js';
2
+ import { AgentDriver } from './chunk-IZIFMNTI.js';
3
3
  import { spawn } from 'child_process';
4
4
  import { createInterface } from 'readline';
5
5
 
@@ -441,5 +441,5 @@ function mapApiKeysToEnv(apiKeys) {
441
441
  }
442
442
 
443
443
  export { SubprocessCliDriver, extractCost, extractText, extractTokens, mapApiKeysToEnv };
444
- //# sourceMappingURL=chunk-5V5KZQIC.js.map
445
- //# sourceMappingURL=chunk-5V5KZQIC.js.map
444
+ //# sourceMappingURL=chunk-PVMAIVNL.js.map
445
+ //# sourceMappingURL=chunk-PVMAIVNL.js.map