@sundaeswap/sprinkles 0.6.1 → 0.8.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 (197) hide show
  1. package/README.md +178 -181
  2. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js +590 -0
  3. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  4. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js +193 -0
  5. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  6. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js +304 -0
  7. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  8. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +1110 -0
  9. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  10. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +744 -0
  11. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  12. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
  13. package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  14. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +711 -0
  15. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  16. package/dist/cjs/Sprinkle/__tests__/native-script.test.js +390 -0
  17. package/dist/cjs/Sprinkle/__tests__/native-script.test.js.map +1 -0
  18. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js +334 -0
  19. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  20. package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js +367 -0
  21. package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
  22. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js +749 -0
  23. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  24. package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js +164 -0
  25. package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
  26. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js +61 -0
  27. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  28. package/dist/cjs/Sprinkle/actions/builtin/index.js +174 -0
  29. package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -0
  30. package/dist/cjs/Sprinkle/actions/builtin/native-script.js +139 -0
  31. package/dist/cjs/Sprinkle/actions/builtin/native-script.js.map +1 -0
  32. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js +202 -0
  33. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  34. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js +87 -0
  35. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  36. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js +345 -0
  37. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  38. package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js +218 -0
  39. package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
  40. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js +212 -0
  41. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  42. package/dist/cjs/Sprinkle/actions/cli-adapter.js +390 -0
  43. package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -0
  44. package/dist/cjs/Sprinkle/actions/index.js +139 -0
  45. package/dist/cjs/Sprinkle/actions/index.js.map +1 -0
  46. package/dist/cjs/Sprinkle/actions/mcp-adapter.js +557 -0
  47. package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -0
  48. package/dist/cjs/Sprinkle/actions/registry.js +92 -0
  49. package/dist/cjs/Sprinkle/actions/registry.js.map +1 -0
  50. package/dist/cjs/Sprinkle/actions/runner.js +190 -0
  51. package/dist/cjs/Sprinkle/actions/runner.js.map +1 -0
  52. package/dist/cjs/Sprinkle/actions/tui-helpers.js +96 -0
  53. package/dist/cjs/Sprinkle/actions/tui-helpers.js.map +1 -0
  54. package/dist/cjs/Sprinkle/actions/types.js +68 -0
  55. package/dist/cjs/Sprinkle/actions/types.js.map +1 -0
  56. package/dist/cjs/Sprinkle/index.js +678 -5
  57. package/dist/cjs/Sprinkle/index.js.map +1 -1
  58. package/dist/cjs/Sprinkle/prompts.js +12 -7
  59. package/dist/cjs/Sprinkle/prompts.js.map +1 -1
  60. package/dist/cjs/Sprinkle/schemas.js +17 -1
  61. package/dist/cjs/Sprinkle/schemas.js.map +1 -1
  62. package/dist/cjs/Sprinkle/type-guards.js +7 -1
  63. package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
  64. package/dist/esm/Sprinkle/__tests__/action-integration.test.js +588 -0
  65. package/dist/esm/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  66. package/dist/esm/Sprinkle/__tests__/action-registry.test.js +192 -0
  67. package/dist/esm/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  68. package/dist/esm/Sprinkle/__tests__/action-runner.test.js +302 -0
  69. package/dist/esm/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  70. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +1107 -0
  71. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  72. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +742 -0
  73. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  74. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
  75. package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
  76. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +710 -0
  77. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  78. package/dist/esm/Sprinkle/__tests__/native-script.test.js +388 -0
  79. package/dist/esm/Sprinkle/__tests__/native-script.test.js.map +1 -0
  80. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js +332 -0
  81. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  82. package/dist/esm/Sprinkle/__tests__/utility-actions.test.js +365 -0
  83. package/dist/esm/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
  84. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js +747 -0
  85. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  86. package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js +159 -0
  87. package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
  88. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js +55 -0
  89. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  90. package/dist/esm/Sprinkle/actions/builtin/index.js +37 -0
  91. package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -0
  92. package/dist/esm/Sprinkle/actions/builtin/native-script.js +133 -0
  93. package/dist/esm/Sprinkle/actions/builtin/native-script.js.map +1 -0
  94. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js +197 -0
  95. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  96. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js +81 -0
  97. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  98. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js +340 -0
  99. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  100. package/dist/esm/Sprinkle/actions/builtin/utility-actions.js +213 -0
  101. package/dist/esm/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
  102. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js +207 -0
  103. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  104. package/dist/esm/Sprinkle/actions/cli-adapter.js +379 -0
  105. package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -0
  106. package/dist/esm/Sprinkle/actions/index.js +12 -0
  107. package/dist/esm/Sprinkle/actions/index.js.map +1 -0
  108. package/dist/esm/Sprinkle/actions/mcp-adapter.js +547 -0
  109. package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -0
  110. package/dist/esm/Sprinkle/actions/registry.js +85 -0
  111. package/dist/esm/Sprinkle/actions/registry.js.map +1 -0
  112. package/dist/esm/Sprinkle/actions/runner.js +182 -0
  113. package/dist/esm/Sprinkle/actions/runner.js.map +1 -0
  114. package/dist/esm/Sprinkle/actions/tui-helpers.js +91 -0
  115. package/dist/esm/Sprinkle/actions/tui-helpers.js.map +1 -0
  116. package/dist/esm/Sprinkle/actions/types.js +61 -0
  117. package/dist/esm/Sprinkle/actions/types.js.map +1 -0
  118. package/dist/esm/Sprinkle/index.js +517 -7
  119. package/dist/esm/Sprinkle/index.js.map +1 -1
  120. package/dist/esm/Sprinkle/prompts.js +12 -7
  121. package/dist/esm/Sprinkle/prompts.js.map +1 -1
  122. package/dist/esm/Sprinkle/schemas.js +16 -0
  123. package/dist/esm/Sprinkle/schemas.js.map +1 -1
  124. package/dist/esm/Sprinkle/type-guards.js +3 -0
  125. package/dist/esm/Sprinkle/type-guards.js.map +1 -1
  126. package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts +50 -0
  127. package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts.map +1 -0
  128. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts +39 -0
  129. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts.map +1 -0
  130. package/dist/types/Sprinkle/actions/builtin/index.d.ts +30 -0
  131. package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -0
  132. package/dist/types/Sprinkle/actions/builtin/native-script.d.ts +27 -0
  133. package/dist/types/Sprinkle/actions/builtin/native-script.d.ts.map +1 -0
  134. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts +55 -0
  135. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts.map +1 -0
  136. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts +32 -0
  137. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts.map +1 -0
  138. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts +70 -0
  139. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts.map +1 -0
  140. package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts +48 -0
  141. package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts.map +1 -0
  142. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts +50 -0
  143. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts.map +1 -0
  144. package/dist/types/Sprinkle/actions/cli-adapter.d.ts +104 -0
  145. package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -0
  146. package/dist/types/Sprinkle/actions/index.d.ts +13 -0
  147. package/dist/types/Sprinkle/actions/index.d.ts.map +1 -0
  148. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +116 -0
  149. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -0
  150. package/dist/types/Sprinkle/actions/registry.d.ts +42 -0
  151. package/dist/types/Sprinkle/actions/registry.d.ts.map +1 -0
  152. package/dist/types/Sprinkle/actions/runner.d.ts +45 -0
  153. package/dist/types/Sprinkle/actions/runner.d.ts.map +1 -0
  154. package/dist/types/Sprinkle/actions/tui-helpers.d.ts +53 -0
  155. package/dist/types/Sprinkle/actions/tui-helpers.d.ts.map +1 -0
  156. package/dist/types/Sprinkle/actions/types.d.ts +76 -0
  157. package/dist/types/Sprinkle/actions/types.d.ts.map +1 -0
  158. package/dist/types/Sprinkle/index.d.ts +84 -2
  159. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  160. package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
  161. package/dist/types/Sprinkle/schemas.d.ts +72 -0
  162. package/dist/types/Sprinkle/schemas.d.ts.map +1 -1
  163. package/dist/types/Sprinkle/type-guards.d.ts +4 -1
  164. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
  165. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  166. package/package.json +9 -2
  167. package/src/Sprinkle/__tests__/action-integration.test.ts +558 -0
  168. package/src/Sprinkle/__tests__/action-registry.test.ts +187 -0
  169. package/src/Sprinkle/__tests__/action-runner.test.ts +324 -0
  170. package/src/Sprinkle/__tests__/builtin-actions.test.ts +1022 -0
  171. package/src/Sprinkle/__tests__/cli-adapter.test.ts +736 -0
  172. package/src/Sprinkle/__tests__/fill-in-struct.test.ts +23 -1
  173. package/src/Sprinkle/__tests__/mcp-adapter.test.ts +720 -0
  174. package/src/Sprinkle/__tests__/native-script.test.ts +341 -0
  175. package/src/Sprinkle/__tests__/tui-helpers.test.ts +325 -0
  176. package/src/Sprinkle/__tests__/utility-actions.test.ts +348 -0
  177. package/src/Sprinkle/__tests__/wallet-transaction-actions.test.ts +695 -0
  178. package/src/Sprinkle/actions/builtin/addressbook-actions.ts +168 -0
  179. package/src/Sprinkle/actions/builtin/blaze-helper.ts +89 -0
  180. package/src/Sprinkle/actions/builtin/index.ts +125 -0
  181. package/src/Sprinkle/actions/builtin/native-script.ts +165 -0
  182. package/src/Sprinkle/actions/builtin/profile-actions.ts +229 -0
  183. package/src/Sprinkle/actions/builtin/settings-actions.ts +99 -0
  184. package/src/Sprinkle/actions/builtin/transaction-actions.ts +381 -0
  185. package/src/Sprinkle/actions/builtin/utility-actions.ts +285 -0
  186. package/src/Sprinkle/actions/builtin/wallet-actions.ts +233 -0
  187. package/src/Sprinkle/actions/cli-adapter.ts +446 -0
  188. package/src/Sprinkle/actions/index.ts +33 -0
  189. package/src/Sprinkle/actions/mcp-adapter.ts +638 -0
  190. package/src/Sprinkle/actions/registry.ts +97 -0
  191. package/src/Sprinkle/actions/runner.ts +200 -0
  192. package/src/Sprinkle/actions/tui-helpers.ts +114 -0
  193. package/src/Sprinkle/actions/types.ts +91 -0
  194. package/src/Sprinkle/index.ts +612 -3
  195. package/src/Sprinkle/prompts.ts +118 -72
  196. package/src/Sprinkle/schemas.ts +20 -0
  197. package/src/Sprinkle/type-guards.ts +9 -0
