@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.
- package/README.md +46 -21
- package/bin/e3-ui.mjs +6 -0
- package/dist/app/assets/{engine-BKZbmXkC-DmcCFcnb.js → engine-Bm-cIDd_-DwUdGcTZ.js} +1 -1
- package/dist/app/assets/{index-BJNWHnRv.js → index-mj-YVVN1.js} +91 -91
- package/dist/app/index.html +1 -1
- package/dist/cli.js +36 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/tui.d.ts +84 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +89 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/tui/api.d.ts +108 -0
- package/dist/tui/api.d.ts.map +1 -0
- package/dist/tui/api.js +130 -0
- package/dist/tui/api.js.map +1 -0
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +244 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/controller.d.ts +116 -0
- package/dist/tui/controller.d.ts.map +1 -0
- package/dist/tui/controller.js +644 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/data/dataflow.d.ts +68 -0
- package/dist/tui/data/dataflow.d.ts.map +1 -0
- package/dist/tui/data/dataflow.js +137 -0
- package/dist/tui/data/dataflow.js.map +1 -0
- package/dist/tui/data/dataset.d.ts +80 -0
- package/dist/tui/data/dataset.d.ts.map +1 -0
- package/dist/tui/data/dataset.js +297 -0
- package/dist/tui/data/dataset.js.map +1 -0
- package/dist/tui/data/edit-buffer.d.ts +74 -0
- package/dist/tui/data/edit-buffer.d.ts.map +1 -0
- package/dist/tui/data/edit-buffer.js +120 -0
- package/dist/tui/data/edit-buffer.js.map +1 -0
- package/dist/tui/data/feeds.d.ts +45 -0
- package/dist/tui/data/feeds.d.ts.map +1 -0
- package/dist/tui/data/feeds.js +318 -0
- package/dist/tui/data/feeds.js.map +1 -0
- package/dist/tui/data/logs.d.ts +68 -0
- package/dist/tui/data/logs.d.ts.map +1 -0
- package/dist/tui/data/logs.js +134 -0
- package/dist/tui/data/logs.js.map +1 -0
- package/dist/tui/input/commands.d.ts +159 -0
- package/dist/tui/input/commands.d.ts.map +1 -0
- package/dist/tui/input/commands.js +259 -0
- package/dist/tui/input/commands.js.map +1 -0
- package/dist/tui/input/completion.d.ts +63 -0
- package/dist/tui/input/completion.d.ts.map +1 -0
- package/dist/tui/input/completion.js +128 -0
- package/dist/tui/input/completion.js.map +1 -0
- package/dist/tui/input/keymap.d.ts +153 -0
- package/dist/tui/input/keymap.d.ts.map +1 -0
- package/dist/tui/input/keymap.js +206 -0
- package/dist/tui/input/keymap.js.map +1 -0
- package/dist/tui/input/mouse.d.ts +52 -0
- package/dist/tui/input/mouse.d.ts.map +1 -0
- package/dist/tui/input/mouse.js +55 -0
- package/dist/tui/input/mouse.js.map +1 -0
- package/dist/tui/lifecycle.d.ts +61 -0
- package/dist/tui/lifecycle.d.ts.map +1 -0
- package/dist/tui/lifecycle.js +99 -0
- package/dist/tui/lifecycle.js.map +1 -0
- package/dist/tui/model/catalogue.d.ts +28 -0
- package/dist/tui/model/catalogue.d.ts.map +1 -0
- package/dist/tui/model/catalogue.js +94 -0
- package/dist/tui/model/catalogue.js.map +1 -0
- package/dist/tui/model/help.d.ts +37 -0
- package/dist/tui/model/help.d.ts.map +1 -0
- package/dist/tui/model/help.js +210 -0
- package/dist/tui/model/help.js.map +1 -0
- package/dist/tui/model/index.d.ts +42 -0
- package/dist/tui/model/index.d.ts.map +1 -0
- package/dist/tui/model/index.js +50 -0
- package/dist/tui/model/index.js.map +1 -0
- package/dist/tui/model/status.d.ts +88 -0
- package/dist/tui/model/status.d.ts.map +1 -0
- package/dist/tui/model/status.js +137 -0
- package/dist/tui/model/status.js.map +1 -0
- package/dist/tui/model/tree.d.ts +126 -0
- package/dist/tui/model/tree.d.ts.map +1 -0
- package/dist/tui/model/tree.js +217 -0
- package/dist/tui/model/tree.js.map +1 -0
- package/dist/tui/model/types.d.ts +21 -0
- package/dist/tui/model/types.d.ts.map +1 -0
- package/dist/tui/model/types.js +46 -0
- package/dist/tui/model/types.js.map +1 -0
- package/dist/tui/render/glyphs.d.ts +122 -0
- package/dist/tui/render/glyphs.d.ts.map +1 -0
- package/dist/tui/render/glyphs.js +122 -0
- package/dist/tui/render/glyphs.js.map +1 -0
- package/dist/tui/render/layout.d.ts +145 -0
- package/dist/tui/render/layout.d.ts.map +1 -0
- package/dist/tui/render/layout.js +209 -0
- package/dist/tui/render/layout.js.map +1 -0
- package/dist/tui/render/text.d.ts +153 -0
- package/dist/tui/render/text.d.ts.map +1 -0
- package/dist/tui/render/text.js +320 -0
- package/dist/tui/render/text.js.map +1 -0
- package/dist/tui/render/theme.d.ts +88 -0
- package/dist/tui/render/theme.d.ts.map +1 -0
- package/dist/tui/render/theme.js +145 -0
- package/dist/tui/render/theme.js.map +1 -0
- package/dist/tui/session.d.ts +78 -0
- package/dist/tui/session.d.ts.map +1 -0
- package/dist/tui/session.js +237 -0
- package/dist/tui/session.js.map +1 -0
- package/dist/tui/state/actions.d.ts +584 -0
- package/dist/tui/state/actions.d.ts.map +1 -0
- package/dist/tui/state/actions.js +62 -0
- package/dist/tui/state/actions.js.map +1 -0
- package/dist/tui/state/persist.d.ts +114 -0
- package/dist/tui/state/persist.d.ts.map +1 -0
- package/dist/tui/state/persist.js +187 -0
- package/dist/tui/state/persist.js.map +1 -0
- package/dist/tui/state/poll.d.ts +99 -0
- package/dist/tui/state/poll.d.ts.map +1 -0
- package/dist/tui/state/poll.js +160 -0
- package/dist/tui/state/poll.js.map +1 -0
- package/dist/tui/state/reducer.d.ts +16 -0
- package/dist/tui/state/reducer.d.ts.map +1 -0
- package/dist/tui/state/reducer.js +363 -0
- package/dist/tui/state/reducer.js.map +1 -0
- package/dist/tui/state/store.d.ts +37 -0
- package/dist/tui/state/store.d.ts.map +1 -0
- package/dist/tui/state/store.js +84 -0
- package/dist/tui/state/store.js.map +1 -0
- package/dist/tui/suspend.d.ts +17 -0
- package/dist/tui/suspend.d.ts.map +1 -0
- package/dist/tui/suspend.js +33 -0
- package/dist/tui/suspend.js.map +1 -0
- package/dist/tui/ui/App.d.ts +44 -0
- package/dist/tui/ui/App.d.ts.map +1 -0
- package/dist/tui/ui/App.js +105 -0
- package/dist/tui/ui/App.js.map +1 -0
- package/dist/tui/ui/frame.d.ts +86 -0
- package/dist/tui/ui/frame.d.ts.map +1 -0
- package/dist/tui/ui/frame.js +42 -0
- package/dist/tui/ui/frame.js.map +1 -0
- package/dist/tui/ui/lines.d.ts +92 -0
- package/dist/tui/ui/lines.d.ts.map +1 -0
- package/dist/tui/ui/lines.js +94 -0
- package/dist/tui/ui/lines.js.map +1 -0
- package/dist/tui/ui/shell/chrome.d.ts +61 -0
- package/dist/tui/ui/shell/chrome.d.ts.map +1 -0
- package/dist/tui/ui/shell/chrome.js +272 -0
- package/dist/tui/ui/shell/chrome.js.map +1 -0
- package/dist/tui/ui/shell/widgets.d.ts +116 -0
- package/dist/tui/ui/shell/widgets.d.ts.map +1 -0
- package/dist/tui/ui/shell/widgets.js +183 -0
- package/dist/tui/ui/shell/widgets.js.map +1 -0
- package/dist/tui/ui/views/about.d.ts +20 -0
- package/dist/tui/ui/views/about.d.ts.map +1 -0
- package/dist/tui/ui/views/about.js +40 -0
- package/dist/tui/ui/views/about.js.map +1 -0
- package/dist/tui/ui/views/all.d.ts +17 -0
- package/dist/tui/ui/views/all.d.ts.map +1 -0
- package/dist/tui/ui/views/all.js +17 -0
- package/dist/tui/ui/views/all.js.map +1 -0
- package/dist/tui/ui/views/dashboard.d.ts +211 -0
- package/dist/tui/ui/views/dashboard.d.ts.map +1 -0
- package/dist/tui/ui/views/dashboard.js +651 -0
- package/dist/tui/ui/views/dashboard.js.map +1 -0
- package/dist/tui/ui/views/help.d.ts +17 -0
- package/dist/tui/ui/views/help.d.ts.map +1 -0
- package/dist/tui/ui/views/help.js +65 -0
- package/dist/tui/ui/views/help.js.map +1 -0
- package/dist/tui/ui/views/index.d.ts +42 -0
- package/dist/tui/ui/views/index.d.ts.map +1 -0
- package/dist/tui/ui/views/index.js +42 -0
- package/dist/tui/ui/views/index.js.map +1 -0
- package/dist/tui/ui/views/input.d.ts +6 -0
- package/dist/tui/ui/views/input.d.ts.map +1 -0
- package/dist/tui/ui/views/input.js +494 -0
- package/dist/tui/ui/views/input.js.map +1 -0
- package/dist/tui/ui/views/launch.d.ts +16 -0
- package/dist/tui/ui/views/launch.d.ts.map +1 -0
- package/dist/tui/ui/views/launch.js +43 -0
- package/dist/tui/ui/views/launch.js.map +1 -0
- package/dist/tui/ui/views/refusal.d.ts +20 -0
- package/dist/tui/ui/views/refusal.d.ts.map +1 -0
- package/dist/tui/ui/views/refusal.js +47 -0
- package/dist/tui/ui/views/refusal.js.map +1 -0
- package/dist/tui/ui/views/repos.d.ts +10 -0
- package/dist/tui/ui/views/repos.d.ts.map +1 -0
- package/dist/tui/ui/views/repos.js +93 -0
- package/dist/tui/ui/views/repos.js.map +1 -0
- package/dist/tui/ui/views/task.d.ts +17 -0
- package/dist/tui/ui/views/task.d.ts.map +1 -0
- package/dist/tui/ui/views/task.js +309 -0
- package/dist/tui/ui/views/task.js.map +1 -0
- package/dist/tui/ui/views/wordmark.d.ts +15 -0
- package/dist/tui/ui/views/wordmark.d.ts.map +1 -0
- package/dist/tui/ui/views/wordmark.js +50 -0
- package/dist/tui/ui/views/wordmark.js.map +1 -0
- package/dist/tui/ui/views/workspaces.d.ts +17 -0
- package/dist/tui/ui/views/workspaces.d.ts.map +1 -0
- package/dist/tui/ui/views/workspaces.js +127 -0
- package/dist/tui/ui/views/workspaces.js.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts +58 -0
- package/dist/tui/ui/widgets/leaf-editor.d.ts.map +1 -0
- package/dist/tui/ui/widgets/leaf-editor.js +119 -0
- package/dist/tui/ui/widgets/leaf-editor.js.map +1 -0
- package/dist/tui/ui/widgets/logs.d.ts +99 -0
- package/dist/tui/ui/widgets/logs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/logs.js +291 -0
- package/dist/tui/ui/widgets/logs.js.map +1 -0
- package/dist/tui/ui/widgets/reads.d.ts +62 -0
- package/dist/tui/ui/widgets/reads.d.ts.map +1 -0
- package/dist/tui/ui/widgets/reads.js +122 -0
- package/dist/tui/ui/widgets/reads.js.map +1 -0
- package/dist/tui/ui/widgets/runs.d.ts +51 -0
- package/dist/tui/ui/widgets/runs.d.ts.map +1 -0
- package/dist/tui/ui/widgets/runs.js +86 -0
- package/dist/tui/ui/widgets/runs.js.map +1 -0
- package/dist/tui/ui/widgets/tree.d.ts +149 -0
- package/dist/tui/ui/widgets/tree.d.ts.map +1 -0
- package/dist/tui/ui/widgets/tree.js +584 -0
- package/dist/tui/ui/widgets/tree.js.map +1 -0
- package/package.json +22 -12
|
@@ -0,0 +1,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"}
|