@nimbus-sh/core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +47 -26
  2. package/dist/_shared/byte-stream.d.ts +5 -4
  3. package/dist/_shared/byte-stream.d.ts.map +1 -1
  4. package/dist/_shared/cache-stats.d.ts +23 -1
  5. package/dist/_shared/cache-stats.d.ts.map +1 -1
  6. package/dist/_shared/cache-stats.js +13 -1
  7. package/dist/_shared/exports-resolver.d.ts +1 -1
  8. package/dist/_shared/exports-resolver.js +1 -1
  9. package/dist/_shared/real-node-imports.d.ts +7 -0
  10. package/dist/_shared/real-node-imports.d.ts.map +1 -1
  11. package/dist/_shared/real-node-imports.js +8 -0
  12. package/dist/_shared/retry.js +1 -1
  13. package/dist/_shared/tarball.d.ts +23 -5
  14. package/dist/_shared/tarball.d.ts.map +1 -1
  15. package/dist/_shared/tarball.js +38 -5
  16. package/dist/_shared/vfs-write-ledger.d.ts.map +1 -1
  17. package/dist/_shared/vfs-write-ledger.js +22 -16
  18. package/dist/constants.d.ts +5 -11
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +16 -56
  21. package/dist/runtime/assets-loader.js +1 -1
  22. package/dist/runtime/comment-strip.d.ts +0 -35
  23. package/dist/runtime/comment-strip.d.ts.map +1 -1
  24. package/dist/runtime/comment-strip.js +48 -20
  25. package/dist/runtime/esbuild-service.d.ts +38 -42
  26. package/dist/runtime/esbuild-service.d.ts.map +1 -1
  27. package/dist/runtime/esbuild-service.js +494 -197
  28. package/dist/runtime/javascript-ast.d.ts.map +1 -1
  29. package/dist/runtime/javascript-ast.js +45 -7
  30. package/dist/runtime/opentui-wasm-backend.d.ts.map +1 -1
  31. package/dist/runtime/opentui-wasm-backend.js +18 -16
  32. package/dist/runtime/port-registry.d.ts +4 -2
  33. package/dist/runtime/port-registry.d.ts.map +1 -1
  34. package/dist/runtime/port-registry.js +60 -8
  35. package/dist/runtime/virtual-socket-kernel.generated.d.ts +1 -1
  36. package/dist/runtime/virtual-socket-kernel.generated.js +1 -1
  37. package/dist/shell/stdin-adapter.d.ts +11 -0
  38. package/dist/shell/stdin-adapter.d.ts.map +1 -0
  39. package/dist/shell/stdin-adapter.js +59 -0
  40. package/dist/shell/unix-commands.d.ts +2 -1
  41. package/dist/shell/unix-commands.d.ts.map +1 -1
  42. package/dist/shell/unix-commands.js +1078 -50
  43. package/dist/substrate/lifo/commands/io/dd.js +1 -1
  44. package/dist/substrate/lifo/commands/net/curl.d.ts.map +1 -1
  45. package/dist/substrate/lifo/commands/net/curl.js +270 -54
  46. package/dist/substrate/lifo/commands/system/npm.d.ts +18 -1
  47. package/dist/substrate/lifo/commands/system/npm.d.ts.map +1 -1
  48. package/dist/substrate/lifo/commands/system/npm.js +26 -43
  49. package/dist/substrate/lifo/commands/text/head.d.ts.map +1 -1
  50. package/dist/substrate/lifo/commands/text/head.js +2 -1
  51. package/dist/substrate/lifo/commands/text/sed.d.ts.map +1 -1
  52. package/dist/substrate/lifo/commands/text/sed.js +499 -117
  53. package/dist/substrate/lifo/commands/types.d.ts +8 -4
  54. package/dist/substrate/lifo/commands/types.d.ts.map +1 -1
  55. package/dist/substrate/lifo/node-compat/zlib.d.ts +37 -18
  56. package/dist/substrate/lifo/node-compat/zlib.d.ts.map +1 -1
  57. package/dist/substrate/lifo/node-compat/zlib.js +122 -23
  58. package/dist/substrate/lifo/shell/interpreter.d.ts +9 -1
  59. package/dist/substrate/lifo/shell/interpreter.d.ts.map +1 -1
  60. package/dist/substrate/lifo/shell/interpreter.js +79 -29
  61. package/dist/substrate/lifo/shell/pipe.d.ts +16 -0
  62. package/dist/substrate/lifo/shell/pipe.d.ts.map +1 -1
  63. package/dist/substrate/lifo/shell/pipe.js +62 -18
  64. package/dist/substrate/lifo/shell/terminal-stdin.d.ts +20 -3
  65. package/dist/substrate/lifo/shell/terminal-stdin.d.ts.map +1 -1
  66. package/dist/substrate/lifo/shell/terminal-stdin.js +60 -24
  67. package/dist/vfs/seed-project.d.ts.map +1 -1
  68. package/dist/vfs/seed-project.js +1 -1
  69. package/dist/vfs/sqlite-vfs.d.ts +21 -30
  70. package/dist/vfs/sqlite-vfs.d.ts.map +1 -1
  71. package/dist/vfs/sqlite-vfs.js +113 -29
  72. package/dist/workspace/nimbus-workspace.d.ts +15 -0
  73. package/dist/workspace/nimbus-workspace.d.ts.map +1 -1
  74. package/dist/workspace/nimbus-workspace.js +20 -3
  75. package/dist/workspace/supervisor-op.d.ts +23 -0
  76. package/dist/workspace/supervisor-op.d.ts.map +1 -0
  77. package/dist/workspace/supervisor-op.js +92 -0
  78. package/package.json +3 -2
  79. package/src/_shared/byte-stream.ts +5 -4
  80. package/src/_shared/cache-stats.ts +27 -1
  81. package/src/_shared/exports-resolver.ts +1 -1
  82. package/src/_shared/real-node-imports.ts +8 -0
  83. package/src/_shared/retry.ts +1 -1
  84. package/src/_shared/tarball.ts +56 -5
  85. package/src/_shared/vfs-write-ledger.ts +22 -16
  86. package/src/constants.ts +30 -60
  87. package/src/runtime/assets-loader.ts +1 -1
  88. package/src/runtime/comment-strip.ts +42 -23
  89. package/src/runtime/esbuild-service.ts +566 -217
  90. package/src/runtime/javascript-ast.ts +40 -9
  91. package/src/runtime/opentui-wasm-backend.ts +19 -17
  92. package/src/runtime/port-registry.ts +66 -8
  93. package/src/runtime/virtual-socket-kernel.generated.ts +1 -1
  94. package/src/shell/stdin-adapter.ts +58 -0
  95. package/src/shell/unix-commands.ts +1054 -50
  96. package/src/substrate/lifo/commands/io/dd.ts +2 -2
  97. package/src/substrate/lifo/commands/net/curl.ts +310 -58
  98. package/src/substrate/lifo/commands/system/npm.ts +58 -38
  99. package/src/substrate/lifo/commands/text/head.ts +2 -1
  100. package/src/substrate/lifo/commands/text/sed.ts +519 -109
  101. package/src/substrate/lifo/commands/types.ts +8 -5
  102. package/src/substrate/lifo/node-compat/zlib.ts +155 -26
  103. package/src/substrate/lifo/shell/interpreter.ts +74 -27
  104. package/src/substrate/lifo/shell/pipe.ts +65 -24
  105. package/src/substrate/lifo/shell/terminal-stdin.ts +66 -30
  106. package/src/vfs/seed-project.ts +3 -3
  107. package/src/vfs/sqlite-vfs.ts +128 -64
  108. package/src/workspace/nimbus-workspace.ts +26 -2
  109. package/src/workspace/supervisor-op.ts +117 -0
  110. package/dist/_shared/install-phase.d.ts +0 -47
  111. package/dist/_shared/install-phase.d.ts.map +0 -1
  112. package/dist/_shared/install-phase.js +0 -1
  113. package/dist/_shared/rpc-dispose.d.ts +0 -4
  114. package/dist/_shared/rpc-dispose.d.ts.map +0 -1
  115. package/dist/_shared/rpc-dispose.js +0 -30
  116. package/dist/_shared/w7-frame.d.ts +0 -79
  117. package/dist/_shared/w7-frame.d.ts.map +0 -1
  118. package/dist/_shared/w7-frame.js +0 -840
  119. package/dist/_shared/weighted-credit-pool.d.ts +0 -61
  120. package/dist/_shared/weighted-credit-pool.d.ts.map +0 -1
  121. package/dist/_shared/weighted-credit-pool.js +0 -196
  122. package/dist/observability/diag-counters.d.ts +0 -236
  123. package/dist/observability/diag-counters.d.ts.map +0 -1
  124. package/dist/observability/diag-counters.js +0 -195
  125. package/dist/observability/heap-estimate.d.ts +0 -225
  126. package/dist/observability/heap-estimate.d.ts.map +0 -1
  127. package/dist/observability/heap-estimate.js +0 -185
  128. package/dist/observability/heavy-alloc-coord.d.ts +0 -93
  129. package/dist/observability/heavy-alloc-coord.d.ts.map +0 -1
  130. package/dist/observability/heavy-alloc-coord.js +0 -181
  131. package/dist/observability/oom-classify.d.ts +0 -138
  132. package/dist/observability/oom-classify.d.ts.map +0 -1
  133. package/dist/observability/oom-classify.js +0 -268
  134. package/dist/observability/oom-discriminator.d.ts +0 -176
  135. package/dist/observability/oom-discriminator.d.ts.map +0 -1
  136. package/dist/observability/oom-discriminator.js +0 -272
  137. package/src/_shared/install-phase.ts +0 -56
  138. package/src/_shared/rpc-dispose.ts +0 -31
  139. package/src/_shared/w7-frame.ts +0 -1013
  140. package/src/_shared/weighted-credit-pool.ts +0 -244
  141. package/src/observability/diag-counters.ts +0 -343
  142. package/src/observability/heap-estimate.ts +0 -331
  143. package/src/observability/heavy-alloc-coord.ts +0 -241
  144. package/src/observability/oom-classify.ts +0 -260
  145. package/src/observability/oom-discriminator.ts +0 -405