@@ -0,0 +1,379 @@
1
+ /**
2
+ * CLI adapter for Sprinkles actions.
3
+ *
4
+ * Provides:
5
+ * - Case-conversion helpers (camelToKebab / kebabToCamel)
6
+ * - Schema-driven type coercion (coerceValue / parseArgvWithSchema)
7
+ * - Help text generation (generateActionHelp / generateAppHelp)
8
+ * - CLI orchestrator (runCli)
9
+ */
10
+
11
+ import { bigIntReplacer } from "../encryption.js";
12
+ import { isArray, isBigInt, isBoolean, isInteger, isNumber, isObject, isString, isUnion, hasDefault, getDefault } from "../type-guards.js";
13
+ import { executeAction } from "./runner.js";
14
+
15
+ // Re-import Sprinkle as a type only to avoid circular deps
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Case conversion helpers
19
+ // ---------------------------------------------------------------------------
20
+
21
+ /**
22
+ * Convert a camelCase string to kebab-case.
23
+ * Examples:
24
+ * "myFlagName" -> "my-flag-name"
25
+ * "getBalance" -> "get-balance"
26
+ * "URL" -> "u-r-l" (each uppercase letter gets a dash)
27
+ */
28
+ export function camelToKebab(str) {
29
+ if (!str) return str;
30
+ return str.replace(/([A-Z])/g, match => `-${match.toLowerCase()}`).replace(/^-/, "");
31
+ }
32
+
33
+ /**
34
+ * Convert a kebab-case string to camelCase.
35
+ * Examples:
36
+ * "my-flag-name" -> "myFlagName"
37
+ * "get-balance" -> "getBalance"
38
+ */
39
+ export function kebabToCamel(str) {
40
+ if (!str) return str;
41
+ return str.replace(/-([a-z0-9])/g, (_, char) => char.toUpperCase());
42
+ }
43
+
44
+ // ---------------------------------------------------------------------------
45
+ // Schema-driven type coercion
46
+ // ---------------------------------------------------------------------------
47
+
48
+ /**
49
+ * Coerce a raw CLI string value to the type expected by a TypeBox schema.
50
+ *
51
+ * Handles:
52
+ * - Number / Integer: parseFloat / parseInt
53
+ * - Boolean: "true"/"false" strings, or passthrough if already boolean
54
+ * - BigInt: BigInt() constructor
55
+ * - Array: already-array passthrough; single value wrapped in array
56
+ * - Object: JSON string parse
57
+ * - String: passthrough
58
+ * - Optional: unwrap and recurse on inner schema
59
+ * - Union: passthrough (caller should supply JSON; no schema-level heuristics)
60
+ */
61
+ export function coerceValue(raw, schema) {
62
+ // Note: TypeBox Optional<T> adds an [OptionalKind] marker but does not
63
+ // change the schema Kind. The guards below work correctly on Optional types.
64
+
65
+ // If the raw value is null or undefined, return as-is
66
+ if (raw === null || raw === undefined) return raw;
67
+ if (isNumber(schema)) {
68
+ if (typeof raw === "number") return raw;
69
+ if (typeof raw === "string") {
70
+ const n = parseFloat(raw);
71
+ return isNaN(n) ? raw : n;
72
+ }
73
+ return raw;
74
+ }
75
+ if (isInteger(schema)) {
76
+ if (typeof raw === "number") return Math.trunc(raw);
77
+ if (typeof raw === "string") {
78
+ const n = parseInt(raw, 10);
79
+ return isNaN(n) ? raw : n;
80
+ }
81
+ return raw;
82
+ }
83
+ if (isBoolean(schema)) {
84
+ if (typeof raw === "boolean") return raw;
85
+ if (raw === "true") return true;
86
+ if (raw === "false") return false;
87
+ return raw;
88
+ }
89
+ if (isBigInt(schema)) {
90
+ if (typeof raw === "bigint") return raw;
91
+ if (typeof raw === "string" || typeof raw === "number") {
92
+ try {
93
+ return BigInt(raw);
94
+ } catch {
95
+ return raw;
96
+ }
97
+ }
98
+ return raw;
99
+ }
100
+ if (isArray(schema)) {
101
+ const itemSchema = schema.items;
102
+ if (Array.isArray(raw)) {
103
+ if (itemSchema) {
104
+ return raw.map(item => coerceValue(item, itemSchema));
105
+ }
106
+ return raw;
107
+ }
108
+ // Single value: wrap in array
109
+ const singleValue = itemSchema ? coerceValue(raw, itemSchema) : raw;
110
+ return [singleValue];
111
+ }
112
+ if (isObject(schema)) {
113
+ let obj = raw;
114
+ // If it's a JSON string, parse it
115
+ if (typeof raw === "string") {
116
+ const trimmed = raw.trim();
117
+ if (trimmed.startsWith("{")) {
118
+ try {
119
+ obj = JSON.parse(trimmed);
120
+ } catch {
121
+ return raw;
122
+ }
123
+ } else {
124
+ return raw;
125
+ }
126
+ }
127
+ // Recurse into properties to coerce nested values
128
+ if (typeof obj === "object" && obj !== null && !Array.isArray(obj)) {
129
+ const props = schema.properties;
130
+ if (props) {
131
+ const result = {
132
+ ...obj
133
+ };
134
+ for (const [key, propSchema] of Object.entries(props)) {
135
+ if (key in result) {
136
+ result[key] = coerceValue(result[key], propSchema);
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ }
142
+ return obj;
143
+ }
144
+ if (isString(schema)) {
145
+ if (typeof raw === "string") return raw;
146
+ return String(raw);
147
+ }
148
+
149
+ // Union / unknown / other: return as-is (caller provides JSON)
150
+ return raw;
151
+ }
152
+
153
+ /**
154
+ * Walk a TypeBox object schema and coerce each property value from raw CLI args.
155
+ *
156
+ * - Handles kebab-case -> camelCase property name mapping
157
+ * - Applies coerceValue for each property
158
+ * - Applies TypeBox defaults for omitted optional fields
159
+ *
160
+ * @param rawArgs - Key/value record from parseCliArgs (keys may be kebab-case)
161
+ * @param schema - A TypeBox TObject schema
162
+ * @returns A new record with coerced values
163
+ */
164
+ export function parseArgvWithSchema(rawArgs, schema) {
165
+ if (!isObject(schema)) {
166
+ // Non-object schema: return args as-is (best-effort)
167
+ return rawArgs;
168
+ }
169
+ const result = {};
170
+ const properties = schema.properties;
171
+ for (const [propName, propSchema] of Object.entries(properties)) {
172
+ // Look up both camelCase and kebab-case versions in rawArgs
173
+ const kebabName = camelToKebab(propName);
174
+ let rawValue = undefined;
175
+ if (propName in rawArgs) {
176
+ rawValue = rawArgs[propName];
177
+ } else if (kebabName !== propName && kebabName in rawArgs) {
178
+ rawValue = rawArgs[kebabName];
179
+ }
180
+ if (rawValue === undefined) {
181
+ // Apply default if defined on schema
182
+ if (hasDefault(propSchema)) {
183
+ result[propName] = getDefault(propSchema);
184
+ }
185
+ // Else omit: Value.Check will handle required/optional enforcement
186
+ continue;
187
+ }
188
+ result[propName] = coerceValue(rawValue, propSchema);
189
+ }
190
+ return result;
191
+ }
192
+
193
+ // ---------------------------------------------------------------------------
194
+ // Help text generation
195
+ // ---------------------------------------------------------------------------
196
+
197
+ /**
198
+ * Describe a single TypeBox schema in a human-readable CLI type label.
199
+ */
200
+ function describeType(schema) {
201
+ // Note: isOptional() only checks the OptionalKind marker; the other guards
202
+ // still work correctly on Optional-wrapped schemas.
203
+ if (isString(schema)) return "<string>";
204
+ if (isNumber(schema)) return "<number>";
205
+ if (isInteger(schema)) return "<integer>";
206
+ if (isBoolean(schema)) return "<boolean>";
207
+ if (isBigInt(schema)) return "<bigint>";
208
+ if (isArray(schema)) {
209
+ const itemSchema = schema.items;
210
+ const itemType = itemSchema ? describeType(itemSchema) : "<value>";
211
+ return `${itemType}... (repeatable)`;
212
+ }
213
+ if (isObject(schema)) return "<json>";
214
+ if (isUnion(schema)) return "<json>";
215
+ return "<value>";
216
+ }
217
+
218
+ /**
219
+ * Generate action-specific help text.
220
+ *
221
+ * Format:
222
+ * ```
223
+ * Usage: <appName> <action-name> [options]
224
+ *
225
+ * Description
226
+ *
227
+ * Options:
228
+ * --flag-name <type> Description [default: x] (required/optional)
229
+ * ...
230
+ * ```
231
+ */
232
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
+ export function generateActionHelp(action, appName) {
234
+ const app = appName ?? "app";
235
+ const lines = [`Usage: ${app} ${action.name} [options]`, "", action.description, "", "Options:"];
236
+ const schema = action.inputSchema;
237
+ if (isObject(schema)) {
238
+ const properties = schema.properties;
239
+ const required = schema.required ?? [];
240
+ for (const [propName, propSchema] of Object.entries(properties)) {
241
+ const flagName = camelToKebab(propName);
242
+ const typeLabel = describeType(propSchema);
243
+ const isReq = required.includes(propName);
244
+ const defaultVal = hasDefault(propSchema) ? getDefault(propSchema) : undefined;
245
+ const description = propSchema.description ?? "";
246
+ const requiredLabel = isReq ? "(required)" : "(optional)";
247
+ const defaultLabel = defaultVal !== undefined ? ` [default: ${String(defaultVal)}]` : "";
248
+ const descPart = description ? ` ${description}` : "";
249
+ lines.push(` --${flagName} ${typeLabel}${descPart}${defaultLabel} ${requiredLabel}`);
250
+ }
251
+ }
252
+ lines.push("");
253
+ lines.push(" --help Show this help message");
254
+ return lines.join("\n");
255
+ }
256
+
257
+ /**
258
+ * Generate application-level help listing all registered actions.
259
+ *
260
+ * Format:
261
+ * ```
262
+ * Usage: <appName> <action> [options]
263
+ *
264
+ * Available actions:
265
+ *
266
+ * category:
267
+ * action-name Description
268
+ *
269
+ * Global options:
270
+ * --help Show this help message
271
+ * --profile <n> Use profile by name
272
+ * ```
273
+ */
274
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
275
+ export function generateAppHelp(
276
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
277
+ actions, appName) {
278
+ const app = appName ?? "app";
279
+ const lines = [`Usage: ${app} <action> [options]`, ""];
280
+ if (actions.length === 0) {
281
+ lines.push("No actions registered.");
282
+ } else {
283
+ lines.push("Available actions:");
284
+
285
+ // Group by category
286
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
287
+ const byCategory = new Map();
288
+ for (const action of actions) {
289
+ const cat = action.category ?? "default";
290
+ const bucket = byCategory.get(cat);
291
+ if (bucket) {
292
+ bucket.push(action);
293
+ } else {
294
+ byCategory.set(cat, [action]);
295
+ }
296
+ }
297
+ for (const [category, categoryActions] of byCategory) {
298
+ if (category !== "default") {
299
+ lines.push("");
300
+ lines.push(` ${category}:`);
301
+ }
302
+ for (const action of categoryActions) {
303
+ lines.push(` ${action.name.padEnd(30)} ${action.description}`);
304
+ }
305
+ }
306
+ }
307
+ lines.push("");
308
+ lines.push("Global options:");
309
+ lines.push(" --help Show this help message");
310
+ lines.push(" --profile <n> Use profile by name");
311
+ return lines.join("\n");
312
+ }
313
+
314
+ // ---------------------------------------------------------------------------
315
+ // CLI orchestrator
316
+ // ---------------------------------------------------------------------------
317
+
318
+ /**
319
+ * Run an action from CLI arguments, writing JSON output to stdout/stderr.
320
+ *
321
+ * Handles:
322
+ * - Action not found: JSON error to stderr, process.exit(1)
323
+ * - Action help (`--help` in rawArgs): prints action help to stdout
324
+ * - Schema-driven argument coercion via parseArgvWithSchema
325
+ * - Success: `{"success":true,"data":...}` JSON to stdout
326
+ * - Failure: `{"success":false,"error":...}` JSON to stderr, process.exit(1)
327
+ *
328
+ * @param sprinkle - Fully-initialized Sprinkle instance
329
+ * @param actionName - The action to invoke
330
+ * @param rawArgs - Pre-parsed key/value args from parseCliArgs (profile already removed)
331
+ * @param context - The action execution context
332
+ * @param appName - Optional app name for help text
333
+ */
334
+ export async function runCli(sprinkle, actionName, rawArgs, context, appName) {
335
+ const action = sprinkle.getAction(actionName);
336
+ if (!action) {
337
+ const available = sprinkle.listActions().map(a => a.name).join(", ");
338
+ const errorOutput = JSON.stringify({
339
+ success: false,
340
+ error: {
341
+ code: "ACTION_NOT_FOUND",
342
+ message: `Action "${actionName}" not found. Available actions: ${available || "(none)"}`
343
+ }
344
+ }, bigIntReplacer);
345
+ console.error(errorOutput);
346
+ process.exit(1);
347
+ }
348
+
349
+ // Handle --help flag for action-specific help
350
+ if (rawArgs["help"] === true) {
351
+ console.log(generateActionHelp(action, appName));
352
+ return;
353
+ }
354
+
355
+ // Coerce raw string args using the action's input schema
356
+ const coercedInput = parseArgvWithSchema(rawArgs, action.inputSchema);
357
+
358
+ // Execute and output result
359
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
360
+ const result = await executeAction(action, coercedInput, context);
361
+ if (result.success) {
362
+ console.log(JSON.stringify({
363
+ success: true,
364
+ data: result.data
365
+ }, bigIntReplacer));
366
+ } else {
367
+ const errorOutput = JSON.stringify({
368
+ success: false,
369
+ error: {
370
+ code: result.error.code,
371
+ message: result.error.message,
372
+ details: result.error.details
373
+ }
374
+ }, bigIntReplacer);
375
+ console.error(errorOutput);
376
+ process.exit(1);
377
+ }
378
+ }
379
+ //# sourceMappingURL=cli-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-adapter.js","names":["bigIntReplacer","isArray","isBigInt","isBoolean","isInteger","isNumber","isObject","isString","isUnion","hasDefault","getDefault","executeAction","camelToKebab","str","replace","match","toLowerCase","kebabToCamel","_","char","toUpperCase","coerceValue","raw","schema","undefined","n","parseFloat","isNaN","Math","trunc","parseInt","BigInt","itemSchema","items","Array","map","item","singleValue","obj","trimmed","trim","startsWith","JSON","parse","props","properties","result","key","propSchema","Object","entries","String","parseArgvWithSchema","rawArgs","propName","kebabName","rawValue","describeType","itemType","generateActionHelp","action","appName","app","lines","name","description","inputSchema","required","flagName","typeLabel","isReq","includes","defaultVal","requiredLabel","defaultLabel","descPart","push","join","generateAppHelp","actions","length","byCategory","Map","cat","category","bucket","get","set","categoryActions","padEnd","runCli","sprinkle","actionName","context","getAction","available","listActions","a","errorOutput","stringify","success","error","code","message","console","process","exit","log","coercedInput","data","details"],"sources":["../../../../src/Sprinkle/actions/cli-adapter.ts"],"sourcesContent":["/**\n * CLI adapter for Sprinkles actions.\n *\n * Provides:\n * - Case-conversion helpers (camelToKebab / kebabToCamel)\n * - Schema-driven type coercion (coerceValue / parseArgvWithSchema)\n * - Help text generation (generateActionHelp / generateAppHelp)\n * - CLI orchestrator (runCli)\n */\n\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { bigIntReplacer } from \"../encryption.js\";\nimport {\n isArray,\n isBigInt,\n isBoolean,\n isInteger,\n isNumber,\n isObject,\n isString,\n isUnion,\n hasDefault,\n getDefault,\n} from \"../type-guards.js\";\nimport type { AnyAction, IActionContext } from \"./types.js\";\nimport { executeAction } from \"./runner.js\";\n\n// Re-import Sprinkle as a type only to avoid circular deps\nimport type { Sprinkle } from \"../index.js\";\n\n// ---------------------------------------------------------------------------\n// Case conversion helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a camelCase string to kebab-case.\n * Examples:\n * \"myFlagName\" -> \"my-flag-name\"\n * \"getBalance\" -> \"get-balance\"\n * \"URL\" -> \"u-r-l\" (each uppercase letter gets a dash)\n */\nexport function camelToKebab(str: string): string {\n if (!str) return str;\n return str\n .replace(/([A-Z])/g, (match) => `-${match.toLowerCase()}`)\n .replace(/^-/, \"\");\n}\n\n/**\n * Convert a kebab-case string to camelCase.\n * Examples:\n * \"my-flag-name\" -> \"myFlagName\"\n * \"get-balance\" -> \"getBalance\"\n */\nexport function kebabToCamel(str: string): string {\n if (!str) return str;\n return str.replace(/-([a-z0-9])/g, (_, char: string) => char.toUpperCase());\n}\n\n// ---------------------------------------------------------------------------\n// Schema-driven type coercion\n// ---------------------------------------------------------------------------\n\n/**\n * Coerce a raw CLI string value to the type expected by a TypeBox schema.\n *\n * Handles:\n * - Number / Integer: parseFloat / parseInt\n * - Boolean: \"true\"/\"false\" strings, or passthrough if already boolean\n * - BigInt: BigInt() constructor\n * - Array: already-array passthrough; single value wrapped in array\n * - Object: JSON string parse\n * - String: passthrough\n * - Optional: unwrap and recurse on inner schema\n * - Union: passthrough (caller should supply JSON; no schema-level heuristics)\n */\nexport function coerceValue(raw: unknown, schema: TSchema): unknown {\n // Note: TypeBox Optional<T> adds an [OptionalKind] marker but does not\n // change the schema Kind. The guards below work correctly on Optional types.\n\n // If the raw value is null or undefined, return as-is\n if (raw === null || raw === undefined) return raw;\n\n if (isNumber(schema)) {\n if (typeof raw === \"number\") return raw;\n if (typeof raw === \"string\") {\n const n = parseFloat(raw);\n return isNaN(n) ? raw : n;\n }\n return raw;\n }\n\n if (isInteger(schema)) {\n if (typeof raw === \"number\") return Math.trunc(raw);\n if (typeof raw === \"string\") {\n const n = parseInt(raw, 10);\n return isNaN(n) ? raw : n;\n }\n return raw;\n }\n\n if (isBoolean(schema)) {\n if (typeof raw === \"boolean\") return raw;\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n return raw;\n }\n\n if (isBigInt(schema)) {\n if (typeof raw === \"bigint\") return raw;\n if (typeof raw === \"string\" || typeof raw === \"number\") {\n try {\n return BigInt(raw);\n } catch {\n return raw;\n }\n }\n return raw;\n }\n\n if (isArray(schema)) {\n const itemSchema = (schema as { items?: TSchema }).items;\n if (Array.isArray(raw)) {\n if (itemSchema) {\n return raw.map((item) => coerceValue(item, itemSchema));\n }\n return raw;\n }\n // Single value: wrap in array\n const singleValue = itemSchema ? coerceValue(raw, itemSchema) : raw;\n return [singleValue];\n }\n\n if (isObject(schema)) {\n let obj = raw;\n // If it's a JSON string, parse it\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n if (trimmed.startsWith(\"{\")) {\n try {\n obj = JSON.parse(trimmed);\n } catch {\n return raw;\n }\n } else {\n return raw;\n }\n }\n // Recurse into properties to coerce nested values\n if (typeof obj === \"object\" && obj !== null && !Array.isArray(obj)) {\n const props = schema.properties as Record<string, TSchema> | undefined;\n if (props) {\n const result: Record<string, unknown> = { ...(obj as Record<string, unknown>) };\n for (const [key, propSchema] of Object.entries(props)) {\n if (key in result) {\n result[key] = coerceValue(result[key], propSchema);\n }\n }\n return result;\n }\n }\n return obj;\n }\n\n if (isString(schema)) {\n if (typeof raw === \"string\") return raw;\n return String(raw);\n }\n\n // Union / unknown / other: return as-is (caller provides JSON)\n return raw;\n}\n\n/**\n * Walk a TypeBox object schema and coerce each property value from raw CLI args.\n *\n * - Handles kebab-case -> camelCase property name mapping\n * - Applies coerceValue for each property\n * - Applies TypeBox defaults for omitted optional fields\n *\n * @param rawArgs - Key/value record from parseCliArgs (keys may be kebab-case)\n * @param schema - A TypeBox TObject schema\n * @returns A new record with coerced values\n */\nexport function parseArgvWithSchema(\n rawArgs: Record<string, unknown>,\n schema: TSchema,\n): Record<string, unknown> {\n if (!isObject(schema)) {\n // Non-object schema: return args as-is (best-effort)\n return rawArgs;\n }\n\n const result: Record<string, unknown> = {};\n const properties = schema.properties as Record<string, TSchema>;\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n // Look up both camelCase and kebab-case versions in rawArgs\n const kebabName = camelToKebab(propName);\n\n let rawValue: unknown = undefined;\n if (propName in rawArgs) {\n rawValue = rawArgs[propName];\n } else if (kebabName !== propName && kebabName in rawArgs) {\n rawValue = rawArgs[kebabName];\n }\n\n if (rawValue === undefined) {\n // Apply default if defined on schema\n if (hasDefault(propSchema)) {\n result[propName] = getDefault(propSchema);\n }\n // Else omit: Value.Check will handle required/optional enforcement\n continue;\n }\n\n result[propName] = coerceValue(rawValue, propSchema);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Help text generation\n// ---------------------------------------------------------------------------\n\n/**\n * Describe a single TypeBox schema in a human-readable CLI type label.\n */\nfunction describeType(schema: TSchema): string {\n // Note: isOptional() only checks the OptionalKind marker; the other guards\n // still work correctly on Optional-wrapped schemas.\n if (isString(schema)) return \"<string>\";\n if (isNumber(schema)) return \"<number>\";\n if (isInteger(schema)) return \"<integer>\";\n if (isBoolean(schema)) return \"<boolean>\";\n if (isBigInt(schema)) return \"<bigint>\";\n if (isArray(schema)) {\n const itemSchema = (schema as { items?: TSchema }).items;\n const itemType = itemSchema ? describeType(itemSchema) : \"<value>\";\n return `${itemType}... (repeatable)`;\n }\n if (isObject(schema)) return \"<json>\";\n if (isUnion(schema)) return \"<json>\";\n return \"<value>\";\n}\n\n/**\n * Generate action-specific help text.\n *\n * Format:\n * ```\n * Usage: <appName> <action-name> [options]\n *\n * Description\n *\n * Options:\n * --flag-name <type> Description [default: x] (required/optional)\n * ...\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generateActionHelp(\n action: AnyAction<any>,\n appName?: string,\n): string {\n const app = appName ?? \"app\";\n const lines: string[] = [\n `Usage: ${app} ${action.name} [options]`,\n \"\",\n action.description,\n \"\",\n \"Options:\",\n ];\n\n const schema = action.inputSchema;\n if (isObject(schema)) {\n const properties = schema.properties as Record<string, TSchema>;\n const required = (schema.required as string[] | undefined) ?? [];\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const flagName = camelToKebab(propName);\n const typeLabel = describeType(propSchema);\n const isReq = required.includes(propName);\n const defaultVal = hasDefault(propSchema) ? getDefault(propSchema) : undefined;\n const description = (propSchema as { description?: string }).description ?? \"\";\n\n const requiredLabel = isReq ? \"(required)\" : \"(optional)\";\n const defaultLabel =\n defaultVal !== undefined ? ` [default: ${String(defaultVal)}]` : \"\";\n\n const descPart = description ? ` ${description}` : \"\";\n lines.push(\n ` --${flagName} ${typeLabel}${descPart}${defaultLabel} ${requiredLabel}`,\n );\n }\n }\n\n lines.push(\"\");\n lines.push(\" --help Show this help message\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate application-level help listing all registered actions.\n *\n * Format:\n * ```\n * Usage: <appName> <action> [options]\n *\n * Available actions:\n *\n * category:\n * action-name Description\n *\n * Global options:\n * --help Show this help message\n * --profile <n> Use profile by name\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function generateAppHelp(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions: AnyAction<any>[],\n appName?: string,\n): string {\n const app = appName ?? \"app\";\n const lines: string[] = [`Usage: ${app} <action> [options]`, \"\"];\n\n if (actions.length === 0) {\n lines.push(\"No actions registered.\");\n } else {\n lines.push(\"Available actions:\");\n\n // Group by category\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const byCategory = new Map<string, AnyAction<any>[]>();\n for (const action of actions) {\n const cat = action.category ?? \"default\";\n const bucket = byCategory.get(cat);\n if (bucket) {\n bucket.push(action);\n } else {\n byCategory.set(cat, [action]);\n }\n }\n\n for (const [category, categoryActions] of byCategory) {\n if (category !== \"default\") {\n lines.push(\"\");\n lines.push(` ${category}:`);\n }\n for (const action of categoryActions) {\n lines.push(` ${action.name.padEnd(30)} ${action.description}`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\"Global options:\");\n lines.push(\" --help Show this help message\");\n lines.push(\" --profile <n> Use profile by name\");\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI orchestrator\n// ---------------------------------------------------------------------------\n\n/**\n * Run an action from CLI arguments, writing JSON output to stdout/stderr.\n *\n * Handles:\n * - Action not found: JSON error to stderr, process.exit(1)\n * - Action help (`--help` in rawArgs): prints action help to stdout\n * - Schema-driven argument coercion via parseArgvWithSchema\n * - Success: `{\"success\":true,\"data\":...}` JSON to stdout\n * - Failure: `{\"success\":false,\"error\":...}` JSON to stderr, process.exit(1)\n *\n * @param sprinkle - Fully-initialized Sprinkle instance\n * @param actionName - The action to invoke\n * @param rawArgs - Pre-parsed key/value args from parseCliArgs (profile already removed)\n * @param context - The action execution context\n * @param appName - Optional app name for help text\n */\nexport async function runCli<S extends TSchema>(\n sprinkle: Sprinkle<S>,\n actionName: string,\n rawArgs: Record<string, unknown>,\n context: IActionContext<S>,\n appName?: string,\n): Promise<void> {\n const action = sprinkle.getAction(actionName);\n\n if (!action) {\n const available = sprinkle\n .listActions()\n .map((a) => a.name)\n .join(\", \");\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: {\n code: \"ACTION_NOT_FOUND\",\n message: `Action \"${actionName}\" not found. Available actions: ${available || \"(none)\"}`,\n },\n },\n bigIntReplacer,\n );\n console.error(errorOutput);\n process.exit(1);\n }\n\n // Handle --help flag for action-specific help\n if (rawArgs[\"help\"] === true) {\n console.log(generateActionHelp(action, appName));\n return;\n }\n\n // Coerce raw string args using the action's input schema\n const coercedInput = parseArgvWithSchema(rawArgs, action.inputSchema);\n\n // Execute and output result\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result = await executeAction(action as any, coercedInput, context as any);\n\n if (result.success) {\n console.log(JSON.stringify({ success: true, data: result.data }, bigIntReplacer));\n } else {\n const errorOutput = JSON.stringify(\n {\n success: false,\n error: {\n code: result.error.code,\n message: result.error.message,\n details: result.error.details,\n },\n },\n bigIntReplacer,\n );\n console.error(errorOutput);\n process.exit(1);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Barrel export for the actions subsystem.
3
+ */
4
+
5
+ export { ActionError } from "./types.js";
6
+ export { ActionRegistry } from "./registry.js";
7
+ export { executeAction, detectMode, parseCliArgs } from "./runner.js";
8
+ export { camelToKebab, kebabToCamel, coerceValue, parseArgvWithSchema, generateActionHelp, generateAppHelp, runCli } from "./cli-adapter.js";
9
+ export { typeboxToJsonSchema, coerceMcpInput, getMcpSdk, createMcpServer, runMcp } from "./mcp-adapter.js";
10
+ export { getBuiltinActions, toNativeScript, completeWithScripts } from "./builtin/index.js";
11
+ export { promptAndExecute } from "./tui-helpers.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["ActionError","ActionRegistry","executeAction","detectMode","parseCliArgs","camelToKebab","kebabToCamel","coerceValue","parseArgvWithSchema","generateActionHelp","generateAppHelp","runCli","typeboxToJsonSchema","coerceMcpInput","getMcpSdk","createMcpServer","runMcp","getBuiltinActions","toNativeScript","completeWithScripts","promptAndExecute"],"sources":["../../../../src/Sprinkle/actions/index.ts"],"sourcesContent":["/**\n * Barrel export for the actions subsystem.\n */\n\nexport type { IAction, IActionContext, IActionResult, IActionSuccess, IActionFailure, AnyAction } from \"./types.js\";\nexport { ActionError } from \"./types.js\";\n\nexport { ActionRegistry } from \"./registry.js\";\n\nexport { executeAction, detectMode, parseCliArgs } from \"./runner.js\";\n\nexport {\n camelToKebab,\n kebabToCamel,\n coerceValue,\n parseArgvWithSchema,\n generateActionHelp,\n generateAppHelp,\n runCli,\n} from \"./cli-adapter.js\";\n\nexport {\n typeboxToJsonSchema,\n coerceMcpInput,\n getMcpSdk,\n createMcpServer,\n runMcp,\n} from \"./mcp-adapter.js\";\n\nexport { getBuiltinActions, toNativeScript, completeWithScripts } from \"./builtin/index.js\";\nexport type { NativeScriptInput } from \"./builtin/index.js\";\n\nexport { promptAndExecute } from \"./tui-helpers.js\";\n"],"mappings":"AAAA;AACA;AACA;;AAGA,SAASA,WAAW,QAAQ,YAAY;AAExC,SAASC,cAAc,QAAQ,eAAe;AAE9C,SAASC,aAAa,EAAEC,UAAU,EAAEC,YAAY,QAAQ,aAAa;AAErE,SACEC,YAAY,EACZC,YAAY,EACZC,WAAW,EACXC,mBAAmB,EACnBC,kBAAkB,EAClBC,eAAe,EACfC,MAAM,QACD,kBAAkB;AAEzB,SACEC,mBAAmB,EACnBC,cAAc,EACdC,SAAS,EACTC,eAAe,EACfC,MAAM,QACD,kBAAkB;AAEzB,SAASC,iBAAiB,EAAEC,cAAc,EAAEC,mBAAmB,QAAQ,oBAAoB;AAG3F,SAASC,gBAAgB,QAAQ,kBAAkB","ignoreList":[]}