@studio-foundation/cli 0.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/ARCHITECTURE.md +40 -0
  2. package/LICENSE +663 -0
  3. package/README.md +165 -0
  4. package/dist/commands/api.d.ts +16 -0
  5. package/dist/commands/api.d.ts.map +1 -0
  6. package/dist/commands/api.js +118 -0
  7. package/dist/commands/api.js.map +1 -0
  8. package/dist/commands/config.d.ts +32 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +390 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/init.d.ts +93 -0
  13. package/dist/commands/init.d.ts.map +1 -0
  14. package/dist/commands/init.js +728 -0
  15. package/dist/commands/init.js.map +1 -0
  16. package/dist/commands/install.d.ts +2 -0
  17. package/dist/commands/install.d.ts.map +1 -0
  18. package/dist/commands/install.js +22 -0
  19. package/dist/commands/install.js.map +1 -0
  20. package/dist/commands/integrations.d.ts +14 -0
  21. package/dist/commands/integrations.d.ts.map +1 -0
  22. package/dist/commands/integrations.js +282 -0
  23. package/dist/commands/integrations.js.map +1 -0
  24. package/dist/commands/list.d.ts +9 -0
  25. package/dist/commands/list.d.ts.map +1 -0
  26. package/dist/commands/list.js +161 -0
  27. package/dist/commands/list.js.map +1 -0
  28. package/dist/commands/logs.d.ts +7 -0
  29. package/dist/commands/logs.d.ts.map +1 -0
  30. package/dist/commands/logs.js +98 -0
  31. package/dist/commands/logs.js.map +1 -0
  32. package/dist/commands/ollama.d.ts +6 -0
  33. package/dist/commands/ollama.d.ts.map +1 -0
  34. package/dist/commands/ollama.js +161 -0
  35. package/dist/commands/ollama.js.map +1 -0
  36. package/dist/commands/project.d.ts +38 -0
  37. package/dist/commands/project.d.ts.map +1 -0
  38. package/dist/commands/project.js +137 -0
  39. package/dist/commands/project.js.map +1 -0
  40. package/dist/commands/registry/audit.d.ts +13 -0
  41. package/dist/commands/registry/audit.d.ts.map +1 -0
  42. package/dist/commands/registry/audit.js +65 -0
  43. package/dist/commands/registry/audit.js.map +1 -0
  44. package/dist/commands/registry/index.d.ts +3 -0
  45. package/dist/commands/registry/index.d.ts.map +1 -0
  46. package/dist/commands/registry/index.js +53 -0
  47. package/dist/commands/registry/index.js.map +1 -0
  48. package/dist/commands/registry/install.d.ts +17 -0
  49. package/dist/commands/registry/install.d.ts.map +1 -0
  50. package/dist/commands/registry/install.js +153 -0
  51. package/dist/commands/registry/install.js.map +1 -0
  52. package/dist/commands/registry/publish.d.ts +8 -0
  53. package/dist/commands/registry/publish.d.ts.map +1 -0
  54. package/dist/commands/registry/publish.js +94 -0
  55. package/dist/commands/registry/publish.js.map +1 -0
  56. package/dist/commands/registry/remove.d.ts +8 -0
  57. package/dist/commands/registry/remove.d.ts.map +1 -0
  58. package/dist/commands/registry/remove.js +82 -0
  59. package/dist/commands/registry/remove.js.map +1 -0
  60. package/dist/commands/registry/search.d.ts +9 -0
  61. package/dist/commands/registry/search.d.ts.map +1 -0
  62. package/dist/commands/registry/search.js +68 -0
  63. package/dist/commands/registry/search.js.map +1 -0
  64. package/dist/commands/registry/sync.d.ts +8 -0
  65. package/dist/commands/registry/sync.d.ts.map +1 -0
  66. package/dist/commands/registry/sync.js +19 -0
  67. package/dist/commands/registry/sync.js.map +1 -0
  68. package/dist/commands/registry/update.d.ts +15 -0
  69. package/dist/commands/registry/update.d.ts.map +1 -0
  70. package/dist/commands/registry/update.js +48 -0
  71. package/dist/commands/registry/update.js.map +1 -0
  72. package/dist/commands/replay.d.ts +36 -0
  73. package/dist/commands/replay.d.ts.map +1 -0
  74. package/dist/commands/replay.js +453 -0
  75. package/dist/commands/replay.js.map +1 -0
  76. package/dist/commands/run.d.ts +18 -0
  77. package/dist/commands/run.d.ts.map +1 -0
  78. package/dist/commands/run.js +406 -0
  79. package/dist/commands/run.js.map +1 -0
  80. package/dist/commands/status.d.ts +6 -0
  81. package/dist/commands/status.d.ts.map +1 -0
  82. package/dist/commands/status.js +144 -0
  83. package/dist/commands/status.js.map +1 -0
  84. package/dist/commands/template/index.d.ts +2 -0
  85. package/dist/commands/template/index.d.ts.map +1 -0
  86. package/dist/commands/template/index.js +57 -0
  87. package/dist/commands/template/index.js.map +1 -0
  88. package/dist/commands/template/validate.d.ts +8 -0
  89. package/dist/commands/template/validate.d.ts.map +1 -0
  90. package/dist/commands/template/validate.js +135 -0
  91. package/dist/commands/template/validate.js.map +1 -0
  92. package/dist/commands/templates.d.ts +14 -0
  93. package/dist/commands/templates.d.ts.map +1 -0
  94. package/dist/commands/templates.js +86 -0
  95. package/dist/commands/templates.js.map +1 -0
  96. package/dist/commands/tools.d.ts +12 -0
  97. package/dist/commands/tools.d.ts.map +1 -0
  98. package/dist/commands/tools.js +200 -0
  99. package/dist/commands/tools.js.map +1 -0
  100. package/dist/commands/users.d.ts +4 -0
  101. package/dist/commands/users.d.ts.map +1 -0
  102. package/dist/commands/users.js +123 -0
  103. package/dist/commands/users.js.map +1 -0
  104. package/dist/commands/validate.d.ts +2 -0
  105. package/dist/commands/validate.d.ts.map +1 -0
  106. package/dist/commands/validate.js +39 -0
  107. package/dist/commands/validate.js.map +1 -0
  108. package/dist/config.d.ts +36 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +64 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/index.d.ts +3 -0
  113. package/dist/index.d.ts.map +1 -0
  114. package/dist/index.js +178 -0
  115. package/dist/index.js.map +1 -0
  116. package/dist/models-cache.d.ts +13 -0
  117. package/dist/models-cache.d.ts.map +1 -0
  118. package/dist/models-cache.js +106 -0
  119. package/dist/models-cache.js.map +1 -0
  120. package/dist/output/file-changes.d.ts +15 -0
  121. package/dist/output/file-changes.d.ts.map +1 -0
  122. package/dist/output/file-changes.js +77 -0
  123. package/dist/output/file-changes.js.map +1 -0
  124. package/dist/output/formatter.d.ts +6 -0
  125. package/dist/output/formatter.d.ts.map +1 -0
  126. package/dist/output/formatter.js +70 -0
  127. package/dist/output/formatter.js.map +1 -0
  128. package/dist/output/formatters.d.ts +42 -0
  129. package/dist/output/formatters.d.ts.map +1 -0
  130. package/dist/output/formatters.js +280 -0
  131. package/dist/output/formatters.js.map +1 -0
  132. package/dist/output/logger.d.ts +3 -0
  133. package/dist/output/logger.d.ts.map +1 -0
  134. package/dist/output/logger.js +15 -0
  135. package/dist/output/logger.js.map +1 -0
  136. package/dist/output/parallel-progress.d.ts +33 -0
  137. package/dist/output/parallel-progress.d.ts.map +1 -0
  138. package/dist/output/parallel-progress.js +85 -0
  139. package/dist/output/parallel-progress.js.map +1 -0
  140. package/dist/output/progress.d.ts +32 -0
  141. package/dist/output/progress.d.ts.map +1 -0
  142. package/dist/output/progress.js +393 -0
  143. package/dist/output/progress.js.map +1 -0
  144. package/dist/provider-validator.d.ts +15 -0
  145. package/dist/provider-validator.d.ts.map +1 -0
  146. package/dist/provider-validator.js +85 -0
  147. package/dist/provider-validator.js.map +1 -0
  148. package/dist/registry/cache.d.ts +10 -0
  149. package/dist/registry/cache.d.ts.map +1 -0
  150. package/dist/registry/cache.js +36 -0
  151. package/dist/registry/cache.js.map +1 -0
  152. package/dist/registry/client.d.ts +19 -0
  153. package/dist/registry/client.d.ts.map +1 -0
  154. package/dist/registry/client.js +63 -0
  155. package/dist/registry/client.js.map +1 -0
  156. package/dist/registry/lockfile.d.ts +17 -0
  157. package/dist/registry/lockfile.d.ts.map +1 -0
  158. package/dist/registry/lockfile.js +61 -0
  159. package/dist/registry/lockfile.js.map +1 -0
  160. package/dist/registry/resolver.d.ts +13 -0
  161. package/dist/registry/resolver.d.ts.map +1 -0
  162. package/dist/registry/resolver.js +79 -0
  163. package/dist/registry/resolver.js.map +1 -0
  164. package/dist/registry/types.d.ts +59 -0
  165. package/dist/registry/types.d.ts.map +1 -0
  166. package/dist/registry/types.js +14 -0
  167. package/dist/registry/types.js.map +1 -0
  168. package/dist/run-logger.d.ts +8 -0
  169. package/dist/run-logger.d.ts.map +1 -0
  170. package/dist/run-logger.js +53 -0
  171. package/dist/run-logger.js.map +1 -0
  172. package/dist/run-store-factory.d.ts +9 -0
  173. package/dist/run-store-factory.d.ts.map +1 -0
  174. package/dist/run-store-factory.js +26 -0
  175. package/dist/run-store-factory.js.map +1 -0
  176. package/dist/studio-dir.d.ts +7 -0
  177. package/dist/studio-dir.d.ts.map +1 -0
  178. package/dist/studio-dir.js +27 -0
  179. package/dist/studio-dir.js.map +1 -0
  180. package/dist/utils/input-wizard.d.ts +4 -0
  181. package/dist/utils/input-wizard.d.ts.map +1 -0
  182. package/dist/utils/input-wizard.js +56 -0
  183. package/dist/utils/input-wizard.js.map +1 -0
  184. package/dist/utils/placeholders.d.ts +6 -0
  185. package/dist/utils/placeholders.d.ts.map +1 -0
  186. package/dist/utils/placeholders.js +12 -0
  187. package/dist/utils/placeholders.js.map +1 -0
  188. package/package.json +43 -0
  189. package/src/commands/api.ts +126 -0
  190. package/src/commands/config.ts +433 -0
  191. package/src/commands/init.ts +879 -0
  192. package/src/commands/install.ts +23 -0
  193. package/src/commands/integrations.ts +332 -0
  194. package/src/commands/list.ts +197 -0
  195. package/src/commands/logs.ts +119 -0
  196. package/src/commands/ollama.ts +168 -0
  197. package/src/commands/project.ts +167 -0
  198. package/src/commands/registry/audit.ts +87 -0
  199. package/src/commands/registry/index.ts +63 -0
  200. package/src/commands/registry/install.ts +222 -0
  201. package/src/commands/registry/publish.ts +112 -0
  202. package/src/commands/registry/remove.ts +89 -0
  203. package/src/commands/registry/search.ts +93 -0
  204. package/src/commands/registry/sync.ts +24 -0
  205. package/src/commands/registry/update.ts +63 -0
  206. package/src/commands/replay.ts +559 -0
  207. package/src/commands/run.ts +454 -0
  208. package/src/commands/status.ts +163 -0
  209. package/src/commands/template/index.ts +59 -0
  210. package/src/commands/template/validate.ts +175 -0
  211. package/src/commands/templates.ts +99 -0
  212. package/src/commands/tools.ts +227 -0
  213. package/src/commands/users.ts +127 -0
  214. package/src/commands/validate.ts +46 -0
  215. package/src/config.ts +101 -0
  216. package/src/index.ts +201 -0
  217. package/src/models-cache.ts +127 -0
  218. package/src/output/file-changes.ts +97 -0
  219. package/src/output/formatter.ts +85 -0
  220. package/src/output/formatters.ts +303 -0
  221. package/src/output/logger.ts +18 -0
  222. package/src/output/parallel-progress.ts +103 -0
  223. package/src/output/progress.ts +414 -0
  224. package/src/provider-validator.ts +109 -0
  225. package/src/registry/cache.ts +46 -0
  226. package/src/registry/client.ts +84 -0
  227. package/src/registry/lockfile.ts +68 -0
  228. package/src/registry/resolver.ts +113 -0
  229. package/src/registry/types.ts +66 -0
  230. package/src/run-logger.ts +66 -0
  231. package/src/run-store-factory.ts +30 -0
  232. package/src/studio-dir.ts +28 -0
  233. package/src/utils/input-wizard.ts +73 -0
  234. package/src/utils/placeholders.ts +10 -0
  235. package/templates/.studiorc.yaml +16 -0
  236. package/templates/projects/blank/metadata.json +7 -0
  237. package/templates/studio-config.yaml +14 -0
  238. package/tests/__stubs__/studio-runner.ts +104 -0
  239. package/tests/commands/api.test.ts +110 -0
  240. package/tests/commands/config.test.ts +221 -0
  241. package/tests/commands/init.test.ts +919 -0
  242. package/tests/commands/install.test.ts +52 -0
  243. package/tests/commands/integrations.test.ts +158 -0
  244. package/tests/commands/ollama.test.ts +139 -0
  245. package/tests/commands/project.test.ts +179 -0
  246. package/tests/commands/registry/audit.test.ts +56 -0
  247. package/tests/commands/registry/install.test.ts +200 -0
  248. package/tests/commands/registry/publish.test.ts +56 -0
  249. package/tests/commands/registry/remove.test.ts +103 -0
  250. package/tests/commands/registry/search.test.ts +44 -0
  251. package/tests/commands/registry/sync.test.ts +37 -0
  252. package/tests/commands/registry/update.test.ts +62 -0
  253. package/tests/commands/replay.test.ts +283 -0
  254. package/tests/commands/template/validate.test.ts +150 -0
  255. package/tests/commands/templates.test.ts +42 -0
  256. package/tests/commands/tools.test.ts +106 -0
  257. package/tests/config.test.ts +142 -0
  258. package/tests/formatter.test.ts +158 -0
  259. package/tests/integration/sigint.test.ts +188 -0
  260. package/tests/models-cache.test.ts +250 -0
  261. package/tests/output/file-changes.test.ts +178 -0
  262. package/tests/output/formatters.test.ts +448 -0
  263. package/tests/output/progress-spinner.test.ts +232 -0
  264. package/tests/output/progress-timer.test.ts +230 -0
  265. package/tests/provider-validator.test.ts +182 -0
  266. package/tests/registry/cache.test.ts +66 -0
  267. package/tests/registry/client.test.ts +70 -0
  268. package/tests/registry/lockfile.test.ts +87 -0
  269. package/tests/registry/resolver.test.ts +122 -0
  270. package/tests/run-logger-events.test.ts +326 -0
  271. package/tests/run-logger.test.ts +64 -0
  272. package/tests/run-store-factory.test.ts +51 -0
  273. package/tests/studio-dir.test.ts +31 -0
  274. package/tests/utils/input-wizard.test.ts +153 -0
  275. package/tests/utils/placeholders.test.ts +36 -0
  276. package/tsconfig.json +24 -0
  277. package/vitest.config.ts +20 -0
