@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
@@ -1,7 +1,38 @@
1
1
  import { EventEmitter } from 'events';
2
2
  import { ulid } from 'ulid';
3
3
 
4
- // core/src/logging/log-store.ts
4
+ // core/src/logging/stream-health.ts
5
+ function codeOf(err) {
6
+ if (typeof err !== "object" || err === null) return void 0;
7
+ const code = err.code;
8
+ return typeof code === "string" ? code : void 0;
9
+ }
10
+ function isBrokenPipeError(err) {
11
+ return codeOf(err) === "EPIPE";
12
+ }
13
+ var UNWRITABLE_CODES = /* @__PURE__ */ new Set([
14
+ "EPIPE",
15
+ "EBADF",
16
+ "ERR_STREAM_DESTROYED",
17
+ "ERR_STREAM_WRITE_AFTER_END"
18
+ ]);
19
+ function isUnwritableStreamError(err) {
20
+ const code = codeOf(err);
21
+ return code !== void 0 && UNWRITABLE_CODES.has(code);
22
+ }
23
+ function isStreamOpen(stream) {
24
+ return stream.destroyed !== true && stream.writableEnded !== true;
25
+ }
26
+ var brokenStreams = /* @__PURE__ */ new WeakSet();
27
+ function markStreamBroken(stream) {
28
+ brokenStreams.add(stream);
29
+ }
30
+ function __resetBrokenStreams() {
31
+ brokenStreams = /* @__PURE__ */ new WeakSet();
32
+ }
33
+ function isStreamUsable(stream) {
34
+ return !brokenStreams.has(stream) && isStreamOpen(stream);
35
+ }
5
36
  var LEVEL_RANK = {
6
37
  debug: 10,
7
38
  info: 20,
@@ -116,12 +147,20 @@ var LogStore = class {
116
147
  try {
117
148
  sink.writeBatch(batch);
118
149
  } catch (err) {
119
- process.stderr.write(`LogStore sink write failed: ${String(err)}
120
- `);
150
+ reportSinkFailure(err);
121
151
  }
122
152
  }
123
153
  }
124
154
  };
155
+ function reportSinkFailure(err) {
156
+ if (!isStreamUsable(process.stderr)) return;
157
+ try {
158
+ process.stderr.write(`LogStore sink write failed: ${String(err)}
159
+ `);
160
+ } catch (writeErr) {
161
+ if (isUnwritableStreamError(writeErr)) markStreamBroken(process.stderr);
162
+ }
163
+ }
125
164
 
126
165
  // core/src/logging/sanitize.ts
