moderado 0.4.33 → 0.4.46

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 (109) hide show
  1. package/README.md +14 -9
  2. package/dist/commands/chat.d.ts +7 -70
  3. package/dist/commands/chat.d.ts.map +1 -1
  4. package/dist/commands/chat.js +305 -456
  5. package/dist/commands/chat.js.map +1 -1
  6. package/dist/commands/chat_meta.d.ts +36 -0
  7. package/dist/commands/chat_meta.d.ts.map +1 -0
  8. package/dist/commands/chat_meta.js +102 -0
  9. package/dist/commands/chat_meta.js.map +1 -0
  10. package/dist/commands/chat_outcome.d.ts +31 -0
  11. package/dist/commands/chat_outcome.d.ts.map +1 -0
  12. package/dist/commands/chat_outcome.js +70 -0
  13. package/dist/commands/chat_outcome.js.map +1 -0
  14. package/dist/commands/chat_search.d.ts +24 -0
  15. package/dist/commands/chat_search.d.ts.map +1 -0
  16. package/dist/commands/chat_search.js +61 -0
  17. package/dist/commands/chat_search.js.map +1 -0
  18. package/dist/commands/chat_slash.d.ts +17 -0
  19. package/dist/commands/chat_slash.d.ts.map +1 -0
  20. package/dist/commands/chat_slash.js +108 -0
  21. package/dist/commands/chat_slash.js.map +1 -0
  22. package/dist/commands/run.d.ts.map +1 -1
  23. package/dist/commands/run.js +25 -1
  24. package/dist/commands/run.js.map +1 -1
  25. package/dist/config.d.ts +1 -1
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +18 -2
  28. package/dist/config.js.map +1 -1
  29. package/dist/diagnostic_log.d.ts.map +1 -1
  30. package/dist/diagnostic_log.js +1 -0
  31. package/dist/diagnostic_log.js.map +1 -1
  32. package/dist/http_shutdown.d.ts +22 -0
  33. package/dist/http_shutdown.d.ts.map +1 -0
  34. package/dist/http_shutdown.js +36 -0
  35. package/dist/http_shutdown.js.map +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +16 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/self_update.d.ts +6 -0
  40. package/dist/self_update.d.ts.map +1 -1
  41. package/dist/self_update.js +17 -1
  42. package/dist/self_update.js.map +1 -1
  43. package/dist/sessions.d.ts.map +1 -1
  44. package/dist/sessions.js +5 -1
  45. package/dist/sessions.js.map +1 -1
  46. package/dist/transcript.d.ts +19 -0
  47. package/dist/transcript.d.ts.map +1 -0
  48. package/dist/transcript.js +76 -0
  49. package/dist/transcript.js.map +1 -0
  50. package/dist/turn_summary.d.ts +76 -0
  51. package/dist/turn_summary.d.ts.map +1 -0
  52. package/dist/turn_summary.js +305 -0
  53. package/dist/turn_summary.js.map +1 -0
  54. package/dist/ui/box.d.ts +19 -0
  55. package/dist/ui/box.d.ts.map +1 -1
  56. package/dist/ui/box.js +119 -12
  57. package/dist/ui/box.js.map +1 -1
  58. package/dist/ui/chart.d.ts +2 -0
  59. package/dist/ui/chart.d.ts.map +1 -0
  60. package/dist/ui/chart.js +97 -0
  61. package/dist/ui/chart.js.map +1 -0
  62. package/dist/ui/composer.d.ts +80 -0
  63. package/dist/ui/composer.d.ts.map +1 -0
  64. package/dist/ui/composer.js +762 -0
  65. package/dist/ui/composer.js.map +1 -0
  66. package/dist/ui/help_content.d.ts +1 -1
  67. package/dist/ui/help_content.d.ts.map +1 -1
  68. package/dist/ui/help_content.js +4 -2
  69. package/dist/ui/help_content.js.map +1 -1
  70. package/dist/ui/model_selector.d.ts +1 -0
  71. package/dist/ui/model_selector.d.ts.map +1 -1
  72. package/dist/ui/model_selector.js +61 -18
  73. package/dist/ui/model_selector.js.map +1 -1
  74. package/dist/ui/popup.d.ts.map +1 -1
  75. package/dist/ui/popup.js +13 -0
  76. package/dist/ui/popup.js.map +1 -1
  77. package/dist/ui/provider_connect.d.ts +8 -0
  78. package/dist/ui/provider_connect.d.ts.map +1 -1
  79. package/dist/ui/provider_connect.js +81 -23
  80. package/dist/ui/provider_connect.js.map +1 -1
  81. package/dist/ui/renderer.d.ts +49 -4
  82. package/dist/ui/renderer.d.ts.map +1 -1
  83. package/dist/ui/renderer.js +167 -31
  84. package/dist/ui/renderer.js.map +1 -1
  85. package/dist/ui/terminal_approval.d.ts +21 -0
  86. package/dist/ui/terminal_approval.d.ts.map +1 -1
  87. package/dist/ui/terminal_approval.js +145 -47
  88. package/dist/ui/terminal_approval.js.map +1 -1
  89. package/dist/ui/welcome.d.ts +234 -69
  90. package/dist/ui/welcome.d.ts.map +1 -1
  91. package/dist/ui/welcome.js +588 -693
  92. package/dist/ui/welcome.js.map +1 -1
  93. package/dist/vendor/providers/presets.d.ts +16 -0
  94. package/dist/vendor/providers/presets.d.ts.map +1 -1
  95. package/dist/vendor/providers/presets.js +13 -0
  96. package/dist/vendor/providers/presets.js.map +1 -1
  97. package/dist/vendor/tools/checkpoints.js +5 -5
  98. package/dist/vendor/tools/checkpoints.js.map +1 -1
  99. package/dist/vendor/tools/jail.d.ts +8 -0
  100. package/dist/vendor/tools/jail.d.ts.map +1 -1
  101. package/dist/vendor/tools/jail.js +13 -2
  102. package/dist/vendor/tools/jail.js.map +1 -1
  103. package/dist/vendor/tools/tools/apply_patch.d.ts.map +1 -1
  104. package/dist/vendor/tools/tools/apply_patch.js +6 -3
  105. package/dist/vendor/tools/tools/apply_patch.js.map +1 -1
  106. package/dist/vendor/tools/tools/git_diff.d.ts.map +1 -1
  107. package/dist/vendor/tools/tools/git_diff.js +5 -3
  108. package/dist/vendor/tools/tools/git_diff.js.map +1 -1
  109. package/package.json +24 -7
