@skaile/workspaces 3.15.0 → 3.16.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 (183) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/dist/{asset-feeds-XSUE5LE6.js → asset-feeds-TS76HDGE.js} +11 -11
  3. package/dist/{asset-feeds-XSUE5LE6.js.map → asset-feeds-TS76HDGE.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +7 -7
  5. package/dist/asset-manager/index.js +10 -10
  6. package/dist/asset-manager/installer.js +7 -7
  7. package/dist/bridge/drivers/claude-sdk.js +8 -8
  8. package/dist/bridge/drivers/codex.js +3 -3
  9. package/dist/bridge/drivers/continue.js +4 -4
  10. package/dist/bridge/drivers/echo.js +3 -3
  11. package/dist/bridge/drivers/gemini.js +5 -5
  12. package/dist/bridge/drivers/goose.js +4 -4
  13. package/dist/bridge/drivers/omp.js +3 -3
  14. package/dist/bridge/drivers/opencode.js +4 -4
  15. package/dist/bridge/drivers/qwen.js +5 -5
  16. package/dist/bridge/index.js +9 -9
  17. package/dist/bridge/src/normalizer.d.ts.map +1 -1
  18. package/dist/{chunk-RUFTB7QN.js → chunk-3NCGSSCU.js} +3 -3
  19. package/dist/{chunk-RUFTB7QN.js.map → chunk-3NCGSSCU.js.map} +1 -1
  20. package/dist/{chunk-4VTBZ2MF.js → chunk-3XXQPHGL.js} +4 -4
  21. package/dist/{chunk-4VTBZ2MF.js.map → chunk-3XXQPHGL.js.map} +1 -1
  22. package/dist/{chunk-LAOS2TZU.js → chunk-4J24AU4Q.js} +8 -8
  23. package/dist/{chunk-LAOS2TZU.js.map → chunk-4J24AU4Q.js.map} +1 -1
  24. package/dist/{chunk-DTSKPMP3.js → chunk-5FCBPIOK.js} +9 -5
  25. package/dist/chunk-5FCBPIOK.js.map +1 -0
  26. package/dist/{chunk-3UU3D2Q3.js → chunk-5KSIVLOX.js} +5 -5
  27. package/dist/{chunk-3UU3D2Q3.js.map → chunk-5KSIVLOX.js.map} +1 -1
  28. package/dist/{chunk-FYLIY6TO.js → chunk-6KPCHQP5.js} +3 -3
  29. package/dist/{chunk-FYLIY6TO.js.map → chunk-6KPCHQP5.js.map} +1 -1
  30. package/dist/{chunk-LVZ5NGME.js → chunk-775OMGVP.js} +3 -3
  31. package/dist/{chunk-LVZ5NGME.js.map → chunk-775OMGVP.js.map} +1 -1
  32. package/dist/{chunk-GHWJHOYX.js → chunk-7BUZQVRR.js} +4 -4
  33. package/dist/{chunk-GHWJHOYX.js.map → chunk-7BUZQVRR.js.map} +1 -1
  34. package/dist/{chunk-JAHHMZWG.js → chunk-7IRJ4K4F.js} +3 -3
  35. package/dist/{chunk-JAHHMZWG.js.map → chunk-7IRJ4K4F.js.map} +1 -1
  36. package/dist/{chunk-QZ6XXD3A.js → chunk-BQMRUH7J.js} +3 -3
  37. package/dist/{chunk-QZ6XXD3A.js.map → chunk-BQMRUH7J.js.map} +1 -1
  38. package/dist/{chunk-O52DU5KU.js → chunk-BUKPS4YL.js} +3 -3
  39. package/dist/{chunk-O52DU5KU.js.map → chunk-BUKPS4YL.js.map} +1 -1
  40. package/dist/{chunk-Q7KWJO4J.js → chunk-C4AP3XZB.js} +5 -5
  41. package/dist/{chunk-Q7KWJO4J.js.map → chunk-C4AP3XZB.js.map} +1 -1
  42. package/dist/{chunk-F2WTSHZS.js → chunk-CIPK5JMJ.js} +4 -4
  43. package/dist/{chunk-F2WTSHZS.js.map → chunk-CIPK5JMJ.js.map} +1 -1
  44. package/dist/{chunk-PPKK5EV6.js → chunk-DZ4UZOFB.js} +3 -3
  45. package/dist/{chunk-PPKK5EV6.js.map → chunk-DZ4UZOFB.js.map} +1 -1
  46. package/dist/{chunk-6YDXCJGK.js → chunk-EVQDXN27.js} +3 -3
  47. package/dist/{chunk-6YDXCJGK.js.map → chunk-EVQDXN27.js.map} +1 -1
  48. package/dist/{chunk-G2CXWUO5.js → chunk-FAI2SMFE.js} +4 -4
  49. package/dist/{chunk-G2CXWUO5.js.map → chunk-FAI2SMFE.js.map} +1 -1
  50. package/dist/{chunk-5Q7HA4JP.js → chunk-FTG7CRFD.js} +3 -3
  51. package/dist/{chunk-5Q7HA4JP.js.map → chunk-FTG7CRFD.js.map} +1 -1
  52. package/dist/{chunk-FI4QNNMD.js → chunk-GP2AYOC2.js} +8 -8
  53. package/dist/{chunk-FI4QNNMD.js.map → chunk-GP2AYOC2.js.map} +1 -1
  54. package/dist/{chunk-VQ4P7UYE.js → chunk-MKZOK4JU.js} +3 -3
  55. package/dist/{chunk-VQ4P7UYE.js.map → chunk-MKZOK4JU.js.map} +1 -1
  56. package/dist/{chunk-Z5ED4E57.js → chunk-NIUG3MIH.js} +3 -3
  57. package/dist/{chunk-Z5ED4E57.js.map → chunk-NIUG3MIH.js.map} +1 -1
  58. package/dist/{chunk-5WMFU575.js → chunk-OEK2ACRR.js} +116 -29
  59. package/dist/chunk-OEK2ACRR.js.map +1 -0
  60. package/dist/{chunk-4OQ2HQCQ.js → chunk-OGTS7QJX.js} +4 -4
  61. package/dist/{chunk-4OQ2HQCQ.js.map → chunk-OGTS7QJX.js.map} +1 -1
  62. package/dist/{chunk-SH572OBN.js → chunk-OIDFK7SG.js} +4 -4
  63. package/dist/{chunk-SH572OBN.js.map → chunk-OIDFK7SG.js.map} +1 -1
  64. package/dist/{chunk-IP3GXHOB.js → chunk-OZ7UNMTK.js} +3 -3
  65. package/dist/{chunk-IP3GXHOB.js.map → chunk-OZ7UNMTK.js.map} +1 -1
  66. package/dist/{chunk-CWTL2QWL.js → chunk-PCDNZROC.js} +7 -7
  67. package/dist/{chunk-CWTL2QWL.js.map → chunk-PCDNZROC.js.map} +1 -1
  68. package/dist/{chunk-VFPFW67T.js → chunk-QA52GQQN.js} +10 -10
  69. package/dist/{chunk-VFPFW67T.js.map → chunk-QA52GQQN.js.map} +1 -1
  70. package/dist/{chunk-TMAGWRKY.js → chunk-QG6C3XOS.js} +6 -6
  71. package/dist/{chunk-TMAGWRKY.js.map → chunk-QG6C3XOS.js.map} +1 -1
  72. package/dist/{chunk-3DNCPQAR.js → chunk-RTM4SFLA.js} +9 -3
  73. package/dist/chunk-RTM4SFLA.js.map +1 -0
  74. package/dist/{chunk-X5EYJEEQ.js → chunk-S4UA244H.js} +4 -4
  75. package/dist/{chunk-X5EYJEEQ.js.map → chunk-S4UA244H.js.map} +1 -1
  76. package/dist/{chunk-WE7ONZNB.js → chunk-SUPIVTLX.js} +3 -3
  77. package/dist/{chunk-WE7ONZNB.js.map → chunk-SUPIVTLX.js.map} +1 -1
  78. package/dist/{chunk-DWO2N72K.js → chunk-U2UNQBXB.js} +4 -4
  79. package/dist/{chunk-DWO2N72K.js.map → chunk-U2UNQBXB.js.map} +1 -1
  80. package/dist/{chunk-MTCLDJPR.js → chunk-VC2MWHRH.js} +9 -9
  81. package/dist/{chunk-MTCLDJPR.js.map → chunk-VC2MWHRH.js.map} +1 -1
  82. package/dist/{chunk-3A5IKBHQ.js → chunk-W4IPN3DD.js} +61 -8
  83. package/dist/chunk-W4IPN3DD.js.map +1 -0
  84. package/dist/{chunk-M5D2QNTY.js → chunk-ZNCZ7RUO.js} +3 -3
  85. package/dist/{chunk-M5D2QNTY.js.map → chunk-ZNCZ7RUO.js.map} +1 -1
  86. package/dist/cli/index.js +56 -52
  87. package/dist/cli/index.js.map +1 -1
  88. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  89. package/dist/connectors/config.js +7 -7
  90. package/dist/connectors/index.js +12 -12
  91. package/dist/core/index.js +6 -6
  92. package/dist/core/logging.js +2 -2
  93. package/dist/core/manifest.js +2 -2
  94. package/dist/core/runtime-assets.js +4 -4
  95. package/dist/core/src/logging/index.d.ts +2 -0
  96. package/dist/core/src/logging/index.d.ts.map +1 -1
  97. package/dist/core/src/logging/log-store.d.ts.map +1 -1
  98. package/dist/core/src/logging/sinks/stdout-sink.d.ts +6 -1
  99. package/dist/core/src/logging/sinks/stdout-sink.d.ts.map +1 -1
  100. package/dist/core/src/logging/stream-health.d.ts +46 -0
  101. package/dist/core/src/logging/stream-health.d.ts.map +1 -0
  102. package/dist/core/workspace-config.js +3 -3
  103. package/dist/deploy/index.js +8 -7
  104. package/dist/deploy/index.js.map +1 -1
  105. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -1
  106. package/dist/discovery/index.js +3 -3
  107. package/dist/{ensure-sources-SFQT5GXY.js → ensure-sources-I2F6XBDJ.js} +13 -13
  108. package/dist/{ensure-sources-SFQT5GXY.js.map → ensure-sources-I2F6XBDJ.js.map} +1 -1
  109. package/dist/factory-assets/connectors/box.js +12 -12
  110. package/dist/factory-assets/connectors/deploy.js +12 -12
  111. package/dist/factory-assets/connectors/devserver.js +12 -12
  112. package/dist/factory-assets/connectors/flow/adapter.js +12 -12
  113. package/dist/factory-assets/connectors/flow/engine.js +7 -7
  114. package/dist/factory-assets/connectors/flow/run-flow.js +14 -14
  115. package/dist/factory-assets/connectors/flow.js +12 -12
  116. package/dist/factory-assets/connectors/git.js +12 -12
  117. package/dist/factory-assets/connectors/gmail.js +12 -12
  118. package/dist/factory-assets/connectors/googledrive.js +12 -12
  119. package/dist/factory-assets/connectors/local.js +12 -12
  120. package/dist/factory-assets/connectors/mattermost.js +12 -12
  121. package/dist/factory-assets/connectors/memory.js +12 -12
  122. package/dist/factory-assets/connectors/minio.js +12 -12
  123. package/dist/factory-assets/connectors/postgres.js +12 -12
  124. package/dist/factory-assets/connectors/s3.js +12 -12
  125. package/dist/factory-assets/connectors/sharepoint.js +12 -12
  126. package/dist/factory-assets/connectors/sqlite.js +12 -12
  127. package/dist/factory-assets/connectors/static-server.js +12 -12
  128. package/dist/factory-assets/connectors/tunnel.js +12 -12
  129. package/dist/factory-assets/connectors/webdav.js +12 -12
  130. package/dist/factory-assets/connectors/xstate-store.js +12 -12
  131. package/dist/factory-assets/connectors/xstate.js +12 -12
  132. package/dist/flows-2SUFOVVO.js +20 -0
  133. package/dist/{flows-Z3DM5BHF.js.map → flows-2SUFOVVO.js.map} +1 -1
  134. package/dist/{helpers-VRQXNHFR.js → helpers-Y66CM6LO.js} +13 -13
  135. package/dist/{helpers-VRQXNHFR.js.map → helpers-Y66CM6LO.js.map} +1 -1
  136. package/dist/library/index.js +8 -8
  137. package/dist/library/install.js +6 -6
  138. package/dist/{library-publish-DV3B2ITY.js → library-publish-SNUOWBUD.js} +17 -17
  139. package/dist/{library-publish-DV3B2ITY.js.map → library-publish-SNUOWBUD.js.map} +1 -1
  140. package/dist/{open-library-2BXBAC6Q.js → open-library-IO4TSO2H.js} +15 -15
  141. package/dist/{open-library-2BXBAC6Q.js.map → open-library-IO4TSO2H.js.map} +1 -1
  142. package/dist/paths-4APA2PKT.js +16 -0
  143. package/dist/{paths-AI7MDPNA.js.map → paths-4APA2PKT.js.map} +1 -1
  144. package/dist/{plugin-store-OO5EZBYP.js → plugin-store-JQAIKR3R.js} +8 -8
  145. package/dist/{plugin-store-OO5EZBYP.js.map → plugin-store-JQAIKR3R.js.map} +1 -1
  146. package/dist/{project-2TYDMEZB.js → project-OR524CQ3.js} +14 -14
  147. package/dist/{project-2TYDMEZB.js.map → project-OR524CQ3.js.map} +1 -1
  148. package/dist/resolver/index.js +7 -7
  149. package/dist/runner/index.js +17 -17
  150. package/dist/runner/src/process-safety-net.d.ts +61 -0
  151. package/dist/runner/src/process-safety-net.d.ts.map +1 -0
  152. package/dist/runner/src/serve.d.ts +10 -0
  153. package/dist/runner/src/serve.d.ts.map +1 -1
  154. package/dist/sdk/asset-manager.js +10 -10
  155. package/dist/sdk/bridge.js +9 -9
  156. package/dist/sdk/core.js +6 -6
  157. package/dist/sdk/flow.js +7 -7
  158. package/dist/sdk/index.js +17 -17
  159. package/dist/sdk/resolver.js +7 -7
  160. package/dist/sdk/runner.js +17 -17
  161. package/dist/sdk/store.js +1 -1
  162. package/dist/{setup-EH4TZFMN.js → setup-5OG442AZ.js} +11 -11
  163. package/dist/{setup-EH4TZFMN.js.map → setup-5OG442AZ.js.map} +1 -1
  164. package/dist/skills-Q7PJVB3W.js +20 -0
  165. package/dist/{skills-XZOG6ZPX.js.map → skills-Q7PJVB3W.js.map} +1 -1
  166. package/dist/{source-PVTUMNAO.js → source-DTV7VK3C.js} +16 -16
  167. package/dist/{source-PVTUMNAO.js.map → source-DTV7VK3C.js.map} +1 -1
  168. package/dist/{source-manifest-publish-3XYTUVQQ.js → source-manifest-publish-HC3K7D63.js} +18 -18
  169. package/dist/{source-manifest-publish-3XYTUVQQ.js.map → source-manifest-publish-HC3K7D63.js.map} +1 -1
  170. package/dist/store/index.js +1 -1
  171. package/dist/store/src/store.d.ts.map +1 -1
  172. package/dist/tui/index.js +17 -17
  173. package/dist/workspace-plugin/adapters/mcp.js +11 -11
  174. package/dist/workspace-plugin/adapters/omp.js +7 -7
  175. package/dist/workspace-plugin/index.js +3 -3
  176. package/package.json +1 -1
  177. package/dist/chunk-3A5IKBHQ.js.map +0 -1
  178. package/dist/chunk-3DNCPQAR.js.map +0 -1
  179. package/dist/chunk-5WMFU575.js.map +0 -1
  180. package/dist/chunk-DTSKPMP3.js.map +0 -1
  181. package/dist/flows-Z3DM5BHF.js +0 -20
  182. package/dist/paths-AI7MDPNA.js +0 -16
  183. package/dist/skills-XZOG6ZPX.js +0 -20
@@ -0,0 +1,20 @@
1
+ export { skillCheckRequirements, skillGetPreamble, skillList, skillListDomains, skillSearch, skillShow } from './chunk-FAI2SMFE.js';
2
+ import './chunk-7IRJ4K4F.js';
3
+ import './chunk-X5YPJV4N.js';
4
+ import './chunk-3XXQPHGL.js';
5
+ import './chunk-7BUZQVRR.js';
6
+ import './chunk-CIPK5JMJ.js';
7
+ import './chunk-F3HNW354.js';
8
+ import './chunk-K5GBV4SA.js';
9
+ import './chunk-QVZA2MDT.js';
10
+ import './chunk-OIDFK7SG.js';
11
+ import './chunk-OZ7UNMTK.js';
12
+ import './chunk-MENCWIHW.js';
13
+ import './chunk-P4VHQA4N.js';
14
+ import './chunk-MKZOK4JU.js';
15
+ import './chunk-GEEW6SY2.js';
16
+ import './chunk-FTG7CRFD.js';
17
+ import './chunk-W4IPN3DD.js';
18
+ import './chunk-NSBPE2FW.js';
19
+ //# sourceMappingURL=skills-Q7PJVB3W.js.map
20
+ //# sourceMappingURL=skills-Q7PJVB3W.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"skills-XZOG6ZPX.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"skills-Q7PJVB3W.js"}
@@ -1,33 +1,33 @@
1
- export { autoSyncForSearch, ensureClone, findCacheKeyCollision, indexingHadFailures, legacySourceConfigHint, makeSourceCommand, normalizeSourceUrl, readProjectSources, sourceClonePath, sourceMatchesKey, syncProjectSources } from './chunk-VFPFW67T.js';
2
- import './chunk-TMAGWRKY.js';
3
- import './chunk-LVZ5NGME.js';
4
- import './chunk-QZ6XXD3A.js';
1
+ export { autoSyncForSearch, ensureClone, findCacheKeyCollision, indexingHadFailures, legacySourceConfigHint, makeSourceCommand, normalizeSourceUrl, readProjectSources, sourceClonePath, sourceMatchesKey, syncProjectSources } from './chunk-QA52GQQN.js';
2
+ import './chunk-QG6C3XOS.js';
3
+ import './chunk-775OMGVP.js';
4
+ import './chunk-BQMRUH7J.js';
5
5
  import './chunk-HY6CIKFH.js';
6
6
  import './chunk-ELPR5XBG.js';
7
- import './chunk-FI4QNNMD.js';
8
- import './chunk-Q7KWJO4J.js';
9
- import './chunk-PPKK5EV6.js';
7
+ import './chunk-GP2AYOC2.js';
8
+ import './chunk-C4AP3XZB.js';
9
+ import './chunk-DZ4UZOFB.js';
10
10
  import './chunk-UKJMQZV6.js';
11
11
  import './chunk-R7FOF242.js';
12
12
  import './chunk-JXT46QFC.js';
13
- import './chunk-X5EYJEEQ.js';
13
+ import './chunk-S4UA244H.js';
14
14
  import './chunk-CGYEHQOX.js';
15
- import './chunk-F2WTSHZS.js';
15
+ import './chunk-CIPK5JMJ.js';
16
16
  import './chunk-F3HNW354.js';
17
17
  import './chunk-K5GBV4SA.js';
18
18
  import './chunk-QVZA2MDT.js';
19
- import './chunk-SH572OBN.js';
20
- import './chunk-IP3GXHOB.js';
19
+ import './chunk-OIDFK7SG.js';
20
+ import './chunk-OZ7UNMTK.js';
21
21
  import './chunk-MENCWIHW.js';
22
22
  import './chunk-P4VHQA4N.js';
23
- import './chunk-VQ4P7UYE.js';
23
+ import './chunk-MKZOK4JU.js';
24
24
  import './chunk-GEEW6SY2.js';
25
- import './chunk-5Q7HA4JP.js';
26
- import './chunk-3A5IKBHQ.js';
25
+ import './chunk-FTG7CRFD.js';
26
+ import './chunk-W4IPN3DD.js';
27
27
  import './chunk-KTBKW2FI.js';
28
28
  import './chunk-UQ6LFBPZ.js';
29
29
  import './chunk-DVSASEGO.js';
30
30
  import './chunk-AN6NAFRT.js';
31
31
  import './chunk-NSBPE2FW.js';
32
- //# sourceMappingURL=source-PVTUMNAO.js.map
33
- //# sourceMappingURL=source-PVTUMNAO.js.map
32
+ //# sourceMappingURL=source-DTV7VK3C.js.map
33
+ //# sourceMappingURL=source-DTV7VK3C.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"source-PVTUMNAO.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"source-DTV7VK3C.js"}
@@ -1,31 +1,31 @@
1
- import { makeHttpPublisherClient, refFor, publishToStore, bareName } from './chunk-DWO2N72K.js';
2
- import { sourceClonePath, resolveSourceArg } from './chunk-VFPFW67T.js';
3
- import { isStoreAuthenticated } from './chunk-WE7ONZNB.js';
4
- import './chunk-TMAGWRKY.js';
5
- import { logErr, S, logInfo, logOk, logWarn } from './chunk-LVZ5NGME.js';
6
- import './chunk-QZ6XXD3A.js';
1
+ import { makeHttpPublisherClient, refFor, publishToStore, bareName } from './chunk-U2UNQBXB.js';
2
+ import { sourceClonePath, resolveSourceArg } from './chunk-QA52GQQN.js';
3
+ import { isStoreAuthenticated } from './chunk-SUPIVTLX.js';
4
+ import './chunk-QG6C3XOS.js';
5
+ import { logErr, S, logInfo, logOk, logWarn } from './chunk-775OMGVP.js';
6
+ import './chunk-BQMRUH7J.js';
7
7
  import './chunk-HY6CIKFH.js';
8
8
  import './chunk-ELPR5XBG.js';
9
- import './chunk-FI4QNNMD.js';
10
- import './chunk-Q7KWJO4J.js';
11
- import './chunk-PPKK5EV6.js';
9
+ import './chunk-GP2AYOC2.js';
10
+ import './chunk-C4AP3XZB.js';
11
+ import './chunk-DZ4UZOFB.js';
12
12
  import './chunk-UKJMQZV6.js';
13
13
  import './chunk-R7FOF242.js';
14
14
  import './chunk-JXT46QFC.js';
15
- import './chunk-X5EYJEEQ.js';
15
+ import './chunk-S4UA244H.js';
16
16
  import './chunk-CGYEHQOX.js';
17
- import './chunk-F2WTSHZS.js';
17
+ import './chunk-CIPK5JMJ.js';
18
18
  import './chunk-F3HNW354.js';
19
19
  import './chunk-K5GBV4SA.js';
20
20
  import './chunk-QVZA2MDT.js';
21
- import './chunk-SH572OBN.js';
22
- import { sourceCacheKey } from './chunk-IP3GXHOB.js';
21
+ import './chunk-OIDFK7SG.js';
22
+ import { sourceCacheKey } from './chunk-OZ7UNMTK.js';
23
23
  import './chunk-MENCWIHW.js';
24
24
  import { decodeSkaileManifest, encodeSkaileManifest } from './chunk-P4VHQA4N.js';
25
- import './chunk-VQ4P7UYE.js';
25
+ import './chunk-MKZOK4JU.js';
26
26
  import './chunk-GEEW6SY2.js';
27
- import './chunk-5Q7HA4JP.js';
28
- import './chunk-3A5IKBHQ.js';
27
+ import './chunk-FTG7CRFD.js';
28
+ import './chunk-W4IPN3DD.js';
29
29
  import './chunk-KTBKW2FI.js';
30
30
  import './chunk-UQ6LFBPZ.js';
31
31
  import './chunk-DVSASEGO.js';
@@ -229,5 +229,5 @@ async function runYank(arg, opts, client) {
229
229
  }
230
230
 
231
231
  export { getSidecarRepo, normalizePublishedManifest, pushSidecarManifest, runPublish, runYank, saveSidecarRepo };
232
- //# sourceMappingURL=source-manifest-publish-3XYTUVQQ.js.map
233
- //# sourceMappingURL=source-manifest-publish-3XYTUVQQ.js.map
232
+ //# sourceMappingURL=source-manifest-publish-HC3K7D63.js.map
233
+ //# sourceMappingURL=source-manifest-publish-HC3K7D63.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/commands/source-manifest-publish.ts"],"names":[],"mappings":"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","file":"source-manifest-publish-3XYTUVQQ.js","sourcesContent":["/**\n * `skaile source manifest publish` / `yank` — the curator-publish flow. Takes a\n * locally-curated sidecar manifest (over a foreign public GitHub repo) and:\n *\n * 1. Pushes the curated `skaile.manifest.yaml` to the curator's OWN public\n * \"sidecar\" repo (bytes stay in the foreign source; the sidecar holds only\n * the manifest pointing at it).\n * 2. Registers the foreign source + the sidecar (url + pinned commit) with the\n * store, syncs it, and publishes each curated asset.\n *\n * `yank` is the inverse: unpublish each currently-published asset of the source.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * (default HTTP client); git side-effects go through an injectable `spawn`. Both\n * seams keep the pure helpers + orchestration unit/integration-testable without a\n * live store or a real remote.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport {\n decodeSkaileManifest,\n encodeSkaileManifest,\n type SkPublishManifest,\n sourceCacheKey,\n} from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { makeHttpPublisherClient, type PublisherClient } from \"../store-publisher.ts\";\nimport { isStoreAuthenticated } from \"../store-client.ts\";\nimport { bareName, publishToStore, refFor } from \"./publish-core.ts\";\nimport { sourceClonePath } from \"./source.ts\";\nimport { resolveSourceArg } from \"./source-manifest.ts\";\n\n/** The fixed filename a sidecar repo carries at its root. */\nconst SIDECAR_MANIFEST_FILENAME = \"skaile.manifest.yaml\";\n\n/** Injectable spawn contract — the subset of `spawnSync` these helpers use. */\ntype SpawnLike = typeof spawnSync;\n\n/**\n * Return a copy of `manifest` normalized for publication under `namespace`:\n * the top-level `publisher` is set to `namespace` and every per-asset\n * `publisher` override is removed so all assets inherit the top-level one.\n * Pure — the input is not mutated.\n */\nexport function normalizePublishedManifest(\n manifest: SkPublishManifest,\n namespace: string,\n): SkPublishManifest {\n const assets = (manifest.assets ?? []).map((a) => {\n const { publisher: _drop, ...rest } = a;\n return rest;\n });\n return { ...manifest, publisher: namespace, assets };\n}\n\n// ── Sidecar-repo association (~/.skaile/settings.json) ────────────────────────\n\n/**\n * Path to the user settings file — the same `~/.skaile/settings.json` the store\n * client reads tokens from. Resolves the `.skaile` root exactly as `getStoreRoot`\n * does (`SKAILE_HOME` when set — it IS the `.skaile` dir — else `~/.skaile`), so\n * the sidecar association lives beside the store manifests under one convention\n * and tests isolate through the same `SKAILE_HOME` seam.\n */\nfunction settingsFile(): string {\n const root = process.env.SKAILE_HOME ?? join(homedir(), \".skaile\");\n return join(root, \"settings.json\");\n}\n\nfunction readSettings(): Record<string, any> {\n const file = settingsFile();\n if (!existsSync(file)) return {};\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\n/**\n * The sidecar repo URL previously associated with a source `slug`, if any.\n * Reads `settings.sidecarRepos?.[slug]?.repo`.\n */\nexport function getSidecarRepo(slug: string): string | undefined {\n const settings = readSettings();\n return settings.sidecarRepos?.[slug]?.repo;\n}\n\n/**\n * Persist the sidecar repo URL for a source `slug`, preserving every other\n * settings key. Stored as an object (`{ repo }`) so a `path` (or other fields)\n * can be added later without a schema migration.\n */\nexport function saveSidecarRepo(slug: string, repo: string): void {\n const file = settingsFile();\n mkdirSync(dirname(file), { recursive: true });\n const settings = readSettings();\n const sidecarRepos = { ...(settings.sidecarRepos ?? {}) };\n sidecarRepos[slug] = { ...(sidecarRepos[slug] ?? {}), repo };\n settings.sidecarRepos = sidecarRepos;\n writeFileSync(file, JSON.stringify(settings, null, 2), \"utf-8\");\n}\n\n// ── Sidecar push ──────────────────────────────────────────────────────────────\n\n/**\n * Run a git command in `cwd` via the injected spawn, throwing with the captured\n * stderr on failure. Returns trimmed stdout.\n */\nfunction git(spawn: SpawnLike, cwd: string, args: string[]): string {\n const res = spawn(\"git\", [\"-C\", cwd, ...args], { encoding: \"utf-8\" });\n if (res.status !== 0) {\n const stderr = (res.stderr ?? \"\").toString().trim();\n throw new Error(`git ${args.join(\" \")} failed: ${stderr || `exit ${res.status}`}`);\n }\n return (res.stdout ?? \"\").toString().trim();\n}\n\n/**\n * Clone the curator's sidecar repo, write the curated manifest at its root, and\n * commit + push. Returns the pushed commit sha (used to pin the store source).\n *\n * Idempotent re-publish: when the manifest is unchanged `git commit` fails with\n * \"nothing to commit\" — we swallow that and return the current HEAD so a no-op\n * re-run still yields a valid pin. Any push/auth failure surfaces as a thrown\n * Error carrying git's stderr.\n */\nexport function pushSidecarManifest(opts: {\n sidecarRepoUrl: string;\n manifestText: string;\n spawn?: SpawnLike;\n}): { commitSha: string } {\n const spawn = opts.spawn ?? spawnSync;\n // Dedicated dir next to the source clone cache; wipe any stale clone first so\n // a re-publish always starts from a clean shallow checkout of the remote.\n const cloneDir = `${sourceClonePath(sourceCacheKey(opts.sidecarRepoUrl))}-sidecar-push`;\n rmSync(cloneDir, { recursive: true, force: true });\n mkdirSync(dirname(cloneDir), { recursive: true });\n\n // The clone is scratch — always remove it afterwards (success or failure) so a\n // failed push never leaves a stale checkout in the cache dir.\n try {\n const cloneRes = spawn(\"git\", [\"clone\", \"--depth\", \"1\", opts.sidecarRepoUrl, cloneDir], {\n encoding: \"utf-8\",\n });\n if (cloneRes.status !== 0) {\n const stderr = (cloneRes.stderr ?? \"\").toString().trim();\n throw new Error(\n `git clone ${opts.sidecarRepoUrl} failed: ${stderr || `exit ${cloneRes.status}`}`,\n );\n }\n\n writeFileSync(join(cloneDir, SIDECAR_MANIFEST_FILENAME), opts.manifestText, \"utf-8\");\n git(spawn, cloneDir, [\"add\", SIDECAR_MANIFEST_FILENAME]);\n\n // Fixed bot identity via -c so the commit succeeds regardless of the curator's\n // git config (the sidecar push is a machine action, not authored work).\n const commitRes = spawn(\n \"git\",\n [\n \"-C\",\n cloneDir,\n \"-c\",\n \"user.email=publish@skaile.store\",\n \"-c\",\n \"user.name=skaile\",\n \"commit\",\n \"-m\",\n \"chore(sidecar): publish curated manifest\",\n ],\n { encoding: \"utf-8\" },\n );\n if (commitRes.status !== 0) {\n const out = `${commitRes.stdout ?? \"\"}${commitRes.stderr ?? \"\"}`;\n // Nothing changed → idempotent re-publish; keep the existing HEAD.\n if (!/nothing to commit/i.test(out)) {\n throw new Error(`git commit failed: ${out.trim() || `exit ${commitRes.status}`}`);\n }\n } else {\n // `push origin HEAD` (not a bare `push`) so a fresh sidecar repo with an\n // unborn/renamed default branch still gets its branch created on the remote.\n git(spawn, cloneDir, [\"push\", \"origin\", \"HEAD\"]);\n }\n\n return { commitSha: git(spawn, cloneDir, [\"rev-parse\", \"HEAD\"]) };\n } finally {\n rmSync(cloneDir, { recursive: true, force: true });\n }\n}\n\n// ── Orchestration ───────────────────────────────────────────────────────────\n\n/**\n * `source manifest publish <src>` — publish a curated sidecar manifest to the\n * store. See the module header for the full flow. Store calls go through\n * `client` (default HTTP); git side-effects through `spawn` (default\n * `spawnSync`). The auth gate is enforced only for the default HTTP client so\n * injected fakes bypass it.\n */\nexport async function runPublish(\n arg: string,\n opts: {\n projectDir: string;\n as?: string;\n sidecarRepo?: string;\n ref?: string;\n dryRun?: boolean;\n },\n client?: PublisherClient,\n spawn: SpawnLike = spawnSync,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug, manifestFile } = resolveSourceArg(arg, opts.projectDir);\n\n if (!existsSync(manifestFile)) {\n logErr(\n `No curated manifest for \"${slug}\" at ${S.dim(manifestFile)} — ` +\n \"run `skaile source manifest init` first.\",\n );\n process.exit(1);\n }\n\n const { manifest, diagnostics } = decodeSkaileManifest(readFileSync(manifestFile, \"utf-8\"));\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics.filter((x) => x.severity === \"error\")) {\n logErr(`${d.code}: ${d.message}`);\n }\n logErr(\n \"The curated manifest has errors — fix them with `skaile source manifest edit` / \" +\n \"`verify` before publishing.\",\n );\n process.exit(1);\n }\n\n // A real publish makes store calls (+ `me()` when `--as` is omitted), so it\n // needs a token. `--dry-run` is an offline preview: never gate it on auth.\n const authed = injected || isStoreAuthenticated();\n if (!opts.dryRun && !authed) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n // Namespace: `--as` wins; else the caller's verified identity. Prefer the\n // GitHub handle (`githubLogin`) over the store login (`username`) — for a user\n // whose login differs from their GitHub handle the login namespace may be\n // reserved (matches the CLI's `resolveLibraryPublisher` precedence). In an\n // unauthenticated dry-run we cannot call `me()`, so show a placeholder.\n let namespace: string;\n if (opts.as) namespace = opts.as;\n else if (authed) {\n const me = await pub.me();\n // `||` not `??`: an empty-string githubLogin (partially-connected account) is\n // not a usable namespace — fall back to the login rather than publish under \"\".\n namespace = me.githubLogin || me.username;\n } else namespace = \"<your store username>\";\n\n const normalized = normalizePublishedManifest(manifest, namespace);\n const publishedText = encodeSkaileManifest(normalized);\n\n const wouldBeRefs = (normalized.assets ?? []).map((a) =>\n refFor(a.kind, namespace, a.name, a.version ?? normalized.version),\n );\n\n if (opts.dryRun) {\n const sidecar = opts.sidecarRepo ?? getSidecarRepo(slug) ?? \"<none — pass --sidecar-repo>\";\n logInfo(`Publish plan for ${S.bold(slug)}:`);\n logInfo(` namespace: ${namespace}`);\n logInfo(` sidecar repo: ${sidecar}`);\n logInfo(` source ref: ${opts.ref ?? \"main\"}`);\n logInfo(` would publish ${wouldBeRefs.length} asset(s):`);\n for (const r of wouldBeRefs) logInfo(` ${r}`);\n return;\n }\n\n const sidecarRepoUrl = opts.sidecarRepo ?? getSidecarRepo(slug);\n if (!sidecarRepoUrl) {\n logErr(\n \"No sidecar repo associated with this source. Pass \" +\n `${S.cmd(\"--sidecar-repo https://github.com/<you>/<repo>\")} — it must be a ` +\n \"PUBLIC GitHub repo you own; the curated manifest is committed there and the \" +\n \"store pins to that commit.\",\n );\n process.exit(1);\n }\n if (opts.sidecarRepo) saveSidecarRepo(slug, sidecarRepoUrl);\n\n const { commitSha } = pushSidecarManifest({ sidecarRepoUrl, manifestText: publishedText, spawn });\n logOk(`Pushed curated manifest to ${S.dim(sidecarRepoUrl)} @ ${commitSha.slice(0, 10)}.`);\n\n // The FOREIGN repo's ref to ingest (branch/sha). Defaults to `main`.\n const sourceRef = opts.ref ?? \"main\";\n\n const { published } = await publishToStore({\n sourceUrl: url,\n ref: sourceRef,\n sidecar: { url: sidecarRepoUrl, ref: commitSha },\n manifest: normalized,\n client: pub,\n });\n\n if (published.length > 0) {\n logInfo(`Consumers can now install them with \\`skaile add ${published[0]}\\`.`);\n }\n}\n\n/**\n * `source manifest yank <src>` — unpublish the source's published assets (all,\n * or the single asset matching `opts.asset`'s name). Auth-gated like publish.\n */\nexport async function runYank(\n arg: string,\n opts: { projectDir: string; asset?: string },\n client?: PublisherClient,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug } = resolveSourceArg(arg, opts.projectDir);\n\n if (!injected && !isStoreAuthenticated()) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n const rows = await pub.sourcesList();\n const source = rows.find((r) => r.url === url);\n if (!source) {\n logErr(`Source \"${slug}\" is not registered in the store — nothing to yank.`);\n process.exit(1);\n }\n\n // Optionally narrow to a single asset by name (accept a bare name or a ref).\n const targetName = opts.asset ? bareName(opts.asset) : undefined;\n const candidates = (await pub.sourceCandidates(source.id)).filter(\n (c) => c.published && (!targetName || c.name === targetName),\n );\n if (candidates.length === 0) {\n logWarn(\"No published assets matched — nothing to yank.\");\n return;\n }\n\n const yanked: string[] = [];\n for (const c of candidates) {\n try {\n await pub.assetUnpublish(c.id);\n yanked.push(`${c.kind}:${c.name}`);\n } catch (err) {\n logWarn(\n `Failed to yank ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Yanked ${yanked.length} asset(s):`);\n for (const r of yanked) logInfo(` ${r}`);\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/commands/source-manifest-publish.ts"],"names":[],"mappings":"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","file":"source-manifest-publish-HC3K7D63.js","sourcesContent":["/**\n * `skaile source manifest publish` / `yank` — the curator-publish flow. Takes a\n * locally-curated sidecar manifest (over a foreign public GitHub repo) and:\n *\n * 1. Pushes the curated `skaile.manifest.yaml` to the curator's OWN public\n * \"sidecar\" repo (bytes stay in the foreign source; the sidecar holds only\n * the manifest pointing at it).\n * 2. Registers the foreign source + the sidecar (url + pinned commit) with the\n * store, syncs it, and publishes each curated asset.\n *\n * `yank` is the inverse: unpublish each currently-published asset of the source.\n *\n * The store REST surface is reached through the injectable {@link PublisherClient}\n * (default HTTP client); git side-effects go through an injectable `spawn`. Both\n * seams keep the pure helpers + orchestration unit/integration-testable without a\n * live store or a real remote.\n *\n * @docLink cli/commands/source#manifest-publish\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport {\n decodeSkaileManifest,\n encodeSkaileManifest,\n type SkPublishManifest,\n sourceCacheKey,\n} from \"@skaile/workspaces/core\";\nimport { logErr, logInfo, logOk, logWarn, S } from \"../helpers.ts\";\nimport { makeHttpPublisherClient, type PublisherClient } from \"../store-publisher.ts\";\nimport { isStoreAuthenticated } from \"../store-client.ts\";\nimport { bareName, publishToStore, refFor } from \"./publish-core.ts\";\nimport { sourceClonePath } from \"./source.ts\";\nimport { resolveSourceArg } from \"./source-manifest.ts\";\n\n/** The fixed filename a sidecar repo carries at its root. */\nconst SIDECAR_MANIFEST_FILENAME = \"skaile.manifest.yaml\";\n\n/** Injectable spawn contract — the subset of `spawnSync` these helpers use. */\ntype SpawnLike = typeof spawnSync;\n\n/**\n * Return a copy of `manifest` normalized for publication under `namespace`:\n * the top-level `publisher` is set to `namespace` and every per-asset\n * `publisher` override is removed so all assets inherit the top-level one.\n * Pure — the input is not mutated.\n */\nexport function normalizePublishedManifest(\n manifest: SkPublishManifest,\n namespace: string,\n): SkPublishManifest {\n const assets = (manifest.assets ?? []).map((a) => {\n const { publisher: _drop, ...rest } = a;\n return rest;\n });\n return { ...manifest, publisher: namespace, assets };\n}\n\n// ── Sidecar-repo association (~/.skaile/settings.json) ────────────────────────\n\n/**\n * Path to the user settings file — the same `~/.skaile/settings.json` the store\n * client reads tokens from. Resolves the `.skaile` root exactly as `getStoreRoot`\n * does (`SKAILE_HOME` when set — it IS the `.skaile` dir — else `~/.skaile`), so\n * the sidecar association lives beside the store manifests under one convention\n * and tests isolate through the same `SKAILE_HOME` seam.\n */\nfunction settingsFile(): string {\n const root = process.env.SKAILE_HOME ?? join(homedir(), \".skaile\");\n return join(root, \"settings.json\");\n}\n\nfunction readSettings(): Record<string, any> {\n const file = settingsFile();\n if (!existsSync(file)) return {};\n try {\n return JSON.parse(readFileSync(file, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\n/**\n * The sidecar repo URL previously associated with a source `slug`, if any.\n * Reads `settings.sidecarRepos?.[slug]?.repo`.\n */\nexport function getSidecarRepo(slug: string): string | undefined {\n const settings = readSettings();\n return settings.sidecarRepos?.[slug]?.repo;\n}\n\n/**\n * Persist the sidecar repo URL for a source `slug`, preserving every other\n * settings key. Stored as an object (`{ repo }`) so a `path` (or other fields)\n * can be added later without a schema migration.\n */\nexport function saveSidecarRepo(slug: string, repo: string): void {\n const file = settingsFile();\n mkdirSync(dirname(file), { recursive: true });\n const settings = readSettings();\n const sidecarRepos = { ...(settings.sidecarRepos ?? {}) };\n sidecarRepos[slug] = { ...(sidecarRepos[slug] ?? {}), repo };\n settings.sidecarRepos = sidecarRepos;\n writeFileSync(file, JSON.stringify(settings, null, 2), \"utf-8\");\n}\n\n// ── Sidecar push ──────────────────────────────────────────────────────────────\n\n/**\n * Run a git command in `cwd` via the injected spawn, throwing with the captured\n * stderr on failure. Returns trimmed stdout.\n */\nfunction git(spawn: SpawnLike, cwd: string, args: string[]): string {\n const res = spawn(\"git\", [\"-C\", cwd, ...args], { encoding: \"utf-8\" });\n if (res.status !== 0) {\n const stderr = (res.stderr ?? \"\").toString().trim();\n throw new Error(`git ${args.join(\" \")} failed: ${stderr || `exit ${res.status}`}`);\n }\n return (res.stdout ?? \"\").toString().trim();\n}\n\n/**\n * Clone the curator's sidecar repo, write the curated manifest at its root, and\n * commit + push. Returns the pushed commit sha (used to pin the store source).\n *\n * Idempotent re-publish: when the manifest is unchanged `git commit` fails with\n * \"nothing to commit\" — we swallow that and return the current HEAD so a no-op\n * re-run still yields a valid pin. Any push/auth failure surfaces as a thrown\n * Error carrying git's stderr.\n */\nexport function pushSidecarManifest(opts: {\n sidecarRepoUrl: string;\n manifestText: string;\n spawn?: SpawnLike;\n}): { commitSha: string } {\n const spawn = opts.spawn ?? spawnSync;\n // Dedicated dir next to the source clone cache; wipe any stale clone first so\n // a re-publish always starts from a clean shallow checkout of the remote.\n const cloneDir = `${sourceClonePath(sourceCacheKey(opts.sidecarRepoUrl))}-sidecar-push`;\n rmSync(cloneDir, { recursive: true, force: true });\n mkdirSync(dirname(cloneDir), { recursive: true });\n\n // The clone is scratch — always remove it afterwards (success or failure) so a\n // failed push never leaves a stale checkout in the cache dir.\n try {\n const cloneRes = spawn(\"git\", [\"clone\", \"--depth\", \"1\", opts.sidecarRepoUrl, cloneDir], {\n encoding: \"utf-8\",\n });\n if (cloneRes.status !== 0) {\n const stderr = (cloneRes.stderr ?? \"\").toString().trim();\n throw new Error(\n `git clone ${opts.sidecarRepoUrl} failed: ${stderr || `exit ${cloneRes.status}`}`,\n );\n }\n\n writeFileSync(join(cloneDir, SIDECAR_MANIFEST_FILENAME), opts.manifestText, \"utf-8\");\n git(spawn, cloneDir, [\"add\", SIDECAR_MANIFEST_FILENAME]);\n\n // Fixed bot identity via -c so the commit succeeds regardless of the curator's\n // git config (the sidecar push is a machine action, not authored work).\n const commitRes = spawn(\n \"git\",\n [\n \"-C\",\n cloneDir,\n \"-c\",\n \"user.email=publish@skaile.store\",\n \"-c\",\n \"user.name=skaile\",\n \"commit\",\n \"-m\",\n \"chore(sidecar): publish curated manifest\",\n ],\n { encoding: \"utf-8\" },\n );\n if (commitRes.status !== 0) {\n const out = `${commitRes.stdout ?? \"\"}${commitRes.stderr ?? \"\"}`;\n // Nothing changed → idempotent re-publish; keep the existing HEAD.\n if (!/nothing to commit/i.test(out)) {\n throw new Error(`git commit failed: ${out.trim() || `exit ${commitRes.status}`}`);\n }\n } else {\n // `push origin HEAD` (not a bare `push`) so a fresh sidecar repo with an\n // unborn/renamed default branch still gets its branch created on the remote.\n git(spawn, cloneDir, [\"push\", \"origin\", \"HEAD\"]);\n }\n\n return { commitSha: git(spawn, cloneDir, [\"rev-parse\", \"HEAD\"]) };\n } finally {\n rmSync(cloneDir, { recursive: true, force: true });\n }\n}\n\n// ── Orchestration ───────────────────────────────────────────────────────────\n\n/**\n * `source manifest publish <src>` — publish a curated sidecar manifest to the\n * store. See the module header for the full flow. Store calls go through\n * `client` (default HTTP); git side-effects through `spawn` (default\n * `spawnSync`). The auth gate is enforced only for the default HTTP client so\n * injected fakes bypass it.\n */\nexport async function runPublish(\n arg: string,\n opts: {\n projectDir: string;\n as?: string;\n sidecarRepo?: string;\n ref?: string;\n dryRun?: boolean;\n },\n client?: PublisherClient,\n spawn: SpawnLike = spawnSync,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug, manifestFile } = resolveSourceArg(arg, opts.projectDir);\n\n if (!existsSync(manifestFile)) {\n logErr(\n `No curated manifest for \"${slug}\" at ${S.dim(manifestFile)} — ` +\n \"run `skaile source manifest init` first.\",\n );\n process.exit(1);\n }\n\n const { manifest, diagnostics } = decodeSkaileManifest(readFileSync(manifestFile, \"utf-8\"));\n if (diagnostics.some((d) => d.severity === \"error\")) {\n for (const d of diagnostics.filter((x) => x.severity === \"error\")) {\n logErr(`${d.code}: ${d.message}`);\n }\n logErr(\n \"The curated manifest has errors — fix them with `skaile source manifest edit` / \" +\n \"`verify` before publishing.\",\n );\n process.exit(1);\n }\n\n // A real publish makes store calls (+ `me()` when `--as` is omitted), so it\n // needs a token. `--dry-run` is an offline preview: never gate it on auth.\n const authed = injected || isStoreAuthenticated();\n if (!opts.dryRun && !authed) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n // Namespace: `--as` wins; else the caller's verified identity. Prefer the\n // GitHub handle (`githubLogin`) over the store login (`username`) — for a user\n // whose login differs from their GitHub handle the login namespace may be\n // reserved (matches the CLI's `resolveLibraryPublisher` precedence). In an\n // unauthenticated dry-run we cannot call `me()`, so show a placeholder.\n let namespace: string;\n if (opts.as) namespace = opts.as;\n else if (authed) {\n const me = await pub.me();\n // `||` not `??`: an empty-string githubLogin (partially-connected account) is\n // not a usable namespace — fall back to the login rather than publish under \"\".\n namespace = me.githubLogin || me.username;\n } else namespace = \"<your store username>\";\n\n const normalized = normalizePublishedManifest(manifest, namespace);\n const publishedText = encodeSkaileManifest(normalized);\n\n const wouldBeRefs = (normalized.assets ?? []).map((a) =>\n refFor(a.kind, namespace, a.name, a.version ?? normalized.version),\n );\n\n if (opts.dryRun) {\n const sidecar = opts.sidecarRepo ?? getSidecarRepo(slug) ?? \"<none — pass --sidecar-repo>\";\n logInfo(`Publish plan for ${S.bold(slug)}:`);\n logInfo(` namespace: ${namespace}`);\n logInfo(` sidecar repo: ${sidecar}`);\n logInfo(` source ref: ${opts.ref ?? \"main\"}`);\n logInfo(` would publish ${wouldBeRefs.length} asset(s):`);\n for (const r of wouldBeRefs) logInfo(` ${r}`);\n return;\n }\n\n const sidecarRepoUrl = opts.sidecarRepo ?? getSidecarRepo(slug);\n if (!sidecarRepoUrl) {\n logErr(\n \"No sidecar repo associated with this source. Pass \" +\n `${S.cmd(\"--sidecar-repo https://github.com/<you>/<repo>\")} — it must be a ` +\n \"PUBLIC GitHub repo you own; the curated manifest is committed there and the \" +\n \"store pins to that commit.\",\n );\n process.exit(1);\n }\n if (opts.sidecarRepo) saveSidecarRepo(slug, sidecarRepoUrl);\n\n const { commitSha } = pushSidecarManifest({ sidecarRepoUrl, manifestText: publishedText, spawn });\n logOk(`Pushed curated manifest to ${S.dim(sidecarRepoUrl)} @ ${commitSha.slice(0, 10)}.`);\n\n // The FOREIGN repo's ref to ingest (branch/sha). Defaults to `main`.\n const sourceRef = opts.ref ?? \"main\";\n\n const { published } = await publishToStore({\n sourceUrl: url,\n ref: sourceRef,\n sidecar: { url: sidecarRepoUrl, ref: commitSha },\n manifest: normalized,\n client: pub,\n });\n\n if (published.length > 0) {\n logInfo(`Consumers can now install them with \\`skaile add ${published[0]}\\`.`);\n }\n}\n\n/**\n * `source manifest yank <src>` — unpublish the source's published assets (all,\n * or the single asset matching `opts.asset`'s name). Auth-gated like publish.\n */\nexport async function runYank(\n arg: string,\n opts: { projectDir: string; asset?: string },\n client?: PublisherClient,\n): Promise<void> {\n const injected = client !== undefined;\n const pub = client ?? makeHttpPublisherClient();\n\n const { url, slug } = resolveSourceArg(arg, opts.projectDir);\n\n if (!injected && !isStoreAuthenticated()) {\n logErr(\"Not signed in — run `skaile store login` first.\");\n process.exit(1);\n }\n\n const rows = await pub.sourcesList();\n const source = rows.find((r) => r.url === url);\n if (!source) {\n logErr(`Source \"${slug}\" is not registered in the store — nothing to yank.`);\n process.exit(1);\n }\n\n // Optionally narrow to a single asset by name (accept a bare name or a ref).\n const targetName = opts.asset ? bareName(opts.asset) : undefined;\n const candidates = (await pub.sourceCandidates(source.id)).filter(\n (c) => c.published && (!targetName || c.name === targetName),\n );\n if (candidates.length === 0) {\n logWarn(\"No published assets matched — nothing to yank.\");\n return;\n }\n\n const yanked: string[] = [];\n for (const c of candidates) {\n try {\n await pub.assetUnpublish(c.id);\n yanked.push(`${c.kind}:${c.name}`);\n } catch (err) {\n logWarn(\n `Failed to yank ${c.kind}:${c.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n logOk(`Yanked ${yanked.length} asset(s):`);\n for (const r of yanked) logInfo(` ${r}`);\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { AgentStore, ResourceClient } from '../chunk-3DNCPQAR.js';
1
+ export { AgentStore, ResourceClient } from '../chunk-RTM4SFLA.js';
2
2
  import '../chunk-NSBPE2FW.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../store/src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../store/src/store.ts"],"names":[],"mappings":"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"}
package/dist/tui/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createAgentSession } from '../chunk-5WMFU575.js';
2
- import '../chunk-6YDXCJGK.js';
1
+ import { createAgentSession } from '../chunk-OEK2ACRR.js';
2
+ import '../chunk-EVQDXN27.js';
3
3
  import '../chunk-X5YPJV4N.js';