@@ -0,0 +1,70 @@
1
+ import chalk from 'chalk';
2
+ export function formatResult(run) {
3
+ console.log('');
4
+ console.log(`Pipeline: ${chalk.bold(run.pipeline_name)}`);
5
+ if (run.status === 'success') {
6
+ console.log(`Status: ${chalk.green('✓ success')}`);
7
+ }
8
+ else if (run.status === 'rejected') {
9
+ console.log(`Status: ${chalk.red('✗ rejected by QA')}`);
10
+ }
11
+ else {
12
+ console.log(`Status: ${chalk.red('✗ failed')}`);
13
+ }
14
+ if (run.started_at && run.completed_at) {
15
+ const duration = formatDuration(new Date(run.completed_at).getTime() - new Date(run.started_at).getTime());
16
+ console.log(`Duration: ${duration}`);
17
+ }
18
+ if (run.stages.length > 0) {
19
+ console.log('');
20
+ console.log('Stages:');
21
+ const total = run.stages.length;
22
+ for (let i = 0; i < run.stages.length; i++) {
23
+ const stage = run.stages[i];
24
+ const index = `[${i + 1}/${total}]`;
25
+ const name = stage.stage_name;
26
+ const attempts = stage.tasks[0]?.agent_runs.length ?? 0;
27
+ const dots = '.'.repeat(Math.max(2, 30 - name.length));
28
+ if (stage.status === 'success') {
29
+ console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.green('✓')} (${attempts} attempt${attempts !== 1 ? 's' : ''})`);
30
+ }
31
+ else if (stage.status === 'rejected') {
32
+ console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ REJECTED')}`);
33
+ }
34
+ else if (stage.status === 'failed') {
35
+ console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.red('✗ FAILED')} (${attempts} attempts exhausted)`);
36
+ // Show errors from the last agent run
37
+ const lastAgentRun = stage.tasks[0]?.agent_runs.at(-1);
38
+ if (lastAgentRun?.error) {
39
+ console.log(`${chalk.gray(' Errors:')}`);
40
+ console.log(`${chalk.gray(' -')} ${lastAgentRun.error}`);
41
+ }
42
+ }
43
+ else if (stage.status === 'skipped') {
44
+ const reasonText = stage.skipped_reason ? ` (skipped: ${stage.skipped_reason})` : '';
45
+ console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.dim('⊘ skipped')}${chalk.gray(reasonText)}`);
46
+ }
47
+ else {
48
+ console.log(` ${index} ${name} ${chalk.gray(dots)} ${chalk.yellow(stage.status)}`);
49
+ }
50
+ }
51
+ }
52
+ console.log('');
53
+ }
54
+ export function formatJson(data) {
55
+ console.log(JSON.stringify(data, null, 2));
56
+ }
57
+ export function formatError(error) {
58
+ console.error(chalk.red(`Error: ${error.message}`));
59
+ }
60
+ export function formatDuration(ms) {
61
+ if (ms < 1000)
62
+ return `${ms}ms`;
63
+ const seconds = Math.floor(ms / 1000);
64
+ if (seconds < 60)
65
+ return `${seconds}s`;
66
+ const minutes = Math.floor(seconds / 60);
67
+ const remainingSeconds = seconds % 60;
68
+ return `${minutes}m${remainingSeconds.toString().padStart(2, '0')}s`;
69
+ }
70
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/output/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Formats a token count into a compact human-readable string.
3
+ * 450 → "450", 2100 → "2.1k", 17900 → "17.9k", 1234567 → "1.2M"
4
+ */
5
+ export declare function formatTokens(count: number): string;
6
+ /**
7
+ * Formats a stage progress line with dot-filling for alignment.
8
+ * formatStageLine("[1/4]", "brief-analysis", "✓ (12s, 2.1k tokens)")
9
+ * → "[1/4] brief-analysis ............ ✓ (12s, 2.1k tokens)"
10
+ */
11
+ export declare function formatStageLine(prefix: string, name: string, suffix: string): string;
12
+ /**
13
+ * Converts a kebab-case stage name to a human-readable label.
14
+ * Uses a lookup table for known names; falls back to title-casing.
15
+ */
16
+ export declare function humanReadableStageName(stageName: string): string;
17
+ /**
18
+ * Groups tool calls by type and returns a human-readable summary string.
19
+ * E.g. "Read 3 files, wrote 1 file, ran 2 commands"
20
+ */
21
+ export declare function summarizeToolCalls(toolCalls: {
22
+ name: string;
23
+ }[]): string;
24
+ /** Counts how many tool calls wrote or patched files. */
25
+ export declare function countWriteFiles(toolCalls: {
26
+ name: string;
27
+ }[]): number;
28
+ export declare function getToolIcon(tool: string): string;
29
+ export declare function summarizeToolParams(tool: string, params: Record<string, unknown>): string;
30
+ export declare function summarizeToolResult(result: unknown, error?: string): string;
31
+ /**
32
+ * Formats the full result of a tool call for verbose display.
33
+ * Each line is indented with 2 spaces.
34
+ */
35
+ export declare function formatToolResult(result: unknown, error?: string): string;
36
+ /**
37
+ * Formats a stage output object as a human-readable string.
38
+ * Detects types dynamically — no hardcoded field names.
39
+ * Returns plain text (no ANSI colors).
40
+ */
41
+ export declare function formatStageOutput(output: Record<string, unknown>, maxDepth?: number): string;
42
+ //# sourceMappingURL=formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/output/formatters.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASlD;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKpF;AAeD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhE;AAyBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CA+BxE;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAKrE;AAID,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CASzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB3E;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBxE;AA4FD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,SAAI,GAAG,MAAM,CAEvF"}
@@ -0,0 +1,280 @@
1
+ // cli/src/output/formatters.ts
2
+ // ── Shared helpers ──────────────────────────────────────────────────────────
3
+ function titleCase(key) {
4
+ return key
5
+ .split(/[-_]/)
6
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
7
+ .join(' ');
8
+ }
9
+ // ── Token formatting ──────────────────────────────────────────────────────────
10
+ /**
11
+ * Formats a token count into a compact human-readable string.
12
+ * 450 → "450", 2100 → "2.1k", 17900 → "17.9k", 1234567 → "1.2M"
13
+ */
14
+ export function formatTokens(count) {
15
+ if (count === 0)
16
+ return '0';
17
+ if (count < 1000)
18
+ return String(count);
19
+ if (count < 1_000_000) {
20
+ const k = count / 1000;
21
+ return k % 1 === 0 ? `${k}k` : `${parseFloat(k.toFixed(1))}k`;
22
+ }
23
+ const m = count / 1_000_000;
24
+ return m % 1 === 0 ? `${m}M` : `${parseFloat(m.toFixed(1))}M`;
25
+ }
26
+ // ── Stage line formatting ─────────────────────────────────────────────────────
27
+ const STAGE_LINE_WIDTH = 42;
28
+ /**
29
+ * Formats a stage progress line with dot-filling for alignment.
30
+ * formatStageLine("[1/4]", "brief-analysis", "✓ (12s, 2.1k tokens)")
31
+ * → "[1/4] brief-analysis ............ ✓ (12s, 2.1k tokens)"
32
+ */
33
+ export function formatStageLine(prefix, name, suffix) {
34
+ const left = `${prefix} ${name} `;
35
+ const dotsNeeded = Math.max(2, STAGE_LINE_WIDTH - left.length);
36
+ const dots = '.'.repeat(dotsNeeded);
37
+ return `${left}${dots} ${suffix}`;
38
+ }
39
+ // ── Stage name mapping ────────────────────────────────────────────────────────
40
+ const STAGE_NAME_PATTERNS = [
41
+ [/^brief[-_]analysis$/i, 'Analyzing brief'],
42
+ [/^implementation[-_]plan$/i, 'Planning implementation'],
43
+ [/^code[-_]gen(?:eration)?$/i, 'Generating code'],
44
+ [/^qa[-_]review$/i, 'Reviewing'],
45
+ [/^analysis$/i, 'Analysis'],
46
+ [/^planning$/i, 'Planning'],
47
+ [/^generation$/i, 'Generating'],
48
+ [/^review$/i, 'Reviewing'],
49
+ ];
50
+ /**
51
+ * Converts a kebab-case stage name to a human-readable label.
52
+ * Uses a lookup table for known names; falls back to title-casing.
53
+ */
54
+ export function humanReadableStageName(stageName) {
55
+ for (const [pattern, label] of STAGE_NAME_PATTERNS) {
56
+ if (pattern.test(stageName))
57
+ return label;
58
+ }
59
+ return titleCase(stageName);
60
+ }
61
+ const TOOL_GROUPS = {
62
+ read_file: { verb: 'Read', singular: 'file', plural: 'files' },
63
+ write_file: { verb: 'Wrote', singular: 'file', plural: 'files' },
64
+ list_files: { verb: 'Listed', singular: 'directory', plural: 'directories' },
65
+ run_command: { verb: 'Ran', singular: 'command', plural: 'commands' },
66
+ search_codebase: { verb: 'Searched', singular: 'time', plural: 'times' },
67
+ apply_patch: { verb: 'Patched', singular: 'file', plural: 'files' },
68
+ };
69
+ /** Extracts the action part from a tool name like `repo_manager-read_file` → `read_file`. */
70
+ function toolAction(name) {
71
+ const idx = name.lastIndexOf('-');
72
+ return idx >= 0 ? name.slice(idx + 1) : name;
73
+ }
74
+ /**
75
+ * Groups tool calls by type and returns a human-readable summary string.
76
+ * E.g. "Read 3 files, wrote 1 file, ran 2 commands"
77
+ */
78
+ export function summarizeToolCalls(toolCalls) {
79
+ if (toolCalls.length === 0)
80
+ return '';
81
+ const counts = new Map();
82
+ let unknownCount = 0;
83
+ for (const tc of toolCalls) {
84
+ const action = toolAction(tc.name);
85
+ if (TOOL_GROUPS[action]) {
86
+ counts.set(action, (counts.get(action) ?? 0) + 1);
87
+ }
88
+ else {
89
+ unknownCount++;
90
+ }
91
+ }
92
+ const parts = [];
93
+ for (const [action, count] of counts) {
94
+ const group = TOOL_GROUPS[action];
95
+ const noun = count === 1 ? group.singular : group.plural;
96
+ // First part uses title-case verb, rest lowercase
97
+ const verb = parts.length === 0 ? group.verb : group.verb.toLowerCase();
98
+ parts.push(`${verb} ${count} ${noun}`);
99
+ }
100
+ if (unknownCount > 0) {
101
+ const label = `${unknownCount} tool call${unknownCount !== 1 ? 's' : ''}`;
102
+ parts.push(label);
103
+ }
104
+ return parts.join(', ');
105
+ }
106
+ /** Counts how many tool calls wrote or patched files. */
107
+ export function countWriteFiles(toolCalls) {
108
+ return toolCalls.filter((tc) => {
109
+ const action = toolAction(tc.name);
110
+ return action === 'write_file' || action === 'apply_patch';
111
+ }).length;
112
+ }
113
+ // ── Live mode helpers ─────────────────────────────────────────────────────────
114
+ export function getToolIcon(tool) {
115
+ if (tool.startsWith('repo_manager-read'))
116
+ return '📖';
117
+ if (tool.startsWith('repo_manager-write'))
118
+ return '✏️';
119
+ if (tool.startsWith('repo_manager-list'))
120
+ return '📁';
121
+ if (tool.startsWith('search'))
122
+ return '🔍';
123
+ if (tool.startsWith('shell'))
124
+ return '⚙️';
125
+ if (tool.startsWith('git'))
126
+ return '🔀';
127
+ return '🔧';
128
+ }
129
+ export function summarizeToolParams(tool, params) {
130
+ if (tool.includes('read_file') || tool.includes('write_file'))
131
+ return `(${params.path})`;
132
+ if (tool.includes('list_files'))
133
+ return params.path ? `(${params.path})` : '';
134
+ if (tool.includes('search')) {
135
+ const term = params.query ?? params.pattern;
136
+ return term ? `("${term}")` : '';
137
+ }
138
+ if (tool.includes('run_command'))
139
+ return `("${params.command}")`;
140
+ return '';
141
+ }
142
+ export function summarizeToolResult(result, error) {
143
+ if (error)
144
+ return error;
145
+ if (typeof result === 'string') {
146
+ const lines = result.split('\n').length;
147
+ return lines > 1 ? `${lines} lines` : result.slice(0, 60);
148
+ }
149
+ if (Array.isArray(result))
150
+ return `${result.length} items`;
151
+ if (result !== null && typeof result === 'object') {
152
+ const obj = result;
153
+ if (typeof obj.content === 'string') {
154
+ const lines = obj.content.split('\n').length;
155
+ return lines > 1 ? `${lines} lines` : (obj.content.length > 0 ? obj.content.slice(0, 60) : 'empty');
156
+ }
157
+ if (Array.isArray(obj.files))
158
+ return `${obj.files.length} files`;
159
+ if (obj.written === true)
160
+ return 'written';
161
+ }
162
+ return 'Done';
163
+ }
164
+ // ── Verbose tool result formatting ───────────────────────────────────────────
165
+ /**
166
+ * Formats the full result of a tool call for verbose display.
167
+ * Each line is indented with 2 spaces.
168
+ */
169
+ export function formatToolResult(result, error) {
170
+ if (error)
171
+ return ` (error) ${error}`;
172
+ if (result === null || result === undefined)
173
+ return ' (empty)';
174
+ if (typeof result === 'string') {
175
+ return result.split('\n').map(line => ` ${line}`).join('\n');
176
+ }
177
+ if (result !== null && typeof result === 'object' && !Array.isArray(result)) {
178
+ const obj = result;
179
+ if (typeof obj.content === 'string') {
180
+ if (obj.content.length === 0)
181
+ return ' (empty content)';
182
+ return obj.content.split('\n').map(line => ` ${line}`).join('\n');
183
+ }
184
+ }
185
+ // Arrays and other objects: indented JSON
186
+ const json = JSON.stringify(result, null, 2);
187
+ return json.split('\n').map(line => ` ${line}`).join('\n');
188
+ }
189
+ // ── Stage output formatting ─────────────────────────────────────────────────
190
+ const CIRCLED_DIGITS = ['①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩'];
191
+ function circledIndex(i) {
192
+ return i < CIRCLED_DIGITS.length ? CIRCLED_DIGITS[i] : `(${i + 1})`;
193
+ }
194
+ function isPrimitive(value) {
195
+ return value === null || value === undefined || typeof value !== 'object';
196
+ }
197
+ function formatValue(value, indent, maxDepth) {
198
+ const pad = ' '.repeat(indent);
199
+ if (value === null || value === undefined)
200
+ return '—';
201
+ if (typeof value === 'boolean' || typeof value === 'number')
202
+ return String(value);
203
+ if (typeof value === 'string') {
204
+ if (value.length <= 80)
205
+ return value;
206
+ return `\n${pad} ${value}`;
207
+ }
208
+ if (Array.isArray(value)) {
209
+ if (value.length === 0)
210
+ return '(empty)';
211
+ // Array of primitives
212
+ if (value.every(isPrimitive)) {
213
+ const inline = value.map(v => String(v ?? '—')).join(', ');
214
+ if (inline.length <= 80)
215
+ return inline;
216
+ return '\n' + value.map(v => `${pad} • ${String(v ?? '—')}`).join('\n');
217
+ }
218
+ // Array of objects
219
+ return '\n' + value.map((item, i) => {
220
+ const idx = circledIndex(i);
221
+ if (typeof item === 'object' && item !== null && !Array.isArray(item)) {
222
+ const obj = item;
223
+ const keys = Object.keys(obj);
224
+ // Single string field: compact rendering
225
+ if (keys.length === 1 && typeof obj[keys[0]] === 'string') {
226
+ return `${pad} ${idx} ${obj[keys[0]]}`;
227
+ }
228
+ // First string field as title, rest as sub-fields
229
+ const firstStrKey = keys.find(k => typeof obj[k] === 'string');
230
+ if (firstStrKey && indent + 1 < maxDepth) {
231
+ const title = obj[firstStrKey];
232
+ const rest = keys.filter(k => k !== firstStrKey);
233
+ if (rest.length === 0)
234
+ return `${pad} ${idx} ${title}`;
235
+ const subPad = pad + ' ';
236
+ const maxKeyLen = Math.max(...rest.map(k => titleCase(k).length));
237
+ const subFields = rest.map(k => {
238
+ const label = titleCase(k).padEnd(maxKeyLen);
239
+ const val = formatValue(obj[k], indent + 2, maxDepth);
240
+ return `${subPad}${label} : ${val}`;
241
+ }).join('\n');
242
+ return `${pad} ${idx} ${title}\n${subFields}`;
243
+ }
244
+ }
245
+ // Fallback: JSON
246
+ return `${pad} ${idx} ${JSON.stringify(item)}`;
247
+ }).join('\n');
248
+ }
249
+ // Nested object
250
+ if (typeof value === 'object') {
251
+ if (indent + 1 >= maxDepth)
252
+ return JSON.stringify(value);
253
+ const obj = value;
254
+ const formatted = formatObjectFields(obj, indent + 1, maxDepth);
255
+ return formatted ? '\n' + formatted : '(empty)';
256
+ }
257
+ return String(value);
258
+ }
259
+ function formatObjectFields(obj, indent, maxDepth) {
260
+ const keys = Object.keys(obj);
261
+ if (keys.length === 0)
262
+ return '';
263
+ const pad = ' '.repeat(indent);
264
+ const labels = keys.map(k => titleCase(k));
265
+ const maxKeyLen = Math.max(...labels.map(l => l.length));
266
+ return keys.map((key, i) => {
267
+ const label = labels[i].padEnd(maxKeyLen);
268
+ const val = formatValue(obj[key], indent, maxDepth);
269
+ return `${pad}${label} : ${val}`;
270
+ }).join('\n');
271
+ }
272
+ /**
273
+ * Formats a stage output object as a human-readable string.
274
+ * Detects types dynamically — no hardcoded field names.
275
+ * Returns plain text (no ANSI colors).
276
+ */
277
+ export function formatStageOutput(output, maxDepth = 4) {
278
+ return formatObjectFields(output, 0, maxDepth);
279
+ }
280
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/output/formatters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export declare function log(level: LogLevel, message: string, data?: unknown): void;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/output/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAa1E"}
@@ -0,0 +1,15 @@
1
+ import chalk from 'chalk';
2
+ export function log(level, message, data) {
3
+ const timestamp = new Date().toISOString().slice(11, 19);
4
+ const prefix = {
5
+ debug: chalk.gray('[DEBUG]'),
6
+ info: chalk.blue('[INFO]'),
7
+ warn: chalk.yellow('[WARN]'),
8
+ error: chalk.red('[ERROR]'),
9
+ }[level];
10
+ console.log(`${chalk.gray(timestamp)} ${prefix} ${message}`);
11
+ if (data) {
12
+ console.log(chalk.gray(JSON.stringify(data, null, 2)));
13
+ }
14
+ }
15
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/output/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,IAAc;IAClE,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC5B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;KAC5B,CAAC,KAAK,CAAC,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7D,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Renders N parallel stages as N lines that update in-place.
3
+ * Each line shows a spinner + elapsed time while running, then freezes on completion.
4
+ *
5
+ * Visual output:
6
+ * [5/14] entity-resolution-PERSON ............ ⠇ (12s)
7
+ * [6/14] entity-resolution-PLACE ............. ⠙ (12s)
8
+ * [7/14] entity-resolution-ORG ............... ⠹ (12s)
9
+ */
10
+ export declare class ParallelRenderer {
11
+ private stages;
12
+ private frameIdx;
13
+ private timer;
14
+ /**
15
+ * Register a new parallel stage and print its initial line.
16
+ * All addStage calls fire synchronously before any stage completes,
17
+ * so lines are built up before the first timer tick.
18
+ */
19
+ addStage(prefix: string, stageName: string): void;
20
+ /**
21
+ * Freeze a stage's line with its final status text (✓ or ✗).
22
+ */
23
+ completeStage(stageName: string, finalText: string): void;
24
+ private runningText;
25
+ /**
26
+ * Redraw all lines in one pass, moving the cursor to the top of the block first.
27
+ * Node.js is single-threaded so this is safe — timer and event handlers don't interleave.
28
+ */
29
+ private renderAll;
30
+ stop(): void;
31
+ interrupt(): void;
32
+ }
33
+ //# sourceMappingURL=parallel-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-progress.d.ts","sourceRoot":"","sources":["../../src/output/parallel-progress.ts"],"names":[],"mappings":"AAiBA;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA+C;IAE5D;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAejD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAYzD,OAAO,CAAC,WAAW;IAMnB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAgBjB,IAAI,IAAI,IAAI;IAOZ,SAAS,IAAI,IAAI;CAGlB"}
@@ -0,0 +1,85 @@
1
+ // cli/src/output/parallel-progress.ts
2
+ // Multi-line renderer for parallel stage display.
3
+ // Uses ANSI escape codes to update lines in-place without creating concurrent ora spinners.
4
+ import chalk from 'chalk';
5
+ import { formatStageLine } from './formatters.js';
6
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
7
+ /**
8
+ * Renders N parallel stages as N lines that update in-place.
9
+ * Each line shows a spinner + elapsed time while running, then freezes on completion.
10
+ *
11
+ * Visual output:
12
+ * [5/14] entity-resolution-PERSON ............ ⠇ (12s)
13
+ * [6/14] entity-resolution-PLACE ............. ⠙ (12s)
14
+ * [7/14] entity-resolution-ORG ............... ⠹ (12s)
15
+ */
16
+ export class ParallelRenderer {
17
+ stages = [];
18
+ frameIdx = 0;
19
+ timer = null;
20
+ /**
21
+ * Register a new parallel stage and print its initial line.
22
+ * All addStage calls fire synchronously before any stage completes,
23
+ * so lines are built up before the first timer tick.
24
+ */
25
+ addStage(prefix, stageName) {
26
+ const entry = {
27
+ prefix,
28
+ stageName,
29
+ startTime: Date.now(),
30
+ done: false,
31
+ };
32
+ this.stages.push(entry);
33
+ process.stdout.write(this.runningText(entry) + '\n');
34
+ if (!this.timer) {
35
+ this.timer = setInterval(() => this.renderAll(), 100);
36
+ }
37
+ }
38
+ /**
39
+ * Freeze a stage's line with its final status text (✓ or ✗).
40
+ */
41
+ completeStage(stageName, finalText) {
42
+ const entry = this.stages.find(s => s.stageName === stageName);
43
+ if (!entry)
44
+ return;
45
+ entry.done = true;
46
+ entry.finalText = finalText;
47
+ this.renderAll();
48
+ if (this.stages.every(s => s.done)) {
49
+ this.stop();
50
+ }
51
+ }
52
+ runningText(entry) {
53
+ const elapsed = Math.floor((Date.now() - entry.startTime) / 1000);
54
+ const frame = chalk.cyan(SPINNER_FRAMES[this.frameIdx]);
55
+ return formatStageLine(entry.prefix, entry.stageName, `${frame} (${elapsed}s)`);
56
+ }
57
+ /**
58
+ * Redraw all lines in one pass, moving the cursor to the top of the block first.
59
+ * Node.js is single-threaded so this is safe — timer and event handlers don't interleave.
60
+ */
61
+ renderAll() {
62
+ this.frameIdx = (this.frameIdx + 1) % SPINNER_FRAMES.length;
63
+ const N = this.stages.length;
64
+ if (N === 0)
65
+ return;
66
+ // Move cursor to the top of the rendered block
67
+ process.stdout.write(`\x1B[${N}A`);
68
+ for (const entry of this.stages) {
69
+ const text = entry.done ? entry.finalText : this.runningText(entry);
70
+ // Clear line, go to column 0, write text, advance to next line
71
+ process.stdout.write(`\x1B[2K\r${text}\n`);
72
+ }
73
+ // Cursor is now positioned below the last line, ready for more output
74
+ }
75
+ stop() {
76
+ if (this.timer) {
77
+ clearInterval(this.timer);
78
+ this.timer = null;
79
+ }
80
+ }
81
+ interrupt() {
82
+ this.stop();
83
+ }
84
+ }
85
+ //# sourceMappingURL=parallel-progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-progress.js","sourceRoot":"","sources":["../../src/output/parallel-progress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { EngineEvents } from '@studio-foundation/engine';
2
+ export declare class ProgressDisplay {
3
+ private jsonMode;
4
+ private spinner;
5
+ private spinnerText;
6
+ private toolSpinner;
7
+ private thinkingSpinner;
8
+ private currentToolText;
9
+ private isStreamingTokens;
10
+ private stageStartTime;
11
+ private timerInterval;
12
+ private isInParallelGroup;
13
+ private parallelRenderer;
14
+ runId: string;
15
+ private currentAttempt;
16
+ private currentStageIndex;
17
+ private currentTotalStages;
18
+ private currentStageName;
19
+ readonly live: boolean;
20
+ readonly verbose: boolean;
21
+ constructor(jsonMode: boolean, mode: 'quiet' | 'verbose' | 'live' | {
22
+ live: boolean;
23
+ verbose: boolean;
24
+ });
25
+ private resetStageTimer;
26
+ private startTimer;
27
+ private clearTimer;
28
+ private elapsedSeconds;
29
+ interrupt(): void;
30
+ getEvents(): EngineEvents;
31
+ }
32
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/output/progress.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D,qBAAa,eAAe;IAyBxB,OAAO,CAAC,QAAQ;IAxBlB,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAA+C;IAGpE,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gBAAgB,CAAiC;IAGzD,KAAK,SAAM;IACX,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,gBAAgB,CAAM;IAE9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAGhB,QAAQ,EAAE,OAAO,EACzB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAW1E,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,cAAc;IAItB,SAAS,IAAI,IAAI;IAiBjB,SAAS,IAAI,YAAY;CA0U1B"}