@elaraai/e3-ui-cli 1.0.72 → 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-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
  3. package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
  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,68 @@
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 { Glyphs } from '../render/glyphs.js';
7
+ import type { TuiState } from '../state/actions.js';
8
+ /** A workspace lock's holder, as the status / the locked error report it. */
9
+ export interface LockHolder {
10
+ pid: bigint;
11
+ acquiredAt: string;
12
+ command: {
13
+ type: 'some';
14
+ value: string;
15
+ } | {
16
+ type: 'none';
17
+ value: null;
18
+ };
19
+ }
20
+ /**
21
+ * Whether a run is live in a workspace: running, launched and not yet seen
22
+ * running (settling), or cancelled and not yet seen stopped (stopping).
23
+ *
24
+ * @param state - The store state
25
+ * @param ws - The workspace
26
+ * @returns `true` while live
27
+ */
28
+ export declare function isRunLive(state: TuiState, ws: string): boolean;
29
+ /**
30
+ * The lock holder line: `pid 4242 · e3 dataflow run · 12s ago`.
31
+ *
32
+ * @param holder - The holder
33
+ * @param now - Epoch milliseconds
34
+ * @param g - The glyph set
35
+ * @returns The text
36
+ */
37
+ export declare function lockHolderText(holder: LockHolder, now: number, g: Glyphs): string;
38
+ /**
39
+ * The toast for a failed launch: the lock holder for `workspace_locked`,
40
+ * else the formatted error.
41
+ *
42
+ * @param err - The error
43
+ * @param ws - The workspace
44
+ * @param now - Epoch milliseconds
45
+ * @param g - The glyph set
46
+ * @returns The toast text
47
+ */
48
+ export declare function launchFailureText(err: unknown, ws: string, now: number, g: Glyphs): string;
49
+ /**
50
+ * Starts the dataflow in a workspace.
51
+ *
52
+ * @param controller - The controller
53
+ * @param ws - The workspace
54
+ * @param options - `--force`, `--filter`, `--concurrency`
55
+ */
56
+ export declare function startRun(controller: Controller, ws: string, options: {
57
+ force: boolean;
58
+ filter: string | undefined;
59
+ concurrency: number | undefined;
60
+ }): Promise<void>;
61
+ /**
62
+ * Cancels the dataflow running in a workspace.
63
+ *
64
+ * @param controller - The controller
65
+ * @param ws - The workspace
66
+ */
67
+ export declare function cancelRun(controller: Controller, ws: string): Promise<void>;
68
+ //# sourceMappingURL=dataflow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow.d.ts","sourceRoot":"","sources":["../../../src/tui/data/dataflow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC;CAC5E;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjF;AAUD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ1F;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B1K;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BjF"}
@@ -0,0 +1,137 @@
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 { apiCode, describeError } from '../api.js';
6
+ import { timeAgo } from '../render/text.js';
7
+ /**
8
+ * Whether a run is live in a workspace: running, launched and not yet seen
9
+ * running (settling), or cancelled and not yet seen stopped (stopping).
10
+ *
11
+ * @param state - The store state
12
+ * @param ws - The workspace
13
+ * @returns `true` while live
14
+ */
15
+ export function isRunLive(state, ws) {
16
+ const execution = state.data.execution[ws];
17
+ return execution !== undefined && (execution.state?.status.type === 'running' || execution.settling || execution.stopping);
18
+ }
19
+ /**
20
+ * The lock holder line: `pid 4242 · e3 dataflow run · 12s ago`.
21
+ *
22
+ * @param holder - The holder
23
+ * @param now - Epoch milliseconds
24
+ * @param g - The glyph set
25
+ * @returns The text
26
+ */
27
+ export function lockHolderText(holder, now, g) {
28
+ const command = holder.command.type === 'some' ? holder.command.value : 'another process';
29
+ return `pid ${holder.pid} ${g.sep} ${command} ${g.sep} ${timeAgo(holder.acquiredAt, now)}`;
30
+ }
31
+ /** The message of an error's details (`{ message }` or a string). */
32
+ function detailMessage(err) {
33
+ const details = err.details;
34
+ if (typeof details === 'string')
35
+ return details;
36
+ if (typeof details === 'object' && details !== null && typeof details.message === 'string')
37
+ return details.message;
38
+ return '';
39
+ }
40
+ /**
41
+ * The toast for a failed launch: the lock holder for `workspace_locked`,
42
+ * else the formatted error.
43
+ *
44
+ * @param err - The error
45
+ * @param ws - The workspace
46
+ * @param now - Epoch milliseconds
47
+ * @param g - The glyph set
48
+ * @returns The toast text
49
+ */
50
+ export function launchFailureText(err, ws, now, g) {
51
+ if (apiCode(err) === 'workspace_locked') {
52
+ const details = err.details;
53
+ const holder = details?.holder;
54
+ if (holder !== undefined && holder.type === 'known' && holder.value !== null)
55
+ return `workspace ${ws} is locked by ${lockHolderText(holder.value, now, g)}`;
56
+ return `workspace ${ws} is locked by another process`;
57
+ }
58
+ return describeError(err);
59
+ }
60
+ /**
61
+ * Starts the dataflow in a workspace.
62
+ *
63
+ * @param controller - The controller
64
+ * @param ws - The workspace
65
+ * @param options - `--force`, `--filter`, `--concurrency`
66
+ */
67
+ export async function startRun(controller, ws, options) {
68
+ const s = controller.state();
69
+ const g = controller.deps.glyphs;
70
+ if (isRunLive(s, ws)) {
71
+ controller.toast('a run is already in progress — /stop first', 'warn');
72
+ return;
73
+ }
74
+ const api = controller.deps.api();
75
+ if (api === null) {
76
+ controller.toast('no session is open', 'neg');
77
+ return;
78
+ }
79
+ const dataflowOptions = { force: options.force };
80
+ if (options.filter !== undefined)
81
+ dataflowOptions.filter = options.filter;
82
+ if (options.concurrency !== undefined)
83
+ dataflowOptions.concurrency = options.concurrency;
84
+ controller.dispatch({ type: 'data/executionFlag', ws, settling: true });
85
+ try {
86
+ await api.dataflowExecuteLaunch(ws, dataflowOptions);
87
+ }
88
+ catch (err) {
89
+ controller.dispatch({ type: 'data/executionFlag', ws, settling: false });
90
+ controller.deps.log(`run ${ws} failed: ${describeError(err)}`);
91
+ controller.toast(launchFailureText(err, ws, controller.deps.now(), g), 'neg');
92
+ return;
93
+ }
94
+ const taskCount = s.data.status[ws]?.result.tasks.length ?? 0;
95
+ const queued = options.filter !== undefined ? `tasks matching ${options.filter} queued` : `${taskCount} task${taskCount === 1 ? '' : 's'} queued`;
96
+ controller.toast(`Dataflow started ${g.sep} ${ws} ${g.sep} ${queued}`, 'pos');
97
+ controller.deps.feeds.fire(`execution:${ws}`);
98
+ controller.deps.feeds.fire(`status:${ws}`);
99
+ }
100
+ /**
101
+ * Cancels the dataflow running in a workspace.
102
+ *
103
+ * @param controller - The controller
104
+ * @param ws - The workspace
105
+ */
106
+ export async function cancelRun(controller, ws) {
107
+ const s = controller.state();
108
+ const g = controller.deps.glyphs;
109
+ if (!isRunLive(s, ws)) {
110
+ controller.toast('no run in progress', 'warn');
111
+ return;
112
+ }
113
+ const api = controller.deps.api();
114
+ if (api === null) {
115
+ controller.toast('no session is open', 'neg');
116
+ return;
117
+ }
118
+ controller.dispatch({ type: 'data/executionFlag', ws, stopping: true });
119
+ try {
120
+ await api.dataflowCancel(ws);
121
+ }
122
+ catch (err) {
123
+ controller.dispatch({ type: 'data/executionFlag', ws, stopping: false });
124
+ controller.deps.log(`stop ${ws} failed: ${describeError(err)}`);
125
+ if (apiCode(err) === 'internal' && /no active execution/i.test(detailMessage(err))) {
126
+ controller.toast('nothing to cancel here — the run was started by another server process; stop it from there', 'warn');
127
+ }
128
+ else {
129
+ controller.toast(describeError(err), 'neg');
130
+ }
131
+ return;
132
+ }
133
+ controller.toast('Dataflow cancelled', 'warn', g.square);
134
+ controller.deps.feeds.fire(`execution:${ws}`);
135
+ controller.deps.feeds.fire(`status:${ws}`);
136
+ }
137
+ //# sourceMappingURL=dataflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataflow.js","sourceRoot":"","sources":["../../../src/tui/data/dataflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
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 { type EastTypeValue } from '@elaraai/east';
27
+ import { type DatasetKeyMatchRange, type DatasetKeyQuery, type ValueTreePagedRow } from '@elaraai/east-ui/internal';
28
+ import { type Api } from '../api.js';
29
+ import { PAGE_SIZE, collectionKeys, isCollectionType, keyTypeOf, viewDataset } from '../model/tree.js';
30
+ import type { Store } from '../state/store.js';
31
+ export { PAGE_SIZE, collectionKeys, isCollectionType, keyTypeOf, viewDataset };
32
+ /** Non-collection values up to this many bytes are fetched whole. */
33
+ export declare const INLINE_LIMIT: number;
34
+ /** `⏎ load whole value` on a not-indexed collection is offered up to this size. */
35
+ export declare const WHOLE_LIMIT: number;
36
+ /** Loaded pages retained around the window. */
37
+ export declare const MAX_RETAINED_PAGES = 8;
38
+ /** Raw page bytes kept per session (a return re-materializes without a request). */
39
+ export declare const MAX_CACHED_PAGES = 32;
40
+ /**
41
+ * Materializes one decoded page into the tree's paged-row contract (the
42
+ * web preview's `pageRows`).
43
+ *
44
+ * @param type - The dataset's root type
45
+ * @param decoded - The decoded page (a value of the root type)
46
+ * @param offset - The global row of the page's first element
47
+ * @returns The rows
48
+ */
49
+ export declare function pageRows(type: EastTypeValue, decoded: unknown, offset: number): ValueTreePagedRow[];
50
+ /** What the loader needs. */
51
+ export interface DatasetLoaderDeps {
52
+ store: Store;
53
+ api: () => Api | null;
54
+ log?: ((line: string) => void) | undefined;
55
+ }
56
+ /** The dataset loader. */
57
+ export interface DatasetLoader {
58
+ /** Polls the status and (re)loads the content on a new hash (`force` also past a pending edit's conflict). */
59
+ tick(ws: string, path: string, force?: boolean): Promise<void>;
60
+ /** Reloads the content now, past any conflict (`/reload`). */
61
+ reload(ws: string, path: string): Promise<void>;
62
+ /** Requests the pages covering root rows `[startRow, endRow)` (with retention). */
63
+ needRows(ws: string, path: string, startRow: number, endRow: number): void;
64
+ /** `⏎ load whole value` on a not-indexed collection. */
65
+ loadWhole(ws: string, path: string): Promise<void>;
66
+ /** Locates a key query: server-side for a paged value, in memory for an inline one. */
67
+ findKey(ws: string, path: string, query: DatasetKeyQuery): Promise<DatasetKeyMatchRange>;
68
+ /** The stored bytes (`/save`). */
69
+ bytes(ws: string, path: string): Promise<Uint8Array>;
70
+ /** Drops the caches and in-flight bookkeeping. */
71
+ reset(): void;
72
+ }
73
+ /**
74
+ * Creates the loader.
75
+ *
76
+ * @param deps - The store, the API accessor, the log
77
+ * @returns The loader
78
+ */
79
+ export declare function createDatasetLoader(deps: DatasetLoaderDeps): DatasetLoader;
80
+ //# sourceMappingURL=dataset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../../src/tui/data/dataset.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAqC,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACvJ,OAAO,EAAsC,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,SAAS,EAA8B,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEnI,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAE/E,qEAAqE;AACrE,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,mFAAmF;AACnF,eAAO,MAAM,WAAW,QAAmB,CAAC;AAC5C,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAgBnG;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC9C;AAED,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC1B,8GAA8G;IAC9G,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,8DAA8D;IAC9D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mFAAmF;IACnF,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,wDAAwD;IACxD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,uFAAuF;IACvF,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzF,kCAAkC;IAClC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,kDAAkD;IAClD,KAAK,IAAI,IAAI,CAAC;CACjB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAmM1E"}
@@ -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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"}