4
4
  import '../chunk-W3UDISS2.js';
5
5
  import '../chunk-O7SG5PC2.js';
@@ -7,39 +7,39 @@ import '../chunk-7QBNJTTQ.js';
7
7
  import '../chunk-GTS2FODO.js';
8
8
  import '../chunk-WQ7DE5UC.js';
9
9
  import '../chunk-32NA4TVC.js';
10
- import '../chunk-LAOS2TZU.js';
10
+ import '../chunk-4J24AU4Q.js';
11
11
  import '../chunk-4R6DROGN.js';
12
- import '../chunk-4VTBZ2MF.js';
13
- import '../chunk-GHWJHOYX.js';
12
+ import '../chunk-3XXQPHGL.js';
13
+ import '../chunk-7BUZQVRR.js';
14
14
  import '../chunk-NC5YXVZF.js';
15
- import '../chunk-MTCLDJPR.js';
16
- import { loadConnectorDeclarations } from '../chunk-3UU3D2Q3.js';
17
- import '../chunk-DTSKPMP3.js';
18
- import '../chunk-RUFTB7QN.js';
15
+ import '../chunk-VC2MWHRH.js';
16
+ import { loadConnectorDeclarations } from '../chunk-5KSIVLOX.js';
17
+ import '../chunk-5FCBPIOK.js';
18
+ import '../chunk-3NCGSSCU.js';
19
19
  import '../chunk-RRVQAE5D.js';
