silvery 0.17.0 → 0.17.2

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 (171) hide show
  1. package/dist/UPNG-AVSMjiFE.mjs +5076 -0
  2. package/dist/UPNG-AVSMjiFE.mjs.map +1 -0
  3. package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs +6 -0
  4. package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs.map +1 -0
  5. package/dist/animation-C_PTO0uH.mjs +304 -0
  6. package/dist/animation-C_PTO0uH.mjs.map +1 -0
  7. package/dist/ansi-CXLE_pt1.mjs +71 -0
  8. package/dist/ansi-CXLE_pt1.mjs.map +1 -0
  9. package/dist/ansi-zmNzgkPB.d.mts +49 -0
  10. package/dist/ansi-zmNzgkPB.d.mts.map +1 -0
  11. package/dist/apng-DCWY913R.mjs +3 -0
  12. package/dist/apng-ENBAJk-H.mjs +70 -0
  13. package/dist/apng-ENBAJk-H.mjs.map +1 -0
  14. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  15. package/dist/backend-CkIkIHR-.mjs +13396 -0
  16. package/dist/backend-CkIkIHR-.mjs.map +1 -0
  17. package/dist/backends-CkvbG3js.mjs +1181 -0
  18. package/dist/backends-CkvbG3js.mjs.map +1 -0
  19. package/dist/backends-CyJqNLeK.mjs +3 -0
  20. package/dist/chunk-BSw8zbkd.mjs +37 -0
  21. package/dist/cli-B-k7Bm56.mjs +4 -0
  22. package/dist/context-QreF3UHr.mjs +64 -0
  23. package/dist/context-QreF3UHr.mjs.map +1 -0
  24. package/dist/derive-D7bFJdfU.d.mts +28 -0
  25. package/dist/derive-D7bFJdfU.d.mts.map +1 -0
  26. package/dist/devtools-CscuKaDK.mjs +89 -0
  27. package/dist/devtools-CscuKaDK.mjs.map +1 -0
  28. package/dist/devtools-D4oGc6LY.mjs +2 -0
  29. package/dist/eta-DLiVPaSD.mjs +110 -0
  30. package/dist/eta-DLiVPaSD.mjs.map +1 -0
  31. package/dist/flexily-zero-adapter-DmG4Ge8t.mjs +3376 -0
  32. package/dist/flexily-zero-adapter-DmG4Ge8t.mjs.map +1 -0
  33. package/dist/flexily-zero-adapter-GHwEW11s.mjs +2 -0
  34. package/dist/gif-BaJNREpP.mjs +3 -0
  35. package/dist/gif-Bp6fIyN3.mjs +73 -0
  36. package/dist/gif-Bp6fIyN3.mjs.map +1 -0
  37. package/dist/gifenc-GiVCZ9-3.mjs +730 -0
  38. package/dist/gifenc-GiVCZ9-3.mjs.map +1 -0
  39. package/dist/image-Dx7gYjkq.mjs +346 -0
  40. package/dist/image-Dx7gYjkq.mjs.map +1 -0
  41. package/dist/index-CBcSpGSM.d.mts +3416 -0
  42. package/dist/index-CBcSpGSM.d.mts.map +1 -0
  43. package/dist/index-DCVL3jHo.d.mts +634 -0
  44. package/dist/index-DCVL3jHo.d.mts.map +1 -0
  45. package/dist/index-p-wBs_wH.d.mts +175 -0
  46. package/dist/index-p-wBs_wH.d.mts.map +1 -0
  47. package/dist/index.d.mts +7296 -0
  48. package/dist/index.d.mts.map +1 -0
  49. package/dist/index.mjs +9399 -0
  50. package/dist/index.mjs.map +1 -0
  51. package/dist/key-mapping-BsUHe_nk.mjs +3 -0
  52. package/dist/key-mapping-DsyfLEdC.mjs +132 -0
  53. package/dist/key-mapping-DsyfLEdC.mjs.map +1 -0
  54. package/dist/layout-engine-B3dsnVLU.mjs +50 -0
  55. package/dist/layout-engine-B3dsnVLU.mjs.map +1 -0
  56. package/dist/layout-engine-D_lSR4i9.mjs +2 -0
  57. package/dist/multi-progress-C0-rkn86.d.mts +180 -0
  58. package/dist/multi-progress-C0-rkn86.d.mts.map +1 -0
  59. package/dist/multi-progress-CQVB9lES.mjs +219 -0
  60. package/dist/multi-progress-CQVB9lES.mjs.map +1 -0
  61. package/dist/node-Dedx-6xF.mjs +1085 -0
  62. package/dist/node-Dedx-6xF.mjs.map +1 -0
  63. package/dist/pipeline-DDOPrjuY.mjs +4387 -0
  64. package/dist/pipeline-DDOPrjuY.mjs.map +1 -0
  65. package/dist/progress-bar-COPSBlT9.mjs +155 -0
  66. package/dist/progress-bar-COPSBlT9.mjs.map +1 -0
  67. package/dist/reconciler-2lp5VXK7.mjs +16506 -0
  68. package/dist/reconciler-2lp5VXK7.mjs.map +1 -0
  69. package/dist/render-string-BXvxTg5P.mjs +201 -0
  70. package/dist/render-string-BXvxTg5P.mjs.map +1 -0
  71. package/dist/render-string-hvfpVtoP.mjs +2 -0
  72. package/dist/resvg-js-V6oMi8CY.mjs +203 -0
  73. package/dist/resvg-js-V6oMi8CY.mjs.map +1 -0
  74. package/dist/runtime-BjDHNTxJ.mjs +8723 -0
  75. package/dist/runtime-BjDHNTxJ.mjs.map +1 -0
  76. package/dist/runtime.d.mts +2 -0
  77. package/dist/runtime.mjs +3 -0
  78. package/dist/spinner-Cgej6Vnb.d.mts +127 -0
  79. package/dist/spinner-Cgej6Vnb.d.mts.map +1 -0
  80. package/dist/spinner-DSByknyx.mjs +298 -0
  81. package/dist/spinner-DSByknyx.mjs.map +1 -0
  82. package/dist/src-9B5k0JmY.mjs +1629 -0
  83. package/dist/src-9B5k0JmY.mjs.map +1 -0
  84. package/dist/src-C9f3hiVG.mjs +3620 -0
  85. package/dist/src-C9f3hiVG.mjs.map +1 -0
  86. package/dist/src-fJVbhdn-.mjs +816 -0
  87. package/dist/src-fJVbhdn-.mjs.map +1 -0
  88. package/dist/theme.d.mts +115 -0
  89. package/dist/theme.d.mts.map +1 -0
  90. package/dist/theme.mjs +8 -0
  91. package/dist/theme.mjs.map +1 -0
  92. package/dist/types-Bhj5QkIQ.mjs +13 -0
  93. package/dist/types-Bhj5QkIQ.mjs.map +1 -0
  94. package/dist/types-CDgkE-Rw.d.mts +241 -0
  95. package/dist/types-CDgkE-Rw.d.mts.map +1 -0
  96. package/dist/ui/animation.d.mts +2 -0
  97. package/dist/ui/animation.mjs +2 -0
  98. package/dist/ui/ansi.d.mts +2 -0
  99. package/dist/ui/ansi.mjs +2 -0
  100. package/dist/ui/cli.d.mts +5 -0
  101. package/dist/ui/cli.mjs +7 -0
  102. package/dist/ui/display.d.mts +35 -0
  103. package/dist/ui/display.d.mts.map +1 -0
  104. package/dist/ui/display.mjs +123 -0
  105. package/dist/ui/display.mjs.map +1 -0
  106. package/dist/ui/image.d.mts +2 -0
  107. package/dist/ui/image.mjs +2 -0
  108. package/dist/ui/input.d.mts +184 -0
  109. package/dist/ui/input.d.mts.map +1 -0
  110. package/dist/ui/input.mjs +285 -0
  111. package/dist/ui/input.mjs.map +1 -0
  112. package/dist/ui/progress.d.mts +249 -0
  113. package/dist/ui/progress.d.mts.map +1 -0
  114. package/dist/ui/progress.mjs +858 -0
  115. package/dist/ui/progress.mjs.map +1 -0
  116. package/dist/ui/react.d.mts +280 -0
  117. package/dist/ui/react.d.mts.map +1 -0
  118. package/dist/ui/react.mjs +413 -0
  119. package/dist/ui/react.mjs.map +1 -0
  120. package/dist/ui/utils.d.mts +86 -0
  121. package/dist/ui/utils.d.mts.map +1 -0
  122. package/dist/ui/utils.mjs +2 -0
  123. package/dist/ui/wrappers.d.mts +3 -0
  124. package/dist/ui/wrappers.mjs +2 -0
  125. package/dist/ui.d.mts +6 -0
  126. package/dist/ui.mjs +7 -0
  127. package/dist/useLatest-BMIYXd6e.d.mts +154 -0
  128. package/dist/useLatest-BMIYXd6e.d.mts.map +1 -0
  129. package/dist/useLayout-BG2cGl15.mjs +139 -0
  130. package/dist/useLayout-BG2cGl15.mjs.map +1 -0
  131. package/dist/with-text-input-CmHf_9d6.d.mts +284 -0
  132. package/dist/with-text-input-CmHf_9d6.d.mts.map +1 -0
  133. package/dist/wrapper-Dqh0zi2W.mjs +3527 -0
  134. package/dist/wrapper-Dqh0zi2W.mjs.map +1 -0
  135. package/dist/wrappers-hhL8EQ_n.mjs +810 -0
  136. package/dist/wrappers-hhL8EQ_n.mjs.map +1 -0
  137. package/dist/yoga-adapter-BJ9SOhTY.mjs +245 -0
  138. package/dist/yoga-adapter-BJ9SOhTY.mjs.map +1 -0
  139. package/dist/yoga-adapter-Daq6-dw1.mjs +2 -0
  140. package/package.json +48 -75
  141. package/CHANGELOG.md +0 -319
  142. package/dist/chalk.js +0 -4
  143. package/dist/index.js +0 -270
  144. package/dist/ink.js +0 -142
  145. package/dist/runtime.js +0 -135
  146. package/dist/theme.js +0 -7
  147. package/dist/ui/animation.js +0 -3
  148. package/dist/ui/ansi.js +0 -3
  149. package/dist/ui/cli.js +0 -9
  150. package/dist/ui/display.js +0 -4
  151. package/dist/ui/image.js +0 -4
  152. package/dist/ui/input.js +0 -3
  153. package/dist/ui/progress.js +0 -9
  154. package/dist/ui/react.js +0 -4
  155. package/dist/ui/utils.js +0 -3
  156. package/dist/ui/wrappers.js +0 -15
  157. package/dist/ui.js +0 -18
  158. package/src/index.ts +0 -73
  159. package/src/runtime.ts +0 -4
  160. package/src/theme.ts +0 -4
  161. package/src/ui/animation.ts +0 -2
  162. package/src/ui/ansi.ts +0 -2
  163. package/src/ui/cli.ts +0 -3
  164. package/src/ui/display.ts +0 -2
  165. package/src/ui/image.ts +0 -2
  166. package/src/ui/input.ts +0 -2
  167. package/src/ui/progress.ts +0 -2
  168. package/src/ui/react.ts +0 -2
  169. package/src/ui/utils.ts +0 -2
  170. package/src/ui/wrappers.ts +0 -2
  171. package/src/ui.ts +0 -4
