@elaraai/e3-ui-cli 1.0.72 → 1.0.74

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 (220) hide show
  1. package/README.md +46 -21
  2. package/bin/e3-ui.mjs +6 -0
  3. package/dist/app/assets/{engine-BKZbmXkC-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  4. package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
  5. package/dist/app/index.html +1 -1
  6. package/dist/cli.js +36 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/tui.d.ts +84 -0
  9. package/dist/commands/tui.d.ts.map +1 -0
  10. package/dist/commands/tui.js +89 -0
  11. package/dist/commands/tui.js.map +1 -0
  12. package/dist/tui/api.d.ts +108 -0
  13. package/dist/tui/api.d.ts.map +1 -0
  14. package/dist/tui/api.js +130 -0
  15. package/dist/tui/api.js.map +1 -0
  16. package/dist/tui/app.d.ts +23 -0
  17. package/dist/tui/app.d.ts.map +1 -0
  18. package/dist/tui/app.js +244 -0
  19. package/dist/tui/app.js.map +1 -0
  20. package/dist/tui/controller.d.ts +116 -0
  21. package/dist/tui/controller.d.ts.map +1 -0
  22. package/dist/tui/controller.js +644 -0
  23. package/dist/tui/controller.js.map +1 -0
  24. package/dist/tui/data/dataflow.d.ts +68 -0
  25. package/dist/tui/data/dataflow.d.ts.map +1 -0
  26. package/dist/tui/data/dataflow.js +137 -0
  27. package/dist/tui/data/dataflow.js.map +1 -0
  28. package/dist/tui/data/dataset.d.ts +80 -0
  29. package/dist/tui/data/dataset.d.ts.map +1 -0
  30. package/dist/tui/data/dataset.js +297 -0
  31. package/dist/tui/data/dataset.js.map +1 -0
  32. package/dist/tui/data/edit-buffer.d.ts +74 -0
  33. package/dist/tui/data/edit-buffer.d.ts.map +1 -0
  34. package/dist/tui/data/edit-buffer.js +120 -0
  35. package/dist/tui/data/edit-buffer.js.map +1 -0
  36. package/dist/tui/data/feeds.d.ts +45 -0
  37. package/dist/tui/data/feeds.d.ts.map +1 -0
  38. package/dist/tui/data/feeds.js +318 -0
  39. package/dist/tui/data/feeds.js.map +1 -0
  40. package/dist/tui/data/logs.d.ts +68 -0
  41. package/dist/tui/data/logs.d.ts.map +1 -0
  42. package/dist/tui/data/logs.js +134 -0
  43. package/dist/tui/data/logs.js.map +1 -0
  44. package/dist/tui/input/commands.d.ts +159 -0
  45. package/dist/tui/input/commands.d.ts.map +1 -0
  46. package/dist/tui/input/commands.js +259 -0
  47. package/dist/tui/input/commands.js.map +1 -0
  48. package/dist/tui/input/completion.d.ts +63 -0
  49. package/dist/tui/input/completion.d.ts.map +1 -0
  50. package/dist/tui/input/completion.js +128 -0
  51. package/dist/tui/input/completion.js.map +1 -0
  52. package/dist/tui/input/keymap.d.ts +153 -0
  53. package/dist/tui/input/keymap.d.ts.map +1 -0
  54. package/dist/tui/input/keymap.js +206 -0
  55. package/dist/tui/input/keymap.js.map +1 -0
  56. package/dist/tui/input/mouse.d.ts +52 -0
  57. package/dist/tui/input/mouse.d.ts.map +1 -0
  58. package/dist/tui/input/mouse.js +55 -0
  59. package/dist/tui/input/mouse.js.map +1 -0
  60. package/dist/tui/lifecycle.d.ts +61 -0
  61. package/dist/tui/lifecycle.d.ts.map +1 -0
  62. package/dist/tui/lifecycle.js +99 -0
  63. package/dist/tui/lifecycle.js.map +1 -0
  64. package/dist/tui/model/catalogue.d.ts +28 -0
  65. package/dist/tui/model/catalogue.d.ts.map +1 -0
  66. package/dist/tui/model/catalogue.js +94 -0
  67. package/dist/tui/model/catalogue.js.map +1 -0
  68. package/dist/tui/model/help.d.ts +37 -0
  69. package/dist/tui/model/help.d.ts.map +1 -0
  70. package/dist/tui/model/help.js +210 -0
  71. package/dist/tui/model/help.js.map +1 -0
  72. package/dist/tui/model/index.d.ts +42 -0
  73. package/dist/tui/model/index.d.ts.map +1 -0
  74. package/dist/tui/model/index.js +50 -0
  75. package/dist/tui/model/index.js.map +1 -0
  76. package/dist/tui/model/status.d.ts +88 -0
  77. package/dist/tui/model/status.d.ts.map +1 -0
  78. package/dist/tui/model/status.js +137 -0
  79. package/dist/tui/model/status.js.map +1 -0
  80. package/dist/tui/model/tree.d.ts +126 -0
  81. package/dist/tui/model/tree.d.ts.map +1 -0
  82. package/dist/tui/model/tree.js +217 -0
  83. package/dist/tui/model/tree.js.map +1 -0
  84. package/dist/tui/model/types.d.ts +21 -0
  85. package/dist/tui/model/types.d.ts.map +1 -0
  86. package/dist/tui/model/types.js +46 -0
  87. package/dist/tui/model/types.js.map +1 -0
  88. package/dist/tui/render/glyphs.d.ts +122 -0
  89. package/dist/tui/render/glyphs.d.ts.map +1 -0
  90. package/dist/tui/render/glyphs.js +122 -0
  91. package/dist/tui/render/glyphs.js.map +1 -0
  92. package/dist/tui/render/layout.d.ts +145 -0
  93. package/dist/tui/render/layout.d.ts.map +1 -0
  94. package/dist/tui/render/layout.js +209 -0
  95. package/dist/tui/render/layout.js.map +1 -0
  96. package/dist/tui/render/text.d.ts +153 -0
  97. package/dist/tui/render/text.d.ts.map +1 -0
  98. package/dist/tui/render/text.js +320 -0
  99. package/dist/tui/render/text.js.map +1 -0
  100. package/dist/tui/render/theme.d.ts +88 -0
  101. package/dist/tui/render/theme.d.ts.map +1 -0
  102. package/dist/tui/render/theme.js +145 -0
  103. package/dist/tui/render/theme.js.map +1 -0
  104. package/dist/tui/session.d.ts +78 -0
  105. package/dist/tui/session.d.ts.map +1 -0
  106. package/dist/tui/session.js +237 -0
  107. package/dist/tui/session.js.map +1 -0
  108. package/dist/tui/state/actions.d.ts +584 -0
  109. package/dist/tui/state/actions.d.ts.map +1 -0
  110. package/dist/tui/state/actions.js +62 -0
  111. package/dist/tui/state/actions.js.map +1 -0
  112. package/dist/tui/state/persist.d.ts +114 -0
  113. package/dist/tui/state/persist.d.ts.map +1 -0
  114. package/dist/tui/state/persist.js +187 -0
  115. package/dist/tui/state/persist.js.map +1 -0
  116. package/dist/tui/state/poll.d.ts +99 -0
  117. package/dist/tui/state/poll.d.ts.map +1 -0
  118. package/dist/tui/state/poll.js +160 -0
  119. package/dist/tui/state/poll.js.map +1 -0
  120. package/dist/tui/state/reducer.d.ts +16 -0
  121. package/dist/tui/state/reducer.d.ts.map +1 -0
  122. package/dist/tui/state/reducer.js +363 -0
  123. package/dist/tui/state/reducer.js.map +1 -0
  124. package/dist/tui/state/store.d.ts +37 -0
  125. package/dist/tui/state/store.d.ts.map +1 -0
  126. package/dist/tui/state/store.js +84 -0
  127. package/dist/tui/state/store.js.map +1 -0
  128. package/dist/tui/suspend.d.ts +17 -0
  129. package/dist/tui/suspend.d.ts.map +1 -0
  130. package/dist/tui/suspend.js +33 -0
  131. package/dist/tui/suspend.js.map +1 -0
  132. package/dist/tui/ui/App.d.ts +44 -0
  133. package/dist/tui/ui/App.d.ts.map +1 -0
  134. package/dist/tui/ui/App.js +105 -0
  135. package/dist/tui/ui/App.js.map +1 -0
  136. package/dist/tui/ui/frame.d.ts +86 -0
  137. package/dist/tui/ui/frame.d.ts.map +1 -0
  138. package/dist/tui/ui/frame.js +42 -0
  139. package/dist/tui/ui/frame.js.map +1 -0
  140. package/dist/tui/ui/lines.d.ts +92 -0
  141. package/dist/tui/ui/lines.d.ts.map +1 -0
  142. package/dist/tui/ui/lines.js +94 -0
  143. package/dist/tui/ui/lines.js.map +1 -0
  144. package/dist/tui/ui/shell/chrome.d.ts +61 -0
  145. package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
  146. package/dist/tui/ui/shell/chrome.js +272 -0
  147. package/dist/tui/ui/shell/chrome.js.map +1 -0
  148. package/dist/tui/ui/shell/widgets.d.ts +116 -0
  149. package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
  150. package/dist/tui/ui/shell/widgets.js +183 -0
  151. package/dist/tui/ui/shell/widgets.js.map +1 -0
  152. package/dist/tui/ui/views/about.d.ts +20 -0
  153. package/dist/tui/ui/views/about.d.ts.map +1 -0
  154. package/dist/tui/ui/views/about.js +40 -0
  155. package/dist/tui/ui/views/about.js.map +1 -0
  156. package/dist/tui/ui/views/all.d.ts +17 -0
  157. package/dist/tui/ui/views/all.d.ts.map +1 -0
  158. package/dist/tui/ui/views/all.js +17 -0
  159. package/dist/tui/ui/views/all.js.map +1 -0
  160. package/dist/tui/ui/views/dashboard.d.ts +211 -0
  161. package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
  162. package/dist/tui/ui/views/dashboard.js +651 -0
  163. package/dist/tui/ui/views/dashboard.js.map +1 -0
  164. package/dist/tui/ui/views/help.d.ts +17 -0
  165. package/dist/tui/ui/views/help.d.ts.map +1 -0
  166. package/dist/tui/ui/views/help.js +65 -0
  167. package/dist/tui/ui/views/help.js.map +1 -0
  168. package/dist/tui/ui/views/index.d.ts +42 -0
  169. package/dist/tui/ui/views/index.d.ts.map +1 -0
  170. package/dist/tui/ui/views/index.js +42 -0
  171. package/dist/tui/ui/views/index.js.map +1 -0
  172. package/dist/tui/ui/views/input.d.ts +6 -0
  173. package/dist/tui/ui/views/input.d.ts.map +1 -0
  174. package/dist/tui/ui/views/input.js +494 -0
  175. package/dist/tui/ui/views/input.js.map +1 -0
  176. package/dist/tui/ui/views/launch.d.ts +16 -0
  177. package/dist/tui/ui/views/launch.d.ts.map +1 -0
  178. package/dist/tui/ui/views/launch.js +43 -0
  179. package/dist/tui/ui/views/launch.js.map +1 -0
  180. package/dist/tui/ui/views/refusal.d.ts +20 -0
  181. package/dist/tui/ui/views/refusal.d.ts.map +1 -0
  182. package/dist/tui/ui/views/refusal.js +47 -0
  183. package/dist/tui/ui/views/refusal.js.map +1 -0
  184. package/dist/tui/ui/views/repos.d.ts +10 -0
  185. package/dist/tui/ui/views/repos.d.ts.map +1 -0
  186. package/dist/tui/ui/views/repos.js +93 -0
  187. package/dist/tui/ui/views/repos.js.map +1 -0
  188. package/dist/tui/ui/views/task.d.ts +17 -0
  189. package/dist/tui/ui/views/task.d.ts.map +1 -0
  190. package/dist/tui/ui/views/task.js +309 -0
  191. package/dist/tui/ui/views/task.js.map +1 -0
  192. package/dist/tui/ui/views/wordmark.d.ts +15 -0
  193. package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
  194. package/dist/tui/ui/views/wordmark.js +50 -0
  195. package/dist/tui/ui/views/wordmark.js.map +1 -0
  196. package/dist/tui/ui/views/workspaces.d.ts +17 -0
  197. package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
  198. package/dist/tui/ui/views/workspaces.js +127 -0
  199. package/dist/tui/ui/views/workspaces.js.map +1 -0
  200. package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
  201. package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
  202. package/dist/tui/ui/widgets/leaf-editor.js +119 -0
  203. package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
  204. package/dist/tui/ui/widgets/logs.d.ts +99 -0
  205. package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
  206. package/dist/tui/ui/widgets/logs.js +291 -0
  207. package/dist/tui/ui/widgets/logs.js.map +1 -0
  208. package/dist/tui/ui/widgets/reads.d.ts +62 -0
  209. package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
  210. package/dist/tui/ui/widgets/reads.js +122 -0
  211. package/dist/tui/ui/widgets/reads.js.map +1 -0
  212. package/dist/tui/ui/widgets/runs.d.ts +51 -0
  213. package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
  214. package/dist/tui/ui/widgets/runs.js +86 -0
  215. package/dist/tui/ui/widgets/runs.js.map +1 -0
  216. package/dist/tui/ui/widgets/tree.d.ts +149 -0
  217. package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
  218. package/dist/tui/ui/widgets/tree.js +584 -0
  219. package/dist/tui/ui/widgets/tree.js.map +1 -0
  220. package/package.json +22 -12
@@ -0,0 +1,297 @@
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
+ * Dataset content — what the value tree shows for one dataset path.
7
+ *
8
+ * `tick` polls `datasetGetStatus` (every 5 s while the dataset is on
9
+ * screen) and, on a new content hash, decides how the value is shown, as
10
+ * the web preview does: no value → *unset* / *null*; a collection root
11
+ * (Array / Set / Dict) → *paged* through `datasetGetPage` in 500-row
12
+ * windows, read-only, at every size; any other root ≤ 200 KB → fetched
13
+ * whole, decoded and materialized into the tree (*inline*); larger → *too
14
+ * large* (`/save` still works). The server's refusals map to states:
15
+ * `dataset_not_indexed` (a legacy blob) → *not indexed* with a `⏎ load
16
+ * whole value` fallback up to 64 MB, `dataset_too_large` → *too large*,
17
+ * `dataset_hash_mismatch` → the status is refetched.
18
+ *
19
+ * Pages are keyed `(ws, path, hash, page)`: raw bytes stay in a small
20
+ * cache so a page that was evicted from the eight retained around the
21
+ * window re-materializes without a request; one fetch is in flight per
22
+ * key. Decoding and materializing yield to the renderer first.
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ import { decodeBeast2For, variant } from '@elaraai/east';
27
+ import { ValueTree } from '@elaraai/east-ui';
28
+ import { findKeyInline, pruneRetainedPages } from '@elaraai/east-ui/internal';
29
+ import { apiCode, describeError, treePathOf } from '../api.js';
30
+ import { PAGE_SIZE, applyAnchor, captureAnchor, collectionKeys, isCollectionType, keyTypeOf, viewDataset } from '../model/tree.js';
31
+ export { PAGE_SIZE, collectionKeys, isCollectionType, keyTypeOf, viewDataset };
32
+ /** Non-collection values up to this many bytes are fetched whole. */
33
+ export const INLINE_LIMIT = 200 * 1024;
34
+ /** `⏎ load whole value` on a not-indexed collection is offered up to this size. */
35
+ export const WHOLE_LIMIT = 64 * 1024 * 1024;
36
+ /** Loaded pages retained around the window. */
37
+ export const MAX_RETAINED_PAGES = 8;
38
+ /** Raw page bytes kept per session (a return re-materializes without a request). */
39
+ export const MAX_CACHED_PAGES = 32;
40
+ /** Root rows requested around the first window before the view has scrolled. */
41
+ const INITIAL_WINDOW_ROWS = 60;
42
+ /**
43
+ * Materializes one decoded page into the tree's paged-row contract (the
44
+ * web preview's `pageRows`).
45
+ *
46
+ * @param type - The dataset's root type
47
+ * @param decoded - The decoded page (a value of the root type)
48
+ * @param offset - The global row of the page's first element
49
+ * @returns The rows
50
+ */
51
+ export function pageRows(type, decoded, offset) {
52
+ if (type.type === 'Array') {
53
+ const elemType = type.value;
54
+ return decoded.map((el, i) => ({ node: ValueTree.materialize(elemType, el), step: variant('index', BigInt(offset + i)) }));
55
+ }
56
+ if (type.type === 'Dict') {
57
+ const { key: keyType, value: valueType } = type.value;
58
+ const stringKeys = keyType.type === 'String';
59
+ return Array.from(decoded.entries()).map(([k, v], i) => ({
60
+ node: ValueTree.materialize(valueType, v),
61
+ step: stringKeys ? variant('key', k) : variant('index', BigInt(offset + i)),
62
+ label: stringKeys ? k : ValueTree.keyLabel(keyType, k),
63
+ }));
64
+ }
65
+ const elemType = type.value;
66
+ return Array.from(decoded.values()).map((el, i) => ({ node: ValueTree.materialize(elemType, el), step: variant('index', BigInt(offset + i)) }));
67
+ }
68
+ const yieldToRender = () => new Promise(resolve => setImmediate(resolve));
69
+ /**
70
+ * Creates the loader.
71
+ *
72
+ * @param deps - The store, the API accessor, the log
73
+ * @returns The loader
74
+ */
75
+ export function createDatasetLoader(deps) {
76
+ const { store } = deps;
77
+ const inflight = new Set();
78
+ const cache = new Map();
79
+ const keyOf = (ws, path, hash, page) => `${ws}\n${path}\n${hash}\n${page}`;
80
+ const current = (ws, path) => store.getState().data.dataset[ws]?.[path];
81
+ const notFound = { found: false, row: 0, count: 0 };
82
+ /** Replaces the mode, unless the value changed underneath; the shown tree's selection stays on its logical row. */
83
+ const setMode = (ws, path, hash, mode) => {
84
+ const s = store.getState();
85
+ const d = s.data.dataset[ws]?.[path];
86
+ if (d === undefined || d.hash !== hash)
87
+ return;
88
+ const anchor = captureAnchor(s, ws, path);
89
+ store.dispatch({ type: 'data/datasetMode', ws, path, mode });
90
+ if (anchor !== null) {
91
+ const view = applyAnchor(store.getState(), anchor);
92
+ if (view !== null)
93
+ store.dispatch({ type: 'view/set', view });
94
+ }
95
+ };
96
+ const cachePut = (key, entry) => {
97
+ cache.delete(key);
98
+ cache.set(key, entry);
99
+ while (cache.size > MAX_CACHED_PAGES) {
100
+ const oldest = cache.keys().next().value;
101
+ if (oldest === undefined)
102
+ break;
103
+ cache.delete(oldest);
104
+ }
105
+ };
106
+ const loadInline = async (api, ws, path, hash, type) => {
107
+ const key = keyOf(ws, path, hash, 'whole');
108
+ if (inflight.has(key))
109
+ return;
110
+ inflight.add(key);
111
+ try {
112
+ const got = await api.datasetGet(ws, treePathOf(path));
113
+ await yieldToRender();
114
+ const value = decodeBeast2For(type)(got.data);
115
+ await yieldToRender();
116
+ const root = ValueTree.materialize(type, value);
117
+ setMode(ws, path, hash, { kind: 'inline', root, value });
118
+ }
119
+ catch (err) {
120
+ deps.log?.(`dataset ${ws}${path} load failed: ${describeError(err)}`);
121
+ setMode(ws, path, hash, { kind: 'error', message: describeError(err) });
122
+ }
123
+ finally {
124
+ inflight.delete(key);
125
+ }
126
+ };
127
+ const loadPage = async (api, ws, path, hash, type, page) => {
128
+ const key = keyOf(ws, path, hash, page);
129
+ if (inflight.has(key))
130
+ return;
131
+ inflight.add(key);
132
+ const before = current(ws, path);
133
+ if (before?.mode.kind === 'paged' && before.hash === hash && !before.mode.loading.includes(page)) {
134
+ setMode(ws, path, hash, { ...before.mode, loading: [...before.mode.loading, page] });
135
+ }
136
+ try {
137
+ let entry = cache.get(key);
138
+ if (entry === undefined) {
139
+ const p = await api.datasetGetPage(ws, treePathOf(path), { offset: page * PAGE_SIZE, limit: PAGE_SIZE, hash });
140
+ entry = { bytes: p.data, totalRows: p.totalElements, totalBytes: p.totalBytes };
141
+ cachePut(key, entry);
142
+ }
143
+ await yieldToRender();
144
+ const rows = pageRows(type, decodeBeast2For(type)(entry.bytes), page * PAGE_SIZE);
145
+ const now = current(ws, path);
146
+ if (now === undefined || now.hash !== hash)
147
+ return;
148
+ if (now.mode.kind === 'paged') {
149
+ const pages = new Map(now.mode.pages);
150
+ pages.set(page, rows);
151
+ setMode(ws, path, hash, { kind: 'paged', totalRows: entry.totalRows, totalBytes: entry.totalBytes, pages, loading: now.mode.loading.filter(p => p !== page) });
152
+ }
153
+ else {
154
+ setMode(ws, path, hash, { kind: 'paged', totalRows: entry.totalRows, totalBytes: entry.totalBytes, pages: new Map([[page, rows]]), loading: [] });
155
+ }
156
+ }
157
+ catch (err) {
158
+ const code = apiCode(err);
159
+ const now = current(ws, path);
160
+ if (code === 'dataset_hash_mismatch') {
161
+ deps.log?.(`dataset ${ws}${path} page ${page}: hash mismatch — refetching the status`);
162
+ void loader.tick(ws, path);
163
+ }
164
+ else if (code === 'dataset_not_indexed') {
165
+ setMode(ws, path, hash, { kind: 'not-indexed', loadable: (now?.size ?? 0) <= WHOLE_LIMIT });
166
+ }
167
+ else if (code === 'dataset_too_large') {
168
+ setMode(ws, path, hash, { kind: 'too-large' });
169
+ }
170
+ else if (now?.mode.kind === 'paged') {
171
+ deps.log?.(`dataset ${ws}${path} page ${page} failed: ${describeError(err)}`);
172
+ setMode(ws, path, hash, { ...now.mode, loading: now.mode.loading.filter(p => p !== page) });
173
+ }
174
+ else {
175
+ deps.log?.(`dataset ${ws}${path} first page failed: ${describeError(err)}`);
176
+ setMode(ws, path, hash, { kind: 'error', message: describeError(err) });
177
+ }
178
+ }
179
+ finally {
180
+ inflight.delete(key);
181
+ }
182
+ };
183
+ const loader = {
184
+ async tick(ws, path, force = false) {
185
+ const api = deps.api();
186
+ if (api === null)
187
+ return;
188
+ const status = await api.datasetGetStatus(ws, treePathOf(path));
189
+ const hash = status.hash.type === 'some' ? status.hash.value : null;
190
+ const size = status.size.type === 'some' ? Number(status.size.value) : 0;
191
+ const type = status.type;
192
+ const before = current(ws, path);
193
+ if (!force && before !== undefined && before.status !== null && before.hash === hash && before.mode.kind !== 'error') {
194
+ if (before.size !== size)
195
+ store.dispatch({ type: 'data/dataset', ws, path, data: { ...before, status, size } });
196
+ return;
197
+ }
198
+ // A value that changed on the server under a pending edit: keep the base
199
+ // the ops were made against and raise the conflict; `/reload` replays them.
200
+ const edit = store.getState().edit;
201
+ if (!force && edit !== null && edit.ws === ws && edit.path === path && edit.ops.length > 0 && hash !== edit.baseHash) {
202
+ if (edit.conflict !== hash)
203
+ store.dispatch({ type: 'edit/set', edit: { ...edit, conflict: hash } });
204
+ return;
205
+ }
206
+ const base = { status, hash, type, size, mode: { kind: 'loading' }, forced: false };
207
+ if (status.refType !== 'value' || hash === null) {
208
+ store.dispatch({ type: 'data/dataset', ws, path, data: { ...base, mode: { kind: status.refType === 'null' ? 'null' : 'unset' } } });
209
+ return;
210
+ }
211
+ store.dispatch({ type: 'data/dataset', ws, path, data: base });
212
+ if (isCollectionType(type)) {
213
+ await loadPage(api, ws, path, hash, type, 0);
214
+ // The first window around wherever the view sits (a restored top row may be deep).
215
+ const s = store.getState();
216
+ const shown = viewDataset(s);
217
+ const top = shown !== null && shown.ws === ws && shown.path === path && (s.view.kind === 'task' || s.view.kind === 'input') ? s.view.tree.top : 0;
218
+ loader.needRows(ws, path, Math.max(0, top - PAGE_SIZE), top + INITIAL_WINDOW_ROWS + PAGE_SIZE);
219
+ }
220
+ else if (size <= INLINE_LIMIT) {
221
+ await loadInline(api, ws, path, hash, type);
222
+ }
223
+ else {
224
+ setMode(ws, path, hash, { kind: 'too-large' });
225
+ }
226
+ },
227
+ needRows(ws, path, startRow, endRow) {
228
+ const api = deps.api();
229
+ const d = current(ws, path);
230
+ if (api === null || d === undefined || d.mode.kind !== 'paged' || d.hash === null || d.type === null)
231
+ return;
232
+ const pageCount = Math.ceil(d.mode.totalRows / PAGE_SIZE);
233
+ const first = Math.max(0, Math.min(Math.floor(startRow / PAGE_SIZE), Math.max(0, pageCount - 1)));
234
+ const last = Math.max(first, Math.min(Math.ceil(endRow / PAGE_SIZE) - 1, pageCount - 1));
235
+ const missing = [];
236
+ for (let p = first; p <= last; p++)
237
+ if (!d.mode.pages.has(p))
238
+ missing.push(p);
239
+ // Retention counts the pages about to land, so the cap holds after they do.
240
+ const pruned = pruneRetainedPages(d.mode.pages, first, last, Math.max(1, MAX_RETAINED_PAGES - missing.length));
241
+ if (pruned !== d.mode.pages)
242
+ setMode(ws, path, d.hash, { ...d.mode, pages: pruned });
243
+ for (const p of missing)
244
+ void loadPage(api, ws, path, d.hash, d.type, p);
245
+ },
246
+ async reload(ws, path) {
247
+ const d = current(ws, path);
248
+ if (d !== undefined && d.hash !== null) {
249
+ // Drop the whole-value in-flight key so the reload fetches afresh.
250
+ inflight.delete(keyOf(ws, path, d.hash, 'whole'));
251
+ }
252
+ await loader.tick(ws, path, true);
253
+ },
254
+ async loadWhole(ws, path) {
255
+ const api = deps.api();
256
+ const d = current(ws, path);
257
+ if (api === null || d === undefined || d.hash === null || d.type === null)
258
+ return;
259
+ if (d.mode.kind !== 'not-indexed' || !d.mode.loadable)
260
+ return;
261
+ store.dispatch({ type: 'data/dataset', ws, path, data: { ...d, mode: { kind: 'loading' }, forced: true } });
262
+ await loadInline(api, ws, path, d.hash, d.type);
263
+ },
264
+ async findKey(ws, path, query) {
265
+ const api = deps.api();
266
+ const d = current(ws, path);
267
+ if (api === null || d === undefined || d.type === null)
268
+ return notFound;
269
+ if (d.mode.kind === 'paged') {
270
+ if (d.hash === null)
271
+ return notFound;
272
+ const r = await api.datasetFindKey(ws, treePathOf(path), { ...query, hash: d.hash });
273
+ return { found: r.found, row: r.row, count: r.count };
274
+ }
275
+ if (d.mode.kind === 'inline') {
276
+ const keyType = keyTypeOf(d.type);
277
+ const keys = collectionKeys(d.type, d.mode.value);
278
+ if (keyType === null || keys === null)
279
+ return notFound;
280
+ return findKeyInline(keyType, keys, query);
281
+ }
282
+ return notFound;
283
+ },
284
+ async bytes(ws, path) {
285
+ const api = deps.api();
286
+ if (api === null)
287
+ throw new Error('no session is open');
288
+ return (await api.datasetGet(ws, treePathOf(path))).data;
289
+ },
290
+ reset() {
291
+ inflight.clear();
292
+ cache.clear();
293
+ },
294
+ };
295
+ return loader;
296
+ }
297
+ //# sourceMappingURL=dataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../../src/tui/data/dataset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
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 edit buffer of an input — an ordered list of ops (`edit | insert |
7
+ * remove | tag`) applied through `ValueTree.applyEdit` to a *draft* of the
8
+ * base value; the tree renders the draft (re-materialized after every op)
9
+ * with `┆` on the rows the ops touched. `apply` encodes the draft with
10
+ * `encodeDatasetBlob` (collections stay segmented and pageable) and
11
+ * `datasetSet`s it; `replay` re-applies the ops onto a newer base after a
12
+ * conflict, reporting the ops that no longer apply.
13
+ *
14
+ * @packageDocumentation
15
+ */
16
+ import type { EastTypeValue } from '@elaraai/east';
17
+ import type { EditOp, EditState } from '../state/actions.js';
18
+ /**
19
+ * The row id an op marks as changed: the edited / tagged row itself, or
20
+ * the container an insert or remove touched.
21
+ *
22
+ * @param op - The op
23
+ * @returns The row id (`pathKey` of the path)
24
+ */
25
+ export declare function markOf(op: EditOp): string;
26
+ /**
27
+ * Starts a buffer over a base value.
28
+ *
29
+ * @param ws - The workspace
30
+ * @param path - The dataset path
31
+ * @param type - The value's type
32
+ * @param base - The decoded base value
33
+ * @param baseHash - Its content hash
34
+ * @returns A clean buffer
35
+ */
36
+ export declare function startEdit(ws: string, path: string, type: EastTypeValue, base: unknown, baseHash: string): EditState;
37
+ /**
38
+ * Appends an op and re-materializes the draft.
39
+ *
40
+ * @param edit - The buffer
41
+ * @param op - The op
42
+ * @returns The buffer with the op applied
43
+ * @throws {Error} When the op does not apply (an unknown dict key, a bad path)
44
+ */
45
+ export declare function pushOp(edit: EditState, op: EditOp): EditState;
46
+ /**
47
+ * Re-applies the ops onto a newer base (after a conflict); ops that no
48
+ * longer apply are dropped and reported.
49
+ *
50
+ * @param edit - The buffer
51
+ * @param base - The new base value
52
+ * @param baseHash - Its content hash
53
+ * @returns The rebased buffer and the dropped ops
54
+ */
55
+ export declare function replay(edit: EditState, base: unknown, baseHash: string): {
56
+ edit: EditState;
57
+ dropped: EditOp[];
58
+ };
59
+ /**
60
+ * A one-line description of an op (`edit .smoothing`).
61
+ *
62
+ * @param op - The op
63
+ * @returns The text
64
+ */
65
+ export declare function describeOp(op: EditOp): string;
66
+ /**
67
+ * The changed rows' short names for the commit bar (`smoothing ·
68
+ * min_confidence`).
69
+ *
70
+ * @param edit - The buffer
71
+ * @returns The names
72
+ */
73
+ export declare function changedNames(edit: EditState): string[];
74
+ //# sourceMappingURL=edit-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-buffer.d.ts","sourceRoot":"","sources":["../../../src/tui/data/edit-buffer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAY7D;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAEnH;AAED;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAU7D;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAW/G;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAYtD"}
@@ -0,0 +1,120 @@
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 { ValueTree } from '@elaraai/east-ui';
6
+ import { pathKey } from '@elaraai/east-ui/internal';
7
+ /** The op as `ValueTree.applyEdit` takes it. */
8
+ function treeOp(op) {
9
+ switch (op.kind) {
10
+ case 'edit': return { kind: 'edit', leaf: op.leaf };
11
+ case 'insert': return { kind: 'insert' };
12
+ case 'remove': return { kind: 'remove' };
13
+ case 'tag': return { kind: 'tag', tag: op.tag };
14
+ }
15
+ }
16
+ /**
17
+ * The row id an op marks as changed: the edited / tagged row itself, or
18
+ * the container an insert or remove touched.
19
+ *
20
+ * @param op - The op
21
+ * @returns The row id (`pathKey` of the path)
22
+ */
23
+ export function markOf(op) {
24
+ if (op.kind === 'edit' || op.kind === 'tag')
25
+ return pathKey(op.path);
26
+ return pathKey(op.path.slice(0, -1));
27
+ }
28
+ /**
29
+ * Starts a buffer over a base value.
30
+ *
31
+ * @param ws - The workspace
32
+ * @param path - The dataset path
33
+ * @param type - The value's type
34
+ * @param base - The decoded base value
35
+ * @param baseHash - Its content hash
36
+ * @returns A clean buffer
37
+ */
38
+ export function startEdit(ws, path, type, base, baseHash) {
39
+ return { ws, path, type, base, baseHash, ops: [], draft: base, root: ValueTree.materialize(type, base), changed: [], conflict: null, applying: false };
40
+ }
41
+ /**
42
+ * Appends an op and re-materializes the draft.
43
+ *
44
+ * @param edit - The buffer
45
+ * @param op - The op
46
+ * @returns The buffer with the op applied
47
+ * @throws {Error} When the op does not apply (an unknown dict key, a bad path)
48
+ */
49
+ export function pushOp(edit, op) {
50
+ const draft = ValueTree.applyEdit(edit.type, edit.draft, op.path, treeOp(op));
51
+ const mark = markOf(op);
52
+ return {
53
+ ...edit,
54
+ ops: [...edit.ops, op],
55
+ draft,
56
+ root: ValueTree.materialize(edit.type, draft),
57
+ changed: edit.changed.includes(mark) ? edit.changed : [...edit.changed, mark],
58
+ };
59
+ }
60
+ /**
61
+ * Re-applies the ops onto a newer base (after a conflict); ops that no
62
+ * longer apply are dropped and reported.
63
+ *
64
+ * @param edit - The buffer
65
+ * @param base - The new base value
66
+ * @param baseHash - Its content hash
67
+ * @returns The rebased buffer and the dropped ops
68
+ */
69
+ export function replay(edit, base, baseHash) {
70
+ let next = startEdit(edit.ws, edit.path, edit.type, base, baseHash);
71
+ const dropped = [];
72
+ for (const op of edit.ops) {
73
+ try {
74
+ next = pushOp(next, op);
75
+ }
76
+ catch {
77
+ dropped.push(op);
78
+ }
79
+ }
80
+ return { edit: next, dropped };
81
+ }
82
+ /**
83
+ * A one-line description of an op (`edit .smoothing`).
84
+ *
85
+ * @param op - The op
86
+ * @returns The text
87
+ */
88
+ export function describeOp(op) {
89
+ const where = pathKey(op.path);
90
+ switch (op.kind) {
91
+ case 'edit': return `edit ${where}`;
92
+ case 'insert': return `add ${where}`;
93
+ case 'remove': return `remove ${where}`;
94
+ case 'tag': return `tag ${where} ${op.tag}`;
95
+ }
96
+ }
97
+ /**
98
+ * The changed rows' short names for the commit bar (`smoothing ·
99
+ * min_confidence`).
100
+ *
101
+ * @param edit - The buffer
102
+ * @returns The names
103
+ */
104
+ export function changedNames(edit) {
105
+ return edit.changed.map(id => {
106
+ if (id === '$')
107
+ return 'value';
108
+ // The last field or key segment; indices, `?` and `!` name nothing.
109
+ const parts = id.match(/\.[^.[{?!]+|\[[^\]]*\]|\{[^}]*\}|\?|!/g) ?? [];
110
+ for (let i = parts.length - 1; i >= 0; i--) {
111
+ const part = parts[i];
112
+ if (part.startsWith('.'))
113
+ return part.slice(1);
114
+ if (part.startsWith('{'))
115
+ return part.slice(1, -1);
116
+ }
117
+ return id;
118
+ });
119
+ }
120
+ //# sourceMappingURL=edit-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-buffer.js","sourceRoot":"","sources":["../../../src/tui/data/edit-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
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 { Api } from '../api.js';
6
+ import { type DatasetLoader } from './dataset.js';
7
+ import { type TuiState } from '../state/actions.js';
8
+ import { type PollClock, type Poller } from '../state/poll.js';
9
+ import type { Store } from '../state/store.js';
10
+ /** The running feeds. */
11
+ export interface Feeds {
12
+ /** Starts deriving feeds from the store. */
13
+ start(): void;
14
+ /** Stops every poller and the derivation. */
15
+ stop(): void;
16
+ /** Fires every running poller now (`/refresh`, `R`). */
17
+ refresh(): void;
18
+ /** Fires one poller now, by key (`execution:<ws>` after a launch); unknown keys are ignored. */
19
+ fire(key: string): void;
20
+ /** The running pollers (for the connection pill and tests). */
21
+ pollers(): Poller[];
22
+ /** Re-derives the feed set now (after a session change). */
23
+ sync(): void;
24
+ /** The dataset loader behind the value tree (pages, key search, saves). */
25
+ datasets: DatasetLoader;
26
+ }
27
+ /** What {@link createFeeds} needs. */
28
+ export interface FeedsDeps {
29
+ store: Store;
30
+ /** The API of the current session (may change when `/repo` rebinds). */
31
+ api: () => Api | null;
32
+ clock?: PollClock | undefined;
33
+ /** A logger for feed failures (the debug log). */
34
+ log?: ((line: string) => void) | undefined;
35
+ }
36
+ /** The workspace a view is about, if any. */
37
+ export declare function viewWorkspace(state: TuiState): string | null;
38
+ /**
39
+ * Creates the feed manager.
40
+ *
41
+ * @param deps - The store, the API accessor, timers
42
+ * @returns The feeds (not started)
43
+ */
44
+ export declare function createFeeds(deps: FeedsDeps): Feeds;
45
+ //# sourceMappingURL=feeds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../../../src/tui/data/feeds.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAEpF,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAiC,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAS/C,yBAAyB;AACzB,MAAM,WAAW,KAAK;IAClB,4CAA4C;IAC5C,KAAK,IAAI,IAAI,CAAC;IACd,6CAA6C;IAC7C,IAAI,IAAI,IAAI,CAAC;IACb,wDAAwD;IACxD,OAAO,IAAI,IAAI,CAAC;IAChB,gGAAgG;IAChG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+DAA+D;IAC/D,OAAO,IAAI,MAAM,EAAE,CAAC;IACpB,4DAA4D;IAC5D,IAAI,IAAI,IAAI,CAAC;IACb,2EAA2E;IAC3E,QAAQ,EAAE,aAAa,CAAC;CAC3B;AAED,sCAAsC;AACtC,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,wEAAwE;IACxE,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,kDAAkD;IAClD,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC9C;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,KAAK,CAsRlD"}