@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,584 @@
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 value tree widget — rows from the row model `@elaraai/east-ui`
7
+ * shares with the browser (`flattenRows` inline, `flattenPaged` paged), so
8
+ * a value reads identically in both: the same labels, summaries, row ids
9
+ * and expand semantics. This module renders a window of rows with the
10
+ * scrollbar and the footer, and drives the tree from the keyboard and the
11
+ * command box: move / expand-or-next / collapse-or-parent / toggle / deep
12
+ * collapse, `/find` (server-side for paged values, in memory inline) with
13
+ * `n` / `N` and a held highlight, `/goto <row|N%>`, `/save`, the paged
14
+ * window requests, and the expand-set + top row persisted per
15
+ * `${ws}:${path}`.
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import { parseFor, printFor, StringType } from '@elaraai/east';
22
+ import { fmtLeaf, humanize, keySignature, pageOfFlat, parseKeyInput, } from '@elaraai/east-ui/internal';
23
+ import { layoutOf } from '../../model/index.js';
24
+ import { PAGE_SIZE, treeModel, viewDataset } from '../../model/tree.js';
25
+ import { labelWidth, scrollIntoView } from '../../render/layout.js';
26
+ import { formatInt, formatSize, padEnd, percent } from '../../render/text.js';
27
+ import { repoEntry } from '../../state/persist.js';
28
+ import { b, d, t } from '../lines.js';
29
+ import { withScrollbar } from '../shell/widgets.js';
30
+ export { treeModel };
31
+ /** Context rows kept above a jump target. */
32
+ const JUMP_CONTEXT_ROWS = 2;
33
+ /** Rows the header lines, the dashed rule and the footer take in a tree view. */
34
+ export const TREE_CHROME_ROWS = 4;
35
+ /** How long a jump waits for its page. */
36
+ const JUMP_WAIT_MS = 10_000;
37
+ /** A leaf's display text: strings quoted, the rest as the row model prints them. */
38
+ export function leafText(leaf) {
39
+ return leaf.type === 'string' ? JSON.stringify(leaf.value) : fmtLeaf(leaf);
40
+ }
41
+ /** The value cell of a row. */
42
+ export function valueText(row) {
43
+ const tag = row.variantCtl !== undefined ? humanize(row.variantCtl.tag) : null;
44
+ if (row.leaf !== undefined) {
45
+ if (tag !== null && row.leaf.type === 'null')
46
+ return tag;
47
+ const text = leafText(row.leaf);
48
+ return tag !== null ? `${tag} · ${text}` : text;
49
+ }
50
+ if (row.opaque !== undefined)
51
+ return row.opaque;
52
+ if (row.kind === 'appendArray' || row.kind === 'appendDict')
53
+ return '';
54
+ const summary = row.summary ?? '';
55
+ if (tag !== null && !summary.startsWith(tag))
56
+ return summary === '' ? tag : `${tag} · ${summary}`;
57
+ return summary;
58
+ }
59
+ /** Whether a root row is inside the held match. */
60
+ function inMatch(row, match) {
61
+ if (match === null || row.depth !== 0)
62
+ return false;
63
+ const root = row.posinset - 1;
64
+ return root >= match.row && root < match.row + match.count;
65
+ }
66
+ /**
67
+ * Renders the visible window of a tree with its scrollbar.
68
+ *
69
+ * @param model - The tree model
70
+ * @param tree - The tree UI (selection, top, held match)
71
+ * @param loading - Pages being loaded (the first placeholder of each says so)
72
+ * @param visible - Rows in the window
73
+ * @param width - The row width including the scrollbar column
74
+ * @param g - The glyph set
75
+ * @param changed - Row ids with pending edits (`┆` in the gutter)
76
+ * @returns The lines
77
+ */
78
+ export function renderTreeRows(model, tree, loading, visible, width, g, changed, decor) {
79
+ const lw = labelWidth(width);
80
+ const vw = Math.max(1, width - lw - 2);
81
+ const top = Math.max(0, Math.min(tree.top, Math.max(0, model.total - visible)));
82
+ const lines = [];
83
+ const noted = new Set();
84
+ for (let i = top; i < top + visible; i++) {
85
+ const at = model.at(i);
86
+ if (at === null) {
87
+ lines.push([t(' '.repeat(width - 1))]);
88
+ continue;
89
+ }
90
+ const selected = i === tree.sel;
91
+ if (at.kind === 'placeholder') {
92
+ const page = Math.floor(at.globalRow / PAGE_SIZE);
93
+ let note = '';
94
+ if (loading.includes(page) && !noted.has(page)) {
95
+ noted.add(page);
96
+ note = ` loading p${page}`;
97
+ }
98
+ lines.push([
99
+ selected ? b(g.sel, 'brand') : t(' '),
100
+ d(padEnd(`${g.placeholder} ${g.placeholder.repeat(26)}`, lw)),
101
+ d(padEnd(`${g.placeholder.repeat(36)}${note}`, vw)),
102
+ ]);
103
+ continue;
104
+ }
105
+ const row = at.row;
106
+ const twist = row.kind === 'appendArray' || row.kind === 'appendDict' ? g.add
107
+ : row.expandable ? (row.expanded ? g.expanded : g.collapsed)
108
+ : g.leaf;
109
+ const label = padEnd(`${' '.repeat(row.depth)}${twist} ${row.label}`, lw);
110
+ const deco = decor?.(row, selected) ?? null;
111
+ const hint = deco?.hint ?? '';
112
+ const valueWidth = hint === '' ? vw : Math.max(1, vw - hint.length - 4);
113
+ const value = padEnd(deco?.value ?? valueText(row), valueWidth);
114
+ const matched = inMatch(row, tree.match);
115
+ const marker = selected ? b(g.sel, 'brand') : changed?.has(row.id) === true ? b(g.edited, 'warn') : t(' ');
116
+ const labelSpan = selected ? b(label, matched ? 'brand' : undefined) : matched ? b(label, 'brand') : t(label);
117
+ const isValue = row.leaf !== undefined || deco?.value !== undefined;
118
+ const valueSpan = isValue ? (selected ? b(value) : t(value)) : d(value);
119
+ const line = [marker, labelSpan, valueSpan];
120
+ if (hint !== '')
121
+ line.push(t(padEnd('', vw - valueWidth - hint.length)), deco?.tone === 'muted' || deco?.tone === undefined ? d(hint) : b(hint, deco.tone));
122
+ lines.push(line);
123
+ }
124
+ return withScrollbar(lines, width, model.total, visible, top, g);
125
+ }
126
+ /**
127
+ * The footer line: `rows a–b of N · p% · pK ▒ loading · match held until esc`
128
+ * with the toolbar words flush right.
129
+ *
130
+ * @param model - The tree model
131
+ * @param tree - The tree UI
132
+ * @param loading - Pages being loaded
133
+ * @param visible - Rows in the window
134
+ * @param width - The row width
135
+ * @param g - The glyph set
136
+ * @param saveHint - The save word (`s save .beast2`), or empty
137
+ * @returns The line
138
+ */
139
+ export function treeFooter(model, tree, loading, visible, width, g, saveHint) {
140
+ const total = model.total;
141
+ const top = Math.max(0, Math.min(tree.top, Math.max(0, total - visible)));
142
+ const first = total === 0 ? 0 : top + 1;
143
+ const last = Math.min(total, top + visible);
144
+ const parts = [`rows ${formatInt(first)}–${formatInt(last)} of ${formatInt(total)}`];
145
+ if (model.paged !== null && total > visible)
146
+ parts.push(percent(first, total));
147
+ if (loading.length > 0)
148
+ parts.push(`p${loading[0]} ${g.loading} loading`);
149
+ if (tree.match !== null)
150
+ parts.push('match held until esc');
151
+ const left = ` ${parts.join(` ${g.sep} `)}`;
152
+ const right = `${g.expanded} expand all ${g.collapsed} collapse all${saveHint === '' ? '' : ` ${saveHint}`} `;
153
+ const gap = Math.max(1, width - left.length - right.length);
154
+ return [d(left), t(' '.repeat(gap)), d(right)];
155
+ }
156
+ /**
157
+ * The tree context of the current view (the task view's Output tab or an
158
+ * input view).
159
+ *
160
+ * @param state - The store state
161
+ * @returns The context, or null
162
+ */
163
+ export function treeContext(state) {
164
+ const shown = viewDataset(state);
165
+ const v = state.view;
166
+ if (shown === null || (v.kind !== 'task' && v.kind !== 'input'))
167
+ return null;
168
+ let data = state.data.dataset[shown.ws]?.[shown.path];
169
+ const edit = state.edit;
170
+ const editingHere = edit !== null && edit.ws === shown.ws && edit.path === shown.path;
171
+ // While editing, the tree shows the draft (the base plus the pending ops).
172
+ if (editingHere && data !== undefined)
173
+ data = { ...data, mode: { kind: 'inline', root: edit.root, value: edit.draft } };
174
+ const banner = editingHere && edit.conflict !== null ? 1 : 0;
175
+ const visible = Math.max(1, layoutOf(state).bodyRows - TREE_CHROME_ROWS - banner);
176
+ return {
177
+ ws: shown.ws,
178
+ path: shown.path,
179
+ editable: shown.editable,
180
+ tree: v.tree,
181
+ data,
182
+ visible,
183
+ setTree: (tree) => ({ ...v, tree }),
184
+ };
185
+ }
186
+ /** The persisted-state key of a tree. */
187
+ export function treeStorageKey(ws, path) {
188
+ return `${ws}:${path}`;
189
+ }
190
+ /** Remembers a tree's expand-set and top row. */
191
+ function persistTree(controller, ctx, tree) {
192
+ const persist = controller.deps.persist;
193
+ const session = controller.state().session;
194
+ if (persist === null || session === null)
195
+ return;
196
+ persist.update(s => {
197
+ repoEntry(s, session.stateKey).trees[treeStorageKey(ctx.ws, ctx.path)] = { open: tree.open, topRow: tree.top, baseDepth: tree.baseDepth, touched: controller.deps.now() };
198
+ });
199
+ }
200
+ /**
201
+ * Restores a tree's remembered expand-set and top row into the current view.
202
+ *
203
+ * @param controller - The controller
204
+ * @param ws - The workspace
205
+ * @param dataset - The dataset path
206
+ */
207
+ export function restoreTree(controller, ws, dataset) {
208
+ const persist = controller.deps.persist;
209
+ const session = controller.state().session;
210
+ if (persist === null || session === null)
211
+ return;
212
+ const remembered = persist.state.repos[session.stateKey]?.trees[treeStorageKey(ws, dataset)];
213
+ if (remembered === undefined)
214
+ return;
215
+ controller.dispatch({ type: 'tree/restore', open: remembered.open, top: remembered.topRow, baseDepth: remembered.baseDepth });
216
+ }
217
+ /** Requests the pages around the window (one page of margin each side). */
218
+ function requestWindow(controller, ctx, model, top) {
219
+ if (model.paged === null || model.total === 0)
220
+ return;
221
+ const { flat, paging } = model.paged;
222
+ const startFlat = Math.max(0, Math.min(top, model.total - 1));
223
+ const endFlat = Math.min(model.total - 1, startFlat + ctx.visible);
224
+ const firstPage = Math.max(0, pageOfFlat(flat.prefix, startFlat) - 1);
225
+ const lastPage = Math.min(flat.pageCount - 1, pageOfFlat(flat.prefix, endFlat) + 1);
226
+ controller.deps.feeds.datasets.needRows(ctx.ws, ctx.path, firstPage * paging.pageSize, Math.min(paging.totalRows, (lastPage + 1) * paging.pageSize));
227
+ }
228
+ /** Writes a tree UI back, persists it, and requests the window's pages. */
229
+ function commit(controller, ctx, model, tree) {
230
+ const total = model?.total ?? 0;
231
+ const top = Math.max(0, Math.min(tree.top, Math.max(0, total - ctx.visible)));
232
+ const sel = Math.max(0, Math.min(tree.sel, Math.max(0, total - 1)));
233
+ const next = { ...tree, sel, top };
234
+ controller.dispatch({ type: 'view/set', view: ctx.setTree(next) });
235
+ persistTree(controller, ctx, next);
236
+ if (model !== null)
237
+ requestWindow(controller, ctx, model, top);
238
+ }
239
+ /** Selects a flat row, scrolling minimally (or to `top` when given). */
240
+ function select(controller, ctx, model, sel, top) {
241
+ const clamped = Math.max(0, Math.min(sel, Math.max(0, model.total - 1)));
242
+ commit(controller, ctx, model, { ...ctx.tree, sel: clamped, top: top ?? scrollIntoView(ctx.tree.top, clamped, ctx.visible, model.total) });
243
+ }
244
+ /** Jumps to a root row: it lands two rows below the top of the window (the anchor keeps it there as pages arrive). */
245
+ function jumpToRoot(controller, ctx, model, root) {
246
+ const flat = model.flatOfRoot(root);
247
+ if (flat === undefined)
248
+ return false;
249
+ select(controller, ctx, model, flat, Math.max(0, flat - JUMP_CONTEXT_ROWS));
250
+ return true;
251
+ }
252
+ /** `G`: requests the last page, waits for it, then selects the very last row. */
253
+ async function jumpToEnd(controller, first, firstModel) {
254
+ if (firstModel.paged !== null) {
255
+ const lastRoot = Math.max(0, firstModel.rootCount - 1);
256
+ controller.deps.feeds.datasets.needRows(first.ws, first.path, Math.max(0, lastRoot - PAGE_SIZE), lastRoot + 1);
257
+ const deadline = Date.now() + JUMP_WAIT_MS;
258
+ for (;;) {
259
+ const ctx = treeContext(controller.state());
260
+ if (ctx === null || ctx.ws !== first.ws || ctx.path !== first.path)
261
+ return;
262
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
263
+ if (model === null)
264
+ return;
265
+ const flat = model.flatOfRoot(lastRoot);
266
+ if (flat === undefined || model.at(flat)?.kind === 'model' || Date.now() > deadline) {
267
+ select(controller, ctx, model, model.total - 1, Math.max(0, model.total - ctx.visible));
268
+ return;
269
+ }
270
+ await new Promise(resolve => setTimeout(resolve, 15));
271
+ }
272
+ }
273
+ select(controller, first, firstModel, firstModel.total - 1, Math.max(0, firstModel.total - first.visible));
274
+ }
275
+ /**
276
+ * Scrolls the tree by rows (the wheel) or to a row (a thumb drag), keeping
277
+ * the selection inside the window.
278
+ *
279
+ * @param state - The store state
280
+ * @param controller - The controller
281
+ * @param to - `{ delta }` rows, or `{ top }` absolute
282
+ */
283
+ export function scrollTree(state, controller, to) {
284
+ const ctx = treeContext(state);
285
+ if (ctx === null)
286
+ return;
287
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
288
+ if (model === null)
289
+ return;
290
+ const max = Math.max(0, model.total - ctx.visible);
291
+ if ('top' in to && to.top >= max && model.paged !== null) {
292
+ // The bottom of the track means the end of the collection, which is
293
+ // further than the placeholders suggest until the last page lands.
294
+ void jumpToEnd(controller, ctx, model);
295
+ return;
296
+ }
297
+ const top = Math.max(0, Math.min('delta' in to ? ctx.tree.top + to.delta : to.top, max));
298
+ const sel = Math.max(top, Math.min(ctx.tree.sel, top + ctx.visible - 1, Math.max(0, model.total - 1)));
299
+ commit(controller, ctx, model, { ...ctx.tree, sel, top });
300
+ }
301
+ /**
302
+ * A click on a tree row: selects it; on its twist, toggles it.
303
+ *
304
+ * @param state - The store state
305
+ * @param controller - The controller
306
+ * @param flat - The flat row clicked
307
+ * @param onTwist - Whether the twist cell was clicked
308
+ */
309
+ export function clickTree(state, controller, flat, onTwist) {
310
+ const ctx = treeContext(state);
311
+ if (ctx === null)
312
+ return;
313
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
314
+ if (model === null)
315
+ return;
316
+ const at = model.at(flat);
317
+ if (at === null)
318
+ return;
319
+ commit(controller, ctx, model, { ...ctx.tree, sel: flat });
320
+ if (onTwist && at.kind === 'model' && at.row.expandable) {
321
+ controller.dispatch({ type: 'tree/toggle', id: at.row.id, expanded: !at.row.expanded });
322
+ afterToggle(controller, ctx);
323
+ }
324
+ }
325
+ /**
326
+ * The footer toolbar: expand all / collapse all.
327
+ *
328
+ * @param state - The store state
329
+ * @param controller - The controller
330
+ * @param action - Which word was clicked
331
+ */
332
+ export function treeToolbar(state, controller, action) {
333
+ const ctx = treeContext(state);
334
+ if (ctx === null)
335
+ return;
336
+ controller.dispatch({ type: action === 'expandAll' ? 'tree/expandAll' : 'tree/collapseAll' });
337
+ afterToggle(controller, ctx);
338
+ }
339
+ /**
340
+ * Handles a key action on the tree.
341
+ *
342
+ * @param action - The action
343
+ * @param state - The store state
344
+ * @param controller - The controller
345
+ * @returns `true` when handled
346
+ */
347
+ export function treeKey(action, state, controller) {
348
+ const ctx = treeContext(state);
349
+ if (ctx === null)
350
+ return false;
351
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
352
+ if (action.kind === 'back') {
353
+ if (ctx.tree.match === null)
354
+ return false;
355
+ controller.dispatch({ type: 'tree/match', match: null });
356
+ return true;
357
+ }
358
+ if (action.kind === 'save') {
359
+ void controller.execute('/save');
360
+ return true;
361
+ }
362
+ if (model === null)
363
+ return action.kind === 'move' || action.kind === 'expand' || action.kind === 'collapse' || action.kind === 'toggle' || action.kind === 'collapseDeep' || action.kind === 'next' || action.kind === 'prev';
364
+ const at = model.at(ctx.tree.sel);
365
+ const row = at?.kind === 'model' ? at.row : null;
366
+ switch (action.kind) {
367
+ case 'move': {
368
+ if (action.op === 'end') {
369
+ void jumpToEnd(controller, ctx, model);
370
+ return true;
371
+ }
372
+ const last = Math.max(0, model.total - 1);
373
+ const page = Math.max(1, ctx.visible - 1);
374
+ const sel = ctx.tree.sel;
375
+ const next = action.op === 'up' ? sel - 1 : action.op === 'down' ? sel + 1
376
+ : action.op === 'pageUp' ? sel - page : action.op === 'pageDown' ? sel + page
377
+ : 0;
378
+ select(controller, ctx, model, Math.max(0, Math.min(next, last)), action.op === 'home' ? 0 : undefined);
379
+ return true;
380
+ }
381
+ case 'expand': {
382
+ if (row !== null && row.expandable && !row.expanded) {
383
+ controller.dispatch({ type: 'tree/toggle', id: row.id, expanded: true });
384
+ afterToggle(controller, ctx);
385
+ }
386
+ else {
387
+ select(controller, ctx, model, ctx.tree.sel + 1);
388
+ }
389
+ return true;
390
+ }
391
+ case 'collapse': {
392
+ if (row !== null && row.expandable && row.expanded) {
393
+ controller.dispatch({ type: 'tree/toggle', id: row.id, expanded: false });
394
+ afterToggle(controller, ctx);
395
+ }
396
+ else if (row !== null && row.parentId !== undefined) {
397
+ const parent = model.flatOfId(row.parentId);
398
+ if (parent !== undefined)
399
+ select(controller, ctx, model, parent);
400
+ }
401
+ return true;
402
+ }
403
+ case 'toggle': {
404
+ if (row !== null && row.expandable) {
405
+ controller.dispatch({ type: 'tree/toggle', id: row.id, expanded: !row.expanded });
406
+ afterToggle(controller, ctx);
407
+ }
408
+ return true;
409
+ }
410
+ case 'collapseDeep': {
411
+ if (row !== null && row.expandable) {
412
+ const descendants = [];
413
+ for (let i = ctx.tree.sel + 1; i < model.total; i++) {
414
+ const next = model.at(i);
415
+ if (next === null || next.kind !== 'model' || next.row.depth <= row.depth)
416
+ break;
417
+ if (next.row.expandable)
418
+ descendants.push(next.row.id);
419
+ }
420
+ controller.dispatch({ type: 'tree/toggle', id: row.id, expanded: false, descendants });
421
+ afterToggle(controller, ctx);
422
+ }
423
+ return true;
424
+ }
425
+ case 'next':
426
+ case 'prev': {
427
+ const match = ctx.tree.match;
428
+ if (match === null || match.count === 0) {
429
+ controller.toast('no match held — /find <key> first', 'warn');
430
+ return true;
431
+ }
432
+ const index = ((match.index + (action.kind === 'next' ? 1 : -1)) % match.count + match.count) % match.count;
433
+ controller.dispatch({ type: 'tree/match', match: { ...match, index } });
434
+ const after = treeContext(controller.state());
435
+ if (after !== null)
436
+ jumpToRoot(controller, after, treeModel(after.data, after.tree, after.editable) ?? model, match.row + index);
437
+ return true;
438
+ }
439
+ default:
440
+ return false;
441
+ }
442
+ }
443
+ /** After an expand-set change: persist and refresh the window's pages. */
444
+ function afterToggle(controller, before) {
445
+ const ctx = treeContext(controller.state());
446
+ if (ctx === null)
447
+ return;
448
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
449
+ commit(controller, ctx, model, ctx.tree);
450
+ void before;
451
+ }
452
+ /**
453
+ * Parses `/find` text for a key type: a quoted string is an exact key,
454
+ * `a|b` are struct-key fields, anything else goes to the shared grammar.
455
+ *
456
+ * @param keyType - The collection's key type
457
+ * @param text - The typed text
458
+ * @returns The wire query, or the hint to show
459
+ */
460
+ export function parseFindText(keyType, text) {
461
+ const trimmed = text.trim();
462
+ if (keyType.type === 'String' && /^".*"$/.test(trimmed)) {
463
+ const parsed = parseFor(StringType)(trimmed);
464
+ if (parsed.success)
465
+ return { kind: 'query', query: { key: printFor(StringType)(parsed.value) } };
466
+ }
467
+ if (keyType.type === 'Struct')
468
+ return parseKeyInput(keyType, trimmed.replace(/\|/g, ','));
469
+ return parseKeyInput(keyType, trimmed);
470
+ }
471
+ /** The query's form word for the footer / toast. */
472
+ function formOf(query) {
473
+ return 'key' in query ? 'exact' : 'fields' in query ? 'fields' : 'prefix';
474
+ }
475
+ /** The `/save` target: `<ws>.<name>.beast2` in the working directory unless a file is given. */
476
+ export function saveTarget(ws, dataset, file) {
477
+ if (file !== undefined)
478
+ return path.resolve(file);
479
+ const name = dataset.replace(/^\.(inputs|tasks)\./, '').replace(/\.output$/, '');
480
+ return path.resolve(`${ws}.${name}.beast2`);
481
+ }
482
+ /**
483
+ * Handles `/find`, `/goto` and `/save` on the tree.
484
+ *
485
+ * @param command - The parsed command
486
+ * @param state - The store state
487
+ * @param controller - The controller
488
+ * @returns `true` when handled
489
+ */
490
+ export async function treeCommand(command, state, controller) {
491
+ const ctx = treeContext(state);
492
+ if (ctx === null)
493
+ return false;
494
+ const model = treeModel(ctx.data, ctx.tree, ctx.editable);
495
+ switch (command.name) {
496
+ case 'find': {
497
+ if (model === null || model.keyType === null) {
498
+ controller.toast('/find needs a Set or Dict value — /goto <row> moves by row', 'warn');
499
+ return true;
500
+ }
501
+ const parsed = parseFindText(model.keyType, command.query);
502
+ if (parsed.kind === 'hint') {
503
+ controller.toast(`${parsed.hint} — key is ${keySignature(model.keyType)}`, 'warn');
504
+ return true;
505
+ }
506
+ const result = await controller.deps.feeds.datasets.findKey(ctx.ws, ctx.path, parsed.query);
507
+ const form = formOf(parsed.query);
508
+ const after = treeContext(controller.state());
509
+ const afterModel = after === null ? null : treeModel(after.data, after.tree, after.editable);
510
+ if (after === null || afterModel === null)
511
+ return true;
512
+ if (!result.found) {
513
+ controller.toast(`no ${form} match for ${command.query} — nearest row ${formatInt(Math.min(result.row, Math.max(0, afterModel.rootCount - 1)) + 1)}`, 'warn');
514
+ controller.dispatch({ type: 'tree/match', match: null });
515
+ jumpToRoot(controller, after, afterModel, Math.min(result.row, Math.max(0, afterModel.rootCount - 1)));
516
+ return true;
517
+ }
518
+ controller.dispatch({ type: 'tree/match', match: { row: result.row, count: result.count, index: 0, text: command.query, form } });
519
+ const held = treeContext(controller.state());
520
+ if (held !== null)
521
+ jumpToRoot(controller, held, afterModel, result.row);
522
+ controller.toast(`${form} ${g(controller).sep} ${formatInt(result.count)} match${result.count === 1 ? '' : 'es'} from row ${formatInt(result.row + 1)} ${g(controller).sep} n N next/prev ${g(controller).sep} esc`, 'info');
523
+ return true;
524
+ }
525
+ case 'goto': {
526
+ if (model === null) {
527
+ controller.toast('nothing to go to yet', 'warn');
528
+ return true;
529
+ }
530
+ const roots = model.rootCount;
531
+ const root = command.target.kind === 'row'
532
+ ? command.target.row - 1
533
+ : Math.round((command.target.percent / 100) * Math.max(0, roots - 1));
534
+ if (root < 0 || root >= roots) {
535
+ controller.toast(`row ${formatInt(root + 1)} is past the end — ${formatInt(roots)} rows`, 'warn');
536
+ return true;
537
+ }
538
+ if (!jumpToRoot(controller, ctx, model, root))
539
+ controller.toast('that row is not loaded yet', 'warn');
540
+ return true;
541
+ }
542
+ case 'save': {
543
+ const target = saveTarget(ctx.ws, ctx.path, command.file);
544
+ if (fs.existsSync(target) && !command.force) {
545
+ controller.dispatch({ type: 'command/confirm', confirm: { question: `overwrite ${target}?`, command: `/save "${target}" --force` } });
546
+ return true;
547
+ }
548
+ if (ctx.data === undefined || ctx.data.hash === null) {
549
+ controller.toast('nothing to save — the dataset has no value', 'warn');
550
+ return true;
551
+ }
552
+ const bytes = await controller.deps.feeds.datasets.bytes(ctx.ws, ctx.path);
553
+ fs.mkdirSync(path.dirname(target), { recursive: true });
554
+ fs.writeFileSync(target, bytes);
555
+ controller.toast(`saved ${formatSize(bytes.length)} to ${target}`, 'pos');
556
+ return true;
557
+ }
558
+ default:
559
+ return false;
560
+ }
561
+ }
562
+ /** The glyphs of a controller (a shorthand). */
563
+ function g(controller) {
564
+ return controller.deps.glyphs;
565
+ }
566
+ /**
567
+ * `⏎` on a not-indexed value loads it whole.
568
+ *
569
+ * @param state - The store state
570
+ * @param controller - The controller
571
+ * @returns `true` when a load was started
572
+ */
573
+ export function treeOpen(state, controller) {
574
+ const ctx = treeContext(state);
575
+ if (ctx === null || ctx.data === undefined || ctx.data.mode.kind !== 'not-indexed')
576
+ return false;
577
+ if (!ctx.data.mode.loadable) {
578
+ controller.toast(`too large to load whole (${formatSize(ctx.data.size)}) — /save writes the bytes`, 'warn');
579
+ return true;
580
+ }
581
+ void controller.deps.feeds.datasets.loadWhole(ctx.ws, ctx.path);
582
+ return true;
583
+ }
584
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../../src/tui/ui/widgets/tree.ts"],"names":[],"mappings":"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"}