@@ -0,0 +1,305 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { canonicalizeRoot, resolveInJailFromRoot } from './vendor/tools/index.js';
4
+ /**
5
+ * Fence that marks the turn summary inside a chat answer.
6
+ *
7
+ * The renderer paints everything between these markers as a tinted panel, so
8
+ * the report reads as an afterword rather than more prose. `ui/welcome.ts`
9
+ * imports this constant rather than repeating the literal.
10
+ */
11
+ export const SUMMARY_FENCE = '```summary';
12
+ /** Commands that verify work rather than change it. */
13
+ const VERIFICATION_COMMAND = /\b(test|vitest|jest|pytest|tsc|typecheck|type-check|lint|eslint|biome|build)\b/i;
14
+ const CODE_FILE = /\.(?:[cm]?[jt]sx?|py|rb|go|rs|java|kt|swift|php|cs|cpp|cc|c|h|vue|svelte|astro)$/i;
15
+ const MAX_LISTED = 5;
16
+ /**
17
+ * Records one agent turn from the structured event stream so the CLI can
18
+ * report what actually happened without asking the model to summarise itself
19
+ * (a model summary is unbounded prose and can claim work it never did).
20
+ */
21
+ export class TurnRecorder {
22
+ workspaceRoot;
23
+ pending = new Map();
24
+ created = new Set();
25
+ modified = new Set();
26
+ commands = [];
27
+ checks = [];
28
+ failures = [];
29
+ denied = 0;
30
+ /** Jail root, resolved on first use: one recorder serves one workspace for one turn. */
31
+ canonicalRootCache;
32
+ constructor(workspaceRoot) {
33
+ this.workspaceRoot = workspaceRoot;
34
+ }
35
+ get canonicalRoot() {
36
+ // `resolveInJail` would stat + realpath the root on every tool call; the root
37
+ // cannot change under a single turn, so resolve it once.
38
+ if (!this.canonicalRootCache)
39
+ this.canonicalRootCache = canonicalizeRoot(this.workspaceRoot);
40
+ return this.canonicalRootCache;
41
+ }
42
+ record(event) {
43
+ if (event.type === 'tool_call_initiated') {
44
+ const parameters = event.parameters;
45
+ this.pending.set(event.toolCallId, {
46
+ toolName: event.toolName,
47
+ parameters,
48
+ existed: this.fileExists(parameters.path),
49
+ });
50
+ return;
51
+ }
52
+ if (event.type === 'tool_result') {
53
+ this.recordResult(event.toolCallId, event.result);
54
+ return;
55
+ }
56
+ if (event.type === 'error') {
57
+ this.failures.push(`Provider error: ${event.message}`);
58
+ }
59
+ }
60
+ /** True when the turn changed files or ran commands, so a summary is worth showing. */
61
+ hasWork() {
62
+ return this.created.size + this.modified.size + this.commands.length > 0;
63
+ }
64
+ build(status, steps) {
65
+ const changed = [...this.created, ...this.modified];
66
+ const leftover = [...this.failures];
67
+ if (this.denied > 0)
68
+ leftover.push(`${this.denied} action${this.denied === 1 ? ' was' : 's were'} denied; those changes were not applied.`);
69
+ if (status === 'step_limit_reached')
70
+ leftover.push('The step limit ended the task before it finished; run the task again to continue.');
71
+ if (status === 'cancelled')
72
+ leftover.push('The task was stopped before it finished.');
73
+ if (status === 'failed')
74
+ leftover.push('The task failed before finishing.');
75
+ if (changed.some((file) => CODE_FILE.test(file)) && this.checks.length === 0) {
76
+ leftover.push('No test, typecheck, or build command ran after these edits.');
77
+ }
78
+ return {
79
+ status,
80
+ steps,
81
+ created: [...this.created],
82
+ modified: [...this.modified],
83
+ commands: [...this.commands],
84
+ checks: [...this.checks],
85
+ leftover,
86
+ webApp: this.webAppHint(changed),
87
+ };
88
+ }
89
+ recordResult(toolCallId, result) {
90
+ const call = this.pending.get(toolCallId);
91
+ this.pending.delete(toolCallId);
92
+ if (result.status === 'denied') {
93
+ this.denied += 1;
94
+ return;
95
+ }
96
+ if (!call)
97
+ return;
98
+ if (call.toolName === 'run_command') {
99
+ const command = formatCommand(call.parameters);
100
+ const serverUrl = typeof result.metadata?.serverUrl === 'string' ? result.metadata.serverUrl : undefined;
101
+ const exitCode = typeof result.metadata?.exitCode === 'number' ? result.metadata.exitCode : undefined;
102
+ this.commands.push({ command, ok: result.status === 'success', exitCode, serverUrl });
103
+ if (result.status !== 'success') {
104
+ this.failures.push(`\`${command}\` failed: ${firstLine(result.output)}`);
105
+ }
106
+ else if (VERIFICATION_COMMAND.test(command)) {
107
+ this.checks.push({ name: command, ok: true });
108
+ }
109
+ return;
110
+ }
111
+ if (call.toolName === 'run_diagnostics') {
112
+ const script = typeof call.parameters.script === 'string' ? call.parameters.script : 'diagnostics';
113
+ this.checks.push({ name: script, ok: result.status === 'success' });
114
+ if (result.status !== 'success')
115
+ this.failures.push(`${script} reported problems.`);
116
+ return;
117
+ }
118
+ if (result.status !== 'success') {
119
+ this.failures.push(`${call.toolName} failed: ${firstLine(result.output)}`);
120
+ return;
121
+ }
122
+ if (call.toolName === 'write_file' && typeof call.parameters.path === 'string') {
123
+ (call.existed ? this.modified : this.created).add(call.parameters.path);
124
+ }
125
+ else if (call.toolName === 'edit_file' && typeof call.parameters.path === 'string') {
126
+ this.modified.add(call.parameters.path);
127
+ }
128
+ else if (call.toolName === 'apply_patch' && Array.isArray(call.parameters.edits)) {
129
+ for (const edit of call.parameters.edits) {
130
+ const target = edit?.path;
131
+ if (typeof target === 'string')
132
+ this.modified.add(target);
133
+ }
134
+ }
135
+ }
136
+ fileExists(relative) {
137
+ if (typeof relative !== 'string' || !relative)
138
+ return false;
139
+ try {
140
+ return fs.existsSync(resolveInJailFromRoot(this.canonicalRoot, relative));
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ }
146
+ webAppHint(changed) {
147
+ const started = this.commands.find((command) => command.serverUrl);
148
+ const hint = detectWebApp(this.workspaceRoot, changed);
149
+ if (!hint)
150
+ return undefined;
151
+ if (!started?.serverUrl)
152
+ return hint;
153
+ return { ...hint, url: started.serverUrl, live: true };
154
+ }
155
+ }
156
+ function firstLine(text) {
157
+ const line = text.split('\n').find((entry) => entry.trim().length > 0)?.trim() ?? '';
158
+ return line.length > 120 ? `${line.slice(0, 117)}...` : line;
159
+ }
160
+ function formatCommand(parameters) {
161
+ const command = typeof parameters.command === 'string' ? parameters.command : '';
162
+ const args = Array.isArray(parameters.args) ? parameters.args.filter((arg) => typeof arg === 'string') : [];
163
+ return [command, ...args].join(' ').trim();
164
+ }
165
+ const WEB_FRAMEWORKS = [
166
+ { dependency: /^next$/, port: 3000 },
167
+ { dependency: /^nuxt$/, port: 3000 },
168
+ { dependency: /^@remix-run\/dev$/, port: 3000 },
169
+ { dependency: /^astro$/, port: 4321 },
170
+ { dependency: /^vite$/, port: 5173 },
171
+ { dependency: /^@sveltejs\/kit$/, port: 5173 },
172
+ { dependency: /^react-scripts$/, port: 3000 },
173
+ { dependency: /^parcel$/, port: 1234 },
174
+ { dependency: /^@angular\/core$/, port: 4200 },
175
+ { dependency: /^webpack-dev-server$/, port: 8080 },
176
+ ];
177
+ const START_SCRIPTS = ['dev', 'start', 'serve', 'preview'];
178
+ /**
179
+ * Find the web app a change belongs to: the nearest ancestor directory that
180
+ * declares a start script and a web framework (or ships an `index.html`).
181
+ * A build-only library therefore never claims to be runnable.
182
+ */
183
+ export function detectWebApp(workspaceRoot, changedPaths) {
184
+ // Every candidate directory resolves `package.json` and `index.html`; canonicalize
185
+ // the root once for the whole scan rather than once per file.
186
+ let canonicalRoot;
187
+ try {
188
+ canonicalRoot = canonicalizeRoot(workspaceRoot);
189
+ }
190
+ catch {
191
+ return undefined;
192
+ }
193
+ const directories = [];
194
+ const seen = new Set();
195
+ const add = (directory) => {
196
+ if (!directory || seen.has(directory))
197
+ return;
198
+ seen.add(directory);
199
+ directories.push(directory);
200
+ };
201
+ for (const changed of changedPaths) {
202
+ let directory = path.posix.dirname(changed.replace(/\\/g, '/'));
203
+ while (directory && directory !== '.' && directory !== '/' && directory !== '..') {
204
+ add(directory);
205
+ directory = path.posix.dirname(directory);
206
+ }
207
+ }
208
+ add('.');
209
+ for (const directory of directories) {
210
+ const hint = readWebAppHint(canonicalRoot, directory);
211
+ if (hint)
212
+ return hint;
213
+ }
214
+ return undefined;
215
+ }
216
+ function readWebAppHint(canonicalRoot, directory) {
217
+ const relative = (file) => (directory === '.' ? file : `${directory}/${file}`);
218
+ const absolute = (file) => {
219
+ try {
220
+ return resolveInJailFromRoot(canonicalRoot, relative(file));
221
+ }
222
+ catch {
223
+ return undefined;
224
+ }
225
+ };
226
+ const hasIndex = (() => {
227
+ const target = absolute('index.html');
228
+ return target !== undefined && fs.existsSync(target);
229
+ })();
230
+ const packagePath = absolute('package.json');
231
+ if (packagePath && fs.existsSync(packagePath)) {
232
+ let manifest;
233
+ try {
234
+ if (fs.statSync(packagePath).size > 512 * 1024)
235
+ return undefined;
236
+ manifest = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
237
+ }
238
+ catch {
239
+ return undefined;
240
+ }
241
+ const scripts = manifest.scripts ?? {};
242
+ const script = START_SCRIPTS.find((name) => typeof scripts[name] === 'string');
243
+ const dependencies = { ...(manifest.dependencies ?? {}), ...(manifest.devDependencies ?? {}) };
244
+ const framework = WEB_FRAMEWORKS.find((candidate) => Object.keys(dependencies).some((name) => candidate.dependency.test(name)));
245
+ if (!script || (!framework && !hasIndex))
246
+ return undefined;
247
+ return {
248
+ directory,
249
+ command: `cd ${directory} && ${script === 'start' ? 'npm start' : `npm run ${script}`}`,
250
+ url: framework ? `http://localhost:${framework.port}` : undefined,
251
+ live: false,
252
+ };
253
+ }
254
+ if (!hasIndex)
255
+ return undefined;
256
+ return {
257
+ directory,
258
+ command: `npx --yes serve ${directory === '.' ? '.' : directory}`,
259
+ url: 'http://localhost:3000',
260
+ live: false,
261
+ };
262
+ }
263
+ /**
264
+ * Render the end-of-turn report: what changed, what was verified, what is
265
+ * outstanding, and how to run the app when the turn produced one.
266
+ */
267
+ export function formatTurnSummary(summary, style = 'chat') {
268
+ const chat = style === 'chat';
269
+ // Chat renders the report as a fenced block so the CLI can paint it as a
270
+ // tinted panel: the summary is the answer's afterword, and it has to read as
271
+ // a different thing from the prose above it. `#`/`##`/`-` keep it valid
272
+ // markdown outside the CLI, where the fence degrades to a code block.
273
+ const heading = (title, level = 2) => chat ? `${'#'.repeat(level)} ${title}` : `\x1b[1;38;5;75m${title}\x1b[0m`;
274
+ const quote = (value) => (chat ? `\`${value}\`` : value);
275
+ const bullet = (text) => (chat ? `- ${text}` : ` \x1b[38;5;253m•\x1b[0m ${text}`);
276
+ const section = (title, items) => [heading(title), ...items.map(bullet)].join('\n');
277
+ const changed = [
278
+ ...summary.created.map((file) => `Added ${quote(file)}`),
279
+ ...summary.modified.map((file) => `Updated ${quote(file)}`),
280
+ ...summary.commands.map((command) => `Ran ${quote(command.command)}${command.ok ? '' : ' (failed)'}`),
281
+ ];
282
+ const listed = changed.slice(0, MAX_LISTED * 2);
283
+ if (changed.length > listed.length)
284
+ listed.push(`… +${changed.length - listed.length} more actions`);
285
+ const sections = [
286
+ heading('Turn summary', 1),
287
+ section('Done', listed.length > 0 ? listed : ['No workspace changes were needed.']),
288
+ ];
289
+ if (summary.checks.length > 0) {
290
+ sections.push(section('Checked', summary.checks.map((check) => `${quote(check.name)} ${check.ok ? 'passed' : 'reported problems'}`)));
291
+ }
292
+ sections.push(section('Left over', summary.leftover.length > 0 ? summary.leftover : ['Nothing outstanding.']));
293
+ if (summary.webApp) {
294
+ const { command, url, live, directory } = summary.webApp;
295
+ const where = directory === '.' ? 'workspace root' : quote(directory);
296
+ sections.push(section('Run it', [
297
+ live && url ? `Already running at ${quote(url)}` : `${quote(command)}${url ? ` → ${quote(url)}` : ''}`,
298
+ `Web app in ${where}; Moderado does not keep a server in the foreground.`,
299
+ ]));
300
+ }
301
+ // One blank line between sections keeps the tinted band readable; the fence
302
+ // markers are the contract with `wrapAnswerLines` in `ui/welcome.ts`.
303
+ return chat ? [SUMMARY_FENCE, sections.join('\n'), '```'].join('\n') : sections.join('\n\n');
304
+ }
305
+ //# sourceMappingURL=turn_summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn_summary.js","sourceRoot":"","sources":["../src/turn_summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAK1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAoC1C,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,iFAAiF,CAAC;AAC/G,MAAM,SAAS,GAAG,mFAAmF,CAAC;AACtG,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAWM;IAVZ,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IACzC,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5B,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7B,QAAQ,GAAwB,EAAE,CAAC;IACnC,MAAM,GAAoC,EAAE,CAAC;IAC7C,QAAQ,GAAa,EAAE,CAAC;IACjC,MAAM,GAAG,CAAC,CAAC;IACnB,wFAAwF;IAChF,kBAAkB,CAAU;IAEpC,YAA6B,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;IAAG,CAAC;IAEtD,IAAY,aAAa;QACvB,8EAA8E;QAC9E,yDAAyD;QACzD,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,IAAI,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7F,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,KAAiB;QACtB,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAqC,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE;gBACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU;gBACV,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;aAC1C,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,MAAkB,EAAE,KAAa;QACrC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,UAAU,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,0CAA0C,CAAC,CAAC;QAC5I,IAAI,MAAM,KAAK,oBAAoB;YAAE,QAAQ,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;QACxI,IAAI,MAAM,KAAK,WAAW;YAAE,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QACtF,IAAI,MAAM,KAAK,QAAQ;YAAE,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC5E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7E,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO;YACL,MAAM;YACN,KAAK;YACL,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACxB,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;SACjC,CAAC;IACJ,CAAC;IAEO,YAAY,CAAC,UAAkB,EAAE,MAA8E;QACrH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,QAAQ,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YACzG,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YACtG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;YACtF,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,OAAO,cAAc,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3E,CAAC;iBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACnG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC,CAAC;YACpE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,YAAY,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACnF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAI,IAA2B,EAAE,IAAI,CAAC;gBAClD,IAAI,OAAO,MAAM,KAAK,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,QAAiB;QAClC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAA0B;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACzD,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrF,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,SAAS,aAAa,CAAC,UAAmC;IACxD,MAAM,OAAO,GAAG,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3H,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,cAAc,GAA2C;IAC7D,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;IACpC,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;IACpC,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,IAAI,EAAE;IAC/C,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;IACrC,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE;IACpC,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE;IAC9C,EAAE,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,EAAE;IAC7C,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE;IAC9C,EAAE,UAAU,EAAE,sBAAsB,EAAE,IAAI,EAAE,IAAI,EAAE;CACnD,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;AAEpE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,aAAqB,EAAE,YAA+B;IACjF,mFAAmF;IACnF,8DAA8D;IAC9D,IAAI,aAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,SAAiB,EAAQ,EAAE;QACtC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAC9C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACjF,GAAG,CAAC,SAAS,CAAC,CAAC;YACf,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,CAAC;IACT,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,aAAqB,EAAE,SAAiB;IAC9D,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAsB,EAAE;QACpD,IAAI,CAAC;YACH,OAAO,qBAAqB,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;QACrB,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACtC,OAAO,MAAM,KAAK,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC7C,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9C,IAAI,QAAkI,CAAC;QACvI,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI;gBAAE,OAAO,SAAS,CAAC;YACjE,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC;QAC/E,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/F,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC3D,OAAO;YACL,SAAS;YACT,OAAO,EAAE,MAAM,SAAS,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,EAAE;YACvF,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,oBAAoB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;YACjE,IAAI,EAAE,KAAK;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO;QACL,SAAS;QACT,OAAO,EAAE,mBAAmB,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE;QACjE,GAAG,EAAE,uBAAuB;QAC5B,IAAI,EAAE,KAAK;KACZ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB,EAAE,QAA6B,MAAM;IACzF,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC;IAC9B,yEAAyE;IACzE,6EAA6E;IAC7E,wEAAwE;IACxE,sEAAsE;IACtE,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,QAAe,CAAC,EAAU,EAAE,CAC1D,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,SAAS,CAAC;IAC5E,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,KAAe,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9G,MAAM,OAAO,GAAG;QACd,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;KACtG,CAAC;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,eAAe,CAAC,CAAC;IAErG,MAAM,QAAQ,GAAG;QACf,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC;KACpF,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAC;IACxI,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAE/G,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC9B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YACtG,cAAc,KAAK,sDAAsD;SAC1E,CAAC,CAAC,CAAC;IACN,CAAC;IAED,4EAA4E;IAC5E,sEAAsE;IACtE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/F,CAAC"}
package/dist/ui/box.d.ts CHANGED
@@ -6,9 +6,28 @@ export declare function stripAnsi(text: string): string;
6
6
  */
7
7
  export declare function displayWidth(text: string): number;
8
8
  export declare function getVisibleWidth(text: string): number;
9
+ /**
10
+ * Keep the first `max` terminal cells of `text`.
11
+ *
12
+ * `String#slice` counts UTF-16 units, so a CJK or emoji line looks short to it
13
+ * while occupying twice the cells — which is how a status line used to spill
14
+ * past the card and wrap onto the row below. Escape sequences are copied
15
+ * through without being counted.
16
+ */
17
+ export declare function sliceToWidth(text: string, max: number): string;
18
+ /** Keep the last `max` terminal cells of `text`. */
19
+ export declare function sliceTailToWidth(text: string, max: number): string;
20
+ /** Clamp to `max` cells, appending an ellipsis when anything was cut. */
21
+ export declare function truncateToWidth(text: string, max: number): string;
9
22
  export interface BoxOptions {
10
23
  title?: string;
11
24
  minWidth?: number;
25
+ /**
26
+ * Hard cap in terminal cells, borders included. Content wider than the cap is
27
+ * truncated, so a single long diff line can no longer widen the box past the
28
+ * terminal and wrap the whole frame out of alignment.
29
+ */
30
+ maxWidth?: number;
12
31
  borderColor?: string;
13
32
  titleColor?: string;
14
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AACA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAsBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CA6C3E"}
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AACA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAkDD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAKD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB9D;AAED,oDAAoD;AACpD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAiBlE;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CA2D3E"}
package/dist/ui/box.js CHANGED
@@ -20,24 +20,117 @@ function isWideCodePoint(code) {
20
20
  (code >= 0x1f900 && code <= 0x1f9ff) ||
21
21
  (code >= 0x20000 && code <= 0x3fffd));
22
22
  }
23
+ /**
24
+ * One terminal cluster: a code point plus any trailing variation selectors or
25
+ * combining marks, with the cells it occupies.
26
+ *
27
+ * The variation selector matters more than it looks: `⚠` is a narrow glyph, but
28
+ * `⚠️` (U+26A0 U+FE0F) asks for emoji presentation and terminals draw it two
29
+ * cells wide. Counting it as one made every approval-box border one cell short
30
+ * of its own top row — the box appeared to spill out of the frame.
31
+ */
32
+ function nextCluster(text, index) {
33
+ const code = text.codePointAt(index) ?? 0;
34
+ let cluster = String.fromCodePoint(code);
35
+ let cursor = index + cluster.length;
36
+ let emojiPresentation = false;
37
+ while (cursor < text.length) {
38
+ const next = text.codePointAt(cursor) ?? 0;
39
+ const isVariationSelector = next >= 0xfe00 && next <= 0xfe0f;
40
+ const isCombining = next >= 0x0300 && next <= 0x036f;
41
+ if (!isVariationSelector && !isCombining)
42
+ break;
43
+ if (next === 0xfe0f)
44
+ emojiPresentation = true;
45
+ const piece = String.fromCodePoint(next);
46
+ cluster += piece;
47
+ cursor += piece.length;
48
+ }
49
+ const cells = code === 0x200b ? 0 : emojiPresentation || isWideCodePoint(code) ? 2 : 1;
50
+ return { text: cluster, cells };
51
+ }
23
52
  /**
24
53
  * Terminal cells occupied by a string. Wide (CJK, emoji) glyphs count as two
25
54
  * columns and combining marks as zero, so box borders stay aligned when the
26
55
  * workspace path or the task text is not ASCII.
27
56
  */
28
57
  export function displayWidth(text) {
58
+ const plain = stripAnsi(text);
29
59
  let width = 0;
30
- for (const char of stripAnsi(text)) {
31
- const code = char.codePointAt(0) ?? 0;
32
- if (code === 0x200b || (code >= 0x0300 && code <= 0x036f) || (code >= 0xfe00 && code <= 0xfe0f))
33
- continue;
34
- width += isWideCodePoint(code) ? 2 : 1;
60
+ for (let index = 0; index < plain.length;) {
61
+ const cluster = nextCluster(plain, index);
62
+ width += cluster.cells;
63
+ index += cluster.text.length;
35
64
  }
36
65
  return width;
37
66
  }
38
67
  export function getVisibleWidth(text) {
39
68
  return displayWidth(text);
40
69
  }
70
+ /** Match an ANSI escape sequence at the start of `text`, if any. */
71
+ const ANSI_AT_START = /^\x1b\[[0-9;?]*[a-zA-Z]/;
72
+ /**
73
+ * Keep the first `max` terminal cells of `text`.
74
+ *
75
+ * `String#slice` counts UTF-16 units, so a CJK or emoji line looks short to it
76
+ * while occupying twice the cells — which is how a status line used to spill
77
+ * past the card and wrap onto the row below. Escape sequences are copied
78
+ * through without being counted.
79
+ */
80
+ export function sliceToWidth(text, max) {
81
+ if (max <= 0)
82
+ return '';
83
+ let width = 0;
84
+ let out = '';
85
+ for (let i = 0; i < text.length;) {
86
+ if (text[i] === '\x1b') {
87
+ const escape = ANSI_AT_START.exec(text.slice(i));
88
+ if (escape) {
89
+ out += escape[0];
90
+ i += escape[0].length;
91
+ continue;
92
+ }
93
+ }
94
+ const cluster = nextCluster(text, i);
95
+ if (width + cluster.cells > max)
96
+ break;
97
+ width += cluster.cells;
98
+ out += cluster.text;
99
+ i += cluster.text.length;
100
+ }
101
+ return out;
102
+ }
103
+ /** Keep the last `max` terminal cells of `text`. */
104
+ export function sliceTailToWidth(text, max) {
105
+ if (max <= 0)
106
+ return '';
107
+ const plain = stripAnsi(text);
108
+ const clusters = [];
109
+ for (let index = 0; index < plain.length;) {
110
+ const cluster = nextCluster(plain, index);
111
+ clusters.push(cluster);
112
+ index += cluster.text.length;
113
+ }
114
+ let width = 0;
115
+ let out = '';
116
+ for (let index = clusters.length - 1; index >= 0; index -= 1) {
117
+ if (width + clusters[index].cells > max)
118
+ break;
119
+ width += clusters[index].cells;
120
+ out = clusters[index].text + out;
121
+ }
122
+ return out;
123
+ }
124
+ /** Clamp to `max` cells, appending an ellipsis when anything was cut. */
125
+ export function truncateToWidth(text, max) {
126
+ if (max <= 0)
127
+ return '';
128
+ if (displayWidth(text) <= max)
129
+ return text;
130
+ if (max === 1)
131
+ return '…';
132
+ return `${sliceToWidth(text, max - 1)}…`;
133
+ }
41
134
  /**
42
135
  * Renders an enclosed Unicode box with mathematically guaranteed alignment
43
136
  * regardless of ANSI color escape codes or string lengths.
@@ -46,9 +139,22 @@ export function renderBox(lines, options = {}) {
46
139
  const border = options.borderColor ?? '\x1b[38;5;240m';
47
140
  const reset = '\x1b[0m';
48
141
  const titleColor = options.titleColor ?? '\x1b[1;38;5;75m';
142
+ // `maxWidth` is the whole box, borders included; `innerWidth` counts only the
143
+ // cells between them, which is what the border and padding arithmetic uses.
144
+ const innerCap = options.maxWidth ? Math.max(20, options.maxWidth - 2) : Number.POSITIVE_INFINITY;
145
+ // Content budget: two cells of padding on each content line.
146
+ const contentCap = innerCap - 4;
147
+ const clamp = (line) => {
148
+ if (line === '---' || getVisibleWidth(line) <= contentCap)
149
+ return line;
150
+ // Re-assert the reset: truncation can cut a line before its own `\x1b[0m`.
151
+ return `${truncateToWidth(line, contentCap)}${reset}`;
152
+ };
153
+ const shown = lines.map(clamp);
154
+ const title = options.title ? truncateToWidth(options.title, Math.max(10, contentCap - 4)) : undefined;
49
155
  // Calculate required width
50
- let maxContentWidth = options.title ? getVisibleWidth(options.title) + 4 : 0;
51
- for (const line of lines) {
156
+ let maxContentWidth = title ? getVisibleWidth(title) + 4 : 0;
157
+ for (const line of shown) {
52
158
  if (line !== '---') {
53
159
  const w = getVisibleWidth(line);
54
160
  if (w > maxContentWidth) {
@@ -56,19 +162,20 @@ export function renderBox(lines, options = {}) {
56
162
  }
57
163
  }
58
164
  }
59
- const innerWidth = Math.max(maxContentWidth + 4, options.minWidth ?? 60);
165
+ const requested = Math.max(maxContentWidth + 4, options.minWidth ?? 60);
166
+ const innerWidth = Math.min(requested, innerCap);
60
167
  let output = '';
61
168
  // 1. Top border
62
- if (options.title) {
63
- const titleVis = getVisibleWidth(options.title);
169
+ if (title) {
170
+ const titleVis = getVisibleWidth(title);
64
171
  const rightDashes = innerWidth - titleVis - 3;
65
- output += `${border}╭─ ${titleColor}${options.title}${reset}${border} ${'─'.repeat(Math.max(0, rightDashes))}╮${reset}\n`;
172
+ output += `${border}╭─ ${titleColor}${title}${reset}${border} ${'─'.repeat(Math.max(0, rightDashes))}╮${reset}\n`;
66
173
  }
67
174
  else {
68
175
  output += `${border}╭${'─'.repeat(innerWidth)}╮${reset}\n`;
69
176
  }
70
177
  // 2. Content lines
71
- for (const line of lines) {
178
+ for (const line of shown) {
72
179
  if (line === '---') {
73
180
  output += `${border}├${'─'.repeat(innerWidth)}┤${reset}\n`;
74
181
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/ui/box.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,4CAA4C;IAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,qFAAqF;AACrF,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,CACL,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAClC,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC;QACpC,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC;QACpC,CAAC,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,CAAC,CACrC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IACpC,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAC9B,OAAO,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,mBAAmB,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC;QACrD,IAAI,CAAC,mBAAmB,IAAI,CAAC,WAAW;YAAE,MAAM;QAChD,IAAI,IAAI,KAAK,MAAM;YAAE,iBAAiB,GAAG,IAAI,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,KAAK,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;QACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,oEAAoE;AACpE,MAAM,aAAa,GAAG,yBAAyB,CAAC;AAEhD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACpD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QACjC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACjD,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;gBACjB,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACtB,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,GAAG;YAAE,MAAM;QACvC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;QACvB,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;QACpB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,GAAW;IACxD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAA2C,EAAE,CAAC;IAC5D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG;YAAE,MAAM;QAC/C,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;QAC/B,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,GAAW;IACvD,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC1B,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAeD;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe,EAAE,UAAsB,EAAE;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,gBAAgB,CAAC;IACvD,MAAM,KAAK,GAAG,SAAS,CAAC;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAE3D,8EAA8E;IAC9E,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;IAClG,6DAA6D;IAC7D,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE;QACrC,IAAI,IAAI,KAAK,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,UAAU;YAAE,OAAO,IAAI,CAAC;QACvE,2EAA2E;QAC3E,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,KAAK,EAAE,CAAC;IACxD,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEvG,2BAA2B;IAC3B,IAAI,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;gBACxB,eAAe,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gBAAgB;IAChB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;IACpH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC;IAC7D,CAAC;IAED,mBAAmB;IACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,KAAK,IAAI,CAAC;IACrF,CAAC;IAED,mBAAmB;IACnB,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC;IAE3D,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderChartBlock(source: string, width: number, color?: boolean): string[] | undefined;
2
+ //# sourceMappingURL=chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.d.ts","sourceRoot":"","sources":["../../src/ui/chart.ts"],"names":[],"mappings":"AAgBA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,UAAsE,GAAG,MAAM,EAAE,GAAG,SAAS,CAajK"}