@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,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
|
+
import type { TuiState } from '../../state/actions.js';
|
|
6
|
+
import type { RenderCtx } from '../lines.js';
|
|
7
|
+
import { type TableRow } from '../shell/widgets.js';
|
|
8
|
+
/** The `● 4 ◐ 1 ✗ 1` task summary of a workspace, or `○ 6 ready`, or `—`. */
|
|
9
|
+
export declare function taskSummary(state: TuiState, ws: string, ctx: RenderCtx): string;
|
|
10
|
+
/** The `✗ failed · 2m ago · 38.4s` last-run cell of a workspace. */
|
|
11
|
+
export declare function lastRun(state: TuiState, ws: string, ctx: RenderCtx): {
|
|
12
|
+
text: string;
|
|
13
|
+
tone: 'pos' | 'neg' | 'warn' | 'info' | 'muted';
|
|
14
|
+
};
|
|
15
|
+
/** The rows of the workspaces table. */
|
|
16
|
+
export declare function workspaceRows(state: TuiState, ctx: RenderCtx): TableRow[];
|
|
17
|
+
//# sourceMappingURL=workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/views/workspaces.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAKvD,OAAO,KAAK,EAAQ,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAA2C,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG7F,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG,MAAM,CAoB/E;AAED,oEAAoE;AACpE,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,CAStI;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,GAAG,QAAQ,EAAE,CAezE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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 workspaces view — `workspaceList` enriched with each workspace's
|
|
7
|
+
* status summary and last execution (fetched lazily, one at a time);
|
|
8
|
+
* `⏎` opens one as the new root.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
import { breakpoint, columnPlan } from '../../render/layout.js';
|
|
13
|
+
import { formatDuration, timeAgo } from '../../render/text.js';
|
|
14
|
+
import { registerListModel } from '../../model/index.js';
|
|
15
|
+
import { executionDuration, executionStatusCell } from '../../model/status.js';
|
|
16
|
+
import { registerViewHooks } from '../../controller.js';
|
|
17
|
+
import { blank } from '../lines.js';
|
|
18
|
+
import { renderTable, sectionLine, withScrollbar } from '../shell/widgets.js';
|
|
19
|
+
import { registerView } from './index.js';
|
|
20
|
+
/** The `● 4 ◐ 1 ✗ 1` task summary of a workspace, or `○ 6 ready`, or `—`. */
|
|
21
|
+
export function taskSummary(state, ws, ctx) {
|
|
22
|
+
const g = ctx.g;
|
|
23
|
+
const status = state.data.status[ws]?.result;
|
|
24
|
+
if (status === undefined)
|
|
25
|
+
return '…';
|
|
26
|
+
const s = status.summary.tasks;
|
|
27
|
+
const total = Number(s.total);
|
|
28
|
+
if (total === 0)
|
|
29
|
+
return '—';
|
|
30
|
+
const running = Number(s.inProgress);
|
|
31
|
+
const upToDate = Number(s.upToDate);
|
|
32
|
+
const waiting = Number(s.waiting);
|
|
33
|
+
const failed = Number(s.failed) + Number(s.error) + Number(s.staleRunning);
|
|
34
|
+
const ready = Number(s.ready);
|
|
35
|
+
if (ready === total)
|
|
36
|
+
return `${g.empty} ${total} ready`;
|
|
37
|
+
const parts = [];
|
|
38
|
+
if (upToDate > 0)
|
|
39
|
+
parts.push(`${g.dot} ${upToDate}`);
|
|
40
|
+
if (running > 0)
|
|
41
|
+
parts.push(`${g.quarter} ${running}`);
|
|
42
|
+
if (waiting > 0)
|
|
43
|
+
parts.push(`${g.half} ${waiting}`);
|
|
44
|
+
if (failed > 0)
|
|
45
|
+
parts.push(`${g.cross} ${failed}`);
|
|
46
|
+
if (ready > 0)
|
|
47
|
+
parts.push(`${g.empty} ${ready}`);
|
|
48
|
+
return parts.join(' ');
|
|
49
|
+
}
|
|
50
|
+
/** The `✗ failed · 2m ago · 38.4s` last-run cell of a workspace. */
|
|
51
|
+
export function lastRun(state, ws, ctx) {
|
|
52
|
+
const g = ctx.g;
|
|
53
|
+
const execution = state.data.execution[ws];
|
|
54
|
+
if (execution === undefined)
|
|
55
|
+
return { text: '…', tone: 'muted' };
|
|
56
|
+
if (execution.state === null)
|
|
57
|
+
return { text: `${g.empty} never run`, tone: 'muted' };
|
|
58
|
+
const cell = executionStatusCell(execution.state.status.type, g);
|
|
59
|
+
const ms = executionDuration(execution.state);
|
|
60
|
+
const duration = ms !== null ? ` ${g.sep} ${formatDuration(ms)}` : '';
|
|
61
|
+
return { text: `${cell.glyph} ${cell.word.toLowerCase()} ${g.sep} ${timeAgo(execution.state.startedAt, ctx.now)}${duration}`, tone: cell.tone };
|
|
62
|
+
}
|
|
63
|
+
/** The rows of the workspaces table. */
|
|
64
|
+
export function workspaceRows(state, ctx) {
|
|
65
|
+
const g = ctx.g;
|
|
66
|
+
return (state.data.workspaces ?? []).map(w => {
|
|
67
|
+
const pkg = w.packageName.type === 'some' ? `${w.packageName.value}${w.packageVersion.type === 'some' ? `@${w.packageVersion.value}` : ''}` : '—';
|
|
68
|
+
const run = w.deployed ? lastRun(state, w.name, ctx) : { text: '—', tone: 'muted' };
|
|
69
|
+
return {
|
|
70
|
+
cells: {
|
|
71
|
+
name: w.name,
|
|
72
|
+
state: w.deployed ? { text: `${g.dot} DEPLOYED`, tone: 'pos' } : { text: `${g.empty} EMPTY`, tone: 'muted' },
|
|
73
|
+
package: pkg,
|
|
74
|
+
tasks: w.deployed ? taskSummary(state, w.name, ctx) : '—',
|
|
75
|
+
lastRun: { text: run.text, tone: run.tone },
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const CHROME_ROWS = 3;
|
|
81
|
+
registerListModel('workspaces', (state, layout) => ({
|
|
82
|
+
count: state.data.workspaces?.length ?? 0,
|
|
83
|
+
visible: Math.max(1, layout.bodyRows - CHROME_ROWS),
|
|
84
|
+
}));
|
|
85
|
+
registerView('workspaces', (state, ctx) => {
|
|
86
|
+
if (state.view.kind !== 'workspaces')
|
|
87
|
+
return { body: [], hints: { left: '', right: '' } };
|
|
88
|
+
const width = ctx.layout.columns;
|
|
89
|
+
const rows = workspaceRows(state, ctx);
|
|
90
|
+
const total = rows.length;
|
|
91
|
+
const body = [
|
|
92
|
+
sectionLine(`WORKSPACES ${ctx.g.sep} ${state.session?.label ?? ''}`, `${total} of ${total}`, width),
|
|
93
|
+
blank(width),
|
|
94
|
+
];
|
|
95
|
+
const visible = Math.max(1, ctx.layout.bodyRows - CHROME_ROWS);
|
|
96
|
+
const { sel, top } = state.view.list;
|
|
97
|
+
const table = renderTable(columnPlan('workspaces', breakpoint(state.size)), rows, sel, top, visible, width - 1, ctx.g);
|
|
98
|
+
const dataRows = table.slice(1);
|
|
99
|
+
while (dataRows.length < visible)
|
|
100
|
+
dataRows.push(blank(width - 1));
|
|
101
|
+
body.push(table[0], ...withScrollbar(dataRows, width, total, visible, top, ctx.g));
|
|
102
|
+
const hits = [];
|
|
103
|
+
for (let i = top; i < Math.min(total, top + visible); i++)
|
|
104
|
+
hits.push({ row: 3 + (i - top), x0: 0, x1: width, target: { kind: 'list', index: i } });
|
|
105
|
+
const pane = { top: 3, rows: visible, total, visible, scrollTop: top };
|
|
106
|
+
if (state.data.workspaces === null)
|
|
107
|
+
body[3] = [{ text: ' loading workspaces…', dim: true }];
|
|
108
|
+
else if (total === 0)
|
|
109
|
+
body[3] = [{ text: ' no workspaces — e3 workspace create <repo> <name>', dim: true }];
|
|
110
|
+
return {
|
|
111
|
+
body,
|
|
112
|
+
hits,
|
|
113
|
+
pane,
|
|
114
|
+
hints: { left: `${ctx.g.up}${ctx.g.down} move ${ctx.g.enter} open /workspace <name>`, right: 'q quit' },
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
registerViewHooks('workspaces', {
|
|
118
|
+
open: (state, controller) => {
|
|
119
|
+
if (state.view.kind !== 'workspaces')
|
|
120
|
+
return;
|
|
121
|
+
const ws = state.data.workspaces?.[state.view.list.sel];
|
|
122
|
+
if (ws === undefined)
|
|
123
|
+
return;
|
|
124
|
+
controller.openWorkspace(ws.name);
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../../src/tui/ui/views/workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
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 { RowModel } from '@elaraai/east-ui/internal';
|
|
6
|
+
import type { LeafEditUi } from '../../state/actions.js';
|
|
7
|
+
/** A leaf value as the row model carries it. */
|
|
8
|
+
export type LeafValue = NonNullable<RowModel['leaf']>;
|
|
9
|
+
/**
|
|
10
|
+
* The editor kind of a leaf, or null for a leaf that cannot be edited (null).
|
|
11
|
+
*
|
|
12
|
+
* @param leaf - The leaf
|
|
13
|
+
* @returns The kind
|
|
14
|
+
*/
|
|
15
|
+
export declare function leafKindOf(leaf: LeafValue): LeafEditUi['leaf'] | null;
|
|
16
|
+
/**
|
|
17
|
+
* The text an editor starts with.
|
|
18
|
+
*
|
|
19
|
+
* @param leaf - The leaf
|
|
20
|
+
* @returns The text
|
|
21
|
+
*/
|
|
22
|
+
export declare function initialText(leaf: LeafValue): string;
|
|
23
|
+
/**
|
|
24
|
+
* Parses the editor's text into a leaf.
|
|
25
|
+
*
|
|
26
|
+
* @param kind - The editor kind
|
|
27
|
+
* @param text - The text
|
|
28
|
+
* @returns The leaf, or the error to show
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseLeaf(kind: LeafEditUi['leaf'], text: string): {
|
|
31
|
+
ok: true;
|
|
32
|
+
leaf: LeafValue;
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
error: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* The editor's text with the caret.
|
|
39
|
+
*
|
|
40
|
+
* @param editing - The editor state
|
|
41
|
+
* @param cursor - The caret glyph
|
|
42
|
+
* @returns The text
|
|
43
|
+
*/
|
|
44
|
+
export declare function editorText(editing: LeafEditUi, cursor: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* The editor after a key.
|
|
47
|
+
*
|
|
48
|
+
* @param editing - The editor state
|
|
49
|
+
* @param key - The key (`char` carries text)
|
|
50
|
+
* @returns The next state
|
|
51
|
+
*/
|
|
52
|
+
export declare function editKey(editing: LeafEditUi, key: {
|
|
53
|
+
kind: 'char';
|
|
54
|
+
text: string;
|
|
55
|
+
} | {
|
|
56
|
+
kind: 'backspace' | 'delete' | 'left' | 'right' | 'home' | 'end' | 'toggle';
|
|
57
|
+
}): LeafEditUi;
|
|
58
|
+
//# sourceMappingURL=leaf-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaf-editor.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/widgets/leaf-editor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,gDAAgD;AAChD,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAKrE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CASnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyB9H;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;CAAE,GAAG,UAAU,CAkB9K"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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 leaf editor — an inline line editor in the selected row's value
|
|
7
|
+
* cell: strings verbatim, integers and floats validated as typed,
|
|
8
|
+
* datetimes as ISO text, booleans toggled with space. `⏎` commits the
|
|
9
|
+
* leaf to the edit buffer, `Esc` cancels.
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { variant } from '@elaraai/east';
|
|
14
|
+
/**
|
|
15
|
+
* The editor kind of a leaf, or null for a leaf that cannot be edited (null).
|
|
16
|
+
*
|
|
17
|
+
* @param leaf - The leaf
|
|
18
|
+
* @returns The kind
|
|
19
|
+
*/
|
|
20
|
+
export function leafKindOf(leaf) {
|
|
21
|
+
switch (leaf.type) {
|
|
22
|
+
case 'string':
|
|
23
|
+
case 'integer':
|
|
24
|
+
case 'float':
|
|
25
|
+
case 'datetime':
|
|
26
|
+
case 'boolean': return leaf.type;
|
|
27
|
+
default: return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The text an editor starts with.
|
|
32
|
+
*
|
|
33
|
+
* @param leaf - The leaf
|
|
34
|
+
* @returns The text
|
|
35
|
+
*/
|
|
36
|
+
export function initialText(leaf) {
|
|
37
|
+
switch (leaf.type) {
|
|
38
|
+
case 'string': return leaf.value;
|
|
39
|
+
case 'integer': return String(leaf.value);
|
|
40
|
+
case 'float': return String(leaf.value);
|
|
41
|
+
case 'boolean': return leaf.value ? 'true' : 'false';
|
|
42
|
+
case 'datetime': return leaf.value.toISOString().replace(/\.000Z$/, 'Z');
|
|
43
|
+
default: return '';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parses the editor's text into a leaf.
|
|
48
|
+
*
|
|
49
|
+
* @param kind - The editor kind
|
|
50
|
+
* @param text - The text
|
|
51
|
+
* @returns The leaf, or the error to show
|
|
52
|
+
*/
|
|
53
|
+
export function parseLeaf(kind, text) {
|
|
54
|
+
switch (kind) {
|
|
55
|
+
case 'string':
|
|
56
|
+
return { ok: true, leaf: variant('string', text) };
|
|
57
|
+
case 'integer': {
|
|
58
|
+
const trimmed = text.trim().replace(/[,_]/g, '');
|
|
59
|
+
if (!/^[+-]?\d+$/.test(trimmed))
|
|
60
|
+
return { ok: false, error: 'an integer, like 14' };
|
|
61
|
+
return { ok: true, leaf: variant('integer', BigInt(trimmed)) };
|
|
62
|
+
}
|
|
63
|
+
case 'float': {
|
|
64
|
+
const n = Number(text.trim().replace(/[,_]/g, ''));
|
|
65
|
+
if (text.trim() === '' || !Number.isFinite(n))
|
|
66
|
+
return { ok: false, error: 'a number, like 0.35' };
|
|
67
|
+
return { ok: true, leaf: variant('float', n) };
|
|
68
|
+
}
|
|
69
|
+
case 'datetime': {
|
|
70
|
+
const d = new Date(text.trim());
|
|
71
|
+
if (!Number.isFinite(d.getTime()))
|
|
72
|
+
return { ok: false, error: 'an ISO datetime, like 2025-09-01T00:00:00Z' };
|
|
73
|
+
return { ok: true, leaf: variant('datetime', d) };
|
|
74
|
+
}
|
|
75
|
+
case 'boolean': {
|
|
76
|
+
const t = text.trim().toLowerCase();
|
|
77
|
+
if (t !== 'true' && t !== 'false')
|
|
78
|
+
return { ok: false, error: 'true or false (space toggles)' };
|
|
79
|
+
return { ok: true, leaf: variant('boolean', t === 'true') };
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The editor's text with the caret.
|
|
85
|
+
*
|
|
86
|
+
* @param editing - The editor state
|
|
87
|
+
* @param cursor - The caret glyph
|
|
88
|
+
* @returns The text
|
|
89
|
+
*/
|
|
90
|
+
export function editorText(editing, cursor) {
|
|
91
|
+
return `${editing.text.slice(0, editing.cursor)}${cursor}${editing.text.slice(editing.cursor)}`;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The editor after a key.
|
|
95
|
+
*
|
|
96
|
+
* @param editing - The editor state
|
|
97
|
+
* @param key - The key (`char` carries text)
|
|
98
|
+
* @returns The next state
|
|
99
|
+
*/
|
|
100
|
+
export function editKey(editing, key) {
|
|
101
|
+
const { text, cursor } = editing;
|
|
102
|
+
switch (key.kind) {
|
|
103
|
+
case 'char': return { ...editing, text: text.slice(0, cursor) + key.text + text.slice(cursor), cursor: cursor + key.text.length, error: null };
|
|
104
|
+
case 'backspace': return cursor === 0 ? editing : { ...editing, text: text.slice(0, cursor - 1) + text.slice(cursor), cursor: cursor - 1, error: null };
|
|
105
|
+
case 'delete': return { ...editing, text: text.slice(0, cursor) + text.slice(cursor + 1), error: null };
|
|
106
|
+
case 'left': return { ...editing, cursor: Math.max(0, cursor - 1) };
|
|
107
|
+
case 'right': return { ...editing, cursor: Math.min(text.length, cursor + 1) };
|
|
108
|
+
case 'home': return { ...editing, cursor: 0 };
|
|
109
|
+
case 'end': return { ...editing, cursor: text.length };
|
|
110
|
+
case 'toggle': {
|
|
111
|
+
if (editing.leaf === 'boolean') {
|
|
112
|
+
const next = text.trim().toLowerCase() === 'true' ? 'false' : 'true';
|
|
113
|
+
return { ...editing, text: next, cursor: next.length, error: null };
|
|
114
|
+
}
|
|
115
|
+
return { ...editing, text: text.slice(0, cursor) + ' ' + text.slice(cursor), cursor: cursor + 1, error: null };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=leaf-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaf-editor.js","sourceRoot":"","sources":["../../../../src/tui/ui/widgets/leaf-editor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
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 { Controller } from '../../controller.js';
|
|
6
|
+
import { type LogStream } from '../../data/logs.js';
|
|
7
|
+
import type { ParsedCommand } from '../../input/commands.js';
|
|
8
|
+
import type { KeyAction } from '../../input/keymap.js';
|
|
9
|
+
import type { Glyphs } from '../../render/glyphs.js';
|
|
10
|
+
import { type LogsData, type LogsUi, type TuiState } from '../../state/actions.js';
|
|
11
|
+
import { type Line } from '../lines.js';
|
|
12
|
+
/** Rows the header lines, the dashed rule, the stream line and the footer take. */
|
|
13
|
+
export declare const LOGS_CHROME_ROWS = 5;
|
|
14
|
+
/** Bytes copied through OSC 52 at most (terminals cap the sequence). */
|
|
15
|
+
export declare const COPY_LIMIT: number;
|
|
16
|
+
/** The logs a task view shows. */
|
|
17
|
+
export interface LogsContext {
|
|
18
|
+
ws: string;
|
|
19
|
+
task: string;
|
|
20
|
+
/** The stream the tab shows. */
|
|
21
|
+
stream: LogStream;
|
|
22
|
+
ui: LogsUi;
|
|
23
|
+
data: LogsData;
|
|
24
|
+
lines: string[];
|
|
25
|
+
visible: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The logs context of the current view (a task view on its Stdout or Stderr tab).
|
|
29
|
+
*
|
|
30
|
+
* @param state - The store state
|
|
31
|
+
* @returns The context, or null
|
|
32
|
+
*/
|
|
33
|
+
export declare function logsContext(state: TuiState): LogsContext | null;
|
|
34
|
+
/** The window's top: the tail while following, else the scrolled top (clamped). */
|
|
35
|
+
export declare function logsTop(ctx: LogsContext): number;
|
|
36
|
+
/** The matching line indices of the held search. */
|
|
37
|
+
export declare function logsMatches(ctx: LogsContext): number[];
|
|
38
|
+
/**
|
|
39
|
+
* The status line: ` 1,215 lines · 96 KB · ● live · following` (then
|
|
40
|
+
* `capped at 10 MB` and the last fetch error, when there is one).
|
|
41
|
+
*
|
|
42
|
+
* @param ctx - The logs context
|
|
43
|
+
* @param state - The store state
|
|
44
|
+
* @param width - The row width
|
|
45
|
+
* @param g - The glyph set
|
|
46
|
+
* @returns The line
|
|
47
|
+
*/
|
|
48
|
+
export declare function streamLine(ctx: LogsContext, state: TuiState, width: number, g: Glyphs): Line;
|
|
49
|
+
/**
|
|
50
|
+
* The visible lines with numbers and the scrollbar.
|
|
51
|
+
*
|
|
52
|
+
* @param ctx - The logs context
|
|
53
|
+
* @param width - The row width including the scrollbar column
|
|
54
|
+
* @param g - The glyph set
|
|
55
|
+
* @returns The lines
|
|
56
|
+
*/
|
|
57
|
+
export declare function renderLogLines(ctx: LogsContext, width: number, g: Glyphs): Line[];
|
|
58
|
+
/**
|
|
59
|
+
* The footer: ` lines a–b of N · at end` with the follow hint flush right.
|
|
60
|
+
*
|
|
61
|
+
* @param ctx - The logs context
|
|
62
|
+
* @param width - The row width
|
|
63
|
+
* @param g - The glyph set
|
|
64
|
+
* @returns The line
|
|
65
|
+
*/
|
|
66
|
+
export declare function logsFooter(ctx: LogsContext, width: number, g: Glyphs): Line;
|
|
67
|
+
/**
|
|
68
|
+
* Scrolls the log by lines (the wheel) or to a line (a thumb drag).
|
|
69
|
+
*
|
|
70
|
+
* @param state - The store state
|
|
71
|
+
* @param controller - The controller
|
|
72
|
+
* @param to - `{ delta }` lines, or `{ top }` absolute
|
|
73
|
+
*/
|
|
74
|
+
export declare function scrollLogs(state: TuiState, controller: Controller, to: {
|
|
75
|
+
delta: number;
|
|
76
|
+
} | {
|
|
77
|
+
top: number;
|
|
78
|
+
}): void;
|
|
79
|
+
/**
|
|
80
|
+
* Handles a key action on the logs.
|
|
81
|
+
*
|
|
82
|
+
* @param action - The action
|
|
83
|
+
* @param state - The store state
|
|
84
|
+
* @param controller - The controller
|
|
85
|
+
* @returns `true` when handled
|
|
86
|
+
*/
|
|
87
|
+
export declare function logsKey(action: KeyAction, state: TuiState, controller: Controller): boolean;
|
|
88
|
+
/** The `/save` target: `<ws>.<task>.<stream>.log` in the working directory unless a file is given. */
|
|
89
|
+
export declare function logsSaveTarget(ctx: LogsContext, file: string | undefined): string;
|
|
90
|
+
/**
|
|
91
|
+
* Handles `/find` and `/save` on the logs.
|
|
92
|
+
*
|
|
93
|
+
* @param command - The parsed command
|
|
94
|
+
* @param state - The store state
|
|
95
|
+
* @param controller - The controller
|
|
96
|
+
* @returns `true` when handled
|
|
97
|
+
*/
|
|
98
|
+
export declare function logsCommand(command: ParsedCommand, state: TuiState, controller: Controller): Promise<boolean>;
|
|
99
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/widgets/logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAY,KAAK,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAmB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAC;AAGzD,mFAAmF;AACnF,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,wEAAwE;AACxE,eAAO,MAAM,UAAU,QAAa,CAAC;AAErC,kCAAkC;AAClC,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,SAAS,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,IAAI,CAM/D;AAED,mFAAmF;AACnF,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAGhD;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAEtD;AAED;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAS5F;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CAsBjF;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAa3E;AAWD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAIjH;AAaD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAkD3F;AAED,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEjF;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAkCnH"}
|