@@ -3,9 +3,8 @@ import type { VfsCred } from '../../../runtime/os-contracts.js';
3
3
  export interface CommandOutputStream {
4
4
  write(text: string): void;
5
5
  /**
6
- * Present on sinks that store bytes verbatim (files, `/dev/null`). Textual
7
- * sinks — the terminal, shell pipes omit it and take decoded text, since
8
- * they have no way to carry a byte that is not text.
6
+ * Present on sinks that store bytes verbatim files, `/dev/null`, and
7
+ * byte-capable shell pipes. Sinks without it take decoded text instead.
9
8
  */
10
9
  writeBytes?(bytes: Uint8Array): void;
11
10
  /**
@@ -20,7 +19,12 @@ export interface CommandInputStream {
20
19
  read(): Promise<string | null>;
21
20
  readAll(): Promise<string>;
22
21
  readLine?(): Promise<string | null>;
23
- readBytes?(maxLength: number): Promise<string | null>;
22
+ /**
23
+ * Bounded raw-byte read. Byte-capable sources (shell pipes, dumps) return
24
+ * the original bytes; text-only sources encode what they hold. Null means
25
+ * EOF with nothing returned.
26
+ */
27
+ readBytes?(maxLength: number): Promise<Uint8Array | null>;
24
28
  }