@@ -0,0 +1,3 @@
1
+ import { n as keyToAnsi, r as parseKey, t as init_key_mapping } from "./key-mapping-DsyfLEdC.mjs";
2
+ init_key_mapping();
3
+ export { keyToAnsi, parseKey };
@@ -0,0 +1,132 @@
1
+ import { n as __esmMin } from "./chunk-BSw8zbkd.mjs";
2
+ //#region ../termless/src/key-mapping.ts
3
+ function normalizeModifier(mod) {
4
+ return MODIFIER_ALIASES[mod.toLowerCase()] ?? mod.toLowerCase();
5
+ }
6
+ /**
7
+ * Parse a key string like "Ctrl+a", "ArrowUp", "Shift+Tab" into a KeyDescriptor.
8
+ *
9
+ * Supports modifier prefixes: Ctrl, Control, Alt, Shift, Meta, Cmd, Option, Super.
10
+ * Modifiers are case-insensitive and separated by "+".
11
+ */
12
+ function parseKey(key) {
13
+ const parts = key.split("+");
14
+ const result = { key: parts.pop() };
15
+ for (const part of parts) switch (normalizeModifier(part)) {
16
+ case "ctrl":
17
+ result.ctrl = true;
18
+ break;
19
+ case "shift":
20
+ result.shift = true;
21
+ break;
22
+ case "alt":
23
+ result.alt = true;
24
+ break;
25
+ case "super":
26
+ result.super = true;
27
+ break;
28
+ }
29
+ return result;
30
+ }
31
+ /**
32
+ * Convert a key descriptor or key string to its ANSI escape sequence.
33
+ *
34
+ * Handles:
35
+ * - Single characters: returned as-is
36
+ * - Named keys (ArrowUp, Enter, Tab, etc.): mapped to standard ANSI sequences
37
+ * - Function keys (F1-F12): mapped to VT220/xterm sequences
38
+ * - Ctrl+letter: ASCII control codes 1-26
39
+ * - Ctrl+Enter: newline (\n)
40
+ * - Alt+key: ESC prefix + key
41
+ */
42
+ function keyToAnsi(key) {
43
+ const desc = typeof key === "string" ? parseKey(key) : key;
44
+ const { key: mainKey, ctrl, alt, shift } = desc;
45
+ const hasSuperOrMeta = desc.super;
46
+ if (ctrl && mainKey.length === 1) {
47
+ const code = mainKey.toLowerCase().charCodeAt(0) - 96;
48
+ if (code >= 1 && code <= 26) return String.fromCharCode(code);
49
+ }
50
+ if (ctrl && mainKey === "Enter") return "\n";
51
+ if ((alt || hasSuperOrMeta) && mainKey.length === 1) return `\x1b${mainKey}`;
52
+ const fkey = FKEY_MAP[mainKey];
53
+ if (fkey !== void 0) {
54
+ if (ctrl || alt || shift || hasSuperOrMeta) {
55
+ const mod = 1 + (shift ? 1 : 0) + (alt ? 2 : 0) + (ctrl ? 4 : 0) + (hasSuperOrMeta ? 8 : 0);
56
+ const fkeyNum = parseInt(mainKey.slice(1));
57
+ if (fkeyNum <= 4) return `\x1b[${fkeyNum + 10};${mod}~`;
58
+ const match = fkey.match(/\x1b\[(\d+)~/);
59
+ if (match) return `\x1b[${match[1]};${mod}~`;
60
+ }
61
+ return fkey;
62
+ }
63
+ const mapped = KEY_MAP[mainKey];
64
+ if (mapped !== void 0) {
65
+ if (mapped === null) return "";
66
+ if ((ctrl || alt || shift || hasSuperOrMeta) && mapped.startsWith("\x1B[")) {
67
+ const mod = 1 + (shift ? 1 : 0) + (alt ? 2 : 0) + (ctrl ? 4 : 0) + (hasSuperOrMeta ? 8 : 0);
68
+ const letterMatch = mapped.match(/\x1b\[([A-H])$/);
69
+ if (letterMatch) return `\x1b[1;${mod}${letterMatch[1]}`;
70
+ const tildeMatch = mapped.match(/\x1b\[(\d+)~$/);
71
+ if (tildeMatch) return `\x1b[${tildeMatch[1]};${mod}~`;
72
+ }
73
+ if (shift && mainKey === "Tab") return "\x1B[Z";
74
+ return mapped;
75
+ }
76
+ if (mainKey.length === 1) {
77
+ if (shift && mainKey.match(/[a-z]/)) return mainKey.toUpperCase();
78
+ return mainKey;
79
+ }
80
+ return mainKey;
81
+ }
82
+ var KEY_MAP, FKEY_MAP, MODIFIER_ALIASES;
83
+ var init_key_mapping = __esmMin((() => {
84
+ KEY_MAP = {
85
+ ArrowUp: "\x1B[A",
86
+ ArrowDown: "\x1B[B",
87
+ ArrowLeft: "\x1B[D",
88
+ ArrowRight: "\x1B[C",
89
+ Home: "\x1B[H",
90
+ End: "\x1B[F",
91
+ PageUp: "\x1B[5~",
92
+ PageDown: "\x1B[6~",
93
+ Enter: "\r",
94
+ Tab: " ",
95
+ Backspace: "",
96
+ Delete: "\x1B[3~",
97
+ Escape: "\x1B",
98
+ Space: " ",
99
+ Control: null,
100
+ Shift: null,
101
+ Alt: null,
102
+ Meta: null
103
+ };
104
+ FKEY_MAP = {
105
+ F1: "\x1BOP",
106
+ F2: "\x1BOQ",
107
+ F3: "\x1BOR",
108
+ F4: "\x1BOS",
109
+ F5: "\x1B[15~",
110
+ F6: "\x1B[17~",
111
+ F7: "\x1B[18~",
112
+ F8: "\x1B[19~",
113
+ F9: "\x1B[20~",
114
+ F10: "\x1B[21~",
115
+ F11: "\x1B[23~",
116
+ F12: "\x1B[24~"
117
+ };
118
+ MODIFIER_ALIASES = {
119
+ ctrl: "ctrl",
120
+ control: "ctrl",
121
+ shift: "shift",
122
+ alt: "alt",
123
+ meta: "super",
124
+ cmd: "super",
125
+ option: "alt",
126
+ super: "super"
127
+ };
128
+ }));
129
+ //#endregion
130
+ export { keyToAnsi as n, parseKey as r, init_key_mapping as t };
131
+
132
+ //# sourceMappingURL=key-mapping-DsyfLEdC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-mapping-DsyfLEdC.mjs","names":[],"sources":["../../termless/src/key-mapping.ts"],"sourcesContent":["/**\n * Key parsing and ANSI encoding for termless.\n *\n * Converts human-readable key descriptions (e.g., \"Ctrl+a\", \"ArrowUp\", \"F5\")\n * into KeyDescriptor objects and ANSI escape sequences suitable for PTY input.\n */\n\nimport type { KeyDescriptor } from \"./types.ts\"\n\n// ── Named key → ANSI sequence map ──\n\nconst KEY_MAP: Record<string, string | null> = {\n ArrowUp: \"\\x1b[A\",\n ArrowDown: \"\\x1b[B\",\n ArrowLeft: \"\\x1b[D\",\n ArrowRight: \"\\x1b[C\",\n Home: \"\\x1b[H\",\n End: \"\\x1b[F\",\n PageUp: \"\\x1b[5~\",\n PageDown: \"\\x1b[6~\",\n Enter: \"\\r\",\n Tab: \"\\t\",\n Backspace: \"\\x7f\",\n Delete: \"\\x1b[3~\",\n Escape: \"\\x1b\",\n Space: \" \",\n // Pure modifier keys produce no output on their own\n Control: null,\n Shift: null,\n Alt: null,\n Meta: null,\n}\n\n// ── Function keys F1-F12 ──\n\nconst FKEY_MAP: Record<string, string> = {\n F1: \"\\x1bOP\",\n F2: \"\\x1bOQ\",\n F3: \"\\x1bOR\",\n F4: \"\\x1bOS\",\n F5: \"\\x1b[15~\",\n F6: \"\\x1b[17~\",\n F7: \"\\x1b[18~\",\n F8: \"\\x1b[19~\",\n F9: \"\\x1b[20~\",\n F10: \"\\x1b[21~\",\n F11: \"\\x1b[23~\",\n F12: \"\\x1b[24~\",\n}\n\n// ── Modifier aliases ──\n\nconst MODIFIER_ALIASES: Record<string, string> = {\n ctrl: \"ctrl\",\n control: \"ctrl\",\n shift: \"shift\",\n alt: \"alt\",\n meta: \"super\",\n cmd: \"super\",\n option: \"alt\",\n super: \"super\",\n}\n\nfunction normalizeModifier(mod: string): string {\n return MODIFIER_ALIASES[mod.toLowerCase()] ?? mod.toLowerCase()\n}\n\n/**\n * Parse a key string like \"Ctrl+a\", \"ArrowUp\", \"Shift+Tab\" into a KeyDescriptor.\n *\n * Supports modifier prefixes: Ctrl, Control, Alt, Shift, Meta, Cmd, Option, Super.\n * Modifiers are case-insensitive and separated by \"+\".\n */\nexport function parseKey(key: string): KeyDescriptor {\n const parts = key.split(\"+\")\n const mainKey = parts.pop()!\n const result: KeyDescriptor = { key: mainKey }\n\n for (const part of parts) {\n const normalized = normalizeModifier(part)\n switch (normalized) {\n case \"ctrl\":\n result.ctrl = true\n break\n case \"shift\":\n result.shift = true\n break\n case \"alt\":\n result.alt = true\n break\n case \"super\":\n result.super = true\n break\n }\n }\n\n return result\n}\n\n/**\n * Convert a key descriptor or key string to its ANSI escape sequence.\n *\n * Handles:\n * - Single characters: returned as-is\n * - Named keys (ArrowUp, Enter, Tab, etc.): mapped to standard ANSI sequences\n * - Function keys (F1-F12): mapped to VT220/xterm sequences\n * - Ctrl+letter: ASCII control codes 1-26\n * - Ctrl+Enter: newline (\\n)\n * - Alt+key: ESC prefix + key\n */\nexport function keyToAnsi(key: KeyDescriptor | string): string {\n const desc = typeof key === \"string\" ? parseKey(key) : key\n const { key: mainKey, ctrl, alt, shift } = desc\n const hasSuperOrMeta = desc.super\n\n // Ctrl+letter -> control code (ASCII 1-26)\n if (ctrl && mainKey.length === 1) {\n const code = mainKey.toLowerCase().charCodeAt(0) - 96\n if (code >= 1 && code <= 26) return String.fromCharCode(code)\n }\n\n // Ctrl+Enter -> \\n (legacy terminal convention: \\r = Enter, \\n = Ctrl+Enter/Ctrl+J)\n if (ctrl && mainKey === \"Enter\") {\n return \"\\n\"\n }\n\n // Alt (or Super/Meta) + single character -> ESC prefix\n if ((alt || hasSuperOrMeta) && mainKey.length === 1) {\n return `\\x1b${mainKey}`\n }\n\n // Function keys\n const fkey = FKEY_MAP[mainKey]\n if (fkey !== undefined) {\n // With modifiers, use CSI sequences with modifier parameter\n if (ctrl || alt || shift || hasSuperOrMeta) {\n const mod = 1 + (shift ? 1 : 0) + (alt ? 2 : 0) + (ctrl ? 4 : 0) + (hasSuperOrMeta ? 8 : 0)\n // F1-F4 use SS3 format, convert to CSI for modified keys\n const fkeyNum = parseInt(mainKey.slice(1))\n if (fkeyNum <= 4) {\n // F1=11, F2=12, F3=13, F4=14 in CSI ~ format\n const csiNum = fkeyNum + 10\n return `\\x1b[${csiNum};${mod}~`\n }\n // F5-F12 already use CSI ~ format: extract the number\n const match = fkey.match(/\\x1b\\[(\\d+)~/)\n if (match) {\n return `\\x1b[${match[1]};${mod}~`\n }\n }\n return fkey\n }\n\n // Named keys from KEY_MAP\n const mapped = KEY_MAP[mainKey]\n if (mapped !== undefined) {\n if (mapped === null) return \"\" // Pure modifier keys produce nothing\n\n // Arrow/navigation keys with modifiers use CSI 1;mod format\n if ((ctrl || alt || shift || hasSuperOrMeta) && mapped.startsWith(\"\\x1b[\")) {\n const mod = 1 + (shift ? 1 : 0) + (alt ? 2 : 0) + (ctrl ? 4 : 0) + (hasSuperOrMeta ? 8 : 0)\n // CSI letter format (e.g., \\x1b[A) -> CSI 1;mod letter\n const letterMatch = mapped.match(/\\x1b\\[([A-H])$/)\n if (letterMatch) {\n return `\\x1b[1;${mod}${letterMatch[1]}`\n }\n // CSI num ~ format (e.g., \\x1b[5~) -> CSI num;mod ~\n const tildeMatch = mapped.match(/\\x1b\\[(\\d+)~$/)\n if (tildeMatch) {\n return `\\x1b[${tildeMatch[1]};${mod}~`\n }\n }\n\n // Shift+Tab -> reverse tab (CSI Z)\n if (shift && mainKey === \"Tab\") {\n return \"\\x1b[Z\"\n }\n\n return mapped\n }\n\n // Single character without modifiers\n if (mainKey.length === 1) {\n // Shift+letter -> uppercase (passthrough for terminals)\n if (shift && mainKey.match(/[a-z]/)) {\n return mainKey.toUpperCase()\n }\n return mainKey\n }\n\n // Unknown key: return as-is\n return mainKey\n}\n"],"mappings":";;AA+DA,SAAS,kBAAkB,KAAqB;AAC9C,QAAO,iBAAiB,IAAI,aAAa,KAAK,IAAI,aAAa;;;;;;;;AASjE,SAAgB,SAAS,KAA4B;CACnD,MAAM,QAAQ,IAAI,MAAM,IAAI;CAE5B,MAAM,SAAwB,EAAE,KADhB,MAAM,KAAK,EACmB;AAE9C,MAAK,MAAM,QAAQ,MAEjB,SADmB,kBAAkB,KAAK,EAC1C;EACE,KAAK;AACH,UAAO,OAAO;AACd;EACF,KAAK;AACH,UAAO,QAAQ;AACf;EACF,KAAK;AACH,UAAO,MAAM;AACb;EACF,KAAK;AACH,UAAO,QAAQ;AACf;;AAIN,QAAO;;;;;;;;;;;;;AAcT,SAAgB,UAAU,KAAqC;CAC7D,MAAM,OAAO,OAAO,QAAQ,WAAW,SAAS,IAAI,GAAG;CACvD,MAAM,EAAE,KAAK,SAAS,MAAM,KAAK,UAAU;CAC3C,MAAM,iBAAiB,KAAK;AAG5B,KAAI,QAAQ,QAAQ,WAAW,GAAG;EAChC,MAAM,OAAO,QAAQ,aAAa,CAAC,WAAW,EAAE,GAAG;AACnD,MAAI,QAAQ,KAAK,QAAQ,GAAI,QAAO,OAAO,aAAa,KAAK;;AAI/D,KAAI,QAAQ,YAAY,QACtB,QAAO;AAIT,MAAK,OAAO,mBAAmB,QAAQ,WAAW,EAChD,QAAO,OAAO;CAIhB,MAAM,OAAO,SAAS;AACtB,KAAI,SAAS,KAAA,GAAW;AAEtB,MAAI,QAAQ,OAAO,SAAS,gBAAgB;GAC1C,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,MAAM,iBAAiB,IAAI;GAEzF,MAAM,UAAU,SAAS,QAAQ,MAAM,EAAE,CAAC;AAC1C,OAAI,WAAW,EAGb,QAAO,QADQ,UAAU,GACH,GAAG,IAAI;GAG/B,MAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,OAAI,MACF,QAAO,QAAQ,MAAM,GAAG,GAAG,IAAI;;AAGnC,SAAO;;CAIT,MAAM,SAAS,QAAQ;AACvB,KAAI,WAAW,KAAA,GAAW;AACxB,MAAI,WAAW,KAAM,QAAO;AAG5B,OAAK,QAAQ,OAAO,SAAS,mBAAmB,OAAO,WAAW,QAAQ,EAAE;GAC1E,MAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI,MAAM,iBAAiB,IAAI;GAEzF,MAAM,cAAc,OAAO,MAAM,iBAAiB;AAClD,OAAI,YACF,QAAO,UAAU,MAAM,YAAY;GAGrC,MAAM,aAAa,OAAO,MAAM,gBAAgB;AAChD,OAAI,WACF,QAAO,QAAQ,WAAW,GAAG,GAAG,IAAI;;AAKxC,MAAI,SAAS,YAAY,MACvB,QAAO;AAGT,SAAO;;AAIT,KAAI,QAAQ,WAAW,GAAG;AAExB,MAAI,SAAS,QAAQ,MAAM,QAAQ,CACjC,QAAO,QAAQ,aAAa;AAE9B,SAAO;;AAIT,QAAO;;;;AApLH,WAAyC;EAC7C,SAAS;EACT,WAAW;EACX,WAAW;EACX,YAAY;EACZ,MAAM;EACN,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO;EACP,KAAK;EACL,WAAW;EACX,QAAQ;EACR,QAAQ;EACR,OAAO;EAEP,SAAS;EACT,OAAO;EACP,KAAK;EACL,MAAM;EACP;AAIK,YAAmC;EACvC,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,KAAK;EACL,KAAK;EACL,KAAK;EACN;AAIK,oBAA2C;EAC/C,MAAM;EACN,SAAS;EACT,OAAO;EACP,KAAK;EACL,MAAM;EACN,KAAK;EACL,QAAQ;EACR,OAAO;EACR"}
@@ -0,0 +1,50 @@
1
+ //#region packages/ag-term/src/layout-engine.ts
2
+ let layoutEngine = null;
3
+ /**
4
+ * Set the global layout engine instance.
5
+ * Must be called before rendering.
6
+ */
7
+ function setLayoutEngine(engine) {
8
+ layoutEngine = engine;
9
+ }
10
+ /**
11
+ * Get the global layout engine instance.
12
+ * Throws if not initialized.
13
+ */
14
+ function getLayoutEngine() {
15
+ if (!layoutEngine) throw new Error("Layout engine not initialized. Call setLayoutEngine() or initYoga()/initFlexily() first.");
16
+ return layoutEngine;
17
+ }
18
+ /**
19
+ * Check if a layout engine is initialized.
20
+ */
21
+ function isLayoutEngineInitialized() {
22
+ return layoutEngine !== null;
23
+ }
24
+ /**
25
+ * Get the layout constants from the current engine.
26
+ * Convenience function for accessing constants.
27
+ */
28
+ function getConstants() {
29
+ return getLayoutEngine().constants;
30
+ }
31
+ /**
32
+ * Initialize the layout engine if not already set.
33
+ *
34
+ * @param engineType - 'flexily', 'flexily-classic', or 'yoga'. If not provided, checks
35
+ * SILVERY_ENGINE env var, then defaults to 'flexily'.
36
+ */
37
+ async function ensureDefaultLayoutEngine(engineType) {
38
+ if (isLayoutEngineInitialized()) return;
39
+ if ((engineType ?? process.env.SILVERY_ENGINE?.toLowerCase() ?? "flexily") === "yoga") {
40
+ const { initYogaEngine } = await import("./yoga-adapter-Daq6-dw1.mjs");
41
+ setLayoutEngine(await initYogaEngine());
42
+ } else {
43
+ const { createFlexilyZeroEngine } = await import("./flexily-zero-adapter-GHwEW11s.mjs");
44
+ setLayoutEngine(createFlexilyZeroEngine());
45
+ }
46
+ }
47
+ //#endregion
48
+ export { setLayoutEngine as a, isLayoutEngineInitialized as i, getConstants as n, getLayoutEngine as r, ensureDefaultLayoutEngine as t };
49
+
50
+ //# sourceMappingURL=layout-engine-B3dsnVLU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-engine-B3dsnVLU.mjs","names":[],"sources":["../packages/ag-term/src/layout-engine.ts"],"sourcesContent":["/**\n * Layout Engine Abstraction\n *\n * Provides a pluggable interface for layout engines (Yoga, Flexily, etc.)\n * This allows silvery to use different layout backends without code changes.\n *\n * Core type interfaces (LayoutNode, MeasureFunc, MeasureMode) live in\n * @silvery/ag/layout-types. This file contains the runtime engine management.\n */\n\nimport type { LayoutNode } from \"@silvery/ag/layout-types\"\n\n// ============================================================================\n// Branded Types for Type Safety\n// ============================================================================\n\n/**\n * Branded types prevent accidentally mixing up layout constant categories.\n * E.g., you can't pass an AlignValue where a FlexDirectionValue is expected.\n */\nexport type FlexDirectionValue = number & { readonly __brand: \"FlexDirection\" }\nexport type WrapValue = number & { readonly __brand: \"Wrap\" }\nexport type AlignValue = number & { readonly __brand: \"Align\" }\nexport type JustifyValue = number & { readonly __brand: \"Justify\" }\nexport type EdgeValue = number & { readonly __brand: \"Edge\" }\nexport type GutterValue = number & { readonly __brand: \"Gutter\" }\nexport type DisplayValue = number & { readonly __brand: \"Display\" }\nexport type PositionTypeValue = number & { readonly __brand: \"PositionType\" }\nexport type OverflowValue = number & { readonly __brand: \"Overflow\" }\nexport type DirectionValue = number & { readonly __brand: \"Direction\" }\nexport type MeasureModeValue = number & { readonly __brand: \"MeasureMode\" }\n\n// ============================================================================\n// Layout Constants Interface\n// ============================================================================\n\n/**\n * Constants for layout configuration.\n * These are the same across Yoga and Flexily.\n * Uses branded types for compile-time safety.\n */\nexport interface LayoutConstants {\n // Flex Direction\n FLEX_DIRECTION_COLUMN: FlexDirectionValue\n FLEX_DIRECTION_COLUMN_REVERSE: FlexDirectionValue\n FLEX_DIRECTION_ROW: FlexDirectionValue\n FLEX_DIRECTION_ROW_REVERSE: FlexDirectionValue\n\n // Wrap\n WRAP_NO_WRAP: WrapValue\n WRAP_WRAP: WrapValue\n WRAP_WRAP_REVERSE: WrapValue\n\n // Align\n ALIGN_AUTO: AlignValue\n ALIGN_FLEX_START: AlignValue\n ALIGN_CENTER: AlignValue\n ALIGN_FLEX_END: AlignValue\n ALIGN_STRETCH: AlignValue\n ALIGN_BASELINE: AlignValue\n ALIGN_SPACE_BETWEEN: AlignValue\n ALIGN_SPACE_AROUND: AlignValue\n ALIGN_SPACE_EVENLY: AlignValue\n\n // Justify\n JUSTIFY_FLEX_START: JustifyValue\n JUSTIFY_CENTER: JustifyValue\n JUSTIFY_FLEX_END: JustifyValue\n JUSTIFY_SPACE_BETWEEN: JustifyValue\n JUSTIFY_SPACE_AROUND: JustifyValue\n JUSTIFY_SPACE_EVENLY: JustifyValue\n\n // Edge\n EDGE_LEFT: EdgeValue\n EDGE_TOP: EdgeValue\n EDGE_RIGHT: EdgeValue\n EDGE_BOTTOM: EdgeValue\n EDGE_HORIZONTAL: EdgeValue\n EDGE_VERTICAL: EdgeValue\n EDGE_ALL: EdgeValue\n\n // Gutter\n GUTTER_COLUMN: GutterValue\n GUTTER_ROW: GutterValue\n GUTTER_ALL: GutterValue\n\n // Display\n DISPLAY_FLEX: DisplayValue\n DISPLAY_NONE: DisplayValue\n\n // Position Type\n POSITION_TYPE_STATIC: PositionTypeValue\n POSITION_TYPE_RELATIVE: PositionTypeValue\n POSITION_TYPE_ABSOLUTE: PositionTypeValue\n\n // Overflow\n OVERFLOW_VISIBLE: OverflowValue\n OVERFLOW_HIDDEN: OverflowValue\n OVERFLOW_SCROLL: OverflowValue\n\n // Direction\n DIRECTION_LTR: DirectionValue\n\n // Measure Mode\n MEASURE_MODE_UNDEFINED: MeasureModeValue\n MEASURE_MODE_EXACTLY: MeasureModeValue\n MEASURE_MODE_AT_MOST: MeasureModeValue\n}\n\n// ============================================================================\n// Layout Engine Interface\n// ============================================================================\n\n/**\n * Abstract layout engine interface.\n * Implementations can wrap Yoga, Flexily, or other layout engines.\n */\nexport interface LayoutEngine {\n /** Create a new layout node */\n createNode(): LayoutNode\n\n /** Layout constants for this engine */\n readonly constants: LayoutConstants\n\n /** Engine name for debugging */\n readonly name: string\n}\n\n// ============================================================================\n// Global Layout Engine Management\n// ============================================================================\n\nlet layoutEngine: LayoutEngine | null = null\n\n/**\n * Set the global layout engine instance.\n * Must be called before rendering.\n */\nexport function setLayoutEngine(engine: LayoutEngine): void {\n layoutEngine = engine\n}\n\n/**\n * Get the global layout engine instance.\n * Throws if not initialized.\n */\nexport function getLayoutEngine(): LayoutEngine {\n if (!layoutEngine) {\n throw new Error(\"Layout engine not initialized. Call setLayoutEngine() or initYoga()/initFlexily() first.\")\n }\n return layoutEngine\n}\n\n/**\n * Check if a layout engine is initialized.\n */\nexport function isLayoutEngineInitialized(): boolean {\n return layoutEngine !== null\n}\n\n/**\n * Get the layout constants from the current engine.\n * Convenience function for accessing constants.\n */\nexport function getConstants(): LayoutConstants {\n return getLayoutEngine().constants\n}\n\n// ============================================================================\n// Default Engine Initialization\n// ============================================================================\n\n/**\n * Layout engine type for configuration.\n *\n * - 'flexily': Zero-allocation Flexily (default, optimized for high-frequency layout)\n * - 'flexily-classic': Classic Flexily algorithm (for debugging/compatibility)\n * - 'yoga': Facebook's WASM-based flexbox (most mature)\n */\nexport type LayoutEngineType = \"flexily\" | \"yoga\"\n\n/**\n * Initialize the layout engine if not already set.\n *\n * @param engineType - 'flexily', 'flexily-classic', or 'yoga'. If not provided, checks\n * SILVERY_ENGINE env var, then defaults to 'flexily'.\n */\nexport async function ensureDefaultLayoutEngine(engineType?: LayoutEngineType): Promise<void> {\n if (isLayoutEngineInitialized()) {\n return\n }\n\n // Resolve engine type: option → env → 'flexily'\n const resolved = engineType ?? (process.env.SILVERY_ENGINE?.toLowerCase() as LayoutEngineType) ?? \"flexily\"\n\n if (resolved === \"yoga\") {\n const { initYogaEngine } = await import(\"./adapters/yoga-adapter.js\")\n setLayoutEngine(await initYogaEngine())\n } else {\n // 'flexily' (default) uses zero-allocation engine\n const { createFlexilyZeroEngine } = await import(\"./adapters/flexily-zero-adapter.js\")\n setLayoutEngine(createFlexilyZeroEngine())\n }\n}\n"],"mappings":";AAoIA,IAAI,eAAoC;;;;;AAMxC,SAAgB,gBAAgB,QAA4B;AAC1D,gBAAe;;;;;;AAOjB,SAAgB,kBAAgC;AAC9C,KAAI,CAAC,aACH,OAAM,IAAI,MAAM,2FAA2F;AAE7G,QAAO;;;;;AAMT,SAAgB,4BAAqC;AACnD,QAAO,iBAAiB;;;;;;AAO1B,SAAgB,eAAgC;AAC9C,QAAO,iBAAiB,CAAC;;;;;;;;AAsB3B,eAAsB,0BAA0B,YAA8C;AAC5F,KAAI,2BAA2B,CAC7B;AAMF,MAFiB,cAAe,QAAQ,IAAI,gBAAgB,aAAa,IAAyB,eAEjF,QAAQ;EACvB,MAAM,EAAE,mBAAmB,MAAM,OAAO;AACxC,kBAAgB,MAAM,gBAAgB,CAAC;QAClC;EAEL,MAAM,EAAE,4BAA4B,MAAM,OAAO;AACjD,kBAAgB,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { t as ensureDefaultLayoutEngine } from "./layout-engine-B3dsnVLU.mjs";
2
+ export { ensureDefaultLayoutEngine };
@@ -0,0 +1,180 @@
1
+ import { g as TaskStatus, t as ProgressBarOptions, u as SpinnerStyle } from "./types-CDgkE-Rw.mjs";
2
+
3
+ //#region packages/ag-react/src/ui/cli/progress-bar.d.ts
4
+ /**
5
+ * ProgressBar class for CLI progress indication
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const bar = new ProgressBar({ total: 100 });
10
+ * bar.start();
11
+ * for (let i = 0; i <= 100; i++) {
12
+ * await doWork();
13
+ * bar.update(i);
14
+ * }
15
+ * bar.stop();
16
+ * ```
17
+ */
18
+ declare class ProgressBar {
19
+ private total;
20
+ private format;
21
+ private width;
22
+ private complete;
23
+ private incomplete;
24
+ private stream;
25
+ private hideCursor;
26
+ private phases;
27
+ private current;
28
+ private phase;
29
+ private startTime;
30
+ private isActive;
31
+ private etaBuffer;
32
+ constructor(options?: ProgressBarOptions);
33
+ /**
34
+ * Start the progress bar
35
+ */
36
+ start(initialValue?: number, initialTotal?: number): this;
37
+ /**
38
+ * Update progress value
39
+ */
40
+ update(value: number, tokens?: Record<string, string | number>): this;
41
+ /**
42
+ * Increment progress by amount (default: 1)
43
+ */
44
+ increment(amount?: number, tokens?: Record<string, string | number>): this;
45
+ /**
46
+ * Set the current phase (for multi-phase progress)
47
+ */
48
+ setPhase(phaseName: string, options?: {
49
+ current?: number;
50
+ total?: number;
51
+ }): this;
52
+ /**
53
+ * Stop the progress bar
54
+ */
55
+ stop(clear?: boolean): this;
56
+ /** Get ETA in seconds using smoothed rate */
57
+ private getETASeconds;
58
+ /**
59
+ * Render the progress bar
60
+ */
61
+ private render;
62
+ /**
63
+ * Get current progress ratio (0-1)
64
+ */
65
+ get ratio(): number;
66
+ /**
67
+ * Get current progress percentage (0-100)
68
+ */
69
+ get percentage(): number;
70
+ /**
71
+ * Dispose the progress bar (calls stop)
72
+ */
73
+ [Symbol.dispose](): void;
74
+ }
75
+ //#endregion
76
+ //#region packages/ag-react/src/ui/cli/multi-progress.d.ts
77
+ /** Task configuration */
78
+ interface TaskConfig {
79
+ title: string;
80
+ type: "spinner" | "bar" | "group";
81
+ status: TaskStatus;
82
+ total?: number;
83
+ current?: number;
84
+ spinnerStyle?: SpinnerStyle;
85
+ indent?: number;
86
+ }
87
+ /** Internal task state */
88
+ interface TaskState extends TaskConfig {
89
+ id: string;
90
+ /** Completion time in ms (shown dimmed after title on completion) */
91
+ completionTime?: number;
92
+ }
93
+ /**
94
+ * MultiProgress - Manage multiple concurrent progress indicators
95
+ *
96
+ * @example
97
+ * ```ts
98
+ * const multi = new MultiProgress();
99
+ *
100
+ * const download = multi.add("Downloading files", { type: "bar", total: 100 });
101
+ * const process = multi.add("Processing", { type: "spinner" });
102
+ *
103
+ * download.start();
104
+ * download.update(50);
105
+ * download.complete();
106
+ *
107
+ * process.start();
108
+ * process.complete();
109
+ *
110
+ * multi.stop();
111
+ * ```
112
+ */
113
+ declare class MultiProgress {
114
+ private tasks;
115
+ private taskOrder;
116
+ private stream;
117
+ private isActive;
118
+ private timer;
119
+ private frameIndex;
120
+ private renderedLines;
121
+ constructor(stream?: NodeJS.WriteStream);
122
+ /**
123
+ * Add a new task
124
+ * @param insertAfter - ID of task to insert after (for hierarchical display)
125
+ */
126
+ add(title: string, options?: {
127
+ type?: "spinner" | "bar" | "group";
128
+ total?: number;
129
+ spinnerStyle?: SpinnerStyle;
130
+ indent?: number;
131
+ insertAfter?: string;
132
+ }): TaskHandle;
133
+ /**
134
+ * Start the multi-progress display
135
+ */
136
+ start(): this;
137
+ /**
138
+ * Dispose the multi-progress display (calls stop)
139
+ */
140
+ [Symbol.dispose](): void;
141
+ /**
142
+ * Stop the multi-progress display
143
+ * @param clear - If true, clear all task lines from terminal
144
+ */
145
+ stop(clear?: boolean): this;
146
+ /** @internal Update task state */
147
+ _updateTask(id: string, updates: Partial<TaskState>): void;
148
+ /** @internal Get task state */
149
+ _getTask(id: string): TaskState | undefined;
150
+ private render;
151
+ }
152
+ /**
153
+ * Handle for controlling an individual task
154
+ */
155
+ declare class TaskHandle {
156
+ private multi;
157
+ private _id;
158
+ constructor(multi: MultiProgress, _id: string);
159
+ /** Get task ID (for insertAfter) */
160
+ get id(): string;
161
+ /** Start the task (set status to running) */
162
+ start(): this;
163
+ /** Update progress (for bar type) */
164
+ update(current: number): this;
165
+ /** Mark task as completed */
166
+ complete(titleOrTime?: string | number): this;
167
+ /** Mark task as failed */
168
+ fail(title?: string): this;
169
+ /** Mark task as skipped */
170
+ skip(title?: string): this;
171
+ /** Update task title */
172
+ setTitle(title: string): this;
173
+ /** Change task type (e.g., from spinner to group when sub-steps are added) */
174
+ setType(type: "spinner" | "bar" | "group"): this;
175
+ /** Get current status */
176
+ get status(): TaskStatus;
177
+ }
178
+ //#endregion
179
+ export { TaskHandle as n, ProgressBar as r, MultiProgress as t };
180
+ //# sourceMappingURL=multi-progress-C0-rkn86.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-progress-C0-rkn86.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/progress-bar.ts","../packages/ag-react/src/ui/cli/multi-progress.ts"],"mappings":";;;;;;;;;;;;;;;;;cA0Ba,WAAA;EAAA,QACH,KAAA;EAAA,QACA,MAAA;EAAA,QACA,KAAA;EAAA,QACA,QAAA;EAAA,QACA,UAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,MAAA;EAAA,QAEA,OAAA;EAAA,QACA,KAAA;EAAA,QACA,SAAA;EAAA,QACA,QAAA;EAAA,QAGA,SAAA;cAEI,OAAA,GAAS,kBAAA;EAmCU;;;EArB/B,KAAA,CAAM,YAAA,WAAkB,YAAA;EAyCO;;;EApB/B,MAAA,CAAO,KAAA,UAAe,MAAA,GAAS,MAAA;EA2BS;;;EAPxC,SAAA,CAAU,MAAA,WAAY,MAAA,GAAS,MAAA;EA6B1B;;;EAtBL,QAAA,CAAS,SAAA,UAAmB,OAAA;IAAY,OAAA;IAAkB,KAAA;EAAA;EAgH3C;;;EA1Ff,IAAA,CAAK,KAAA;;UAqBG,aAAA;ECjIU;;;EAAA,QDwIV,MAAA;ECtIR;;;EAAA,IDsLI,KAAA,CAAA;ECnLJ;;;EAAA,ID0LI,UAAA,CAAA;ECxLE;;AAAA;EAAA,CD+LL,MAAA,CAAO,OAAA;AAAA;;;;UCtMA,UAAA;EACR,KAAA;EACA,IAAA;EACA,MAAA,EAAQ,UAAA;EACR,KAAA;EACA,OAAA;EACA,YAAA,GAAe,YAAA;EACf,MAAA;AAAA;;UAIQ,SAAA,SAAkB,UAAA;EAC1B,EAAA;EDAQ;ECER,cAAA;AAAA;;;;;;;;;;;;;;;;;;;;;cAuBW,aAAA;EAAA,QACH,KAAA;EAAA,QACA,SAAA;EAAA,QACA,MAAA;EAAA,QACA,QAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;EAAA,QACA,aAAA;cAEI,MAAA,GAAQ,MAAA,CAAO,WAAA;EDiJvB;;;;ECzIJ,GAAA,CACE,KAAA,UACA,OAAA;IACE,IAAA;IACA,KAAA;IACA,YAAA,GAAe,YAAA;IACf,MAAA;IACA,WAAA;EAAA,IAED,UAAA;EAzDwB;;;EA+F3B,KAAA,CAAA;EAlGQ;;;EAAA,CA2HP,MAAA,CAAO,OAAA;EAxHO;;;;EAgIf,IAAA,CAAK,KAAA;EA3Ha;EA8JlB,WAAA,CAAY,EAAA,UAAY,OAAA,EAAS,OAAA,CAAQ,SAAA;EA9JL;EA2KpC,QAAA,CAAS,EAAA,WAAa,SAAA;EAAA,QAId,MAAA;AAAA;;;AArJV;cAmNM,UAAA;EAAA,QAEM,KAAA;EAAA,QACA,GAAA;cADA,KAAA,EAAO,aAAA,EACP,GAAA;EA5LP;EAAA,IAgMC,EAAA,CAAA;EAtFqC;EA2FzC,KAAA,CAAA;EA9EsB;EAoFtB,MAAA,CAAO,OAAA;EApFwB;EA0F/B,QAAA,CAAS,WAAA;EAzOD;EAuPR,IAAA,CAAK,KAAA;EArPG;EA6PR,IAAA,CAAK,KAAA;EA3PG;EAmQR,QAAA,CAAS,KAAA;;EAMT,OAAA,CAAQ,IAAA;EAtQmB;EAAA,IA4QvB,MAAA,CAAA,GAAU,UAAA;AAAA"}
@@ -0,0 +1,219 @@
1
+ import { a as chalk, t as SPINNER_FRAMES } from "./spinner-DSByknyx.mjs";
2
+ import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "./ansi-CXLE_pt1.mjs";
3
+ //#region packages/ag-react/src/ui/cli/multi-progress.ts
4
+ /**
5
+ * MultiProgress - Container for managing multiple concurrent progress indicators
6
+ */
7
+ /** Status icons */
8
+ const STATUS_ICONS = {
9
+ pending: chalk.gray("○"),
10
+ running: "",
11
+ completed: chalk.green("✔"),
12
+ failed: chalk.red("✖"),
13
+ skipped: chalk.yellow("⊘")
14
+ };
15
+ /**
16
+ * MultiProgress - Manage multiple concurrent progress indicators
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const multi = new MultiProgress();
21
+ *
22
+ * const download = multi.add("Downloading files", { type: "bar", total: 100 });
23
+ * const process = multi.add("Processing", { type: "spinner" });
24
+ *
25
+ * download.start();
26
+ * download.update(50);
27
+ * download.complete();
28
+ *
29
+ * process.start();
30
+ * process.complete();
31
+ *
32
+ * multi.stop();
33
+ * ```
34
+ */
35
+ var MultiProgress = class {
36
+ tasks = /* @__PURE__ */ new Map();
37
+ taskOrder = [];
38
+ stream;
39
+ isActive = false;
40
+ timer = null;
41
+ frameIndex = 0;
42
+ renderedLines = 0;
43
+ constructor(stream = process.stdout) {
44
+ this.stream = stream;
45
+ }
46
+ /**
47
+ * Add a new task
48
+ * @param insertAfter - ID of task to insert after (for hierarchical display)
49
+ */
50
+ add(title, options = {}) {
51
+ const id = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
52
+ const task = {
53
+ id,
54
+ title,
55
+ type: options.type ?? "spinner",
56
+ status: "pending",
57
+ total: options.total,
58
+ current: 0,
59
+ spinnerStyle: options.spinnerStyle ?? "dots",
60
+ indent: options.indent ?? 0
61
+ };
62
+ this.tasks.set(id, task);
63
+ if (options.insertAfter) {
64
+ const afterIndex = this.taskOrder.indexOf(options.insertAfter);
65
+ if (afterIndex >= 0) this.taskOrder.splice(afterIndex + 1, 0, id);
66
+ else this.taskOrder.push(id);
67
+ } else this.taskOrder.push(id);
68
+ if (this.isActive) this.render();
69
+ return new TaskHandle(this, id);
70
+ }
71
+ /**
72
+ * Start the multi-progress display
73
+ */
74
+ start() {
75
+ if (this.isActive) return this;
76
+ this.isActive = true;
77
+ if (isTTY(this.stream)) write(CURSOR_HIDE, this.stream);
78
+ this.render();
79
+ this.timer = setInterval(() => {
80
+ this.frameIndex = (this.frameIndex + 1) % 10;
81
+ this.render();
82
+ }, 80);
83
+ return this;
84
+ }
85
+ /**
86
+ * Dispose the multi-progress display (calls stop)
87
+ */
88
+ [Symbol.dispose]() {
89
+ this.stop();
90
+ }
91
+ /**
92
+ * Stop the multi-progress display
93
+ * @param clear - If true, clear all task lines from terminal
94
+ */
95
+ stop(clear = false) {
96
+ if (!this.isActive) return this;
97
+ this.isActive = false;
98
+ if (this.timer) {
99
+ clearInterval(this.timer);
100
+ this.timer = null;
101
+ }
102
+ if (clear && isTTY(this.stream)) {
103
+ if (this.renderedLines > 0) {
104
+ write(cursorUp(this.renderedLines), this.stream);
105
+ for (let i = 0; i < this.renderedLines; i++) write(`${CLEAR_LINE}\n`, this.stream);
106
+ write(cursorUp(this.renderedLines), this.stream);
107
+ }
108
+ } else {
109
+ this.render();
110
+ write("\n", this.stream);
111
+ }
112
+ if (isTTY(this.stream)) write(CURSOR_SHOW, this.stream);
113
+ return this;
114
+ }
115
+ /** @internal Update task state */
116
+ _updateTask(id, updates) {
117
+ const task = this.tasks.get(id);
118
+ if (task) {
119
+ Object.assign(task, updates);
120
+ if (this.isActive && updates.status) this.render();
121
+ }
122
+ }
123
+ /** @internal Get task state */
124
+ _getTask(id) {
125
+ return this.tasks.get(id);
126
+ }
127
+ render() {
128
+ if (!isTTY(this.stream)) return;
129
+ if (this.renderedLines > 0) write(cursorUp(this.renderedLines), this.stream);
130
+ const lines = [];
131
+ for (const id of this.taskOrder) {
132
+ const task = this.tasks.get(id);
133
+ if (!task) continue;
134
+ let icon;
135
+ if (task.status === "running") if (task.type === "group") icon = STATUS_ICONS.pending;
136
+ else {
137
+ const frames = SPINNER_FRAMES[task.spinnerStyle ?? "dots"];
138
+ icon = chalk.cyan(frames[this.frameIndex % frames.length]);
139
+ }
140
+ else icon = STATUS_ICONS[task.status];
141
+ let line = `${" ".repeat(task.indent ?? 0)}${icon} ${task.title}`;
142
+ if (task.type === "bar" && task.total && task.total > 0) {
143
+ const percent = task.current / task.total;
144
+ const barWidth = 20;
145
+ const filled = Math.round(barWidth * percent);
146
+ const empty = barWidth - filled;
147
+ const bar = chalk.cyan("█".repeat(filled)) + chalk.gray("░".repeat(empty));
148
+ line += ` ${bar} ${Math.round(percent * 100)}%`;
149
+ }
150
+ if (task.status === "completed" && task.completionTime !== void 0) line += chalk.dim(` ${task.completionTime}ms`);
151
+ lines.push(line);
152
+ }
153
+ for (const line of lines) write(`${CLEAR_LINE}${line}\n`, this.stream);
154
+ this.renderedLines = lines.length;
155
+ }
156
+ };
157
+ /**
158
+ * Handle for controlling an individual task
159
+ */
160
+ var TaskHandle = class {
161
+ constructor(multi, _id) {
162
+ this.multi = multi;
163
+ this._id = _id;
164
+ }
165
+ /** Get task ID (for insertAfter) */
166
+ get id() {
167
+ return this._id;
168
+ }
169
+ /** Start the task (set status to running) */
170
+ start() {
171
+ this.multi._updateTask(this._id, { status: "running" });
172
+ return this;
173
+ }
174
+ /** Update progress (for bar type) */
175
+ update(current) {
176
+ this.multi._updateTask(this._id, { current });
177
+ return this;
178
+ }
179
+ /** Mark task as completed */
180
+ complete(titleOrTime) {
181
+ const updates = { status: "completed" };
182
+ if (typeof titleOrTime === "number") updates.completionTime = titleOrTime;
183
+ else if (titleOrTime) updates.title = titleOrTime;
184
+ this.multi._updateTask(this._id, updates);
185
+ return this;
186
+ }
187
+ /** Mark task as failed */
188
+ fail(title) {
189
+ const updates = { status: "failed" };
190
+ if (title) updates.title = title;
191
+ this.multi._updateTask(this._id, updates);
192
+ return this;
193
+ }
194
+ /** Mark task as skipped */
195
+ skip(title) {
196
+ const updates = { status: "skipped" };
197
+ if (title) updates.title = title;
198
+ this.multi._updateTask(this._id, updates);
199
+ return this;
200
+ }
201
+ /** Update task title */
202
+ setTitle(title) {
203
+ this.multi._updateTask(this._id, { title });
204
+ return this;
205
+ }
206
+ /** Change task type (e.g., from spinner to group when sub-steps are added) */
207
+ setType(type) {
208
+ this.multi._updateTask(this._id, { type });
209
+ return this;
210
+ }
211
+ /** Get current status */
212
+ get status() {
213
+ return this.multi._getTask(this._id)?.status ?? "pending";
214
+ }
215
+ };
216
+ //#endregion
217
+ export { MultiProgress as t };
218
+
219
+ //# sourceMappingURL=multi-progress-CQVB9lES.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-progress-CQVB9lES.mjs","names":[],"sources":["../packages/ag-react/src/ui/cli/multi-progress.ts"],"sourcesContent":["/**\n * MultiProgress - Container for managing multiple concurrent progress indicators\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SpinnerStyle, TaskStatus } from \"../types.js\"\nimport { CURSOR_HIDE, CURSOR_SHOW, CLEAR_LINE, cursorUp, write, isTTY } from \"./ansi\"\nimport { Spinner, SPINNER_FRAMES } from \"./spinner\"\nimport { ProgressBar } from \"./progress-bar\"\n\n/** Status icons */\nconst STATUS_ICONS: Record<TaskStatus, string> = {\n pending: chalk.gray(\"○\"),\n running: \"\", // Will be replaced with spinner frame\n completed: chalk.green(\"✔\"),\n failed: chalk.red(\"✖\"),\n skipped: chalk.yellow(\"⊘\"),\n}\n\n/** Task configuration */\ninterface TaskConfig {\n title: string\n type: \"spinner\" | \"bar\" | \"group\"\n status: TaskStatus\n total?: number\n current?: number\n spinnerStyle?: SpinnerStyle\n indent?: number\n}\n\n/** Internal task state */\ninterface TaskState extends TaskConfig {\n id: string\n /** Completion time in ms (shown dimmed after title on completion) */\n completionTime?: number\n}\n\n/**\n * MultiProgress - Manage multiple concurrent progress indicators\n *\n * @example\n * ```ts\n * const multi = new MultiProgress();\n *\n * const download = multi.add(\"Downloading files\", { type: \"bar\", total: 100 });\n * const process = multi.add(\"Processing\", { type: \"spinner\" });\n *\n * download.start();\n * download.update(50);\n * download.complete();\n *\n * process.start();\n * process.complete();\n *\n * multi.stop();\n * ```\n */\nexport class MultiProgress {\n private tasks: Map<string, TaskState> = new Map()\n private taskOrder: string[] = []\n private stream: NodeJS.WriteStream\n private isActive = false\n private timer: ReturnType<typeof setInterval> | null = null\n private frameIndex = 0\n private renderedLines = 0\n\n constructor(stream: NodeJS.WriteStream = process.stdout) {\n this.stream = stream\n }\n\n /**\n * Add a new task\n * @param insertAfter - ID of task to insert after (for hierarchical display)\n */\n add(\n title: string,\n options: {\n type?: \"spinner\" | \"bar\" | \"group\"\n total?: number\n spinnerStyle?: SpinnerStyle\n indent?: number\n insertAfter?: string\n } = {},\n ): TaskHandle {\n const id = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n\n const task: TaskState = {\n id,\n title,\n type: options.type ?? \"spinner\",\n status: \"pending\",\n total: options.total,\n current: 0,\n spinnerStyle: options.spinnerStyle ?? \"dots\",\n indent: options.indent ?? 0,\n }\n\n this.tasks.set(id, task)\n\n // Insert after specified task, or append to end\n if (options.insertAfter) {\n const afterIndex = this.taskOrder.indexOf(options.insertAfter)\n if (afterIndex >= 0) {\n this.taskOrder.splice(afterIndex + 1, 0, id)\n } else {\n this.taskOrder.push(id)\n }\n } else {\n this.taskOrder.push(id)\n }\n\n if (this.isActive) {\n this.render()\n }\n\n return new TaskHandle(this, id)\n }\n\n /**\n * Start the multi-progress display\n */\n start(): this {\n if (this.isActive) {\n return this\n }\n\n this.isActive = true\n\n if (isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n\n // Start animation timer\n this.timer = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % 10\n this.render()\n }, 80)\n\n return this\n }\n\n /**\n * Dispose the multi-progress display (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n\n /**\n * Stop the multi-progress display\n * @param clear - If true, clear all task lines from terminal\n */\n stop(clear = false): this {\n if (!this.isActive) {\n return this\n }\n\n this.isActive = false\n\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n\n if (clear && isTTY(this.stream)) {\n // Clear all rendered lines\n if (this.renderedLines > 0) {\n write(cursorUp(this.renderedLines), this.stream)\n for (let i = 0; i < this.renderedLines; i++) {\n write(`${CLEAR_LINE}\\n`, this.stream)\n }\n write(cursorUp(this.renderedLines), this.stream)\n }\n } else {\n // Final render\n this.render()\n write(\"\\n\", this.stream)\n }\n\n if (isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /** @internal Update task state */\n _updateTask(id: string, updates: Partial<TaskState>): void {\n const task = this.tasks.get(id)\n if (task) {\n Object.assign(task, updates)\n // Only render immediately for status changes (complete/fail/etc.)\n // Progress updates (current/total) are debounced by the 80ms animation timer\n if (this.isActive && updates.status) {\n this.render()\n }\n }\n }\n\n /** @internal Get task state */\n _getTask(id: string): TaskState | undefined {\n return this.tasks.get(id)\n }\n\n private render(): void {\n if (!isTTY(this.stream)) {\n return\n }\n\n // Move cursor up to clear previous render\n if (this.renderedLines > 0) {\n write(cursorUp(this.renderedLines), this.stream)\n }\n\n const lines: string[] = []\n\n for (const id of this.taskOrder) {\n const task = this.tasks.get(id)\n if (!task) continue\n\n let icon: string\n if (task.status === \"running\") {\n if (task.type === \"group\") {\n // Groups don't animate - keep pending icon while running\n icon = STATUS_ICONS.pending\n } else {\n const frames = SPINNER_FRAMES[task.spinnerStyle ?? \"dots\"]\n icon = chalk.cyan(frames[this.frameIndex % frames.length])\n }\n } else {\n icon = STATUS_ICONS[task.status]\n }\n\n const indent = \" \".repeat(task.indent ?? 0)\n let line = `${indent}${icon} ${task.title}`\n\n // Add progress bar for bar type\n if (task.type === \"bar\" && task.total && task.total > 0) {\n const percent = task.current! / task.total\n const barWidth = 20\n const filled = Math.round(barWidth * percent)\n const empty = barWidth - filled\n const bar = chalk.cyan(\"█\".repeat(filled)) + chalk.gray(\"░\".repeat(empty))\n line += ` ${bar} ${Math.round(percent * 100)}%`\n }\n\n // Add completion time in dimmed text\n if (task.status === \"completed\" && task.completionTime !== undefined) {\n line += chalk.dim(` ${task.completionTime}ms`)\n }\n\n lines.push(line)\n }\n\n // Clear and write each line\n for (const line of lines) {\n write(`${CLEAR_LINE}${line}\\n`, this.stream)\n }\n\n this.renderedLines = lines.length\n }\n}\n\n/**\n * Handle for controlling an individual task\n */\nclass TaskHandle {\n constructor(\n private multi: MultiProgress,\n private _id: string,\n ) {}\n\n /** Get task ID (for insertAfter) */\n get id(): string {\n return this._id\n }\n\n /** Start the task (set status to running) */\n start(): this {\n this.multi._updateTask(this._id, { status: \"running\" })\n return this\n }\n\n /** Update progress (for bar type) */\n update(current: number): this {\n this.multi._updateTask(this._id, { current })\n return this\n }\n\n /** Mark task as completed */\n complete(titleOrTime?: string | number): this {\n const updates: Partial<TaskState> = { status: \"completed\" }\n if (typeof titleOrTime === \"number\") {\n // Numeric = completion time in ms (preserves current title)\n updates.completionTime = titleOrTime\n } else if (titleOrTime) {\n // String = new title (legacy behavior)\n updates.title = titleOrTime\n }\n this.multi._updateTask(this._id, updates)\n return this\n }\n\n /** Mark task as failed */\n fail(title?: string): this {\n const updates: Partial<TaskState> = { status: \"failed\" }\n if (title) updates.title = title\n this.multi._updateTask(this._id, updates)\n return this\n }\n\n /** Mark task as skipped */\n skip(title?: string): this {\n const updates: Partial<TaskState> = { status: \"skipped\" }\n if (title) updates.title = title\n this.multi._updateTask(this._id, updates)\n return this\n }\n\n /** Update task title */\n setTitle(title: string): this {\n this.multi._updateTask(this._id, { title })\n return this\n }\n\n /** Change task type (e.g., from spinner to group when sub-steps are added) */\n setType(type: \"spinner\" | \"bar\" | \"group\"): this {\n this.multi._updateTask(this._id, { type })\n return this\n }\n\n /** Get current status */\n get status(): TaskStatus {\n return this.multi._getTask(this._id)?.status ?? \"pending\"\n }\n}\n\nexport type { TaskHandle }\n"],"mappings":";;;;;;;AAWA,MAAM,eAA2C;CAC/C,SAAS,MAAM,KAAK,IAAI;CACxB,SAAS;CACT,WAAW,MAAM,MAAM,IAAI;CAC3B,QAAQ,MAAM,IAAI,IAAI;CACtB,SAAS,MAAM,OAAO,IAAI;CAC3B;;;;;;;;;;;;;;;;;;;;;AAwCD,IAAa,gBAAb,MAA2B;CACzB,wBAAwC,IAAI,KAAK;CACjD,YAA8B,EAAE;CAChC;CACA,WAAmB;CACnB,QAAuD;CACvD,aAAqB;CACrB,gBAAwB;CAExB,YAAY,SAA6B,QAAQ,QAAQ;AACvD,OAAK,SAAS;;;;;;CAOhB,IACE,OACA,UAMI,EAAE,EACM;EACZ,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE;EAEvE,MAAM,OAAkB;GACtB;GACA;GACA,MAAM,QAAQ,QAAQ;GACtB,QAAQ;GACR,OAAO,QAAQ;GACf,SAAS;GACT,cAAc,QAAQ,gBAAgB;GACtC,QAAQ,QAAQ,UAAU;GAC3B;AAED,OAAK,MAAM,IAAI,IAAI,KAAK;AAGxB,MAAI,QAAQ,aAAa;GACvB,MAAM,aAAa,KAAK,UAAU,QAAQ,QAAQ,YAAY;AAC9D,OAAI,cAAc,EAChB,MAAK,UAAU,OAAO,aAAa,GAAG,GAAG,GAAG;OAE5C,MAAK,UAAU,KAAK,GAAG;QAGzB,MAAK,UAAU,KAAK,GAAG;AAGzB,MAAI,KAAK,SACP,MAAK,QAAQ;AAGf,SAAO,IAAI,WAAW,MAAM,GAAG;;;;;CAMjC,QAAc;AACZ,MAAI,KAAK,SACP,QAAO;AAGT,OAAK,WAAW;AAEhB,MAAI,MAAM,KAAK,OAAO,CACpB,OAAM,aAAa,KAAK,OAAO;AAGjC,OAAK,QAAQ;AAGb,OAAK,QAAQ,kBAAkB;AAC7B,QAAK,cAAc,KAAK,aAAa,KAAK;AAC1C,QAAK,QAAQ;KACZ,GAAG;AAEN,SAAO;;;;;CAMT,CAAC,OAAO,WAAiB;AACvB,OAAK,MAAM;;;;;;CAOb,KAAK,QAAQ,OAAa;AACxB,MAAI,CAAC,KAAK,SACR,QAAO;AAGT,OAAK,WAAW;AAEhB,MAAI,KAAK,OAAO;AACd,iBAAc,KAAK,MAAM;AACzB,QAAK,QAAQ;;AAGf,MAAI,SAAS,MAAM,KAAK,OAAO;OAEzB,KAAK,gBAAgB,GAAG;AAC1B,UAAM,SAAS,KAAK,cAAc,EAAE,KAAK,OAAO;AAChD,SAAK,IAAI,IAAI,GAAG,IAAI,KAAK,eAAe,IACtC,OAAM,GAAG,WAAW,KAAK,KAAK,OAAO;AAEvC,UAAM,SAAS,KAAK,cAAc,EAAE,KAAK,OAAO;;SAE7C;AAEL,QAAK,QAAQ;AACb,SAAM,MAAM,KAAK,OAAO;;AAG1B,MAAI,MAAM,KAAK,OAAO,CACpB,OAAM,aAAa,KAAK,OAAO;AAGjC,SAAO;;;CAIT,YAAY,IAAY,SAAmC;EACzD,MAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,MAAI,MAAM;AACR,UAAO,OAAO,MAAM,QAAQ;AAG5B,OAAI,KAAK,YAAY,QAAQ,OAC3B,MAAK,QAAQ;;;;CAMnB,SAAS,IAAmC;AAC1C,SAAO,KAAK,MAAM,IAAI,GAAG;;CAG3B,SAAuB;AACrB,MAAI,CAAC,MAAM,KAAK,OAAO,CACrB;AAIF,MAAI,KAAK,gBAAgB,EACvB,OAAM,SAAS,KAAK,cAAc,EAAE,KAAK,OAAO;EAGlD,MAAM,QAAkB,EAAE;AAE1B,OAAK,MAAM,MAAM,KAAK,WAAW;GAC/B,MAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,OAAI,CAAC,KAAM;GAEX,IAAI;AACJ,OAAI,KAAK,WAAW,UAClB,KAAI,KAAK,SAAS,QAEhB,QAAO,aAAa;QACf;IACL,MAAM,SAAS,eAAe,KAAK,gBAAgB;AACnD,WAAO,MAAM,KAAK,OAAO,KAAK,aAAa,OAAO,QAAQ;;OAG5D,QAAO,aAAa,KAAK;GAI3B,IAAI,OAAO,GADI,KAAK,OAAO,KAAK,UAAU,EAAE,GACrB,KAAK,GAAG,KAAK;AAGpC,OAAI,KAAK,SAAS,SAAS,KAAK,SAAS,KAAK,QAAQ,GAAG;IACvD,MAAM,UAAU,KAAK,UAAW,KAAK;IACrC,MAAM,WAAW;IACjB,MAAM,SAAS,KAAK,MAAM,WAAW,QAAQ;IAC7C,MAAM,QAAQ,WAAW;IACzB,MAAM,MAAM,MAAM,KAAK,IAAI,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,OAAO,MAAM,CAAC;AAC1E,YAAQ,IAAI,IAAI,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;;AAI/C,OAAI,KAAK,WAAW,eAAe,KAAK,mBAAmB,KAAA,EACzD,SAAQ,MAAM,IAAI,IAAI,KAAK,eAAe,IAAI;AAGhD,SAAM,KAAK,KAAK;;AAIlB,OAAK,MAAM,QAAQ,MACjB,OAAM,GAAG,aAAa,KAAK,KAAK,KAAK,OAAO;AAG9C,OAAK,gBAAgB,MAAM;;;;;;AAO/B,IAAM,aAAN,MAAiB;CACf,YACE,OACA,KACA;AAFQ,OAAA,QAAA;AACA,OAAA,MAAA;;;CAIV,IAAI,KAAa;AACf,SAAO,KAAK;;;CAId,QAAc;AACZ,OAAK,MAAM,YAAY,KAAK,KAAK,EAAE,QAAQ,WAAW,CAAC;AACvD,SAAO;;;CAIT,OAAO,SAAuB;AAC5B,OAAK,MAAM,YAAY,KAAK,KAAK,EAAE,SAAS,CAAC;AAC7C,SAAO;;;CAIT,SAAS,aAAqC;EAC5C,MAAM,UAA8B,EAAE,QAAQ,aAAa;AAC3D,MAAI,OAAO,gBAAgB,SAEzB,SAAQ,iBAAiB;WAChB,YAET,SAAQ,QAAQ;AAElB,OAAK,MAAM,YAAY,KAAK,KAAK,QAAQ;AACzC,SAAO;;;CAIT,KAAK,OAAsB;EACzB,MAAM,UAA8B,EAAE,QAAQ,UAAU;AACxD,MAAI,MAAO,SAAQ,QAAQ;AAC3B,OAAK,MAAM,YAAY,KAAK,KAAK,QAAQ;AACzC,SAAO;;;CAIT,KAAK,OAAsB;EACzB,MAAM,UAA8B,EAAE,QAAQ,WAAW;AACzD,MAAI,MAAO,SAAQ,QAAQ;AAC3B,OAAK,MAAM,YAAY,KAAK,KAAK,QAAQ;AACzC,SAAO;;;CAIT,SAAS,OAAqB;AAC5B,OAAK,MAAM,YAAY,KAAK,KAAK,EAAE,OAAO,CAAC;AAC3C,SAAO;;;CAIT,QAAQ,MAAyC;AAC/C,OAAK,MAAM,YAAY,KAAK,KAAK,EAAE,MAAM,CAAC;AAC1C,SAAO;;;CAIT,IAAI,SAAqB;AACvB,SAAO,KAAK,MAAM,SAAS,KAAK,IAAI,EAAE,UAAU"}