@elaraai/e3-ui-cli 1.0.72 → 1.0.74

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 (220) hide show
  1. package/README.md +46 -21
  2. package/bin/e3-ui.mjs +6 -0
  3. package/dist/app/assets/{engine-BKZbmXkC-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  4. package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
  5. package/dist/app/index.html +1 -1
  6. package/dist/cli.js +36 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/tui.d.ts +84 -0
  9. package/dist/commands/tui.d.ts.map +1 -0
  10. package/dist/commands/tui.js +89 -0
  11. package/dist/commands/tui.js.map +1 -0
  12. package/dist/tui/api.d.ts +108 -0
  13. package/dist/tui/api.d.ts.map +1 -0
  14. package/dist/tui/api.js +130 -0
  15. package/dist/tui/api.js.map +1 -0
  16. package/dist/tui/app.d.ts +23 -0
  17. package/dist/tui/app.d.ts.map +1 -0
  18. package/dist/tui/app.js +244 -0
  19. package/dist/tui/app.js.map +1 -0
  20. package/dist/tui/controller.d.ts +116 -0
  21. package/dist/tui/controller.d.ts.map +1 -0
  22. package/dist/tui/controller.js +644 -0
  23. package/dist/tui/controller.js.map +1 -0
  24. package/dist/tui/data/dataflow.d.ts +68 -0
  25. package/dist/tui/data/dataflow.d.ts.map +1 -0
  26. package/dist/tui/data/dataflow.js +137 -0
  27. package/dist/tui/data/dataflow.js.map +1 -0
  28. package/dist/tui/data/dataset.d.ts +80 -0
  29. package/dist/tui/data/dataset.d.ts.map +1 -0
  30. package/dist/tui/data/dataset.js +297 -0
  31. package/dist/tui/data/dataset.js.map +1 -0
  32. package/dist/tui/data/edit-buffer.d.ts +74 -0
  33. package/dist/tui/data/edit-buffer.d.ts.map +1 -0
  34. package/dist/tui/data/edit-buffer.js +120 -0
  35. package/dist/tui/data/edit-buffer.js.map +1 -0
  36. package/dist/tui/data/feeds.d.ts +45 -0
  37. package/dist/tui/data/feeds.d.ts.map +1 -0
  38. package/dist/tui/data/feeds.js +318 -0
  39. package/dist/tui/data/feeds.js.map +1 -0
  40. package/dist/tui/data/logs.d.ts +68 -0
  41. package/dist/tui/data/logs.d.ts.map +1 -0
  42. package/dist/tui/data/logs.js +134 -0
  43. package/dist/tui/data/logs.js.map +1 -0
  44. package/dist/tui/input/commands.d.ts +159 -0
  45. package/dist/tui/input/commands.d.ts.map +1 -0
  46. package/dist/tui/input/commands.js +259 -0
  47. package/dist/tui/input/commands.js.map +1 -0
  48. package/dist/tui/input/completion.d.ts +63 -0
  49. package/dist/tui/input/completion.d.ts.map +1 -0
  50. package/dist/tui/input/completion.js +128 -0
  51. package/dist/tui/input/completion.js.map +1 -0
  52. package/dist/tui/input/keymap.d.ts +153 -0
  53. package/dist/tui/input/keymap.d.ts.map +1 -0
  54. package/dist/tui/input/keymap.js +206 -0
  55. package/dist/tui/input/keymap.js.map +1 -0
  56. package/dist/tui/input/mouse.d.ts +52 -0
  57. package/dist/tui/input/mouse.d.ts.map +1 -0
  58. package/dist/tui/input/mouse.js +55 -0
  59. package/dist/tui/input/mouse.js.map +1 -0
  60. package/dist/tui/lifecycle.d.ts +61 -0
  61. package/dist/tui/lifecycle.d.ts.map +1 -0
  62. package/dist/tui/lifecycle.js +99 -0
  63. package/dist/tui/lifecycle.js.map +1 -0
  64. package/dist/tui/model/catalogue.d.ts +28 -0
  65. package/dist/tui/model/catalogue.d.ts.map +1 -0
  66. package/dist/tui/model/catalogue.js +94 -0
  67. package/dist/tui/model/catalogue.js.map +1 -0
  68. package/dist/tui/model/help.d.ts +37 -0
  69. package/dist/tui/model/help.d.ts.map +1 -0
  70. package/dist/tui/model/help.js +210 -0
  71. package/dist/tui/model/help.js.map +1 -0
  72. package/dist/tui/model/index.d.ts +42 -0
  73. package/dist/tui/model/index.d.ts.map +1 -0
  74. package/dist/tui/model/index.js +50 -0
  75. package/dist/tui/model/index.js.map +1 -0
  76. package/dist/tui/model/status.d.ts +88 -0
  77. package/dist/tui/model/status.d.ts.map +1 -0
  78. package/dist/tui/model/status.js +137 -0
  79. package/dist/tui/model/status.js.map +1 -0
  80. package/dist/tui/model/tree.d.ts +126 -0
  81. package/dist/tui/model/tree.d.ts.map +1 -0
  82. package/dist/tui/model/tree.js +217 -0
  83. package/dist/tui/model/tree.js.map +1 -0
  84. package/dist/tui/model/types.d.ts +21 -0
  85. package/dist/tui/model/types.d.ts.map +1 -0
  86. package/dist/tui/model/types.js +46 -0
  87. package/dist/tui/model/types.js.map +1 -0
  88. package/dist/tui/render/glyphs.d.ts +122 -0
  89. package/dist/tui/render/glyphs.d.ts.map +1 -0
  90. package/dist/tui/render/glyphs.js +122 -0
  91. package/dist/tui/render/glyphs.js.map +1 -0
  92. package/dist/tui/render/layout.d.ts +145 -0
  93. package/dist/tui/render/layout.d.ts.map +1 -0
  94. package/dist/tui/render/layout.js +209 -0
  95. package/dist/tui/render/layout.js.map +1 -0
  96. package/dist/tui/render/text.d.ts +153 -0
  97. package/dist/tui/render/text.d.ts.map +1 -0
  98. package/dist/tui/render/text.js +320 -0
  99. package/dist/tui/render/text.js.map +1 -0
  100. package/dist/tui/render/theme.d.ts +88 -0
  101. package/dist/tui/render/theme.d.ts.map +1 -0
  102. package/dist/tui/render/theme.js +145 -0
  103. package/dist/tui/render/theme.js.map +1 -0
  104. package/dist/tui/session.d.ts +78 -0
  105. package/dist/tui/session.d.ts.map +1 -0
  106. package/dist/tui/session.js +237 -0
  107. package/dist/tui/session.js.map +1 -0
  108. package/dist/tui/state/actions.d.ts +584 -0
  109. package/dist/tui/state/actions.d.ts.map +1 -0
  110. package/dist/tui/state/actions.js +62 -0
  111. package/dist/tui/state/actions.js.map +1 -0
  112. package/dist/tui/state/persist.d.ts +114 -0
  113. package/dist/tui/state/persist.d.ts.map +1 -0
  114. package/dist/tui/state/persist.js +187 -0
  115. package/dist/tui/state/persist.js.map +1 -0
  116. package/dist/tui/state/poll.d.ts +99 -0
  117. package/dist/tui/state/poll.d.ts.map +1 -0
  118. package/dist/tui/state/poll.js +160 -0
  119. package/dist/tui/state/poll.js.map +1 -0
  120. package/dist/tui/state/reducer.d.ts +16 -0
  121. package/dist/tui/state/reducer.d.ts.map +1 -0
  122. package/dist/tui/state/reducer.js +363 -0
  123. package/dist/tui/state/reducer.js.map +1 -0
  124. package/dist/tui/state/store.d.ts +37 -0
  125. package/dist/tui/state/store.d.ts.map +1 -0
  126. package/dist/tui/state/store.js +84 -0
  127. package/dist/tui/state/store.js.map +1 -0
  128. package/dist/tui/suspend.d.ts +17 -0
  129. package/dist/tui/suspend.d.ts.map +1 -0
  130. package/dist/tui/suspend.js +33 -0
  131. package/dist/tui/suspend.js.map +1 -0
  132. package/dist/tui/ui/App.d.ts +44 -0
  133. package/dist/tui/ui/App.d.ts.map +1 -0
  134. package/dist/tui/ui/App.js +105 -0
  135. package/dist/tui/ui/App.js.map +1 -0
  136. package/dist/tui/ui/frame.d.ts +86 -0
  137. package/dist/tui/ui/frame.d.ts.map +1 -0
  138. package/dist/tui/ui/frame.js +42 -0
  139. package/dist/tui/ui/frame.js.map +1 -0
  140. package/dist/tui/ui/lines.d.ts +92 -0
  141. package/dist/tui/ui/lines.d.ts.map +1 -0
  142. package/dist/tui/ui/lines.js +94 -0
  143. package/dist/tui/ui/lines.js.map +1 -0
  144. package/dist/tui/ui/shell/chrome.d.ts +61 -0
  145. package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
  146. package/dist/tui/ui/shell/chrome.js +272 -0
  147. package/dist/tui/ui/shell/chrome.js.map +1 -0
  148. package/dist/tui/ui/shell/widgets.d.ts +116 -0
  149. package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
  150. package/dist/tui/ui/shell/widgets.js +183 -0
  151. package/dist/tui/ui/shell/widgets.js.map +1 -0
  152. package/dist/tui/ui/views/about.d.ts +20 -0
  153. package/dist/tui/ui/views/about.d.ts.map +1 -0
  154. package/dist/tui/ui/views/about.js +40 -0
  155. package/dist/tui/ui/views/about.js.map +1 -0
  156. package/dist/tui/ui/views/all.d.ts +17 -0
  157. package/dist/tui/ui/views/all.d.ts.map +1 -0
  158. package/dist/tui/ui/views/all.js +17 -0
  159. package/dist/tui/ui/views/all.js.map +1 -0
  160. package/dist/tui/ui/views/dashboard.d.ts +211 -0
  161. package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
  162. package/dist/tui/ui/views/dashboard.js +651 -0
  163. package/dist/tui/ui/views/dashboard.js.map +1 -0
  164. package/dist/tui/ui/views/help.d.ts +17 -0
  165. package/dist/tui/ui/views/help.d.ts.map +1 -0
  166. package/dist/tui/ui/views/help.js +65 -0
  167. package/dist/tui/ui/views/help.js.map +1 -0
  168. package/dist/tui/ui/views/index.d.ts +42 -0
  169. package/dist/tui/ui/views/index.d.ts.map +1 -0
  170. package/dist/tui/ui/views/index.js +42 -0
  171. package/dist/tui/ui/views/index.js.map +1 -0
  172. package/dist/tui/ui/views/input.d.ts +6 -0
  173. package/dist/tui/ui/views/input.d.ts.map +1 -0
  174. package/dist/tui/ui/views/input.js +494 -0
  175. package/dist/tui/ui/views/input.js.map +1 -0
  176. package/dist/tui/ui/views/launch.d.ts +16 -0
  177. package/dist/tui/ui/views/launch.d.ts.map +1 -0
  178. package/dist/tui/ui/views/launch.js +43 -0
  179. package/dist/tui/ui/views/launch.js.map +1 -0
  180. package/dist/tui/ui/views/refusal.d.ts +20 -0
  181. package/dist/tui/ui/views/refusal.d.ts.map +1 -0
  182. package/dist/tui/ui/views/refusal.js +47 -0
  183. package/dist/tui/ui/views/refusal.js.map +1 -0
  184. package/dist/tui/ui/views/repos.d.ts +10 -0
  185. package/dist/tui/ui/views/repos.d.ts.map +1 -0
  186. package/dist/tui/ui/views/repos.js +93 -0
  187. package/dist/tui/ui/views/repos.js.map +1 -0
  188. package/dist/tui/ui/views/task.d.ts +17 -0
  189. package/dist/tui/ui/views/task.d.ts.map +1 -0
  190. package/dist/tui/ui/views/task.js +309 -0
  191. package/dist/tui/ui/views/task.js.map +1 -0
  192. package/dist/tui/ui/views/wordmark.d.ts +15 -0
  193. package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
  194. package/dist/tui/ui/views/wordmark.js +50 -0
  195. package/dist/tui/ui/views/wordmark.js.map +1 -0
  196. package/dist/tui/ui/views/workspaces.d.ts +17 -0
  197. package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
  198. package/dist/tui/ui/views/workspaces.js +127 -0
  199. package/dist/tui/ui/views/workspaces.js.map +1 -0
  200. package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
  201. package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
  202. package/dist/tui/ui/widgets/leaf-editor.js +119 -0
  203. package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
  204. package/dist/tui/ui/widgets/logs.d.ts +99 -0
  205. package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
  206. package/dist/tui/ui/widgets/logs.js +291 -0
  207. package/dist/tui/ui/widgets/logs.js.map +1 -0
  208. package/dist/tui/ui/widgets/reads.d.ts +62 -0
  209. package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
  210. package/dist/tui/ui/widgets/reads.js +122 -0
  211. package/dist/tui/ui/widgets/reads.js.map +1 -0
  212. package/dist/tui/ui/widgets/runs.d.ts +51 -0
  213. package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
  214. package/dist/tui/ui/widgets/runs.js +86 -0
  215. package/dist/tui/ui/widgets/runs.js.map +1 -0
  216. package/dist/tui/ui/widgets/tree.d.ts +149 -0
  217. package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
  218. package/dist/tui/ui/widgets/tree.js +584 -0
  219. package/dist/tui/ui/widgets/tree.js.map +1 -0
  220. package/package.json +22 -12
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The shell chrome — the header (breadcrumb + live pills), the command box
7
+ * with its completion list and confirmations, the commit bar, the hint row,
8
+ * and the frame that composes them around a view body.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { columnPlan, breakpoint } from '../../render/layout.js';
13
+ import { displayWidth, padEnd, lr } from '../../render/text.js';
14
+ import { dirtyCount } from '../../state/reducer.js';
15
+ import { changedNames } from '../../data/edit-buffer.js';
16
+ import { RUN_FLAGS, describe, parseCommand } from '../../input/commands.js';
17
+ import { connectionCell } from '../../model/status.js';
18
+ import { blank, fitLine, fitRows, lineWidth, lrLine, rule, t, b, d } from '../lines.js';
19
+ import { launchStep } from '../views/launch.js';
20
+ /** The breadcrumb of a view. */
21
+ export function breadcrumb(state, ctx) {
22
+ const parts = [];
23
+ const session = state.session;
24
+ if (session !== null)
25
+ parts.push(session.label);
26
+ const v = state.view;
27
+ if (v.kind === 'dashboard' || v.kind === 'task' || v.kind === 'input')
28
+ parts.push(v.ws);
29
+ if (v.kind === 'task')
30
+ parts.push(v.task);
31
+ if (v.kind === 'input')
32
+ parts.push(v.name);
33
+ if (v.kind === 'help' || v.kind === 'about') {
34
+ // Help and about keep the breadcrumb of the page underneath.
35
+ const under = state.history[state.history.length - 1];
36
+ if (under !== undefined) {
37
+ if (under.kind === 'dashboard' || under.kind === 'task' || under.kind === 'input')
38
+ parts.push(under.ws);
39
+ if (under.kind === 'task')
40
+ parts.push(under.task);
41
+ if (under.kind === 'input')
42
+ parts.push(under.name);
43
+ }
44
+ }
45
+ return parts.join(` ${ctx.g.crumb} `);
46
+ }
47
+ /** The header's pills: dirty, running, connection. */
48
+ export function pills(state, ctx) {
49
+ const g = ctx.g;
50
+ const out = [];
51
+ const dirty = dirtyCount(state);
52
+ if (dirty > 0)
53
+ out.push(b(`${g.diamond} ${dirty} DIRTY`, 'warn'), t(' '));
54
+ const ws = state.view.kind === 'dashboard' || state.view.kind === 'task' || state.view.kind === 'input' ? state.view.ws : null;
55
+ const execution = ws !== null ? state.data.execution[ws] : undefined;
56
+ if (execution?.state?.status.type === 'running' || execution?.settling === true || execution?.stopping === true) {
57
+ const total = ws !== null ? state.data.status[ws]?.result.tasks.length ?? 0 : 0;
58
+ const done = execution.events.filter(e => e.type !== 'start').length;
59
+ const spin = g.spinner[ctx.spinner % g.spinner.length];
60
+ if (execution.stopping)
61
+ out.push(b(`${g.square} STOPPING ${spin}`, 'warn'), t(' '));
62
+ else
63
+ out.push(b(`${g.quarter} RUNNING ${done}/${total} ${spin}`, 'info'), t(' '));
64
+ }
65
+ const conn = connectionCell(state.connection, g);
66
+ if (conn !== null)
67
+ out.push(b(`${conn.glyph} ${conn.word}`, conn.tone), t(' '));
68
+ if (out.length === 0)
69
+ out.push(d(`v${ctx.version}`), t(' '));
70
+ return out;
71
+ }
72
+ /** The header row: ` e3-ui <breadcrumb>` with the pills flush right. */
73
+ export function renderHeader(state, ctx) {
74
+ const crumb = breadcrumb(state, ctx);
75
+ const left = [t(' '), b('e3-ui', 'brand'), t(crumb === '' ? '' : ` ${crumb}`)];
76
+ return lrLine(left, pills(state, ctx), ctx.layout.columns);
77
+ }
78
+ /**
79
+ * The clickable crumbs and pills of the header row (row 0).
80
+ *
81
+ * @param state - The store state
82
+ * @param ctx - The render context
83
+ * @returns The hits
84
+ */
85
+ export function headerHits(state, ctx) {
86
+ const g = ctx.g;
87
+ const hits = [];
88
+ const parts = breadcrumb(state, ctx).split(` ${g.crumb} `).filter(p => p !== '');
89
+ let x = 1 + displayWidth('e3-ui') + 2;
90
+ parts.forEach((part, i) => {
91
+ const w = displayWidth(part);
92
+ hits.push({ row: 0, x0: x, x1: x + w, target: { kind: 'crumb', index: i } });
93
+ x += w + displayWidth(` ${g.crumb} `);
94
+ });
95
+ const spans = pills(state, ctx);
96
+ let px = ctx.layout.columns - lineWidth(spans);
97
+ for (const span of spans) {
98
+ const w = displayWidth(span.text);
99
+ if (span.bold === true && span.text.trim() !== '') {
100
+ const pill = span.text.includes('DIRTY') ? 'dirty' : span.text.includes('RUNNING') || span.text.includes('STOPPING') ? 'running' : 'connection';
101
+ hits.push({ row: 0, x0: px, x1: px + w, target: { kind: 'pill', pill } });
102
+ }
103
+ px += w;
104
+ }
105
+ return hits;
106
+ }
107
+ /**
108
+ * The clickable completion rows (absolute rows above the command box).
109
+ *
110
+ * @param state - The store state
111
+ * @param ctx - The render context
112
+ * @returns The hits
113
+ */
114
+ export function completionHits(state, ctx) {
115
+ const completion = state.command.completion;
116
+ if (completion === null || ctx.layout.completionRows === 0)
117
+ return [];
118
+ const first = ctx.layout.commandTop - ctx.layout.completionRows;
119
+ return completion.items.slice(0, ctx.layout.completionRows).map((_, i) => ({ row: first + i, x0: 0, x1: ctx.layout.columns, target: { kind: 'completion', index: i } }));
120
+ }
121
+ /** The toast line, if a toast is showing. */
122
+ function toastLine(state, ctx) {
123
+ const toast = state.toast;
124
+ if (toast === null || toast.until < ctx.now)
125
+ return null;
126
+ const glyph = toast.glyph ?? (toast.tone === 'neg' ? ctx.g.cross : toast.tone === 'warn' ? ctx.g.half : toast.tone === 'info' ? ctx.g.quarter : ctx.g.dot);
127
+ return [t(' '), b(`${glyph} `, toast.tone), t(toast.text)];
128
+ }
129
+ /** The consequence line of what is typed (`run 6 tasks in main …`), and its keys. */
130
+ export function commandStatus(state) {
131
+ const text = state.command.text;
132
+ const completion = state.command.completion;
133
+ if (!text.startsWith('/')) {
134
+ if (completion !== null)
135
+ return { text: `${completion.items.length} match${completion.items.length === 1 ? '' : 'es'} · ↑↓ pick · ⏎ open`, keys: 'esc', error: false };
136
+ return { text: text === '' ? '' : 'no match', keys: 'esc', error: false };
137
+ }
138
+ const parsed = parseCommand(text);
139
+ if (!parsed.ok) {
140
+ if (completion !== null)
141
+ return { text: `${completion.items.length} match${completion.items.length === 1 ? '' : 'es'} · ↑↓ pick · ⏎ open · tab complete`, keys: '', error: false };
142
+ return { text: parsed.error, keys: 'esc', error: true };
143
+ }
144
+ const ws = state.view.kind === 'dashboard' || state.view.kind === 'task' || state.view.kind === 'input' ? state.view.ws : null;
145
+ const status = ws !== null ? state.data.status[ws]?.result : undefined;
146
+ const execution = ws !== null ? state.data.execution[ws] : undefined;
147
+ const described = describe(parsed.command, {
148
+ workspace: ws,
149
+ taskCount: status?.tasks.length ?? 0,
150
+ running: execution?.state?.status.type === 'running' || execution?.settling === true,
151
+ concurrency: 4,
152
+ dirty: dirtyCount(state),
153
+ });
154
+ if (completion !== null && (parsed.command.name === 'task' || parsed.command.name === 'input' || parsed.command.name === 'workspace' || parsed.command.name === 'dataset' || parsed.command.name === 'repo' || parsed.command.name === 'logs' || parsed.command.name === 'runs' || parsed.command.name === 'tag')) {
155
+ return { text: `${completion.items.length} match${completion.items.length === 1 ? '' : 'es'} · ↑↓ pick · ⏎ open · tab complete`, keys: '', error: false };
156
+ }
157
+ return { text: described.text, keys: described.keys, error: false };
158
+ }
159
+ /** The command box: a rule, the ` › …` line, a rule. */
160
+ export function renderCommandBox(state, ctx) {
161
+ const width = ctx.layout.columns;
162
+ const g = ctx.g;
163
+ const prompt = [t(' '), b(g.prompt, 'brand'), t(' ')];
164
+ let middle;
165
+ const command = state.command;
166
+ const toast = toastLine(state, ctx);
167
+ if (state.view.kind === 'launch') {
168
+ middle = [...prompt, b(launchStep(state, ctx), 'brand')];
169
+ }
170
+ else if (command.mode === 'confirm' && command.confirm !== null) {
171
+ middle = lrLine([...prompt, b(command.confirm.question, 'warn')], [d('⏎ yes · esc no'), t(' ')], width);
172
+ }
173
+ else if (command.mode === 'edit') {
174
+ const text = command.text;
175
+ const before = text.slice(0, command.cursor);
176
+ const after = text.slice(command.cursor);
177
+ const typed = [...prompt, t(before), b(g.cursor, 'brand'), t(after)];
178
+ const status = commandStatus(state);
179
+ const typedWidth = displayWidth(before) + displayWidth(after) + 4;
180
+ const at = Math.max(typedWidth + 3, Math.min(40, width - 30));
181
+ const pad = Math.max(1, at - typedWidth);
182
+ const statusSpan = status.error ? t(status.text, 'neg') : d(status.text);
183
+ middle = lrLine([...typed, t(' '.repeat(pad)), statusSpan], [d(status.keys), t(' ')], width);
184
+ }
185
+ else if (toast !== null) {
186
+ // The toast sits after the prompt (` › ● Dataflow started · main · 6 tasks queued`).
187
+ middle = [...prompt, t(' '), ...toast.slice(1)];
188
+ }
189
+ else {
190
+ const hint = '/ commands · type a name to jump · ? help';
191
+ const at = Math.min(50, Math.max(6, width - displayWidth(hint) - 6));
192
+ middle = [...prompt, b(g.cursor, 'brand'), t(' '.repeat(Math.max(1, at - 4))), d(hint)];
193
+ }
194
+ return [rule(width, g.rule), fitLine(middle, width), rule(width, g.rule)];
195
+ }
196
+ /** The completion rows above the command box. */
197
+ export function renderCompletion(state, ctx) {
198
+ const completion = state.command.completion;
199
+ if (completion === null || ctx.layout.completionRows === 0)
200
+ return [];
201
+ const width = ctx.layout.columns;
202
+ const g = ctx.g;
203
+ const isJump = !state.command.text.startsWith('/');
204
+ const plan = columnPlan(isJump ? 'jump' : 'completion', breakpoint(state.size));
205
+ const items = completion.items.slice(0, ctx.layout.completionRows);
206
+ return items.map((item, i) => {
207
+ const selected = i === completion.index;
208
+ const line = [t(' '), b(selected ? g.sel : ' ', 'brand'), t(' ')];
209
+ let used = 3;
210
+ plan.forEach((col, ci) => {
211
+ const cell = item.cells[ci] ?? '';
212
+ if (col.width === 0) {
213
+ line.push(selected ? b(cell) : t(cell));
214
+ return;
215
+ }
216
+ line.push(selected ? b(padEnd(cell, col.width)) : t(padEnd(cell, col.width)));
217
+ used += col.width;
218
+ });
219
+ void used;
220
+ return fitLine(line, width);
221
+ });
222
+ }
223
+ /** The commit bar (a dashed rule + the pending summary), when editing. */
224
+ export function renderCommitBar(state, ctx) {
225
+ if (ctx.layout.commitRows === 0 || state.edit === null)
226
+ return [];
227
+ const width = ctx.layout.columns;
228
+ const g = ctx.g;
229
+ const n = state.edit.ops.length;
230
+ const changed = changedNames(state.edit).join(' · ');
231
+ const left = [t(' '), b(`${g.diamond} ${n} change${n === 1 ? '' : 's'} pending`, 'warn'), t(' '), d(changed)];
232
+ const right = state.edit.applying ? [d('applying…')] : [b(`${g.enter} APPLY`, 'pos'), t(' '), b('esc DISCARD', 'neg')];
233
+ return [rule(width, g.dashed), lrLine(left, right, width)];
234
+ }
235
+ /** The hint row (the last row): the view's hints, or the toast when the box is busy. */
236
+ export function renderHintBar(state, ctx, hints) {
237
+ const width = ctx.layout.columns;
238
+ const toast = toastLine(state, ctx);
239
+ if (toast !== null && state.command.mode !== 'idle')
240
+ return fitLine(toast, width);
241
+ // While `/run` is being typed the row lists its flags.
242
+ if (state.command.mode === 'edit' && /^\/run(\s|$)/.test(state.command.text)) {
243
+ return [d(lr(` ${RUN_FLAGS.map(f => (f.hint === '' ? f.flag : `${f.flag} ${f.hint}`)).join(' ')}`, '', width))];
244
+ }
245
+ return [d(lr(` ${hints.left}`, hints.right === '' ? '' : `${hints.right} `, width))];
246
+ }
247
+ /**
248
+ * The whole frame: header, rule, body, commit bar, completion, command box,
249
+ * hint — exactly `rows` lines of exactly `columns` cells.
250
+ *
251
+ * @param state - The store state
252
+ * @param ctx - The render context
253
+ * @param body - The view's body lines
254
+ * @param hints - The view's hint row
255
+ * @returns The frame's lines
256
+ */
257
+ export function renderFrame(state, ctx, body, hints) {
258
+ const { layout } = ctx;
259
+ const width = layout.columns;
260
+ const lines = [];
261
+ lines.push(fitLine(renderHeader(state, ctx), width));
262
+ lines.push(rule(width, ctx.g.rule));
263
+ lines.push(...fitRows(body, layout.bodyRows, width));
264
+ lines.push(...renderCommitBar(state, ctx));
265
+ lines.push(...renderCompletion(state, ctx));
266
+ lines.push(...renderCommandBox(state, ctx));
267
+ lines.push(fitLine(renderHintBar(state, ctx, hints), width));
268
+ while (lines.length < layout.rows)
269
+ lines.push(blank(width));
270
+ return lines.slice(0, layout.rows);
271
+ }
272
+ //# sourceMappingURL=chrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../../../src/tui/ui/shell/chrome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Shared widgets — the scrollbar column every scrolling view uses, tables
7
+ * with a selection bar, a section title line, a centred block (the refusal
8
+ * / output-state screens), and the tab strip.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { type ColumnSpec } from '../../render/layout.js';
13
+ import type { Tone } from '../../render/theme.js';
14
+ import type { Glyphs } from '../../render/glyphs.js';
15
+ import { type Line } from '../lines.js';
16
+ /**
17
+ * Appends the scrollbar column (`▲ … ▼` with a thumb) to `lines` when the
18
+ * content overflows; otherwise pads them to the full width.
19
+ *
20
+ * @param lines - The visible rows (each already at most `width − 1` cells)
21
+ * @param width - The row width including the scrollbar column
22
+ * @param total - Total rows
23
+ * @param visible - Visible rows (`lines.length`)
24
+ * @param top - The first visible row
25
+ * @param g - The glyph set
26
+ * @returns The rows with the scrollbar column
27
+ */
28
+ export declare function withScrollbar(lines: Line[], width: number, total: number, visible: number, top: number, g: Glyphs): Line[];
29
+ /** One table row's cells (text per column key) and its tone / selection. */
30
+ export interface TableRow {
31
+ cells: Record<string, string | {
32
+ text: string;
33
+ tone?: Tone | undefined;
34
+ } | undefined>;
35
+ /** A marker in the gutter instead of the selection bar (`┆` for a changed row). */
36
+ marker?: string | undefined;
37
+ }
38
+ /**
39
+ * Fits a column plan to a table's rows: a `grow` column first widens to
40
+ * its longest cell (plus the gap, up to its cap), then the plan is fitted
41
+ * to the width ({@link fitPlan}). The one pass over every row — the
42
+ * dashboard computes it once per data change and keeps it.
43
+ *
44
+ * @param plan - The column plan (the last column takes the remainder)
45
+ * @param rows - Every row
46
+ * @param width - The row width
47
+ * @returns The fitted plan
48
+ */
49
+ export declare function tablePlan(plan: ColumnSpec[], rows: readonly TableRow[], width: number): ColumnSpec[];
50
+ /**
51
+ * One line of a table: the header (`row` null) or a row, with the
52
+ * selection bar (`▌`) when selected. Cells are looked up by column key, so
53
+ * a plan that drops a column at a narrow width leaves the others aligned;
54
+ * a fixed cell that overflows ends in an ellipsis and keeps one cell of gap.
55
+ *
56
+ * @param fitted - The fitted plan ({@link tablePlan})
57
+ * @param row - The row, or null for the header
58
+ * @param selected - Whether the row is selected
59
+ * @param width - The row width
60
+ * @param g - The glyph set
61
+ * @returns The line
62
+ */
63
+ export declare function tableLine(fitted: readonly ColumnSpec[], row: TableRow | null, selected: boolean, width: number, g: Glyphs): Line;
64
+ /**
65
+ * A table: a header row, then the rows in `[top, top + visible)` with a
66
+ * selection bar (`▌`) on `sel` — {@link tablePlan} then {@link tableLine}
67
+ * per row.
68
+ *
69
+ * @param plan - The column plan (the last column takes the remainder)
70
+ * @param rows - Every row
71
+ * @param sel - The selected row (or −1)
72
+ * @param top - The first visible row
73
+ * @param visible - Visible rows
74
+ * @param width - The row width
75
+ * @param g - The glyph set
76
+ * @param header - Whether to draw the header row
77
+ * @returns The lines
78
+ */
79
+ export declare function renderTable(plan: ColumnSpec[], rows: TableRow[], sel: number, top: number, visible: number, width: number, g: Glyphs, header?: boolean): Line[];
80
+ /** A section title line: ` TITLE` with `right` flush right. */
81
+ export declare function sectionLine(title: string, right: string, width: number): Line;
82
+ /**
83
+ * A centred block: a blank, a bold title line, a blank, the body lines, a blank.
84
+ *
85
+ * @param glyph - The glyph before the title
86
+ * @param tone - The title's tone
87
+ * @param title - The title
88
+ * @param body - The lines (each centred)
89
+ * @param width - The row width
90
+ * @returns The lines
91
+ */
92
+ export declare function centredBlock(glyph: string, tone: Tone, title: string, body: string[], width: number): Line[];
93
+ /**
94
+ * The cell ranges of a tab strip's tabs (the geometry {@link tabStrip} draws).
95
+ *
96
+ * @param name - The leading name
97
+ * @param tabs - The tab labels
98
+ * @param g - The glyph set
99
+ * @returns Each tab's `[x0, x1)` and index
100
+ */
101
+ export declare function tabStripHits(name: string, tabs: string[], g: Glyphs): {
102
+ index: number;
103
+ x0: number;
104
+ x1: number;
105
+ }[];
106
+ /**
107
+ * A tab strip: ` name ▌1 Output▐ 2 Logs 3 Runs`.
108
+ *
109
+ * @param name - The leading name
110
+ * @param tabs - The tab labels
111
+ * @param active - The active tab index
112
+ * @param g - The glyph set
113
+ * @returns The spans
114
+ */
115
+ export declare function tabStrip(name: string, tabs: string[], active: number, g: Glyphs): Line;
116
+ //# sourceMappingURL=widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/shell/widgets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,EAA2C,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAElG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAA4B,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAS1H;AAED,4EAA4E;AAC5E,MAAM,WAAW,QAAQ;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IACtF,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAOpG;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBhI;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,IAAI,EAAE,CAM5J;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAS5G;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CASjH;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAQtF"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Shared widgets — the scrollbar column every scrolling view uses, tables
7
+ * with a selection bar, a section title line, a centred block (the refusal
8
+ * / output-state screens), and the tab strip.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { fitPlan, scrollbar as scrollbarGeometry } from '../../render/layout.js';
13
+ import { center, displayWidth, padEnd, padStart, truncate } from '../../render/text.js';
14
+ import { b, d, fitLine, lrLine, t } from '../lines.js';
15
+ /**
16
+ * Appends the scrollbar column (`▲ … ▼` with a thumb) to `lines` when the
17
+ * content overflows; otherwise pads them to the full width.
18
+ *
19
+ * @param lines - The visible rows (each already at most `width − 1` cells)
20
+ * @param width - The row width including the scrollbar column
21
+ * @param total - Total rows
22
+ * @param visible - Visible rows (`lines.length`)
23
+ * @param top - The first visible row
24
+ * @param g - The glyph set
25
+ * @returns The rows with the scrollbar column
26
+ */
27
+ export function withScrollbar(lines, width, total, visible, top, g) {
28
+ const h = lines.length;
29
+ const geometry = scrollbarGeometry(Math.max(0, h - 2), total, visible, top);
30
+ if (geometry === null)
31
+ return lines.map(l => fitLine(l, width));
32
+ return lines.map((line, i) => {
33
+ const ch = i === 0 ? g.scrollUp : i === h - 1 ? g.scrollDown : (i - 1 >= geometry.pos && i - 1 < geometry.pos + geometry.thumb ? g.thumb : g.vbar);
34
+ const tone = ch === g.thumb ? 'brand' : 'muted';
35
+ return [...fitLine(line, width - 1), b(ch, tone)];
36
+ });
37
+ }
38
+ function cellText(cell) {
39
+ return cell === undefined ? '' : typeof cell === 'string' ? cell : cell.text;
40
+ }
41
+ /**
42
+ * Fits a column plan to a table's rows: a `grow` column first widens to
43
+ * its longest cell (plus the gap, up to its cap), then the plan is fitted
44
+ * to the width ({@link fitPlan}). The one pass over every row — the
45
+ * dashboard computes it once per data change and keeps it.
46
+ *
47
+ * @param plan - The column plan (the last column takes the remainder)
48
+ * @param rows - Every row
49
+ * @param width - The row width
50
+ * @returns The fitted plan
51
+ */
52
+ export function tablePlan(plan, rows, width) {
53
+ const grown = plan.map(col => {
54
+ if (col.grow === undefined)
55
+ return col;
56
+ const longest = rows.reduce((n, row) => Math.max(n, displayWidth(cellText(row.cells[col.key]))), displayWidth(col.title));
57
+ return { ...col, width: Math.min(col.grow, Math.max(col.width, longest + 1)) };
58
+ });
59
+ return fitPlan(grown, width);
60
+ }
61
+ /**
62
+ * One line of a table: the header (`row` null) or a row, with the
63
+ * selection bar (`▌`) when selected. Cells are looked up by column key, so
64
+ * a plan that drops a column at a narrow width leaves the others aligned;
65
+ * a fixed cell that overflows ends in an ellipsis and keeps one cell of gap.
66
+ *
67
+ * @param fitted - The fitted plan ({@link tablePlan})
68
+ * @param row - The row, or null for the header
69
+ * @param selected - Whether the row is selected
70
+ * @param width - The row width
71
+ * @param g - The glyph set
72
+ * @returns The line
73
+ */
74
+ export function tableLine(fitted, row, selected, width, g) {
75
+ const line = [t(' '), selected ? b(g.sel, 'brand') : t(row?.marker ?? ' ')];
76
+ let used = 2;
77
+ for (const col of fitted) {
78
+ const raw = row === null ? col.title : row.cells[col.key] ?? '';
79
+ const cell = typeof raw === 'string' ? { text: raw, tone: undefined } : raw;
80
+ const budget = col.width === 0 ? Math.max(0, width - used) : col.width;
81
+ // A fixed column keeps one cell of gap before the next; overflow ends in an ellipsis.
82
+ const room = col.width === 0 ? budget : Math.max(1, budget - 1);
83
+ const clipped = truncate(cell.text, room);
84
+ const text = col.align === 'right' ? padStart(clipped, budget) : padEnd(clipped, budget);
85
+ if (row === null)
86
+ line.push(d(text));
87
+ else if (selected)
88
+ line.push(b(text, cell.tone));
89
+ else
90
+ line.push(t(text, cell.tone));
91
+ used += budget;
92
+ }
93
+ return fitLine(line, width);
94
+ }
95
+ /**
96
+ * A table: a header row, then the rows in `[top, top + visible)` with a
97
+ * selection bar (`▌`) on `sel` — {@link tablePlan} then {@link tableLine}
98
+ * per row.
99
+ *
100
+ * @param plan - The column plan (the last column takes the remainder)
101
+ * @param rows - Every row
102
+ * @param sel - The selected row (or −1)
103
+ * @param top - The first visible row
104
+ * @param visible - Visible rows
105
+ * @param width - The row width
106
+ * @param g - The glyph set
107
+ * @param header - Whether to draw the header row
108
+ * @returns The lines
109
+ */
110
+ export function renderTable(plan, rows, sel, top, visible, width, g, header = true) {
111
+ const fitted = tablePlan(plan, rows, width);
112
+ const out = [];
113
+ if (header)
114
+ out.push(tableLine(fitted, null, false, width, g));
115
+ for (let i = top; i < Math.min(rows.length, top + visible); i++)
116
+ out.push(tableLine(fitted, rows[i], i === sel, width, g));
117
+ return out;
118
+ }
119
+ /** A section title line: ` TITLE` with `right` flush right. */
120
+ export function sectionLine(title, right, width) {
121
+ return lrLine([t(' '), b(title)], [d(right), t(' ')], width);
122
+ }
123
+ /**
124
+ * A centred block: a blank, a bold title line, a blank, the body lines, a blank.
125
+ *
126
+ * @param glyph - The glyph before the title
127
+ * @param tone - The title's tone
128
+ * @param title - The title
129
+ * @param body - The lines (each centred)
130
+ * @param width - The row width
131
+ * @returns The lines
132
+ */
133
+ export function centredBlock(glyph, tone, title, body, width) {
134
+ const out = [];
135
+ out.push([t(' '.repeat(width))]);
136
+ const heading = `${glyph} ${title}`;
137
+ out.push([b(center(heading, width), tone)]);
138
+ out.push([t(' '.repeat(width))]);
139
+ for (const line of body)
140
+ out.push([t(center(line, width))]);
141
+ out.push([t(' '.repeat(width))]);
142
+ return out;
143
+ }
144
+ /**
145
+ * The cell ranges of a tab strip's tabs (the geometry {@link tabStrip} draws).
146
+ *
147
+ * @param name - The leading name
148
+ * @param tabs - The tab labels
149
+ * @param g - The glyph set
150
+ * @returns Each tab's `[x0, x1)` and index
151
+ */
152
+ export function tabStripHits(name, tabs, g) {
153
+ void g;
154
+ let x = 1 + displayWidth(name) + 3;
155
+ return tabs.map((label, i) => {
156
+ const w = 2 + displayWidth(`${i + 1} ${label}`) + 2;
157
+ const hit = { index: i, x0: x, x1: x + w };
158
+ x += w + (i < tabs.length - 1 ? 1 : 0);
159
+ return hit;
160
+ });
161
+ }
162
+ /**
163
+ * A tab strip: ` name ▌1 Output▐ 2 Logs 3 Runs`.
164
+ *
165
+ * @param name - The leading name
166
+ * @param tabs - The tab labels
167
+ * @param active - The active tab index
168
+ * @param g - The glyph set
169
+ * @returns The spans
170
+ */
171
+ export function tabStrip(name, tabs, active, g) {
172
+ const line = [t(' '), b(name), t(' ')];
173
+ tabs.forEach((label, i) => {
174
+ if (i === active)
175
+ line.push(b(`${g.tabL}${i + 1} ${label}${g.tabR}`, 'brand'));
176
+ else
177
+ line.push(d(` ${i + 1} ${label} `));
178
+ if (i < tabs.length - 1)
179
+ line.push(t(' '));
180
+ });
181
+ return line;
182
+ }
183
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../../src/tui/ui/shell/widgets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ import type { TuiState } from '../../state/actions.js';
6
+ import { type Line, type RenderCtx } from '../lines.js';
7
+ /** Facts about the open repository, filled by the session (for the about view). */
8
+ export interface RepoFacts {
9
+ objects: number;
10
+ packages: number;
11
+ workspaces: number;
12
+ }
13
+ /** The about body. */
14
+ export declare function renderAbout(state: TuiState, ctx: RenderCtx, facts: RepoFacts | null): Line[];
15
+ /** The about hints. */
16
+ export declare const aboutHints: {
17
+ left: string;
18
+ right: string;
19
+ };
20
+ //# sourceMappingURL=about.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/views/about.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAkB,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxE,mFAAmF;AACnF,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,sBAAsB;AACtB,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,EAAE,CAsB5F;AAED,uBAAuB;AACvB,eAAO,MAAM,UAAU;;;CAAkC,CAAC"}