@elaraai/e3-ui-cli 1.0.71 → 1.0.73

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 (219) hide show
  1. package/README.md +46 -21
  2. package/dist/app/assets/{engine-BKZbmXkC-hslJZfFw.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  3. package/dist/app/assets/{index-8USNHP31.js → index-mj-YVVN1.js} +92 -92
  4. package/dist/app/index.html +1 -1
  5. package/dist/cli.js +36 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/tui.d.ts +84 -0
  8. package/dist/commands/tui.d.ts.map +1 -0
  9. package/dist/commands/tui.js +86 -0
  10. package/dist/commands/tui.js.map +1 -0
  11. package/dist/tui/api.d.ts +108 -0
  12. package/dist/tui/api.d.ts.map +1 -0
  13. package/dist/tui/api.js +130 -0
  14. package/dist/tui/api.js.map +1 -0
  15. package/dist/tui/app.d.ts +23 -0
  16. package/dist/tui/app.d.ts.map +1 -0
  17. package/dist/tui/app.js +241 -0
  18. package/dist/tui/app.js.map +1 -0
  19. package/dist/tui/controller.d.ts +116 -0
  20. package/dist/tui/controller.d.ts.map +1 -0
  21. package/dist/tui/controller.js +620 -0
  22. package/dist/tui/controller.js.map +1 -0
  23. package/dist/tui/data/dataflow.d.ts +68 -0
  24. package/dist/tui/data/dataflow.d.ts.map +1 -0
  25. package/dist/tui/data/dataflow.js +137 -0
  26. package/dist/tui/data/dataflow.js.map +1 -0
  27. package/dist/tui/data/dataset.d.ts +80 -0
  28. package/dist/tui/data/dataset.d.ts.map +1 -0
  29. package/dist/tui/data/dataset.js +297 -0
  30. package/dist/tui/data/dataset.js.map +1 -0
  31. package/dist/tui/data/edit-buffer.d.ts +74 -0
  32. package/dist/tui/data/edit-buffer.d.ts.map +1 -0
  33. package/dist/tui/data/edit-buffer.js +120 -0
  34. package/dist/tui/data/edit-buffer.js.map +1 -0
  35. package/dist/tui/data/feeds.d.ts +45 -0
  36. package/dist/tui/data/feeds.d.ts.map +1 -0
  37. package/dist/tui/data/feeds.js +318 -0
  38. package/dist/tui/data/feeds.js.map +1 -0
  39. package/dist/tui/data/logs.d.ts +68 -0
  40. package/dist/tui/data/logs.d.ts.map +1 -0
  41. package/dist/tui/data/logs.js +134 -0
  42. package/dist/tui/data/logs.js.map +1 -0
  43. package/dist/tui/input/commands.d.ts +159 -0
  44. package/dist/tui/input/commands.d.ts.map +1 -0
  45. package/dist/tui/input/commands.js +259 -0
  46. package/dist/tui/input/commands.js.map +1 -0
  47. package/dist/tui/input/completion.d.ts +63 -0
  48. package/dist/tui/input/completion.d.ts.map +1 -0
  49. package/dist/tui/input/completion.js +128 -0
  50. package/dist/tui/input/completion.js.map +1 -0
  51. package/dist/tui/input/keymap.d.ts +153 -0
  52. package/dist/tui/input/keymap.d.ts.map +1 -0
  53. package/dist/tui/input/keymap.js +206 -0
  54. package/dist/tui/input/keymap.js.map +1 -0
  55. package/dist/tui/input/mouse.d.ts +52 -0
  56. package/dist/tui/input/mouse.d.ts.map +1 -0
  57. package/dist/tui/input/mouse.js +55 -0
  58. package/dist/tui/input/mouse.js.map +1 -0
  59. package/dist/tui/lifecycle.d.ts +61 -0
  60. package/dist/tui/lifecycle.d.ts.map +1 -0
  61. package/dist/tui/lifecycle.js +99 -0
  62. package/dist/tui/lifecycle.js.map +1 -0
  63. package/dist/tui/model/catalogue.d.ts +28 -0
  64. package/dist/tui/model/catalogue.d.ts.map +1 -0
  65. package/dist/tui/model/catalogue.js +94 -0
  66. package/dist/tui/model/catalogue.js.map +1 -0
  67. package/dist/tui/model/help.d.ts +37 -0
  68. package/dist/tui/model/help.d.ts.map +1 -0
  69. package/dist/tui/model/help.js +210 -0
  70. package/dist/tui/model/help.js.map +1 -0
  71. package/dist/tui/model/index.d.ts +42 -0
  72. package/dist/tui/model/index.d.ts.map +1 -0
  73. package/dist/tui/model/index.js +50 -0
  74. package/dist/tui/model/index.js.map +1 -0
  75. package/dist/tui/model/status.d.ts +88 -0
  76. package/dist/tui/model/status.d.ts.map +1 -0
  77. package/dist/tui/model/status.js +137 -0
  78. package/dist/tui/model/status.js.map +1 -0
  79. package/dist/tui/model/tree.d.ts +112 -0
  80. package/dist/tui/model/tree.d.ts.map +1 -0
  81. package/dist/tui/model/tree.js +178 -0
  82. package/dist/tui/model/tree.js.map +1 -0
  83. package/dist/tui/model/types.d.ts +21 -0
  84. package/dist/tui/model/types.d.ts.map +1 -0
  85. package/dist/tui/model/types.js +46 -0
  86. package/dist/tui/model/types.js.map +1 -0
  87. package/dist/tui/render/glyphs.d.ts +122 -0
  88. package/dist/tui/render/glyphs.d.ts.map +1 -0
  89. package/dist/tui/render/glyphs.js +122 -0
  90. package/dist/tui/render/glyphs.js.map +1 -0
  91. package/dist/tui/render/layout.d.ts +145 -0
  92. package/dist/tui/render/layout.d.ts.map +1 -0
  93. package/dist/tui/render/layout.js +209 -0
  94. package/dist/tui/render/layout.js.map +1 -0
  95. package/dist/tui/render/text.d.ts +149 -0
  96. package/dist/tui/render/text.d.ts.map +1 -0
  97. package/dist/tui/render/text.js +288 -0
  98. package/dist/tui/render/text.js.map +1 -0
  99. package/dist/tui/render/theme.d.ts +88 -0
  100. package/dist/tui/render/theme.d.ts.map +1 -0
  101. package/dist/tui/render/theme.js +145 -0
  102. package/dist/tui/render/theme.js.map +1 -0
  103. package/dist/tui/session.d.ts +78 -0
  104. package/dist/tui/session.d.ts.map +1 -0
  105. package/dist/tui/session.js +237 -0
  106. package/dist/tui/session.js.map +1 -0
  107. package/dist/tui/state/actions.d.ts +584 -0
  108. package/dist/tui/state/actions.d.ts.map +1 -0
  109. package/dist/tui/state/actions.js +62 -0
  110. package/dist/tui/state/actions.js.map +1 -0
  111. package/dist/tui/state/persist.d.ts +114 -0
  112. package/dist/tui/state/persist.d.ts.map +1 -0
  113. package/dist/tui/state/persist.js +187 -0
  114. package/dist/tui/state/persist.js.map +1 -0
  115. package/dist/tui/state/poll.d.ts +99 -0
  116. package/dist/tui/state/poll.d.ts.map +1 -0
  117. package/dist/tui/state/poll.js +160 -0
  118. package/dist/tui/state/poll.js.map +1 -0
  119. package/dist/tui/state/reducer.d.ts +16 -0
  120. package/dist/tui/state/reducer.d.ts.map +1 -0
  121. package/dist/tui/state/reducer.js +363 -0
  122. package/dist/tui/state/reducer.js.map +1 -0
  123. package/dist/tui/state/store.d.ts +37 -0
  124. package/dist/tui/state/store.d.ts.map +1 -0
  125. package/dist/tui/state/store.js +84 -0
  126. package/dist/tui/state/store.js.map +1 -0
  127. package/dist/tui/suspend.d.ts +17 -0
  128. package/dist/tui/suspend.d.ts.map +1 -0
  129. package/dist/tui/suspend.js +33 -0
  130. package/dist/tui/suspend.js.map +1 -0
  131. package/dist/tui/ui/App.d.ts +41 -0
  132. package/dist/tui/ui/App.d.ts.map +1 -0
  133. package/dist/tui/ui/App.js +92 -0
  134. package/dist/tui/ui/App.js.map +1 -0
  135. package/dist/tui/ui/frame.d.ts +86 -0
  136. package/dist/tui/ui/frame.d.ts.map +1 -0
  137. package/dist/tui/ui/frame.js +42 -0
  138. package/dist/tui/ui/frame.js.map +1 -0
  139. package/dist/tui/ui/lines.d.ts +92 -0
  140. package/dist/tui/ui/lines.d.ts.map +1 -0
  141. package/dist/tui/ui/lines.js +94 -0
  142. package/dist/tui/ui/lines.js.map +1 -0
  143. package/dist/tui/ui/shell/chrome.d.ts +61 -0
  144. package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
  145. package/dist/tui/ui/shell/chrome.js +272 -0
  146. package/dist/tui/ui/shell/chrome.js.map +1 -0
  147. package/dist/tui/ui/shell/widgets.d.ts +75 -0
  148. package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
  149. package/dist/tui/ui/shell/widgets.js +160 -0
  150. package/dist/tui/ui/shell/widgets.js.map +1 -0
  151. package/dist/tui/ui/views/about.d.ts +20 -0
  152. package/dist/tui/ui/views/about.d.ts.map +1 -0
  153. package/dist/tui/ui/views/about.js +40 -0
  154. package/dist/tui/ui/views/about.js.map +1 -0
  155. package/dist/tui/ui/views/all.d.ts +17 -0
  156. package/dist/tui/ui/views/all.d.ts.map +1 -0
  157. package/dist/tui/ui/views/all.js +17 -0
  158. package/dist/tui/ui/views/all.js.map +1 -0
  159. package/dist/tui/ui/views/dashboard.d.ts +156 -0
  160. package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
  161. package/dist/tui/ui/views/dashboard.js +599 -0
  162. package/dist/tui/ui/views/dashboard.js.map +1 -0
  163. package/dist/tui/ui/views/help.d.ts +17 -0
  164. package/dist/tui/ui/views/help.d.ts.map +1 -0
  165. package/dist/tui/ui/views/help.js +65 -0
  166. package/dist/tui/ui/views/help.js.map +1 -0
  167. package/dist/tui/ui/views/index.d.ts +42 -0
  168. package/dist/tui/ui/views/index.d.ts.map +1 -0
  169. package/dist/tui/ui/views/index.js +42 -0
  170. package/dist/tui/ui/views/index.js.map +1 -0
  171. package/dist/tui/ui/views/input.d.ts +6 -0
  172. package/dist/tui/ui/views/input.d.ts.map +1 -0
  173. package/dist/tui/ui/views/input.js +494 -0
  174. package/dist/tui/ui/views/input.js.map +1 -0
  175. package/dist/tui/ui/views/launch.d.ts +16 -0
  176. package/dist/tui/ui/views/launch.d.ts.map +1 -0
  177. package/dist/tui/ui/views/launch.js +43 -0
  178. package/dist/tui/ui/views/launch.js.map +1 -0
  179. package/dist/tui/ui/views/refusal.d.ts +20 -0
  180. package/dist/tui/ui/views/refusal.d.ts.map +1 -0
  181. package/dist/tui/ui/views/refusal.js +47 -0
  182. package/dist/tui/ui/views/refusal.js.map +1 -0
  183. package/dist/tui/ui/views/repos.d.ts +10 -0
  184. package/dist/tui/ui/views/repos.d.ts.map +1 -0
  185. package/dist/tui/ui/views/repos.js +93 -0
  186. package/dist/tui/ui/views/repos.js.map +1 -0
  187. package/dist/tui/ui/views/task.d.ts +17 -0
  188. package/dist/tui/ui/views/task.d.ts.map +1 -0
  189. package/dist/tui/ui/views/task.js +309 -0
  190. package/dist/tui/ui/views/task.js.map +1 -0
  191. package/dist/tui/ui/views/wordmark.d.ts +15 -0
  192. package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
  193. package/dist/tui/ui/views/wordmark.js +50 -0
  194. package/dist/tui/ui/views/wordmark.js.map +1 -0
  195. package/dist/tui/ui/views/workspaces.d.ts +17 -0
  196. package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
  197. package/dist/tui/ui/views/workspaces.js +127 -0
  198. package/dist/tui/ui/views/workspaces.js.map +1 -0
  199. package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
  200. package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
  201. package/dist/tui/ui/widgets/leaf-editor.js +119 -0
  202. package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
  203. package/dist/tui/ui/widgets/logs.d.ts +99 -0
  204. package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
  205. package/dist/tui/ui/widgets/logs.js +291 -0
  206. package/dist/tui/ui/widgets/logs.js.map +1 -0
  207. package/dist/tui/ui/widgets/reads.d.ts +62 -0
  208. package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
  209. package/dist/tui/ui/widgets/reads.js +122 -0
  210. package/dist/tui/ui/widgets/reads.js.map +1 -0
  211. package/dist/tui/ui/widgets/runs.d.ts +51 -0
  212. package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
  213. package/dist/tui/ui/widgets/runs.js +86 -0
  214. package/dist/tui/ui/widgets/runs.js.map +1 -0
  215. package/dist/tui/ui/widgets/tree.d.ts +149 -0
  216. package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
  217. package/dist/tui/ui/widgets/tree.js +584 -0
  218. package/dist/tui/ui/widgets/tree.js.map +1 -0
  219. 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,75 @@
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
+ export declare function renderTable(plan: ColumnSpec[], rows: TableRow[], sel: number, top: number, visible: number, width: number, g: Glyphs, header?: boolean): Line[];
39
+ /** A section title line: ` TITLE` with `right` flush right. */
40
+ export declare function sectionLine(title: string, right: string, width: number): Line;
41
+ /**
42
+ * A centred block: a blank, a bold title line, a blank, the body lines, a blank.
43
+ *
44
+ * @param glyph - The glyph before the title
45
+ * @param tone - The title's tone
46
+ * @param title - The title
47
+ * @param body - The lines (each centred)
48
+ * @param width - The row width
49
+ * @returns The lines
50
+ */
51
+ export declare function centredBlock(glyph: string, tone: Tone, title: string, body: string[], width: number): Line[];
52
+ /**
53
+ * The cell ranges of a tab strip's tabs (the geometry {@link tabStrip} draws).
54
+ *
55
+ * @param name - The leading name
56
+ * @param tabs - The tab labels
57
+ * @param g - The glyph set
58
+ * @returns Each tab's `[x0, x1)` and index
59
+ */
60
+ export declare function tabStripHits(name: string, tabs: string[], g: Glyphs): {
61
+ index: number;
62
+ x0: number;
63
+ x1: number;
64
+ }[];
65
+ /**
66
+ * A tab strip: ` name ▌1 Output▐ 2 Logs 3 Runs`.
67
+ *
68
+ * @param name - The leading name
69
+ * @param tabs - The tab labels
70
+ * @param active - The active tab index
71
+ * @param g - The glyph set
72
+ * @returns The spans
73
+ */
74
+ export declare function tabStrip(name: string, tabs: string[], active: number, g: Glyphs): Line;
75
+ //# 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;AAwBD,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,CA+B5J;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,160 @@
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
+ /**
39
+ * A table: a header row, then the rows in `[top, top + visible)` with a
40
+ * selection bar (`▌`) on `sel`. Cells are looked up by column key, so a
41
+ * plan that drops a column at a narrow width leaves the others aligned;
42
+ * a `grow` column first widens to its longest cell (plus the gap), then
43
+ * the plan is fitted to the width ({@link fitPlan}). A fixed cell that
44
+ * overflows ends in an ellipsis and keeps one cell of gap.
45
+ *
46
+ * @param plan - The column plan (the last column takes the remainder)
47
+ * @param rows - Every row
48
+ * @param sel - The selected row (or −1)
49
+ * @param top - The first visible row
50
+ * @param visible - Visible rows
51
+ * @param width - The row width
52
+ * @param g - The glyph set
53
+ * @param header - Whether to draw the header row
54
+ * @returns The lines
55
+ */
56
+ function cellText(cell) {
57
+ return cell === undefined ? '' : typeof cell === 'string' ? cell : cell.text;
58
+ }
59
+ export function renderTable(plan, rows, sel, top, visible, width, g, header = true) {
60
+ const out = [];
61
+ const grown = plan.map(col => {
62
+ if (col.grow === undefined)
63
+ return col;
64
+ const longest = rows.reduce((n, row) => Math.max(n, displayWidth(cellText(row.cells[col.key]))), displayWidth(col.title));
65
+ return { ...col, width: Math.min(col.grow, Math.max(col.width, longest + 1)) };
66
+ });
67
+ const fitted = fitPlan(grown, width);
68
+ const cellsOf = (row, isHeader, selected) => {
69
+ const line = [t(' '), selected ? b(g.sel, 'brand') : t(row?.marker ?? ' ')];
70
+ let used = 2;
71
+ fitted.forEach((col) => {
72
+ const raw = isHeader ? col.title : row?.cells[col.key] ?? '';
73
+ const cell = typeof raw === 'string' ? { text: raw, tone: undefined } : raw;
74
+ const budget = col.width === 0 ? Math.max(0, width - used) : col.width;
75
+ // A fixed column keeps one cell of gap before the next; overflow ends in an ellipsis.
76
+ const room = col.width === 0 ? budget : Math.max(1, budget - 1);
77
+ const clipped = truncate(cell.text, room);
78
+ const text = col.align === 'right' ? padStart(clipped, budget) : padEnd(clipped, budget);
79
+ if (isHeader)
80
+ line.push(d(text));
81
+ else if (selected)
82
+ line.push(b(text, cell.tone));
83
+ else
84
+ line.push(t(text, cell.tone));
85
+ used += budget;
86
+ });
87
+ return line;
88
+ };
89
+ if (header)
90
+ out.push(fitLine(cellsOf(null, true, false), width));
91
+ for (let i = top; i < Math.min(rows.length, top + visible); i++) {
92
+ out.push(fitLine(cellsOf(rows[i], false, i === sel), width));
93
+ }
94
+ return out;
95
+ }
96
+ /** A section title line: ` TITLE` with `right` flush right. */
97
+ export function sectionLine(title, right, width) {
98
+ return lrLine([t(' '), b(title)], [d(right), t(' ')], width);
99
+ }
100
+ /**
101
+ * A centred block: a blank, a bold title line, a blank, the body lines, a blank.
102
+ *
103
+ * @param glyph - The glyph before the title
104
+ * @param tone - The title's tone
105
+ * @param title - The title
106
+ * @param body - The lines (each centred)
107
+ * @param width - The row width
108
+ * @returns The lines
109
+ */
110
+ export function centredBlock(glyph, tone, title, body, width) {
111
+ const out = [];
112
+ out.push([t(' '.repeat(width))]);
113
+ const heading = `${glyph} ${title}`;
114
+ out.push([b(center(heading, width), tone)]);
115
+ out.push([t(' '.repeat(width))]);
116
+ for (const line of body)
117
+ out.push([t(center(line, width))]);
118
+ out.push([t(' '.repeat(width))]);
119
+ return out;
120
+ }
121
+ /**
122
+ * The cell ranges of a tab strip's tabs (the geometry {@link tabStrip} draws).
123
+ *
124
+ * @param name - The leading name
125
+ * @param tabs - The tab labels
126
+ * @param g - The glyph set
127
+ * @returns Each tab's `[x0, x1)` and index
128
+ */
129
+ export function tabStripHits(name, tabs, g) {
130
+ void g;
131
+ let x = 1 + displayWidth(name) + 3;
132
+ return tabs.map((label, i) => {
133
+ const w = 2 + displayWidth(`${i + 1} ${label}`) + 2;
134
+ const hit = { index: i, x0: x, x1: x + w };
135
+ x += w + (i < tabs.length - 1 ? 1 : 0);
136
+ return hit;
137
+ });
138
+ }
139
+ /**
140
+ * A tab strip: ` name ▌1 Output▐ 2 Logs 3 Runs`.
141
+ *
142
+ * @param name - The leading name
143
+ * @param tabs - The tab labels
144
+ * @param active - The active tab index
145
+ * @param g - The glyph set
146
+ * @returns The spans
147
+ */
148
+ export function tabStrip(name, tabs, active, g) {
149
+ const line = [t(' '), b(name), t(' ')];
150
+ tabs.forEach((label, i) => {
151
+ if (i === active)
152
+ line.push(b(`${g.tabL}${i + 1} ${label}${g.tabR}`, 'brand'));
153
+ else
154
+ line.push(d(` ${i + 1} ${label} `));
155
+ if (i < tabs.length - 1)
156
+ line.push(t(' '));
157
+ });
158
+ return line;
159
+ }
160
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../../src/tui/ui/shell/widgets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAmB,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGxF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAa,MAAM,aAAa,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa,EAAE,OAAe,EAAE,GAAW,EAAE,CAAS;IAC9G,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAC5E,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnJ,MAAM,IAAI,GAAS,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACtD,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC;AASD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAS,QAAQ,CAAC,IAA2C;IACzD,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAkB,EAAE,IAAgB,EAAE,GAAW,EAAE,GAAW,EAAE,OAAe,EAAE,KAAa,EAAE,CAAS,EAAE,MAAM,GAAG,IAAI;IAChJ,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACzB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1H,OAAO,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,CAAC,GAAoB,EAAE,QAAiB,EAAE,QAAiB,EAAQ,EAAE;QACjF,MAAM,IAAI,GAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;QAClF,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC7D,MAAM,IAAI,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YACvE,sFAAsF;YACtF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACzF,IAAI,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;iBAC5B,IAAI,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;gBAC5C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnC,IAAI,IAAI,MAAM,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,IAAI,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa;IACnE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAU,EAAE,KAAa,EAAE,IAAc,EAAE,KAAa;IAChG,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,IAAc,EAAE,CAAS;IAChE,KAAK,CAAC,CAAC;IACP,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAc,EAAE,MAAc,EAAE,CAAS;IAC5E,MAAM,IAAI,GAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,CAAC,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;;YAC1E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -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"}
@@ -0,0 +1,40 @@
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 about view — the wordmark, the version, the server, the repository,
7
+ * the terminal, the state file and the licence.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import { formatInt } from '../../render/text.js';
12
+ import { blank, b, d, t } from '../lines.js';
13
+ import { wordmark } from './wordmark.js';
14
+ /** The about body. */
15
+ export function renderAbout(state, ctx, facts) {
16
+ const width = ctx.layout.columns;
17
+ const session = state.session;
18
+ const row = (label, value) => [t(' '), d(label.padEnd(11)), t(value)];
19
+ const server = session === null ? '—'
20
+ : session.kind === 'local'
21
+ ? `embedded @elaraai/e3-api-server ${ctx.version} · ${session.apiUrl} · repo ${session.repo}`
22
+ : `${session.apiUrl}${session.repo !== null ? ` · repo ${session.repo}` : ''}${session.identity !== null ? ` · signed in as ${session.identity}` : ''}`;
23
+ const repository = session === null ? '—'
24
+ : `${session.path ?? session.target}${facts !== null ? ` · ${formatInt(facts.objects)} objects · ${facts.packages} packages · ${facts.workspaces} workspaces` : ''}`;
25
+ return [
26
+ blank(width),
27
+ ...wordmark(ctx.g.tabL === '[').map(line => [t(' '), b(line, 'brand')]),
28
+ blank(width),
29
+ [t(' '), b(`e3-ui ${ctx.version}`)],
30
+ blank(width),
31
+ row('server', server),
32
+ row('repository', repository),
33
+ row('terminal', ctx.about.terminal),
34
+ row('state', ctx.about.statePath),
35
+ row('licence', 'AGPL-3.0-or-later · commercial licence available'),
36
+ ];
37
+ }
38
+ /** The about hints. */
39
+ export const aboutHints = { left: 'esc back', right: '' };
40
+ //# sourceMappingURL=about.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../../../src/tui/ui/views/about.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAA6B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,sBAAsB;AACtB,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,GAAc,EAAE,KAAuB;IAChF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,KAAa,EAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG;QACjC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;YACtB,CAAC,CAAC,mCAAmC,GAAG,CAAC,OAAO,MAAM,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,IAAI,EAAE;YAC7F,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAChK,MAAM,UAAU,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG;QACrC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,UAAU,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACzK,OAAO;QACH,KAAK,CAAC,KAAK,CAAC;QACZ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,KAAK,CAAC;QACZ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,KAAK,CAAC,KAAK,CAAC;QACZ,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC;QAC7B,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACnC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QACjC,GAAG,CAAC,SAAS,EAAE,kDAAkD,CAAC;KACrE,CAAC;AACN,CAAC;AAED,uBAAuB;AACvB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC"}
@@ -0,0 +1,17 @@
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
+ * Every view module, imported for its registrations (renderer, list
7
+ * model, controller hooks). The app entry and the test harness import
8
+ * this once.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import './dashboard.js';
13
+ import './repos.js';
14
+ import './workspaces.js';
15
+ import './task.js';
16
+ import './input.js';
17
+ //# sourceMappingURL=all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/views/all.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,gBAAgB,CAAC;AACxB,OAAO,YAAY,CAAC;AACpB,OAAO,iBAAiB,CAAC;AACzB,OAAO,WAAW,CAAC;AACnB,OAAO,YAAY,CAAC"}