@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.
- package/README.md +46 -21
- package/dist/app/assets/{engine-BKZbmXkC-hslJZfFw.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
- package/dist/app/assets/{index-8USNHP31.js → index-mj-YVVN1.js} +92 -92
- package/dist/app/index.html +1 -1
- package/dist/cli.js +36 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/tui.d.ts +84 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +86 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/tui/api.d.ts +108 -0
- package/dist/tui/api.d.ts.map +1 -0
- package/dist/tui/api.js +130 -0
- package/dist/tui/api.js.map +1 -0
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +241 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/controller.d.ts +116 -0
- package/dist/tui/controller.d.ts.map +1 -0
- package/dist/tui/controller.js +620 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/data/dataflow.d.ts +68 -0
- package/dist/tui/data/dataflow.d.ts.map +1 -0
- package/dist/tui/data/dataflow.js +137 -0
- package/dist/tui/data/dataflow.js.map +1 -0
- package/dist/tui/data/dataset.d.ts +80 -0
- package/dist/tui/data/dataset.d.ts.map +1 -0
- package/dist/tui/data/dataset.js +297 -0
- package/dist/tui/data/dataset.js.map +1 -0
- package/dist/tui/data/edit-buffer.d.ts +74 -0
- package/dist/tui/data/edit-buffer.d.ts.map +1 -0
- package/dist/tui/data/edit-buffer.js +120 -0
- package/dist/tui/data/edit-buffer.js.map +1 -0
- package/dist/tui/data/feeds.d.ts +45 -0
- package/dist/tui/data/feeds.d.ts.map +1 -0
- package/dist/tui/data/feeds.js +318 -0
- package/dist/tui/data/feeds.js.map +1 -0
- package/dist/tui/data/logs.d.ts +68 -0
- package/dist/tui/data/logs.d.ts.map +1 -0
- package/dist/tui/data/logs.js +134 -0
- package/dist/tui/data/logs.js.map +1 -0
- package/dist/tui/input/commands.d.ts +159 -0
- package/dist/tui/input/commands.d.ts.map +1 -0
- package/dist/tui/input/commands.js +259 -0
- package/dist/tui/input/commands.js.map +1 -0
- package/dist/tui/input/completion.d.ts +63 -0
- package/dist/tui/input/completion.d.ts.map +1 -0
- package/dist/tui/input/completion.js +128 -0
- package/dist/tui/input/completion.js.map +1 -0
- package/dist/tui/input/keymap.d.ts +153 -0
- package/dist/tui/input/keymap.d.ts.map +1 -0
- package/dist/tui/input/keymap.js +206 -0
- package/dist/tui/input/keymap.js.map +1 -0
- package/dist/tui/input/mouse.d.ts +52 -0
- package/dist/tui/input/mouse.d.ts.map +1 -0
- package/dist/tui/input/mouse.js +55 -0
- package/dist/tui/input/mouse.js.map +1 -0
- package/dist/tui/lifecycle.d.ts +61 -0
- package/dist/tui/lifecycle.d.ts.map +1 -0
- package/dist/tui/lifecycle.js +99 -0
- package/dist/tui/lifecycle.js.map +1 -0
- package/dist/tui/model/catalogue.d.ts +28 -0
- package/dist/tui/model/catalogue.d.ts.map +1 -0
- package/dist/tui/model/catalogue.js +94 -0
- package/dist/tui/model/catalogue.js.map +1 -0
- package/dist/tui/model/help.d.ts +37 -0
- package/dist/tui/model/help.d.ts.map +1 -0
- package/dist/tui/model/help.js +210 -0
- package/dist/tui/model/help.js.map +1 -0
- package/dist/tui/model/index.d.ts +42 -0
- package/dist/tui/model/index.d.ts.map +1 -0
- package/dist/tui/model/index.js +50 -0
- package/dist/tui/model/index.js.map +1 -0
- package/dist/tui/model/status.d.ts +88 -0
- package/dist/tui/model/status.d.ts.map +1 -0
- package/dist/tui/model/status.js +137 -0
- package/dist/tui/model/status.js.map +1 -0
- package/dist/tui/model/tree.d.ts +112 -0
- package/dist/tui/model/tree.d.ts.map +1 -0
- package/dist/tui/model/tree.js +178 -0
- package/dist/tui/model/tree.js.map +1 -0
- package/dist/tui/model/types.d.ts +21 -0
- package/dist/tui/model/types.d.ts.map +1 -0
- package/dist/tui/model/types.js +46 -0
- package/dist/tui/model/types.js.map +1 -0
- package/dist/tui/render/glyphs.d.ts +122 -0
- package/dist/tui/render/glyphs.d.ts.map +1 -0
- package/dist/tui/render/glyphs.js +122 -0
- package/dist/tui/render/glyphs.js.map +1 -0
- package/dist/tui/render/layout.d.ts +145 -0
- package/dist/tui/render/layout.d.ts.map +1 -0
- package/dist/tui/render/layout.js +209 -0
- package/dist/tui/render/layout.js.map +1 -0
- package/dist/tui/render/text.d.ts +149 -0
- package/dist/tui/render/text.d.ts.map +1 -0
- package/dist/tui/render/text.js +288 -0
- package/dist/tui/render/text.js.map +1 -0
- package/dist/tui/render/theme.d.ts +88 -0
- package/dist/tui/render/theme.d.ts.map +1 -0
- package/dist/tui/render/theme.js +145 -0
- package/dist/tui/render/theme.js.map +1 -0
- package/dist/tui/session.d.ts +78 -0
- package/dist/tui/session.d.ts.map +1 -0
- package/dist/tui/session.js +237 -0
- package/dist/tui/session.js.map +1 -0
- package/dist/tui/state/actions.d.ts +584 -0
- package/dist/tui/state/actions.d.ts.map +1 -0
- package/dist/tui/state/actions.js +62 -0
- package/dist/tui/state/actions.js.map +1 -0
- package/dist/tui/state/persist.d.ts +114 -0
- package/dist/tui/state/persist.d.ts.map +1 -0
- package/dist/tui/state/persist.js +187 -0
- package/dist/tui/state/persist.js.map +1 -0
- package/dist/tui/state/poll.d.ts +99 -0
- package/dist/tui/state/poll.d.ts.map +1 -0
- package/dist/tui/state/poll.js +160 -0
- package/dist/tui/state/poll.js.map +1 -0
- package/dist/tui/state/reducer.d.ts +16 -0
- package/dist/tui/state/reducer.d.ts.map +1 -0
- package/dist/tui/state/reducer.js +363 -0
- package/dist/tui/state/reducer.js.map +1 -0
- package/dist/tui/state/store.d.ts +37 -0
- package/dist/tui/state/store.d.ts.map +1 -0
- package/dist/tui/state/store.js +84 -0
- package/dist/tui/state/store.js.map +1 -0
- package/dist/tui/suspend.d.ts +17 -0
- package/dist/tui/suspend.d.ts.map +1 -0
- package/dist/tui/suspend.js +33 -0
- package/dist/tui/suspend.js.map +1 -0
- package/dist/tui/ui/App.d.ts +41 -0
- package/dist/tui/ui/App.d.ts.map +1 -0
- package/dist/tui/ui/App.js +92 -0
- package/dist/tui/ui/App.js.map +1 -0
- package/dist/tui/ui/frame.d.ts +86 -0
- package/dist/tui/ui/frame.d.ts.map +1 -0
- package/dist/tui/ui/frame.js +42 -0
- package/dist/tui/ui/frame.js.map +1 -0
- package/dist/tui/ui/lines.d.ts +92 -0
- package/dist/tui/ui/lines.d.ts.map +1 -0
- package/dist/tui/ui/lines.js +94 -0
- package/dist/tui/ui/lines.js.map +1 -0
- package/dist/tui/ui/shell/chrome.d.ts +61 -0
- package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
- package/dist/tui/ui/shell/chrome.js +272 -0
- package/dist/tui/ui/shell/chrome.js.map +1 -0
- package/dist/tui/ui/shell/widgets.d.ts +75 -0
- package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
- package/dist/tui/ui/shell/widgets.js +160 -0
- package/dist/tui/ui/shell/widgets.js.map +1 -0
- package/dist/tui/ui/views/about.d.ts +20 -0
- package/dist/tui/ui/views/about.d.ts.map +1 -0
- package/dist/tui/ui/views/about.js +40 -0
- package/dist/tui/ui/views/about.js.map +1 -0
- package/dist/tui/ui/views/all.d.ts +17 -0
- package/dist/tui/ui/views/all.d.ts.map +1 -0
- package/dist/tui/ui/views/all.js +17 -0
- package/dist/tui/ui/views/all.js.map +1 -0
- package/dist/tui/ui/views/dashboard.d.ts +156 -0
- package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
- package/dist/tui/ui/views/dashboard.js +599 -0
- package/dist/tui/ui/views/dashboard.js.map +1 -0
- package/dist/tui/ui/views/help.d.ts +17 -0
- package/dist/tui/ui/views/help.d.ts.map +1 -0
- package/dist/tui/ui/views/help.js +65 -0
- package/dist/tui/ui/views/help.js.map +1 -0
- package/dist/tui/ui/views/index.d.ts +42 -0
- package/dist/tui/ui/views/index.d.ts.map +1 -0
- package/dist/tui/ui/views/index.js +42 -0
- package/dist/tui/ui/views/index.js.map +1 -0
- package/dist/tui/ui/views/input.d.ts +6 -0
- package/dist/tui/ui/views/input.d.ts.map +1 -0
- package/dist/tui/ui/views/input.js +494 -0
- package/dist/tui/ui/views/input.js.map +1 -0
- package/dist/tui/ui/views/launch.d.ts +16 -0
- package/dist/tui/ui/views/launch.d.ts.map +1 -0
- package/dist/tui/ui/views/launch.js +43 -0
- package/dist/tui/ui/views/launch.js.map +1 -0
- package/dist/tui/ui/views/refusal.d.ts +20 -0
- package/dist/tui/ui/views/refusal.d.ts.map +1 -0
- package/dist/tui/ui/views/refusal.js +47 -0
- package/dist/tui/ui/views/refusal.js.map +1 -0
- package/dist/tui/ui/views/repos.d.ts +10 -0
- package/dist/tui/ui/views/repos.d.ts.map +1 -0
- package/dist/tui/ui/views/repos.js +93 -0
- package/dist/tui/ui/views/repos.js.map +1 -0
- package/dist/tui/ui/views/task.d.ts +17 -0
- package/dist/tui/ui/views/task.d.ts.map +1 -0
- package/dist/tui/ui/views/task.js +309 -0
- package/dist/tui/ui/views/task.js.map +1 -0
- package/dist/tui/ui/views/wordmark.d.ts +15 -0
- package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
- package/dist/tui/ui/views/wordmark.js +50 -0
- package/dist/tui/ui/views/wordmark.js.map +1 -0
- package/dist/tui/ui/views/workspaces.d.ts +17 -0
- package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
- package/dist/tui/ui/views/workspaces.js +127 -0
- package/dist/tui/ui/views/workspaces.js.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.js +119 -0
- package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
- package/dist/tui/ui/widgets/logs.d.ts +99 -0
- package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/logs.js +291 -0
- package/dist/tui/ui/widgets/logs.js.map +1 -0
- package/dist/tui/ui/widgets/reads.d.ts +62 -0
- package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
- package/dist/tui/ui/widgets/reads.js +122 -0
- package/dist/tui/ui/widgets/reads.js.map +1 -0
- package/dist/tui/ui/widgets/runs.d.ts +51 -0
- package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/runs.js +86 -0
- package/dist/tui/ui/widgets/runs.js.map +1 -0
- package/dist/tui/ui/widgets/tree.d.ts +149 -0
- package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
- package/dist/tui/ui/widgets/tree.js +584 -0
- package/dist/tui/ui/widgets/tree.js.map +1 -0
- 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":"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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"}
|
|
@@ -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"}
|