20
20
  import '../chunk-GURXUF2J.js';
21
21
  import '../chunk-GAH4YRCI.js';
22
- import '../chunk-Z5ED4E57.js';
22
+ import '../chunk-NIUG3MIH.js';
23
23
  import '../chunk-6E6PKKAD.js';
24
24
  import '../chunk-IFGTRL2I.js';
25
- import '../chunk-QZ6XXD3A.js';
25
+ import '../chunk-BQMRUH7J.js';
26
26
  import '../chunk-AXEOG4B5.js';
27
27
  import '../chunk-HY6CIKFH.js';
28
28
  import '../chunk-2D5BYAL6.js';
29
29
  import '../chunk-ELPR5XBG.js';
30
30
  import '../chunk-2KBA5OO2.js';
31
- import { resolveSettings } from '../chunk-F2WTSHZS.js';
31
+ import { resolveSettings } from '../chunk-CIPK5JMJ.js';
32
32
  import '../chunk-F3HNW354.js';
33
33
  import '../chunk-K5GBV4SA.js';
34
34
  import '../chunk-QVZA2MDT.js';
35
- import '../chunk-SH572OBN.js';
36
- import { resolveAgentDir } from '../chunk-IP3GXHOB.js';
35
+ import '../chunk-OIDFK7SG.js';
36
+ import { resolveAgentDir } from '../chunk-OZ7UNMTK.js';
37
37
  import '../chunk-MENCWIHW.js';