25
29
  export interface TerminalInputStream extends CommandInputStream {
26
30
  rawMode: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,UAAU,CAAC,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpC,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/commands/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,UAAU,CAAC,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACrC;;;;;OAKG;IACH,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpC;;;;OAIG;IACH,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC3D;AACD,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,MAAM,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC"}
@@ -1,16 +1,32 @@
1
1
  import { Buffer } from './buffer.js';
2
2
  type ZlibCallback = (err: Error | null, result?: Buffer) => void;
3
- export declare const gzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
4
- export declare const gunzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
5
- export declare const deflate: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
6
- export declare const inflate: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
7
- export declare const deflateRaw: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
8
- export declare const inflateRaw: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
9
- export declare const unzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
10
- export declare function gzipSync(): never;
11
- export declare function gunzipSync(): never;
12
- export declare function deflateSync(): never;
13
- export declare function inflateSync(): never;
3
+ /**
4
+ * Node's async surface: the callback is required, with options optional in
5
+ * front of it. There is no promise return to fall back on.
6
+ */
7
+ interface ZlibAsync {
8
+ (data: ZlibInput, callback: ZlibCallback): void;
9
+ (data: ZlibInput, options: object, callback: ZlibCallback): void;
10
+ }
11
+ /**
12
+ * Everything a zlib entry point accepts: strings encode to UTF-8;
13
+ * ArrayBuffers and every ArrayBufferView carry their own bytes.
14
+ */
15
+ type ZlibInput = string | ArrayBufferView | ArrayBuffer;
16
+ export declare const gzip: ZlibAsync;
17
+ export declare const gunzip: ZlibAsync;
18
+ export declare const deflate: ZlibAsync;
19
+ export declare const inflate: ZlibAsync;
20
+ export declare const deflateRaw: ZlibAsync;
21
+ export declare const inflateRaw: ZlibAsync;
22
+ export declare const unzip: ZlibAsync;
23
+ export declare function gzipSync(buffer?: ZlibInput, options?: object): never;
24
+ export declare function gunzipSync(buffer?: ZlibInput, options?: object): never;
25
+ export declare function deflateSync(buffer?: ZlibInput, options?: object): never;
26
+ export declare function inflateSync(buffer?: ZlibInput, options?: object): never;
27
+ export declare function deflateRawSync(buffer?: ZlibInput, options?: object): never;
28
+ export declare function inflateRawSync(buffer?: ZlibInput, options?: object): never;
29
+ export declare function unzipSync(buffer?: ZlibInput, options?: object): never;
14
30
  export declare const constants: {
15
31
  Z_NO_FLUSH: number;
16
32
  Z_PARTIAL_FLUSH: number;
@@ -31,17 +47,20 @@ export declare const constants: {
31
47
  Z_DEFAULT_COMPRESSION: number;
32
48
  };
33
49
  declare const _default: {
34
- gzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
35
- gunzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
36
- deflate: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
37
- inflate: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
38
- deflateRaw: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
39
- inflateRaw: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
40
- unzip: (data: Uint8Array | string, optionsOrCb: unknown, cb?: ZlibCallback) => void;
50
+ gzip: ZlibAsync;
51
+ gunzip: ZlibAsync;
52
+ deflate: ZlibAsync;
53
+ inflate: ZlibAsync;
54
+ deflateRaw: ZlibAsync;
55
+ inflateRaw: ZlibAsync;
56
+ unzip: ZlibAsync;
41
57
  gzipSync: typeof gzipSync;
42
58
  gunzipSync: typeof gunzipSync;
43
59
  deflateSync: typeof deflateSync;
44
60
  inflateSync: typeof inflateSync;
61
+ deflateRawSync: typeof deflateRawSync;
62
+ inflateRawSync: typeof inflateRawSync;
63
+ unzipSync: typeof unzipSync;
45
64
  constants: {
46
65
  Z_NO_FLUSH: number;
47
66
  Z_PARTIAL_FLUSH: number;
@@ -1 +1 @@
1
- {"version":3,"file":"zlib.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/node-compat/zlib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AA8CjE,eAAO,MAAM,IAAI,SAVQ,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAUvC,CAAC;AAClD,eAAO,MAAM,MAAM,SAXM,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAWnC,CAAC;AACtD,eAAO,MAAM,OAAO,SAZK,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAYjC,CAAC;AACxD,eAAO,MAAM,OAAO,SAbK,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAa/B,CAAC;AAC1D,eAAO,MAAM,UAAU,SAdE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAc1B,CAAC;AAC/D,eAAO,MAAM,UAAU,SAfE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAexB,CAAC;AACjE,eAAO,MAAM,KAAK,SAhBO,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAgBpC,CAAC;AAGrD,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AACD,wBAAgB,UAAU,IAAI,KAAK,CAElC;AACD,wBAAgB,WAAW,IAAI,KAAK,CAEnC;AACD,wBAAgB,WAAW,IAAI,KAAK,CAEnC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CAkBrB,CAAC;;iBAlDuB,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;mBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;oBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;oBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;uBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;uBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;kBAAnE,UAAU,GAAG,MAAM,eAAe,OAAO,OAAO,YAAY,KAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;AAoD5F,wBAGE"}
1
+ {"version":3,"file":"zlib.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/node-compat/zlib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;AAEjE;;;GAGG;AACH,UAAU,SAAS;IACjB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAClE;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,eAAe,GAAG,WAAW,CAAC;AA0IxD,eAAO,MAAM,IAAI,WAAgC,CAAC;AAClD,eAAO,MAAM,MAAM,WAAkC,CAAC;AACtD,eAAO,MAAM,OAAO,WAAmC,CAAC;AACxD,eAAO,MAAM,OAAO,WAAqC,CAAC;AAC1D,eAAO,MAAM,UAAU,WAAuC,CAAC;AAC/D,eAAO,MAAM,UAAU,WAAyC,CAAC;AACjE,eAAO,MAAM,KAAK,WAAgF,CAAC;AAcnG,wBAAgB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEpE;AACD,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEtE;AACD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEvE;AACD,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAEvE;AACD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAE1E;AACD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAE1E;AACD,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAErE;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;CAkBrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,wBAKE"}
@@ -1,18 +1,90 @@
1
1
  import { Buffer } from './buffer.js';
2
+ /**
3
+ * One funnel for every entry point. The result views the caller's exact
4
+ * byte region — byteOffset and byteLength preserved, element values never
5
+ * reinterpreted — so sniffing and the codec see identical bytes for a
6
+ * Uint8Array, a Uint16Array, an offset DataView, or a bare ArrayBuffer.
7
+ */
8
+ function toBytes(data) {
9
+ if (typeof data === 'string')
10
+ return new TextEncoder().encode(data);
11
+ if (data instanceof Uint8Array)
12
+ return data;
13
+ if (ArrayBuffer.isView(data)) {
14
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
15
+ }
16
+ return new Uint8Array(data);
17
+ }
18
+ /**
19
+ * Node splits decompression failures two ways, and the engine's own failure
20
+ * is the only thing that can tell them apart: an input that ran out is
21
+ * Z_BUF_ERROR / errno -5, while everything else — bad header, bad block, and
22
+ * a checksum or length trailer that can only fail once the member is
23
+ * complete — is Z_DATA_ERROR / errno -3 carrying the engine's message. Which
24
+ * side of a write or a close the failure lands on says nothing about that,
25
+ * so it is not consulted.
26
+ */
27
+ function isUnexpectedEnd(cause) {
28
+ const message = cause instanceof Error && typeof cause.message === 'string' ? cause.message : String(cause);
29
+ return /unexpected end|end of (?:file|input|stream)|premature|truncated|\bEOF\b/i.test(message);
30
+ }
31
+ function zDataError(cause) {
32
+ const message = cause instanceof Error && cause.message ? cause.message : String(cause);
33
+ return Object.assign(new Error(message), { code: 'Z_DATA_ERROR', errno: -3, cause });
34
+ }
35
+ function zBufError(cause) {
36
+ return Object.assign(new Error('unexpected end of file'), {
37
+ code: 'Z_BUF_ERROR',
38
+ errno: -5,
39
+ cause,
40
+ });
41
+ }
42
+ /**
43
+ * Node throws this synchronously rather than deferring a callback that does
44
+ * not exist.
45
+ */
46
+ function invalidCallback(value) {
47
+ const received = value === undefined ? 'undefined'
48
+ : value === null ? 'null'
49
+ : typeof value === 'object' ? `an instance of ${value.constructor?.name ?? 'Object'}`
50
+ : `type ${typeof value} (${String(value)})`;
51
+ return Object.assign(new TypeError(`The "callback" argument must be of type function. Received ${received}`), { code: 'ERR_INVALID_ARG_TYPE' });
52
+ }
2
53
  async function processStream(data, format, type) {
3
54
  const stream = type === 'compress'
4
55
  ? new CompressionStream(format)
5
56
  : new DecompressionStream(format);
6
57
  const writer = stream.writable.getWriter();
7
- writer.write(data);
8
- writer.close();
9
58
  const reader = stream.readable.getReader();
10
59
  const chunks = [];
11
- for (;;) {
12
- const { done, value } = await reader.read();
13
- if (done)
14
- break;
15
- chunks.push(value);
60
+ // Feeding and draining run together: a single write large enough to fill
61
+ // the codec's output queue only completes while somebody reads. Both sides
62
+ // are contained so neither rejection surfaces unhandled, and the first
63
+ // failure is the one reported.
64
+ const failures = [];
65
+ const record = (reason) => {
66
+ if (failures.length === 0)
67
+ failures.push(reason);
68
+ };
69
+ const drain = (async () => {
70
+ for (;;) {
71
+ const { done, value } = await reader.read();
72
+ if (done)
73
+ return;
74
+ chunks.push(value);
75
+ }
76
+ })().catch(record);
77
+ const feed = (async () => {
78
+ await writer.write(data);
79
+ await writer.close();
80
+ })().catch(record);
81
+ await Promise.all([drain, feed]);
82
+ if (failures.length > 0) {
83
+ const reason = failures[0];
84
+ if (type === 'decompress') {
85
+ throw isUnexpectedEnd(reason) ? zBufError(reason) : zDataError(reason);
86
+ }
87
+ throw reason instanceof Error ? reason : new Error(String(reason));
16
88
  }
17
89
  let totalLength = 0;
18
90
  for (const c of chunks)
@@ -25,14 +97,22 @@ async function processStream(data, format, type) {
25
97
  }
26
98
  return result;
27
99
  }
100
+ /**
101
+ * Node's Unzip sniffs the wrapper itself: the gzip magic bytes mean gunzip,
102
+ * anything else is treated as zlib-wrapped deflate.
103
+ */
104
+ function looksLikeGzip(data) {
105
+ return data.length >= 2 && data[0] === 0x1f && data[1] === 0x8b;
106
+ }
28
107
  function wrapAsync(format, type) {
29
108
  return function (data, optionsOrCb, cb) {
30
109
  const callback = typeof optionsOrCb === 'function' ? optionsOrCb : cb;
31
- const input = typeof data === 'string' ? new TextEncoder().encode(data) : data;
32
- const raw = input instanceof Buffer ? new Uint8Array(input) : input;
33
- processStream(raw, format, type)
34
- .then((result) => callback(null, result))
35
- .catch((err) => callback(err instanceof Error ? err : new Error(String(err))));
110
+ if (typeof callback !== 'function')
111
+ throw invalidCallback(callback);
112
+ const bytes = toBytes(data);
113
+ // Two arms, not .then().catch(): a callback that throws on success must
114
+ // not be handed its own exception as a second, failed invocation.
115
+ processStream(bytes, typeof format === 'function' ? format(bytes) : format, type).then((result) => callback(null, result), (err) => callback(err instanceof Error ? err : new Error(String(err))));
36
116
  };
37
117
  }
38
118
  export const gzip = wrapAsync('gzip', 'compress');
@@ -41,19 +121,36 @@ export const deflate = wrapAsync('deflate', 'compress');
41
121
  export const inflate = wrapAsync('deflate', 'decompress');
42
122
  export const deflateRaw = wrapAsync('deflate-raw', 'compress');
43
123
  export const inflateRaw = wrapAsync('deflate-raw', 'decompress');
44
- export const unzip = wrapAsync('gzip', 'decompress');
45
- // Sync variants are not supported in the browser
46
- export function gzipSync() {
47
- throw new Error('zlib sync operations are not supported in Lifo');
124
+ export const unzip = wrapAsync((data) => (looksLikeGzip(data) ? 'gzip' : 'deflate'), 'decompress');
125
+ /**
126
+ * The Sync surface needs a synchronous compress primitive; browser-class
127
+ * runtimes only offer the async CompressionStream. Each Sync name refuses
128
+ * with the working async replacement spelled out instead of failing as a
129
+ * missing export or a vague "not supported".
130
+ */
131
+ function syncUnavailable(name, asyncName) {
132
+ throw Object.assign(new Error(`zlib.${name}: synchronous compression is not available on this runtime. Use the async zlib.${asyncName}(data, callback) form instead.`), { code: 'ERR_ZLIB_SYNC_UNAVAILABLE' });
133
+ }
134
+ export function gzipSync(buffer, options) {
135
+ syncUnavailable('gzipSync', 'gzip');
136
+ }
137
+ export function gunzipSync(buffer, options) {
138
+ syncUnavailable('gunzipSync', 'gunzip');
139
+ }
140
+ export function deflateSync(buffer, options) {
141
+ syncUnavailable('deflateSync', 'deflate');
142
+ }
143
+ export function inflateSync(buffer, options) {
144
+ syncUnavailable('inflateSync', 'inflate');
48
145
  }
49
- export function gunzipSync() {
50
- throw new Error('zlib sync operations are not supported in Lifo');
146
+ export function deflateRawSync(buffer, options) {
147
+ syncUnavailable('deflateRawSync', 'deflateRaw');
51
148
  }
52
- export function deflateSync() {
53
- throw new Error('zlib sync operations are not supported in Lifo');
149
+ export function inflateRawSync(buffer, options) {
150
+ syncUnavailable('inflateRawSync', 'inflateRaw');
54
151
  }
55
- export function inflateSync() {
56
- throw new Error('zlib sync operations are not supported in Lifo');
152
+ export function unzipSync(buffer, options) {
153
+ syncUnavailable('unzipSync', 'unzip');
57
154
  }
58
155
  export const constants = {
59
156
  Z_NO_FLUSH: 0,
@@ -76,5 +173,7 @@ export const constants = {
76
173
  };
77
174
  export default {
78
175
  gzip, gunzip, deflate, inflate, deflateRaw, inflateRaw, unzip,
79
- gzipSync, gunzipSync, deflateSync, inflateSync, constants,
176
+ gzipSync, gunzipSync, deflateSync, inflateSync,
177
+ deflateRawSync, inflateRawSync, unzipSync,
178
+ constants,
80
179
  };
@@ -241,8 +241,16 @@ export declare class Interpreter {
241
241
  */
242
242
  private withFdFlush;
243
243
  private flushFds;
244
+ /**
245
+ * Byte-faithful redirected input: bounded range reads keep >64 KiB
246
+ * redirections intact and preserve bytes that are not valid UTF-8, while
247
+ * the text view still decodes progressively across chunk boundaries.
248
+ *
249
+ * Only a zero-length range means EOF. Devices and some mounts answer with
250
+ * fewer bytes than asked whenever their internal bound is hit; those short
251
+ * nonempty reads advance the offset and continue, exactly like read(2).
252
+ */
244
253
  private createFileReader;
245
- private createStringReader;
246
254
  private resolveOutputFd;
247
255
  private resolveInputFd;
248
256
  private parseFdTarget;
@@ -1 +1 @@
1
- {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/shell/interpreter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interpreter.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/shell/interpreter.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import { exitCodeForAbortSignal } from './signals.js';
7
7
  import { resolve } from '../utils/path.js';
8
8
  import { encode } from '../utils/encoding.js';
9
9
  import { globMatch } from '../utils/glob.js';
10
+ import { staticStdinReader } from '../../../shell/stdin-adapter.js';
10
11
  /**
11
12
  * Bytes a file-backed descriptor holds before committing. Matches the stream
12
13
  * chunk size used elsewhere and keeps a line-at-a-time producer from paying a
@@ -1136,7 +1137,7 @@ export class Interpreter {
1136
1137
  const body = heredoc.quoted
1137
1138
  ? heredoc.body
1138
1139
  : await expandWord([{ text: heredoc.body, quoted: 'double' }], expandCtx);
1139
- this.setInputFd(fds, redir.fd ?? 0, { stream: this.createStringReader(body), terminal: false });
1140
+ this.setInputFd(fds, redir.fd ?? 0, { stream: staticStdinReader(body), terminal: false });
1140
1141
  continue;
1141
1142
  }
1142
1143
  const target = await expandWord(redir.target, expandCtx);
@@ -1275,11 +1276,17 @@ export class Interpreter {
1275
1276
  }
1276
1277
  if (target === '/dev/stdin')
1277
1278
  return this.resolveInputFd('0', fds.inputFds, fds.terminalInputFds);
1279
+ const targetPath = resolve(this.config.getCwd(), target);
1280
+ const vfs = io.vfs ?? this.config.vfs;
1278
1281
  try {
1279
- return {
1280
- stream: this.createFileReader(io.vfs ?? this.config.vfs, resolve(this.config.getCwd(), target)),
1281
- terminal: false,
1282
- };
1282
+ // Open-authorize before the command runs, the way open(2) would: a
1283
+ // missing, unreadable, or directory target fails the redirection even
1284
+ // when the command never reads a byte.
1285
+ if (vfs.stat(targetPath).type === 'directory') {
1286
+ throw Object.assign(new Error(`EISDIR: ${targetPath}`), { code: 'EISDIR' });
1287
+ }
1288
+ vfs.access(targetPath, 0o4);
1289
+ return { stream: this.createFileReader(vfs, targetPath), terminal: false };
1283
1290
  }
1284
1291
  catch (error) {
1285
1292
  throw new RedirectionOpenError(target, error);
@@ -1347,39 +1354,82 @@ export class Interpreter {
1347
1354
  for (const stream of fds.outputFds.values())
1348
1355
  stream.flush?.();
1349
1356
  }
1357
+ /**
1358
+ * Byte-faithful redirected input: bounded range reads keep >64 KiB
1359
+ * redirections intact and preserve bytes that are not valid UTF-8, while
1360
+ * the text view still decodes progressively across chunk boundaries.
1361
+ *
1362
+ * Only a zero-length range means EOF. Devices and some mounts answer with
1363
+ * fewer bytes than asked whenever their internal bound is hit; those short
1364
+ * nonempty reads advance the offset and continue, exactly like read(2).
1365
+ */
1350
1366
  createFileReader(vfs, path) {
1351
- const content = vfs.readFileString(path);
1352
- return this.createStringReader(content);
1353
- }
1354
- createStringReader(content) {
1367
+ const decoder = new TextDecoder('utf-8');
1355
1368
  let offset = 0;
1369
+ let eof = false;
1370
+ const pull = (max) => {
1371
+ if (eof)
1372
+ return null;
1373
+ const chunk = vfs.readRange(path, offset, max);
1374
+ if (chunk.length === 0) {
1375
+ eof = true;
1376
+ return null;
1377
+ }
1378
+ offset += chunk.length;
1379
+ return chunk;
1380
+ };
1356
1381
  return {
1382
+ readBytes: async (maxLength) => {
1383
+ if (maxLength <= 0)
1384
+ return new Uint8Array(0);
1385
+ return pull(maxLength);
1386
+ },
1357
1387
  read: async () => {
1358
- if (offset >= content.length)
1359
- return null;
1360
- const chunk = content.slice(offset);
1361
- offset = content.length;
1362
- return chunk;
1388
+ while (true) {
1389
+ const bytes = pull(65536);
1390
+ if (bytes === null) {
1391
+ const tail = decoder.decode();
1392
+ return tail.length > 0 ? tail : null;
1393
+ }
1394
+ const text = decoder.decode(bytes, { stream: true });
1395
+ if (text.length > 0)
1396
+ return text;
1397
+ }
1363
1398
  },
1364
1399
  readAll: async () => {
1365
- if (offset >= content.length)
1366
- return '';
1367
- const chunk = content.slice(offset);
1368
- offset = content.length;
1369
- return chunk;
1400
+ let out = '';
1401
+ while (true) {
1402
+ const bytes = pull(65536);
1403
+ if (bytes === null)
1404
+ break;
1405
+ out += decoder.decode(bytes, { stream: true });
1406
+ }
1407
+ out += decoder.decode();
1408
+ return out;
1370
1409
  },
1371
1410
  readLine: async () => {
1372
- if (offset >= content.length)
1373
- return null;
1374
- const newline = content.indexOf('\n', offset);
1375
- if (newline < 0) {
1376
- const line = content.slice(offset);
1377
- offset = content.length;
1378
- return line;
1411
+ let line = '';
1412
+ let sawAny = false;
1413
+ while (true) {
1414
+ const bytes = pull(65536);
1415
+ if (bytes === null)
1416
+ break;
1417
+ sawAny = true;
1418
+ // Split on the raw 0x0A byte so pushback returns ORIGINAL bytes;
1419
+ // decoded-text pushback would corrupt multibyte sequences that
1420
+ // straddle the chunk boundary or mis-measure invalid UTF-8.
1421
+ const newline = bytes.indexOf(0x0a);
1422
+ if (newline >= 0) {
1423
+ offset -= bytes.length - (newline + 1);
1424
+ eof = false;
1425
+ line += decoder.decode(bytes.subarray(0, newline), { stream: true });
1426
+ const flushed = decoder.decode();
1427
+ return line + flushed;
1428
+ }
1429
+ line += decoder.decode(bytes, { stream: true });
1379
1430
  }
1380
- const line = content.slice(offset, newline);
1381
- offset = newline + 1;
1382
- return line;
1431
+ line += decoder.decode();
1432
+ return sawAny || line.length > 0 ? line : null;
1383
1433
  },
1384
1434
  };
1385
1435
  }
@@ -1,13 +1,29 @@
1
1
  import type { CommandOutputStream, CommandInputStream } from '../commands/types.js';
2
+ /**
3
+ * A shell pipe that carries the producer's exact bytes. Text writes are
4
+ * encoded once at the write side, `writeBytes` stores bytes verbatim, and
5
+ * the text view (`read`/`readAll`/`readLine`) decodes progressively so a
6
+ * multi-byte UTF-8 sequence split across chunks survives intact.
7
+ */
2
8
  export declare class PipeChannel {
3
9
  private buffer;
4
10
  private closed;
5
11
  private waiting;
12
+ private decoder;
6
13
  readonly writer: CommandOutputStream;
7
14
  readonly reader: CommandInputStream;
15
+ /** Next queued chunk, a waiter's delivery, or null once closed and empty. */
16
+ private pull;
8
17
  private read;
9
18
  private readAll;
10
19
  private readLine;
20
+ /**
21
+ * Bounded byte read: returns whatever the producer has already delivered,
22
+ * capped at maxLength. maxLength bounds the result, it is never a fill
23
+ * target — waiting to complete it would stall every consumer downstream of
24
+ * a live open producer. A larger chunk keeps only its first maxLength
25
+ * bytes; the remainder stays queued in original order.
26
+ */
11
27
  private readBytes;
12
28
  close(): void;
13
29
  private deliver;
@@ -1 +1 @@
1
- {"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/shell/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA6C;IAE5D,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAKlC;IAEF,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAKjC;IAEF,OAAO,CAAC,IAAI;YAYE,OAAO;YAUP,QAAQ;YAiBR,SAAS;IAWvB,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,OAAO;CAYhB"}
1
+ {"version":3,"file":"pipe.d.ts","sourceRoot":"","sources":["../../../../src/substrate/lifo/shell/pipe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGpF;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiD;IAChE,OAAO,CAAC,OAAO,CAA4B;IAE3C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CASlC;IAEF,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAKjC;IAEF,6EAA6E;IAC7E,OAAO,CAAC,IAAI;YAYE,IAAI;YAYJ,OAAO;YAUP,QAAQ;IA0BtB;;;;;;OAMG;YACW,SAAS;IAUvB,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,OAAO;CAahB"}