127
166
  function normalizeError(value) {
@@ -208,18 +247,27 @@ var StdoutSink = class {
208
247
  format;
209
248
  stream;
210
249
  constructor(opts = {}) {
211
- this.stream = opts.stream === "stderr" ? process.stderr : process.stdout;
250
+ this.stream = resolveStream(opts.stream);
212
251
  this.format = opts.format ?? (this.stream.isTTY ? "pretty" : "json");
213
252
  }
214
253
  write(entry) {
215
- this.stream.write(`${this.render(entry)}
254
+ if (!this.writable()) return;
255
+ try {
256
+ this.stream.write(`${this.render(entry)}
216
257
  `);
258
+ } catch (err) {
259
+ if (isUnwritableStreamError(err)) markStreamBroken(this.stream);
260
+ }
217
261
  }
218
262
  writeBatch(entries) {
219
263
  for (const e of entries) this.write(e);
220
264
  }
221
265
  close() {
222
266
  }
267
+ /** False once the far end is gone; the sink then drops entries silently. */
268
+ writable() {
269
+ return isStreamUsable(this.stream);
270
+ }
223
271
  render(entry) {
224
272
  if (this.format === "json") {
225
273
  return JSON.stringify(entry);
@@ -233,6 +281,11 @@ var StdoutSink = class {
233
281
  return `${head} ${tail}${detail}${err}`;
234
282
  }
235
283
  };
284
+ function resolveStream(stream) {
285
+ if (stream === "stderr") return process.stderr;
286
+ if (stream === void 0 || stream === "stdout") return process.stdout;
287
+ return stream;
288
+ }
236
289
 
237
290
  // core/src/logging/create-logger.ts
238
291
  var ACTIVE_STORE_KEY = /* @__PURE__ */ Symbol.for("@skaile/workspaces:logging:activeStore");
@@ -295,6 +348,6 @@ function makeLogger(source, store) {
295
348
  };
296
349
  }
297
350
 
298
- export { LogStore, LogStoreDisabledError, NoOpSink, StdoutSink, createLogger, getLogStore, normalizeError, registerLogStore, resetLogStore, sanitizeData };
299
- //# sourceMappingURL=chunk-3A5IKBHQ.js.map
300
- //# sourceMappingURL=chunk-3A5IKBHQ.js.map
351
+ export { LogStore, LogStoreDisabledError, NoOpSink, StdoutSink, __resetBrokenStreams, createLogger, getLogStore, isBrokenPipeError, isStreamOpen, isStreamUsable, isUnwritableStreamError, markStreamBroken, normalizeError, registerLogStore, resetLogStore, sanitizeData };
352
+ //# sourceMappingURL=chunk-W4IPN3DD.js.map
353
+ //# sourceMappingURL=chunk-W4IPN3DD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../core/src/logging/stream-health.ts","../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":";;;;AAmBA,SAAS,OAAO,GAAA,EAAkC;AAChD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,MAAM,OAAO,MAAA;AACpD,EAAA,MAAM,OAAQ,GAAA,CAA8B,IAAA;AAC5C,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,MAAA;AAC3C;AASO,SAAS,kBAAkB,GAAA,EAAuB;AACvD,EAAA,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,OAAA;AACzB;AAOA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,SAAS,wBAAwB,GAAA,EAAuB;AAC7D,EAAA,MAAM,IAAA,GAAO,OAAO,GAAG,CAAA;AACvB,EAAA,OAAO,IAAA,KAAS,MAAA,IAAa,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA;AACxD;AAGO,SAAS,aAAa,MAAA,EAAmE;AAC9F,EAAA,OAAO,MAAA,CAAO,SAAA,KAAc,IAAA,IAAQ,MAAA,CAAO,aAAA,KAAkB,IAAA;AAC/D;AASA,IAAI,aAAA,uBAAoB,OAAA,EAAgB;AAGjC,SAAS,iBAAiB,MAAA,EAAsB;AACrD,EAAA,aAAA,CAAc,IAAI,MAAM,CAAA;AAC1B;AAOO,SAAS,oBAAA,GAA6B;AAC3C,EAAA,aAAA,uBAAoB,OAAA,EAAQ;AAC9B;AAGO,SAAS,eAAe,MAAA,EAAmE;AAChG,EAAA,OAAO,CAAC,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,IAAK,aAAa,MAAM,CAAA;AAC1D;ACzDA,IAAM,UAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,EAAA;AAAA,EACP,IAAA,EAAM,EAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAcO,IAAM,WAAN,MAAe;AAAA,EACZ,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAqB,EAAC;AAAA,EACtB,KAAA,GAA+B,IAAA;AAAA,EAC/B,OAAA,GAAU,IAAI,YAAA,EAAa;AAAA,EAC3B,MAAA,GAAS,KAAA;AAAA,EAEjB,YAAY,IAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,eAAA,IAAmB,EAAA;AAC/C,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,GAAA;AAC7C,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AAAA,EAChC;AAAA,EAEA,QAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA,EAGA,QAAQ,IAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACtB;AAAA;AAAA,EAGA,UAAU,KAAA,EAA0B;AAClC,IAAA,OAAO,UAAA,CAAW,KAAK,CAAA,IAAK,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,EACnD;AAAA,EAEA,OAAO,KAAA,EAA0B;AAC/B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,IAAI,IAAA,EAAK;AAAA,MACT,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM;AAAA,KACf;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,KAAK,CAAA;AACtB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,cAAA,EAAgB;AAC7C,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,WAAW,IAAA,CAAK,eAAA,GAAkB,CAAA,IAAK,IAAA,CAAK,UAAU,IAAA,EAAM;AAC1D,MAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,MAAM,KAAK,SAAA,EAAU,EAAG,KAAK,eAAe,CAAA;AAAA,IACtE,CAAA,MAAA,IAAW,IAAA,CAAK,eAAA,KAAoB,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,OAAA,EAAgD;AACxD,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAChC,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,CAAA,EAA6B;AACjC,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,EACvB;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAC1C,IAAA,IAAA,CAAK,QAAQ,kBAAA,EAAmB;AAAA,EAClC;AAAA,EAEQ,SAAA,GAAkB;AACxB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACf;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MACvB,SAAS,GAAA,EAAK;AAIZ,QAAA,iBAAA,CAAkB,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;AAQA,SAAS,kBAAkB,GAAA,EAAoB;AAC7C,EAAA,IAAI,CAAC,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA,EAAG;AACrC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,GAAG,CAAC;AAAA,CAAI,CAAA;AAAA,EACrE,SAAS,QAAA,EAAU;AACjB,IAAA,IAAI,uBAAA,CAAwB,QAAQ,CAAA,EAAG,gBAAA,CAAiB,QAAQ,MAAM,CAAA;AAAA,EACxE;AACF;;;AC1LO,SAAS,eAAe,KAAA,EAA6C;AAC1E,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO;AAAA,MACL,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM;AAAA,KACf;AAAA,EACF;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,KAAA,EAAM;AAAA,EACzC;AACA,EAAA,IAAI;AACF,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAE;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACjD;AACF;AAEO,SAAS,aAAa,KAAA,EAAqD;AAChF,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAClD,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAwB;AACpC,IAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW,OAAO,CAAA;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,EAAE,QAAA,EAAS;AAC7C,IAAA,IAAI,OAAO,CAAA,KAAM,UAAA,EAAY,OAAO,YAAA;AACpC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,EAAE,QAAA,EAAS;AAC7C,IAAA,IAAI,CAAA,YAAa,KAAA,EAAO,OAAO,cAAA,CAAe,CAAC,CAAA;AAC/C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAW,CAAA,EAAG,OAAO,YAAA;AAClC,IAAA,IAAA,CAAK,IAAI,CAAW,CAAA;AACpB,IAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,CAAA,CAAE,IAAI,IAAI,CAAA;AACvC,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,CAA4B,CAAA,EAAG;AACrE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,KAAK,KAAK,CAAA;AACzB,EAAA,IAAI,OAAO,WAAW,QAAA,IAAY,MAAA,KAAW,QAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1E,IAAA,OAAO,EAAE,OAAO,MAAA,EAAO;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;;;ACzCO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,GAAc;AACZ,IAAA,KAAA,CAAM,uDAAuD,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;;;ACNO,IAAM,WAAN,MAAkC;AAAA,EACvC,MAAM,MAAA,EAAwB;AAAA,EAAC;AAAA,EAC/B,WAAW,QAAA,EAA4B;AAAA,EAAC;AAAA,EACxC,MAAM,EAAA,EAA8B;AAClC,IAAA,MAAM,IAAI,qBAAA,EAAsB;AAAA,EAClC;AAAA,EACA,KAAA,GAAc;AAAA,EAAC;AACjB;;;ACiBA,SAAS,aAAa,MAAA,EAA2B;AAC/C,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,IAAA,EAAM,OAAO,OAAO,CAAA;AAC1C,EAAA,IAAI,MAAA,CAAO,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,OAAO,QAAQ,CAAA;AAC/C,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC5B;AAEA,SAAS,WAAW,GAAA,EAAqB;AAEvC,EAAA,OAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AACzB;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,aAAN,MAAoC;AAAA,EACjC,MAAA;AAAA,EACA,MAAA;AAAA,EAER,WAAA,CAAY,IAAA,GAA0B,EAAC,EAAG;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACvC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,MAAA,CAAO,QAAQ,QAAA,GAAW,MAAA,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,KAAA,EAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAS,EAAG;AACtB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC;AAAA,CAAI,CAAA;AAAA,IAC7C,SAAS,GAAA,EAAK;AAEZ,MAAA,IAAI,uBAAA,CAAwB,GAAG,CAAA,EAAG,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,WAAW,OAAA,EAA2B;AAEpC,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,EACvC;AAAA,EAEA,KAAA,GAAc;AAAA,EAAC;AAAA;AAAA,EAGP,QAAA,GAAoB;AAC1B,IAAA,OAAO,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EACnC;AAAA,EAEQ,OAAO,KAAA,EAAyB;AACtC,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,MAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,MAAM,IAAA,GAAO,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,SAAS,CAAC,CAAA,EAAA,EAAK,WAAA,CAAY,KAAA,CAAM,KAAK,CAAC,CAAA,EAAA,EAAK,YAAA,CAAa,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AACvG,IAAA,MAAM,OAAO,KAAA,CAAM,OAAA;AACnB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,GAAO;AAAA,IAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,GAAQ;AAAA,IAAA,EAAS,MAAM,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,EAAA;AAChF,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,EAAG,MAAM,GAAG,GAAG,CAAA,CAAA;AAAA,EACxC;AACF;AAEA,SAAS,cAAc,MAAA,EAAmD;AACxE,EAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,OAAA,CAAQ,MAAA;AACxC,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,QAAA,SAAiB,OAAA,CAAQ,MAAA;AAChE,EAAA,OAAO,MAAA;AACT;;;AC7EA,IAAM,gBAAA,mBAAmB,MAAA,CAAO,GAAA,CAAI,wCAAwC,CAAA;AAM5E,IAAM,eAAA,GAAkB,UAAA;AAEjB,SAAS,iBAAiB,KAAA,EAAuB;AACtD,EAAA,eAAA,CAAgB,gBAAgB,CAAA,GAAI,KAAA;AACtC;AAEO,SAAS,WAAA,GAA+B;AAC7C,EAAA,OAAO,eAAA,CAAgB,gBAAgB,CAAA,IAAK,IAAA;AAC9C;AAEO,SAAS,aAAA,GAAsB;AACpC,EAAA,eAAA,CAAgB,gBAAgB,CAAA,GAAI,IAAA;AACtC;AAUA,SAAS,cAAA,GAA2B;AAClC,EAAA,MAAM,QAAA,GAAW,gBAAgB,gBAAgB,CAAA;AACjD,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS;AAAA,IAC5B,SAAA,EAAW,YAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA,IACP,OAAO,CAAC,IAAI,UAAS,EAAG,IAAI,YAAY;AAAA,GACzC,CAAA;AACD,EAAA,eAAA,CAAgB,gBAAgB,CAAA,GAAI,QAAA;AACpC,EAAA,OAAO,QAAA;AACT;AAoBO,SAAS,YAAA,CAAa,MAAA,EAAmB,IAAA,GAA4B,EAAC,EAAW;AACtF,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,KAAa,KAAA;AACnC,EAAA,IAAI,CAAC,WAAA,EAAY,IAAK,CAAC,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,MAAM,sEAAsE,CAAA;AAAA,EACxF;AACA,EAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,EAAA,OAAO,UAAA,CAAW,QAAQ,KAAK,CAAA;AACjC;AAEA,SAAS,UAAA,CAAW,QAAmB,KAAA,EAAyB;AAC9D,EAAA,MAAM,IAAA,GAAO,CACX,KAAA,EACA,OAAA,EACA,MACA,GAAA,KACG;AACH,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,CAAU,KAAK,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,MAAA,CAAO;AAAA,MACX,MAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,MACvB,KAAA,EAAO,eAAe,GAAG;AAAA,KAC1B,CAAA;AAAA,EACH,CAAA;AACA,EAAA,OAAO;AAAA,IACL,KAAA,CAAM,SAAS,IAAA,EAAM;AACnB,MAAA,IAAA,CAAK,OAAA,EAAS,SAAS,IAAI,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,IAAA,CAAK,SAAS,IAAA,EAAM;AAClB,MAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,IAAA,CAAK,SAAS,IAAA,EAAM;AAClB,MAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM;AACxB,MAAA,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,GAAG,CAAA;AAAA,IAClC,CAAA;AAAA,IACA,MAAM,OAAA,EAAS;AACb,MAAA,OAAO,WAAW,EAAE,GAAG,QAAQ,GAAG,OAAA,IAAW,KAAK,CAAA;AAAA,IACpD;AAAA,GACF;AACF","file":"chunk-W4IPN3DD.js","sourcesContent":["/**\n * Liveness checks for the stdio streams the logging layer writes to.\n *\n * Shared by `StdoutSink` (which stops writing to a dead stream) and the\n * runner's `watchOutputStream` (which stops the loop, and exits only when its\n * caller owns the process), so the two cannot disagree about what \"dead\" means.\n * See `_devlog/notes/2026-09-07-stdout-epipe-log-loop.md`.\n */\n\n/**\n * Structural subset of `process.stdout` these helpers need. Declared instead of\n * `NodeJS.WriteStream` so tests and embedders can pass an ordinary `Writable`.\n */\nexport type OutputStream = NodeJS.WritableStream & {\n isTTY?: boolean;\n destroyed?: boolean;\n writableEnded?: boolean;\n};\n\nfunction codeOf(err: unknown): string | undefined {\n if (typeof err !== \"object\" || err === null) return undefined;\n const code = (err as NodeJS.ErrnoException).code;\n return typeof code === \"string\" ? code : undefined;\n}\n\n/**\n * True only for `EPIPE` — the reader closed its end.\n *\n * Deliberately narrow, because callers act on it by killing the process: a\n * wider set would let an unrelated bad descriptor take a whole session down.\n * Use {@link isUnwritableStreamError} to decide whether to stop *writing*.\n */\nexport function isBrokenPipeError(err: unknown): boolean {\n return codeOf(err) === \"EPIPE\";\n}\n\n/**\n * Error codes meaning this stream will never accept another write. Broader\n * than {@link isBrokenPipeError} because latching a sink off is cheap and\n * reversible in a way that exiting the process is not.\n */\nconst UNWRITABLE_CODES = new Set([\n \"EPIPE\",\n \"EBADF\",\n \"ERR_STREAM_DESTROYED\",\n \"ERR_STREAM_WRITE_AFTER_END\",\n]);\n\n/** True when a further write to this stream can only fail the same way. */\nexport function isUnwritableStreamError(err: unknown): boolean {\n const code = codeOf(err);\n return code !== undefined && UNWRITABLE_CODES.has(code);\n}\n\n/** False once the stream has been destroyed or ended. */\nexport function isStreamOpen(stream: { destroyed?: boolean; writableEnded?: boolean }): boolean {\n return stream.destroyed !== true && stream.writableEnded !== true;\n}\n\n/**\n * Streams known to be unwritable. Sinks consult this and go quiet; nothing\n * here listens for `error`, because claiming that event suppresses Node's\n * default fatal-EPIPE exit — right for a long-lived server, wrong for a CLI\n * being piped into `head`. That listener belongs to whoever owns the process\n * lifecycle: see `watchOutputStream` in the runner.\n */\nlet brokenStreams = new WeakSet<object>();\n\n/** Record that a stream will never accept another write. Idempotent. */\nexport function markStreamBroken(stream: object): void {\n brokenStreams.add(stream);\n}\n\n/**\n * Forget every broken-stream mark. Test-only — the registry is process-wide by\n * design, so a suite that breaks a stream would otherwise leak that verdict.\n * @internal\n */\nexport function __resetBrokenStreams(): void {\n brokenStreams = new WeakSet();\n}\n\n/** True while a stream is worth writing to. */\nexport function isStreamUsable(stream: { destroyed?: boolean; writableEnded?: boolean }): boolean {\n return !brokenStreams.has(stream) && isStreamOpen(stream);\n}\n","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 { isStreamUsable, isUnwritableStreamError, markStreamBroken } from \"./stream-health.js\";\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 // Never let a sink failure crash the producer. `reportSinkFailure` is\n // itself failure-tolerant: a throw here would escape to the process\n // handler, which logs it back through this same store.\n reportSinkFailure(err);\n }\n }\n }\n}\n\n/**\n * Last-resort report of a sink failure. Silent once stderr is unusable —\n * a dead stderr fails asynchronously just like stdout, so the try/catch alone\n * would never latch. `isStreamUsable` is the shared verdict; the `catch` only\n * covers the synchronous throws (write-after-end, destroyed).\n */\nfunction reportSinkFailure(err: unknown): void {\n if (!isStreamUsable(process.stderr)) return;\n try {\n process.stderr.write(`LogStore sink write failed: ${String(err)}\\n`);\n } catch (writeErr) {\n if (isUnwritableStreamError(writeErr)) markStreamBroken(process.stderr);\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 {\n isStreamUsable,\n isUnwritableStreamError,\n markStreamBroken,\n type OutputStream,\n} from \"../stream-health.js\";\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 type { OutputStream };\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 * An explicit stream object may be passed instead; used by tests.\n */\n stream?: StdoutStream | OutputStream;\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: OutputStream;\n\n constructor(opts: StdoutSinkOptions = {}) {\n this.stream = resolveStream(opts.stream);\n this.format = opts.format ?? (this.stream.isTTY ? \"pretty\" : \"json\");\n }\n\n write(entry: LogEntry): void {\n if (!this.writable()) return;\n try {\n this.stream.write(`${this.render(entry)}\\n`);\n } catch (err) {\n // Sync throws (write-after-end, destroyed) never reach the `error` event.\n if (isUnwritableStreamError(err)) markStreamBroken(this.stream);\n }\n }\n\n writeBatch(entries: LogEntry[]): void {\n // `write` re-checks per entry, so a batch stops at the first failure.\n for (const e of entries) this.write(e);\n }\n\n close(): void {}\n\n /** False once the far end is gone; the sink then drops entries silently. */\n private writable(): boolean {\n return isStreamUsable(this.stream);\n }\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\nfunction resolveStream(stream: StdoutSinkOptions[\"stream\"]): OutputStream {\n if (stream === \"stderr\") return process.stderr;\n if (stream === undefined || stream === \"stdout\") return process.stdout;\n return stream;\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"]}
@@ -1,4 +1,4 @@
1
- import { factoryAssetRoots } from './chunk-SH572OBN.js';
1
+ import { factoryAssetRoots } from './chunk-OIDFK7SG.js';
2
2
  import fs from 'fs';
3
3
  import os from 'os';
4
4
  import path from 'path';
@@ -19,5 +19,5 @@ var MONOREPO_ROOT = findMonorepoRoot(__ownDir);
19
19
  var AI_RESOURCES = factoryAssetRoots()[0] ?? path.join(os.homedir(), ".skaile", "libraries");
20
20
 
21
21
  export { AI_RESOURCES, MONOREPO_ROOT };
22
- //# sourceMappingURL=chunk-M5D2QNTY.js.map
23
- //# sourceMappingURL=chunk-M5D2QNTY.js.map
22
+ //# sourceMappingURL=chunk-ZNCZ7RUO.js.map
23
+ //# sourceMappingURL=chunk-ZNCZ7RUO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/paths.ts"],"names":[],"mappings":";;;;;;AAgBA,IAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAW5D,SAAS,iBAAiB,IAAA,EAA6B;AACrD,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,YAAY,CAAC,GAAG,OAAO,GAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,aAAA,GAA+B,iBAAiB,QAAQ;AAc9D,IAAM,YAAA,GACX,iBAAA,EAAkB,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,WAAW","file":"chunk-M5D2QNTY.js","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { factoryAssetRoots } from \"@skaile/workspaces/core\";\n\n/**\n * The content-root policy lives in `@skaile/workspaces/core` so the flow\n * connector's resolution surfaces can reach it too — `factory-assets → cli`\n * would be a module cycle. Re-exported here because this module is the CLI's\n * documented path surface and every CLI caller imports it from here.\n *\n * @docLink cli/dev-guide#paths\n */\nexport { aiResourceRoots } from \"@skaile/workspaces/core\";\n\nconst __ownDir = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Walk up from `from` looking for the monorepo marker (`biome.json`, the\n * repo-root shared tooling config). Returns the matching directory or `null`\n * when none is found within eight levels — the latter is the typical case when\n * `@skaile/workspaces` has been installed via `npm i` without a skaile-dev\n * workspace context. Used only to gate dev-only commands (e.g.\n * `serve --compile-test`); first-party content is located via\n * {@link aiResourceRoots}, not this.\n */\nfunction findMonorepoRoot(from: string): string | null {\n let dir = from;\n for (let i = 0; i < 8; i++) {\n if (fs.existsSync(path.join(dir, \"biome.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Absolute path to the monorepo root, or `null` when the CLI is running\n * outside the skaile-dev workspace (typical for `npm i -g` installs).\n *\n * Consumers that only make sense inside the workspace (e.g.\n * `skaile serve --compile-test`) MUST check for `null` and report a\n * \"monorepo-only feature\" error before proceeding.\n *\n * @docLink cli/dev-guide#paths\n */\nexport const MONOREPO_ROOT: string | null = findMonorepoRoot(__ownDir);\n\n/**\n * Default content root used by path display and the `validate` command.\n *\n * The primary first-party `factory-assets/` root resolved through the shared\n * `factoryAssetRoots()` helper — the `SKAILE_FACTORY_ASSETS_DIR` override when\n * set, else the in-repo source during dev / bundled `dist/factory-assets/` after\n * `npm i`. Falls back to `~/.skaile/libraries/` — the user-library directory\n * managed by `skaile library add` — when the package cannot be located.\n * Consumers `fs.existsSync` first and degrade to \"no skills / flows discovered\".\n *\n * @docLink cli/dev-guide#paths\n */\nexport const AI_RESOURCES: string =\n factoryAssetRoots()[0] ?? path.join(os.homedir(), \".skaile\", \"libraries\");\n"]}
1
+ {"version":3,"sources":["../cli/src/paths.ts"],"names":[],"mappings":";;;;;;AAgBA,IAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAW5D,SAAS,iBAAiB,IAAA,EAA6B;AACrD,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,YAAY,CAAC,GAAG,OAAO,GAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,aAAA,GAA+B,iBAAiB,QAAQ;AAc9D,IAAM,YAAA,GACX,iBAAA,EAAkB,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,WAAW","file":"chunk-ZNCZ7RUO.js","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { factoryAssetRoots } from \"@skaile/workspaces/core\";\n\n/**\n * The content-root policy lives in `@skaile/workspaces/core` so the flow\n * connector's resolution surfaces can reach it too — `factory-assets → cli`\n * would be a module cycle. Re-exported here because this module is the CLI's\n * documented path surface and every CLI caller imports it from here.\n *\n * @docLink cli/dev-guide#paths\n */\nexport { aiResourceRoots } from \"@skaile/workspaces/core\";\n\nconst __ownDir = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Walk up from `from` looking for the monorepo marker (`biome.json`, the\n * repo-root shared tooling config). Returns the matching directory or `null`\n * when none is found within eight levels — the latter is the typical case when\n * `@skaile/workspaces` has been installed via `npm i` without a skaile-dev\n * workspace context. Used only to gate dev-only commands (e.g.\n * `serve --compile-test`); first-party content is located via\n * {@link aiResourceRoots}, not this.\n */\nfunction findMonorepoRoot(from: string): string | null {\n let dir = from;\n for (let i = 0; i < 8; i++) {\n if (fs.existsSync(path.join(dir, \"biome.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Absolute path to the monorepo root, or `null` when the CLI is running\n * outside the skaile-dev workspace (typical for `npm i -g` installs).\n *\n * Consumers that only make sense inside the workspace (e.g.\n * `skaile serve --compile-test`) MUST check for `null` and report a\n * \"monorepo-only feature\" error before proceeding.\n *\n * @docLink cli/dev-guide#paths\n */\nexport const MONOREPO_ROOT: string | null = findMonorepoRoot(__ownDir);\n\n/**\n * Default content root used by path display and the `validate` command.\n *\n * The primary first-party `factory-assets/` root resolved through the shared\n * `factoryAssetRoots()` helper — the `SKAILE_FACTORY_ASSETS_DIR` override when\n * set, else the in-repo source during dev / bundled `dist/factory-assets/` after\n * `npm i`. Falls back to `~/.skaile/libraries/` — the user-library directory\n * managed by `skaile library add` — when the package cannot be located.\n * Consumers `fs.existsSync` first and degrade to \"no skills / flows discovered\".\n *\n * @docLink cli/dev-guide#paths\n */\nexport const AI_RESOURCES: string =\n factoryAssetRoots()[0] ?? path.join(os.homedir(), \".skaile\", \"libraries\");\n"]}
package/dist/cli/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import { makeInstallCommand, makeCheckCommand, makeCleanCommand, reportInstalledSoftDeps } from '../chunk-CWTL2QWL.js';
3
- import { makeSourceCommand, syncProjectSources } from '../chunk-VFPFW67T.js';
4
- import { AI_RESOURCES } from '../chunk-M5D2QNTY.js';
5
- import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity } from '../chunk-WE7ONZNB.js';
6
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-TMAGWRKY.js';
7
- import { logErr, S, logOk, logInfo, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, logWarn, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth } from '../chunk-LVZ5NGME.js';
2
+ import { makeInstallCommand, makeCheckCommand, makeCleanCommand, reportInstalledSoftDeps } from '../chunk-PCDNZROC.js';
3
+ import { makeSourceCommand, syncProjectSources } from '../chunk-QA52GQQN.js';
4
+ import { AI_RESOURCES } from '../chunk-ZNCZ7RUO.js';
5
+ import { getStoreConfig, storeFetch, deviceLogin, loadStoreAuthConfig, logout, hasStoredAuth, isStoreAuthenticated, getStoreToken, getStoreIdentity } from '../chunk-SUPIVTLX.js';
6
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-QG6C3XOS.js';
7
+ import { logErr, S, logOk, logInfo, kindColorPad, kindColor, colorRef, formatSoftDepSection, bareSoftDepName, logWarn, formatSoftDepHint, formatRelativeTime, formatSoftDepRemovePreview, formatSoftDepAddPreview, fitWidth } from '../chunk-775OMGVP.js';
8
8
  import { LocalSecretsProvider } from '../chunk-6BEGKO2Q.js';
9
- import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-5WMFU575.js';
10
- import { buildClaudePluginFiles } from '../chunk-6YDXCJGK.js';
9
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-OEK2ACRR.js';
10
+ import { buildClaudePluginFiles } from '../chunk-EVQDXN27.js';
11
11
  import '../chunk-X5YPJV4N.js';
12
12
  import '../chunk-W3UDISS2.js';
13
13
  import '../chunk-O7SG5PC2.js';
@@ -15,47 +15,47 @@ import '../chunk-7QBNJTTQ.js';
15
15
  import '../chunk-GTS2FODO.js';
16
16
  import '../chunk-WQ7DE5UC.js';
17
17
  import '../chunk-32NA4TVC.js';
18
- import { runFlow, resumeFlow } from '../chunk-LAOS2TZU.js';
18
+ import { runFlow, resumeFlow } from '../chunk-4J24AU4Q.js';
19
19
  import '../chunk-4R6DROGN.js';
20
- import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-4VTBZ2MF.js';
21
- import '../chunk-GHWJHOYX.js';
20
+ import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-3XXQPHGL.js';
21
+ import '../chunk-7BUZQVRR.js';
22
22
  import '../chunk-NC5YXVZF.js';
23
- import '../chunk-MTCLDJPR.js';
24
- import '../chunk-3UU3D2Q3.js';
25
- import '../chunk-DTSKPMP3.js';
26
- import '../chunk-RUFTB7QN.js';
23
+ import '../chunk-VC2MWHRH.js';
24
+ import '../chunk-5KSIVLOX.js';
25
+ import '../chunk-5FCBPIOK.js';
26
+ import '../chunk-3NCGSSCU.js';
27
27
  import '../chunk-RRVQAE5D.js';
28
28
  import '../chunk-GURXUF2J.js';
29
29
  import '../chunk-GAH4YRCI.js';
30
- import '../chunk-Z5ED4E57.js';
30
+ import '../chunk-NIUG3MIH.js';
31
31
  import '../chunk-6E6PKKAD.js';
32
32
  import '../chunk-IFGTRL2I.js';
33
- import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-QZ6XXD3A.js';
33
+ import { projectAiAssetsRoots, loadFlow, loadAllFlowEntries, findFlowFileInRoots } from '../chunk-BQMRUH7J.js';
34
34
  import '../chunk-AXEOG4B5.js';
35
35
  import '../chunk-HY6CIKFH.js';
36
36
  import '../chunk-2D5BYAL6.js';
37
37
  import { nodeLabel, nodeSkillAsset, nodeIsInert, nodeIsOptional, nodeRunKind, flowSkillVersionPins } from '../chunk-ELPR5XBG.js';
38
38
  import '../chunk-2KBA5OO2.js';
39
- import { AssetManager, NON_DEPLOYABLE_KINDS, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-FI4QNNMD.js';
40
- import { getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-Q7KWJO4J.js';
41
- import '../chunk-PPKK5EV6.js';
39
+ import { AssetManager, NON_DEPLOYABLE_KINDS, MissingManifestError, parseRefTolerant, normalizeRepoUrl, FACTORY_SOURCE_URL } from '../chunk-GP2AYOC2.js';
40
+ import { getStoreManifestsDir, getDefaultValue, isSecretPlaceholder } from '../chunk-C4AP3XZB.js';
41
+ import '../chunk-DZ4UZOFB.js';
42
42
  import '../chunk-UKJMQZV6.js';
43
43
  import '../chunk-R7FOF242.js';
44
44
  import '../chunk-JXT46QFC.js';
45
- import '../chunk-X5EYJEEQ.js';
45
+ import '../chunk-S4UA244H.js';
46
46
  import '../chunk-CGYEHQOX.js';
47
- import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, aiResourceRoots, readLock } from '../chunk-F2WTSHZS.js';
47
+ import { resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor, resolveLibraryDir, checkAgentSkillConformance, aiResourceRoots, readLock } from '../chunk-CIPK5JMJ.js';
48
48
  import '../chunk-F3HNW354.js';
49
49
  import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
50
50
  import { detectDomains, assetSearchDirs } from '../chunk-QVZA2MDT.js';
51
- import { factoryAssetRoots } from '../chunk-SH572OBN.js';
52
- import { globalCacheRoot, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, matchPin, coerceVersion, loadSkWorkspaceConfig, resolveSkWorkspaceConfig, storeManifestSlug } from '../chunk-IP3GXHOB.js';
51
+ import { factoryAssetRoots } from '../chunk-OIDFK7SG.js';
52
+ import { globalCacheRoot, sourceCacheKey, getGlobalCacheDir, resolveAgentDir, matchPin, coerceVersion, loadSkWorkspaceConfig, resolveSkWorkspaceConfig, storeManifestSlug } from '../chunk-OZ7UNMTK.js';
53
53
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-MENCWIHW.js';
54
54
  import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest, loadSkPublishManifest, saveSkPublishManifest } from '../chunk-P4VHQA4N.js';
55
- import { parseFrontmatter, scanDirectory } from '../chunk-VQ4P7UYE.js';
55
+ import { parseFrontmatter, scanDirectory } from '../chunk-MKZOK4JU.js';
56
56
  import { parseAssetRef, ASSET_KINDS, isValidAssetName, slugifyAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-GEEW6SY2.js';
57
- import { openSqlite } from '../chunk-5Q7HA4JP.js';
58
- import '../chunk-3A5IKBHQ.js';
57
+ import { openSqlite } from '../chunk-FTG7CRFD.js';
58
+ import '../chunk-W4IPN3DD.js';
59
59
  import '../chunk-KTBKW2FI.js';
60
60
  import '../chunk-UQ6LFBPZ.js';
61
61
  import '../chunk-DVSASEGO.js';
@@ -111,7 +111,7 @@ async function runSearch(kind, query, opts) {
111
111
  }
112
112
  }
113
113
  async function searchIndex(query, kind) {
114
- const { openLibrary: openLibrary2 } = await import('../open-library-2BXBAC6Q.js');
114
+ const { openLibrary: openLibrary2 } = await import('../open-library-IO4TSO2H.js');
115
115
  const library = await openLibrary2();
116
116
  try {
117
117
  const defs = await library.listAssetDefs(kind ? { kind } : {});
@@ -164,7 +164,7 @@ async function searchLocal(query, kind, opts, showStore, airGapped) {
164
164
  const factory = await searchFactory(projectDir, query, kind);
165
165
  let entries = unionEntries(await searchIndex(query, kind), factory);
166
166
  if (entries.length === 0 && !query && !kind && !airGapped) {
167
- const { autoSyncForSearch } = await import('../source-PVTUMNAO.js');
167
+ const { autoSyncForSearch } = await import('../source-DTV7VK3C.js');
168
168
  if (await autoSyncForSearch(projectDir)) {
169
169
  entries = unionEntries(await searchIndex(query, kind), factory);
170
170
  }
@@ -218,7 +218,7 @@ async function searchStore(query, kind, opts, airGapped) {
218
218
  logInfo("air-gapped (cache_ttl: 0) \u2014 local sources only");
219
219
  return;
220
220
  }
221
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-2BXBAC6Q.js');
221
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-IO4TSO2H.js');
222
222
  try {
223
223
  const remote = await openCatalogSource2({ projectDir: path35__default.resolve(opts.projectDir) });
224
224
  const assets = await remote.listAssets(kind ? { kind } : {});
@@ -533,7 +533,7 @@ async function resolveInfoEntry(am2, ref, opts) {
533
533
  return { entry: match ?? deployed };
534
534
  }
535
535
  const lookup = opts.storeLookup ?? (async (filter) => {
536
- const { resolveCatalogSource } = await import('../open-library-2BXBAC6Q.js');
536
+ const { resolveCatalogSource } = await import('../open-library-IO4TSO2H.js');
537
537
  const { source, close } = await resolveCatalogSource({ projectDir: opts.projectDir });
538
538
  try {
539
539
  return await source.listAssets(filter);
@@ -549,7 +549,7 @@ async function resolveInfoEntry(am2, ref, opts) {
549
549
  );
550
550
  return { entry: hit ? catalogAssetToEntry(hit) : null };
551
551
  } catch (err) {
552
- const { LocalCatalogDisabledError } = await import('../open-library-2BXBAC6Q.js');
552
+ const { LocalCatalogDisabledError } = await import('../open-library-IO4TSO2H.js');
553
553
  const storeNote = err instanceof Error ? err.message : String(err);
554
554
  const disabled = err instanceof LocalCatalogDisabledError || /catalog\.url/i.test(storeNote);
555
555
  return { entry: null, storeNote, ...disabled ? { storeDisabled: true } : {} };
@@ -1169,7 +1169,7 @@ function makeCatalogCommand() {
1169
1169
  return catalog;
1170
1170
  }
1171
1171
  async function runLocalCatalogTest(projectDir) {
1172
- const { resolveCatalogSource } = await import('../open-library-2BXBAC6Q.js');
1172
+ const { resolveCatalogSource } = await import('../open-library-IO4TSO2H.js');
1173
1173
  let resolved;
1174
1174
  try {
1175
1175
  resolved = await resolveCatalogSource({ projectDir });
@@ -2153,7 +2153,7 @@ async function ensureTargetsRegistered(projectDir) {
2153
2153
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
2154
2154
  const config = resolveSkWorkspaceConfig2(projectDir);
2155
2155
  if (config.plugins && config.plugins.length > 0) {
2156
- const { ensurePluginsLoaded } = await import('../plugin-store-OO5EZBYP.js');
2156
+ const { ensurePluginsLoaded } = await import('../plugin-store-JQAIKR3R.js');
2157
2157
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
2158
2158
  for (const f of result.failed) logWarn(f.error);
2159
2159
  }
@@ -3408,16 +3408,16 @@ function makeLibraryCommand() {
3408
3408
  });
3409
3409
  cmd.command("publish <lib>").description("Push + register the library's manifest atomically (needs git backend)").option("--asset <ref>", "Publish only the single asset matching this ref/name").option("--create-repo", "Provision + link a public github repo if the library has no remote").option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; push nothing and call no store endpoint").action(
3410
3410
  async (lib, opts) => {
3411
- const { runLibraryPublish } = await import('../library-publish-DV3B2ITY.js');
3411
+ const { runLibraryPublish } = await import('../library-publish-SNUOWBUD.js');
3412
3412
  await withStoreErrorHandling(() => runLibraryPublish(lib, opts));
3413
3413
  }
3414
3414
  );
3415
3415
  cmd.command("register <lib>").description("Register the library's manifest without pushing (bytes already on github)").option("--asset <ref>", "Publish only the single asset matching this ref/name").option("--ref <gitref>", "Git ref to ingest (default: the library branch or main)").option("--dry-run", "Print the plan; call no store endpoint").action(async (lib, opts) => {
3416
- const { runLibraryRegister } = await import('../library-publish-DV3B2ITY.js');
3416
+ const { runLibraryRegister } = await import('../library-publish-SNUOWBUD.js');
3417
3417
  await withStoreErrorHandling(() => runLibraryRegister(lib, opts));
3418
3418
  });
3419
3419
  cmd.command("yank <lib>").description("Retract the library's published assets from the store").option("--asset <ref>", "Yank only the single asset matching this ref/name").action(async (lib, opts) => {
3420
- const { runLibraryYank } = await import('../library-publish-DV3B2ITY.js');
3420
+ const { runLibraryYank } = await import('../library-publish-SNUOWBUD.js');
3421
3421
  await withStoreErrorHandling(() => runLibraryYank(lib, opts));
3422
3422
  });
3423
3423
  return cmd;
@@ -4139,7 +4139,7 @@ function scheduleSoftDepPreview() {
4139
4139
  }
4140
4140
  async function loadAssets() {
4141
4141
  softDepPreviewCache.clear();
4142
- const { gatherAssetFeeds } = await import('../asset-feeds-XSUE5LE6.js');
4142
+ const { gatherAssetFeeds } = await import('../asset-feeds-TS76HDGE.js');
4143
4143
  const { entries, domains, notes } = await gatherAssetFeeds(am, am.projectDir);
4144
4144
  if (notes.length > 0) {
4145
4145
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
@@ -4345,7 +4345,7 @@ function reconcileCollapsedSets(rows) {
4345
4345
  async function loadSourcesAndLibraries() {
4346
4346
  try {
4347
4347
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir }, { getGlobalCacheDir: getGlobalCacheDir2 }] = await Promise.all([
4348
- import('../open-library-2BXBAC6Q.js'),
4348
+ import('../open-library-IO4TSO2H.js'),
4349
4349
  import('../library/index.js'),
4350
4350
  import('../core/index.js')
4351
4351
  ]);
@@ -5634,7 +5634,7 @@ function action2(fn) {
5634
5634
  };
5635
5635
  }
5636
5636
  async function reconcileAndReport(projectDir, plugins) {
5637
- const { reconcilePlugins } = await import('../plugin-store-OO5EZBYP.js');
5637
+ const { reconcilePlugins } = await import('../plugin-store-JQAIKR3R.js');
5638
5638
  if (plugins.length === 0) {
5639
5639
  logInfo("No plugins declared \u2014 nothing to reconcile.");
5640
5640
  return;
@@ -5650,7 +5650,7 @@ async function reconcileAndReport(projectDir, plugins) {
5650
5650
  async function runInstall2(spec, opts) {
5651
5651
  const projectDir = path35__default.resolve(opts.projectDir);
5652
5652
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
5653
- const { specName } = await import('../plugin-store-OO5EZBYP.js');
5653
+ const { specName } = await import('../plugin-store-JQAIKR3R.js');
5654
5654
  const yamlPath = path35__default.join(projectDir, "skaile.yaml");
5655
5655
  const editor = WorkspaceYamlEditor2.load(yamlPath);
5656
5656
  const replaced = editor.addPlugin(spec, specName);
@@ -5662,7 +5662,7 @@ async function runInstall2(spec, opts) {
5662
5662
  async function runRemove(name, opts) {
5663
5663
  const projectDir = path35__default.resolve(opts.projectDir);
5664
5664
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
5665
- const { specName } = await import('../plugin-store-OO5EZBYP.js');
5665
+ const { specName } = await import('../plugin-store-JQAIKR3R.js');
5666
5666
  const yamlPath = path35__default.join(projectDir, "skaile.yaml");
5667
5667
  const editor = WorkspaceYamlEditor2.load(yamlPath);
5668
5668
  const removed = editor.removePlugin(name, specName);
@@ -5690,7 +5690,7 @@ async function runList(opts) {
5690
5690
  const registry = createPluginRegistry();
5691
5691
  if (declared.length > 0) {
5692
5692
  try {
5693
- const { loadPlugins } = await import('../plugin-store-OO5EZBYP.js');
5693
+ const { loadPlugins } = await import('../plugin-store-JQAIKR3R.js');
5694
5694
  const result = await loadPlugins(projectDir, declared, registry);
5695
5695
  for (const f of result.failed) logWarn(f.error);
5696
5696
  } catch (err) {
@@ -6768,6 +6768,10 @@ function makeServeCommand() {
6768
6768
  const { startAgentServer } = await import('../runner/index.js');
6769
6769
  await startAgentServer({
6770
6770
  port: parseInt(opts.port, 10),
6771
+ // The CLI owns its process, so a dead stdout pipe is fatal here.
6772
+ // `SKAILE_SERVE_EXIT_ON_BROKEN_STDOUT=0` opts out — the `local` /
6773
+ // `nix` deploy targets set it for children meant to outlive them.
6774
+ exitOnBrokenPipe: process.env.SKAILE_SERVE_EXIT_ON_BROKEN_STDOUT !== "0",
6771
6775
  projectDir: opts.projectDir,
6772
6776
  driver: opts.driver,
6773
6777
  model: opts.model,
@@ -6779,12 +6783,12 @@ function makeServeCommand() {
6779
6783
  );
6780
6784
  }
6781
6785
  async function ensurePluginsLoadedForServe(projectDir) {
6782
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-VRQXNHFR.js');
6786
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-Y66CM6LO.js');
6783
6787
  try {
6784
6788
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
6785
6789
  const config = resolveSkWorkspaceConfig2(projectDir);
6786
6790
  if (!config.plugins || config.plugins.length === 0) return;
6787
- const { ensurePluginsLoaded } = await import('../plugin-store-OO5EZBYP.js');
6791
+ const { ensurePluginsLoaded } = await import('../plugin-store-JQAIKR3R.js');
6788
6792
  const { pluginRegistry } = await import('../plugin-registry/index.js');
6789
6793
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
6790
6794
  if (result.loaded.length > 0) {
@@ -6798,14 +6802,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
6798
6802
  }
6799
6803
  }
6800
6804
  async function runCompileTest(opts) {
6801
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-VRQXNHFR.js');
6805
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-Y66CM6LO.js');
6802
6806
  const { tmpdir } = await import('os');
6803
6807
  const { dirname: dirname4, join: join7, resolve: resolve5 } = await import('path');
6804
6808
  const { fileURLToPath: fileURLToPath2 } = await import('url');
6805
6809
  const { unlinkSync, existsSync: existsSync15 } = await import('fs');
6806
6810
  const { spawn } = await import('child_process');
6807
6811
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
6808
- const { MONOREPO_ROOT } = await import('../paths-AI7MDPNA.js');
6812
+ const { MONOREPO_ROOT } = await import('../paths-4APA2PKT.js');
6809
6813
  if (MONOREPO_ROOT === null) {
6810
6814
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
6811
6815
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -7680,7 +7684,7 @@ function makeStoreCommand() {
7680
7684
  process.exit(2);
7681
7685
  });
7682
7686
  store.command("search <query>").description("Search the AI Asset Store catalog by name, description, or publisher").option("--kind <kind>", "Filter by asset kind (skill, agent, prompt, flow, \u2026)").option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (query, opts) => {
7683
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-2BXBAC6Q.js');
7687
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-IO4TSO2H.js');
7684
7688
  try {
7685
7689
  const remote = await openCatalogSource2({ projectDir: path35__default.resolve(opts.projectDir) });
7686
7690
  const assets = await remote.listAssets(opts.kind ? { kind: opts.kind } : {});
@@ -7713,8 +7717,8 @@ function makeStoreCommand() {
7713
7717
  }
7714
7718
  });
7715
7719
  store.command("show <ref>").description("Show a store asset's details + provenance (source, files, integrity)").option("-C, --project-dir <dir>", "Project directory (catalog config overlay)", process.cwd()).action(async (ref, opts) => {
7716
- const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-2BXBAC6Q.js');
7717
- const { supportsInstallManifest } = await import('../project-2TYDMEZB.js');
7720
+ const { openCatalogSource: openCatalogSource2, LocalCatalogDisabledError } = await import('../open-library-IO4TSO2H.js');
7721
+ const { supportsInstallManifest } = await import('../project-OR524CQ3.js');
7718
7722
  try {
7719
7723
  const remote = await openCatalogSource2({ projectDir: path35__default.resolve(opts.projectDir) });
7720
7724
  const asset = await remote.resolve(ref);
@@ -8800,7 +8804,7 @@ async function bootstrapUserConfig() {
8800
8804
  }
8801
8805
  async function hydrateInitSources(resolved, created) {
8802
8806
  try {
8803
- const { ensureSourcesCloned } = await import('../ensure-sources-SFQT5GXY.js');
8807
+ const { ensureSourcesCloned } = await import('../ensure-sources-I2F6XBDJ.js');
8804
8808
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
8805
8809
  for (const n of hydrate.cloned) created.push(`~/.skaile/cache/sources/${n}/`);
8806
8810
  if (hydrate.failed.length > 0) {
@@ -8840,7 +8844,7 @@ function printInitSummary(resolved, projectDir, created) {
8840
8844
  console.log();
8841
8845
  }
8842
8846
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
8843
- const { cmdSetup } = await import('../setup-EH4TZFMN.js');
8847
+ const { cmdSetup } = await import('../setup-5OG442AZ.js');
8844
8848
  await cmdSetup([], { projectDir: process.cwd() });
8845
8849
  });
8846
8850
  program.addCommand(makeInstallCommand());