@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,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"}