38
38
  import '../chunk-P4VHQA4N.js';
39
- import '../chunk-VQ4P7UYE.js';
39
+ import '../chunk-MKZOK4JU.js';
40
40
  import '../chunk-GEEW6SY2.js';
41
- import '../chunk-5Q7HA4JP.js';
42
- import '../chunk-3A5IKBHQ.js';
41
+ import '../chunk-FTG7CRFD.js';
42
+ import '../chunk-W4IPN3DD.js';
43
43
  import '../chunk-NSBPE2FW.js';
44
44
  import { existsSync, readFileSync, statSync, readdirSync } from 'fs';
45
45
  import { resolve, join, basename, parse, dirname } from 'path';
@@ -1,24 +1,24 @@
1
1
  import { mountList, mountSync, mountStatus, mountRead, connectorList, connectorRead, connectorWrite, connectorSearch, connectorExec, connectorLoadSkill, connectorDescribe } from '../../chunk-FUCYTGAE.js';
2
- import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-O52DU5KU.js';
2
+ import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-BUKPS4YL.js';
3
3
  import { sessionList, sessionGet } from '../../chunk-R6O6YWU7.js';
4
- import { skillList, skillListDomains, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from '../../chunk-G2CXWUO5.js';
5
- import '../../chunk-JAHHMZWG.js';
4
+ import { skillList, skillListDomains, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from '../../chunk-FAI2SMFE.js';
5
+ import '../../chunk-7IRJ4K4F.js';
6
6
  import { workspaceValidate, workspaceInfo, workspaceTestSecret, workspaceReload } from '../../chunk-E7HKNQTH.js';
7
7
  import '../../chunk-X5YPJV4N.js';
8
- import '../../chunk-4VTBZ2MF.js';
9
- import '../../chunk-GHWJHOYX.js';
10
- import '../../chunk-F2WTSHZS.js';
8
+ import '../../chunk-3XXQPHGL.js';
9
+ import '../../chunk-7BUZQVRR.js';
10
+ import '../../chunk-CIPK5JMJ.js';
11
11
  import '../../chunk-F3HNW354.js';
12
12
  import '../../chunk-K5GBV4SA.js';
13
13
  import '../../chunk-QVZA2MDT.js';
14
- import '../../chunk-SH572OBN.js';
15
- import '../../chunk-IP3GXHOB.js';
14
+ import '../../chunk-OIDFK7SG.js';
15
+ import '../../chunk-OZ7UNMTK.js';
16
16
  import '../../chunk-MENCWIHW.js';
17
17
  import '../../chunk-P4VHQA4N.js';
18
- import '../../chunk-VQ4P7UYE.js';
18
+ import '../../chunk-MKZOK4JU.js';
19
19
  import '../../chunk-GEEW6SY2.js';
20
- import '../../chunk-5Q7HA4JP.js';
21
- import '../../chunk-3A5IKBHQ.js';
20
+ import '../../chunk-FTG7CRFD.js';
21
+ import '../../chunk-W4IPN3DD.js';
22
22
  import '../../chunk-NSBPE2FW.js';
23
23
  import * as zNS from 'zod';
24
24
 
@@ -74,7 +74,7 @@ function buildOmpToolSet(plugin) {
74
74
  description: "List all available flow definitions from ai-assets.",
75
75
  parameters: {},
76
76
  handler: async () => {
77
- const { flowList } = await import('../../flows-Z3DM5BHF.js');
77
+ const { flowList } = await import('../../flows-2SUFOVVO.js');
78
78
  return (await flowList(plugin.projectDir)).content[0].text;
79
79
  }
80
80
  },
@@ -83,7 +83,7 @@ function buildOmpToolSet(plugin) {
83
83
  description: "List past flow run sessions for this workspace.",
84
84
  parameters: {},
85
85
  handler: async () => {
86
- const { flowListSessions } = await import('../../flows-Z3DM5BHF.js');
86
+ const { flowListSessions } = await import('../../flows-2SUFOVVO.js');
87
87
  return (await flowListSessions(plugin.projectDir)).content[0].text;
88
88
  }
89
89
  },
@@ -92,7 +92,7 @@ function buildOmpToolSet(plugin) {
92
92
  description: "List all skills in the ai-assets catalog.",
93
93
  parameters: { domain: { type: "string", optional: true } },
94
94
  handler: async ({ domain }) => {
95
- const { skillList } = await import('../../skills-XZOG6ZPX.js');
95
+ const { skillList } = await import('../../skills-Q7PJVB3W.js');
96
96
  return (await skillList(plugin.projectDir, domain)).content[0].text;
97
97
  }
98
98
  },
@@ -101,7 +101,7 @@ function buildOmpToolSet(plugin) {
101
101
  description: "Search skills by name, description, or keywords.",
102
102
  parameters: { query: { type: "string" } },
103
103
  handler: async ({ query }) => {
104
- const { skillSearch } = await import('../../skills-XZOG6ZPX.js');
104
+ const { skillSearch } = await import('../../skills-Q7PJVB3W.js');
105
105
  return (await skillSearch(plugin.projectDir, query)).content[0].text;
106
106
  }
107
107
  },
@@ -110,7 +110,7 @@ function buildOmpToolSet(plugin) {
110
110
  description: "Show the full SKILL.md content for a skill.",
111
111
  parameters: { skill_id: { type: "string" } },
112
112
  handler: async ({ skill_id }) => {
113
- const { skillShow } = await import('../../skills-XZOG6ZPX.js');
113
+ const { skillShow } = await import('../../skills-Q7PJVB3W.js');
114
114
  return (await skillShow(plugin.projectDir, skill_id)).content[0].text;
115
115
  }
116
116
  },
@@ -201,7 +201,7 @@ async function handleSlashCommand(plugin, group, args) {
201
201
  }
202
202
  }
203
203
  async function handleFlowCommand(plugin, sub, rest) {
204
- const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-Z3DM5BHF.js');
204
+ const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-2SUFOVVO.js');
205
205
  if (!sub || sub === "list") return (await flowList(plugin.projectDir)).content[0].text;
206
206
  if (sub === "show" && rest[0])
207
207
  return (await flowShow(plugin.projectDir, rest[0])).content[0].text;
@@ -230,7 +230,7 @@ async function handleConnectorCommand(plugin, sub, rest) {
230
230
  return "Usage: /connector list | read <id> <path> | exec <id> <op> [json-args] | describe <id>";
231
231
  }
232
232
  async function handleSkillCommand(plugin, sub, rest) {
233
- const { skillList, skillShow, skillSearch } = await import('../../skills-XZOG6ZPX.js');
233
+ const { skillList, skillShow, skillSearch } = await import('../../skills-Q7PJVB3W.js');
234
234
  if (sub === "run" && rest[0])
235
235
  return (await skillShow(plugin.projectDir, rest[0])).content[0].text;
236
236
  if (!sub || sub === "list") return (await skillList(plugin.projectDir, rest[0])).content[0].text;
@@ -1,7 +1,7 @@
1
- export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-6YDXCJGK.js';
1
+ export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-EVQDXN27.js';
2
2
  export { err, ok, okJson } from '../chunk-X5YPJV4N.js';
3
- import '../chunk-5Q7HA4JP.js';
4
- import '../chunk-3A5IKBHQ.js';
3
+ import '../chunk-FTG7CRFD.js';
4
+ import '../chunk-W4IPN3DD.js';
5
5
  import '../chunk-NSBPE2FW.js';
6
6
  //# sourceMappingURL=index.js.map
7
7
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skaile/workspaces",
3
- "version": "3.15.0",
3
+ "version": "3.16.1",
4
4
  "description": "Skaile workspaces runtime — types, core, bridge, runner, store, connectors, and supporting layers as one publishable package",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.9",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../core/src/logging/log-store.ts","../core/src/logging/sanitize.ts","../core/src/logging/sinks/types.ts","../core/src/logging/sinks/no-op-sink.ts","../core/src/logging/sinks/stdout-sink.ts","../core/src/logging/create-logger.ts"],"names":[],"mappings":"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","file":"chunk-3A5IKBHQ.js","sourcesContent":["import { EventEmitter } from \"node:events\";\nimport type {\n LogEntry,\n LogLevel,\n LogQuery,\n LogQueryResult,\n LogSource,\n} from \"@skaile/workspaces/types\";\nimport { ulid } from \"ulid\";\nimport type { LogSink } from \"./sinks/types.js\";\n\nexport interface LogStoreOptions {\n sessionId: string;\n level: LogLevel;\n sinks: LogSink[];\n flushIntervalMs?: number; // default 50\n flushBatchSize?: number; // default 100\n}\n\nexport interface RecordInput {\n source: LogSource;\n level: LogLevel;\n message: string;\n data?: Record<string, unknown>;\n error?: { name: string; message: string; stack?: string };\n}\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\n/**\n * In-memory log buffer with periodic flush to sinks.\n *\n * The LogStore buffers log entries and flushes them to registered sinks\n * either when the buffer reaches a certain size, after a time interval,\n * or when explicitly flushed. Supports subscribing to live log entries.\n *\n * @see {@link LogStoreOptions} for configuration\n * @see {@link LogEntry} for the log entry format\n * @category Logging\n * @since 2.0.0\n */\nexport class LogStore {\n private sessionId: string;\n private level: LogLevel;\n private sinks: LogSink[];\n private flushIntervalMs: number;\n private flushBatchSize: number;\n private buffer: LogEntry[] = [];\n private timer: NodeJS.Timeout | null = null;\n private emitter = new EventEmitter();\n private closed = false;\n\n constructor(opts: LogStoreOptions) {\n this.sessionId = opts.sessionId;\n this.level = opts.level;\n this.sinks = opts.sinks;\n this.flushIntervalMs = opts.flushIntervalMs ?? 50;\n this.flushBatchSize = opts.flushBatchSize ?? 100;\n this.emitter.setMaxListeners(0);\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Append a sink after construction. Used by bridges (e.g. OnLogBridgeSink). */\n addSink(sink: LogSink): void {\n this.sinks.push(sink);\n }\n\n /** Returns true if the level is enabled. Used by createLogger to short-circuit. */\n isEnabled(level: LogLevel): boolean {\n return LEVEL_RANK[level] >= LEVEL_RANK[this.level];\n }\n\n record(input: RecordInput): void {\n if (this.closed) return;\n if (!this.isEnabled(input.level)) return;\n const entry: LogEntry = {\n id: ulid(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n source: input.source,\n level: input.level,\n message: input.message,\n data: input.data,\n error: input.error,\n };\n this.emitter.emit(\"entry\", entry);\n this.buffer.push(entry);\n if (this.buffer.length >= this.flushBatchSize) {\n this.flushSync();\n } else if (this.flushIntervalMs > 0 && this.timer === null) {\n this.timer = setTimeout(() => this.flushSync(), this.flushIntervalMs);\n } else if (this.flushIntervalMs === 0) {\n this.flushSync();\n }\n }\n\n /** Subscribe to live entries. Returns an unsubscribe function. */\n subscribe(handler: (entry: LogEntry) => void): () => void {\n this.emitter.on(\"entry\", handler);\n return () => this.emitter.off(\"entry\", handler);\n }\n\n /**\n * Query stored log entries.\n *\n * Queries the first sink that supports querying (typically SQLiteSink).\n * Returns empty result if no sink supports querying.\n *\n * @param q - Query parameters including filters and pagination\n * @returns Query result with matching entries\n */\n query(q: LogQuery): LogQueryResult {\n for (const sink of this.sinks) {\n if (sink.query) return sink.query(q);\n }\n return { entries: [] };\n }\n\n /** Force-flush. SQLite writes are synchronous, so this returns once writes complete. */\n flush(): void {\n this.flushSync();\n }\n\n /**\n * Close the log store and release resources.\n *\n * Flushes any pending entries, marks the store as closed, and closes\n * all registered sinks.\n */\n close(): void {\n if (this.closed) return;\n this.flushSync();\n this.closed = true;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n for (const sink of this.sinks) sink.close();\n this.emitter.removeAllListeners();\n }\n\n private flushSync(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n if (this.buffer.length === 0) return;\n const batch = this.buffer;\n this.buffer = [];\n for (const sink of this.sinks) {\n try {\n sink.writeBatch(batch);\n } catch (err) {\n // Last-resort: log to stderr; never let a sink failure crash the producer.\n process.stderr.write(`LogStore sink write failed: ${String(err)}\\n`);\n }\n }\n }\n}\n","import type { NormalizedError } from \"@skaile/workspaces/types\";\n\nexport function normalizeError(value: unknown): NormalizedError | undefined {\n if (value === undefined || value === null) return undefined;\n if (value instanceof Error) {\n return {\n name: value.name,\n message: value.message,\n stack: value.stack,\n };\n }\n if (typeof value === \"string\") {\n return { name: \"Error\", message: value };\n }\n try {\n return { name: \"Error\", message: JSON.stringify(value) };\n } catch {\n return { name: \"Error\", message: String(value) };\n }\n}\n\nexport function sanitizeData(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined || value === null) return undefined;\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || v === undefined) return v;\n if (typeof v === \"bigint\") return v.toString();\n if (typeof v === \"function\") return \"[Function]\";\n if (typeof v === \"symbol\") return v.toString();\n if (v instanceof Error) return normalizeError(v);\n if (typeof v !== \"object\") return v;\n if (seen.has(v as object)) return \"[Circular]\";\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const [k, child] of Object.entries(v as Record<string, unknown>)) {\n out[k] = walk(child);\n }\n return out;\n };\n const result = walk(value);\n if (typeof result !== \"object\" || result === null || Array.isArray(result)) {\n return { value: result };\n }\n return result as Record<string, unknown>;\n}\n","// LogSink interface lives in @skaile/workspaces/types so consumers can type-check\n// sink instances without depending on core. Runtime errors live here.\nexport type { LogSink } from \"@skaile/workspaces/types\";\n\nexport class LogStoreDisabledError extends Error {\n constructor() {\n super(\"LogStore is disabled (mode=off); query is unavailable\");\n this.name = \"LogStoreDisabledError\";\n }\n}\n","import type { LogEntry, LogQuery, LogQueryResult } from \"@skaile/workspaces/types\";\nimport { type LogSink, LogStoreDisabledError } from \"./types.js\";\n\nexport class NoOpSink implements LogSink {\n write(_entry: LogEntry): void {}\n writeBatch(_entries: LogEntry[]): void {}\n query(_q: LogQuery): LogQueryResult {\n throw new LogStoreDisabledError();\n }\n close(): void {}\n}\n","import type { LogEntry, LogSource } from \"@skaile/workspaces/types\";\nimport type { LogSink } from \"./types.js\";\n\nexport type StdoutFormat = \"pretty\" | \"json\";\n\n/** Which standard stream the sink writes to. */\nexport type StdoutStream = \"stdout\" | \"stderr\";\n\nexport interface StdoutSinkOptions {\n format?: StdoutFormat;\n /**\n * Standard stream to write to. Default: `\"stdout\"`. Set to `\"stderr\"` for\n * processes whose stdout is a reserved channel — e.g. a stdio MCP server,\n * where stdout carries JSON-RPC and any log line would corrupt the protocol.\n */\n stream?: StdoutStream;\n}\n\nfunction formatSource(source: LogSource): string {\n const parts = [source.kind, source.subkind];\n if (source.instance) parts.push(source.instance);\n return `[${parts.join(\":\")}]`;\n}\n\nfunction formatTime(iso: string): string {\n // HH:MM:SS.sss\n return iso.slice(11, 23);\n}\n\nconst LEVEL_LABEL = {\n debug: \"DEBUG\",\n info: \"INFO \",\n warn: \"WARN \",\n error: \"ERROR\",\n} as const;\n\nexport class StdoutSink implements LogSink {\n private format: StdoutFormat;\n private stream: NodeJS.WriteStream;\n\n constructor(opts: StdoutSinkOptions = {}) {\n this.stream = opts.stream === \"stderr\" ? process.stderr : process.stdout;\n this.format = opts.format ?? (this.stream.isTTY ? \"pretty\" : \"json\");\n }\n\n write(entry: LogEntry): void {\n this.stream.write(`${this.render(entry)}\\n`);\n }\n\n writeBatch(entries: LogEntry[]): void {\n for (const e of entries) this.write(e);\n }\n\n close(): void {}\n\n private render(entry: LogEntry): string {\n if (this.format === \"json\") {\n return JSON.stringify(entry);\n }\n const head = `${formatTime(entry.timestamp)} ${LEVEL_LABEL[entry.level]} ${formatSource(entry.source)}`;\n const tail = entry.message;\n const detail = entry.data ? `\\n > ${JSON.stringify(entry.data)}` : \"\";\n const err = entry.error ? `\\n ! ${entry.error.name}: ${entry.error.message}` : \"\";\n return `${head} ${tail}${detail}${err}`;\n }\n}\n","import type { Logger, LogSource } from \"@skaile/workspaces/types\";\nimport { LogStore } from \"./log-store.js\";\nimport { normalizeError, sanitizeData } from \"./sanitize.js\";\nimport { NoOpSink } from \"./sinks/no-op-sink.js\";\nimport { StdoutSink } from \"./sinks/stdout-sink.js\";\n\n/**\n * The active LogStore is a process-singleton. It is stored on `globalThis`\n * under a `Symbol.for` key so it survives module duplication — under vitest's\n * `skaile-src` aliasing and the runner's lazy `import(\"@skaile/workspaces/runner\")`,\n * `core/logging` can be evaluated as two distinct module instances. A plain\n * module-scoped `let` would give each instance its own store, so a logger\n * created on one instance would not see a store registered on the other.\n * The `globalThis` slot makes the singleton genuinely process-wide.\n */\nconst ACTIVE_STORE_KEY = Symbol.for(\"@skaile/workspaces:logging:activeStore\");\n\ntype GlobalWithStore = typeof globalThis & {\n [ACTIVE_STORE_KEY]?: LogStore | null;\n};\n\nconst globalStoreSlot = globalThis as GlobalWithStore;\n\nexport function registerLogStore(store: LogStore): void {\n globalStoreSlot[ACTIVE_STORE_KEY] = store;\n}\n\nexport function getLogStore(): LogStore | null {\n return globalStoreSlot[ACTIVE_STORE_KEY] ?? null;\n}\n\nexport function resetLogStore(): void {\n globalStoreSlot[ACTIVE_STORE_KEY] = null;\n}\n\nexport interface CreateLoggerOptions {\n /**\n * When true (default), create + register a lazy off-mode LogStore if none\n * is registered. When false, throw if no store has been registered.\n */\n fallback?: boolean;\n}\n\nfunction ensureLogStore(): LogStore {\n const existing = globalStoreSlot[ACTIVE_STORE_KEY];\n if (existing) return existing;\n // Lazy off-mode fallback: NoOp + Stdout, no SQLite, no sessionId.\n const fallback = new LogStore({\n sessionId: \"no-session\",\n level: \"info\",\n sinks: [new NoOpSink(), new StdoutSink()],\n });\n globalStoreSlot[ACTIVE_STORE_KEY] = fallback;\n return fallback;\n}\n\n/**\n * Creates a logger for the given source.\n *\n * If no LogStore is registered and fallback is enabled (default), a lazy\n * off-mode fallback store (NoOp + Stdout) is created.\n *\n * @param source - The log source (e.g., { kind: 'agent', name: 'my-agent' })\n * @param opts - Configuration options for logger creation\n * @param opts.fallback - When true (default), creates a fallback store if none registered\n * @returns A logger instance\n * @throws {Error} When no LogStore is registered and fallback is false\n *\n * @example\n * ```typescript\n * const logger = createLogger({ kind: 'agent', name: 'my-agent' });\n * logger.info('Agent started');\n * ```\n */\nexport function createLogger(source: LogSource, opts: CreateLoggerOptions = {}): Logger {\n const fallback = opts.fallback !== false;\n if (!getLogStore() && !fallback) {\n throw new Error(\"createLogger: no LogStore registered. Call registerLogStore() first.\");\n }\n const store = ensureLogStore();\n return makeLogger(source, store);\n}\n\nfunction makeLogger(source: LogSource, store: LogStore): Logger {\n const emit = (\n level: \"debug\" | \"info\" | \"warn\" | \"error\",\n message: string,\n data?: object,\n err?: unknown,\n ) => {\n if (!store.isEnabled(level)) return;\n store.record({\n source,\n level,\n message,\n data: sanitizeData(data),\n error: normalizeError(err),\n });\n };\n return {\n debug(message, data) {\n emit(\"debug\", message, data);\n },\n info(message, data) {\n emit(\"info\", message, data);\n },\n warn(message, data) {\n emit(\"warn\", message, data);\n },\n error(message, err, data) {\n emit(\"error\", message, data, err);\n },\n child(partial) {\n return makeLogger({ ...source, ...partial }, store);\n },\n };\n}\n"]}