@miadi/chronicle-tui 0.1.0
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/LICENSE +21 -0
- package/README.md +85 -0
- package/dist/App.d.ts +22 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +344 -0
- package/dist/App.js.map +1 -0
- package/dist/actions.d.ts +70 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +94 -0
- package/dist/actions.js.map +1 -0
- package/dist/bin.d.ts +14 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/data.d.ts +56 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +127 -0
- package/dist/data.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/model.d.ts +58 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +170 -0
- package/dist/model.js.map +1 -0
- package/package.json +67 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Miadi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# @miadi/chronicle-tui
|
|
2
|
+
|
|
3
|
+
Browse the Miadi Chronicle from a terminal. `miadi-chronicle` lists every
|
|
4
|
+
episode, filters them as you type, searches their text, reads a vessel's
|
|
5
|
+
files, and opens the room, the wheel or the vessel.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm i -g @miadi/chronicle-tui
|
|
9
|
+
MIADI_CHRONICLE_ROOT=/srv/miadi/episodes/miadi-chronicle miadi-chronicle
|
|
10
|
+
miadi-chronicle 349 # open on one episode
|
|
11
|
+
miadi-chronicle --search "talking circle" # open in full-text mode
|
|
12
|
+
miadi-chronicle --root <dir> # another checkout
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
On Termux, install with `--ignore-scripts`. Node 22 or later.
|
|
16
|
+
|
|
17
|
+
## Keys
|
|
18
|
+
|
|
19
|
+
| key | does |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `/` | type a filter (Enter or Esc leaves the filter) |
|
|
22
|
+
| Tab | title filter or full-text search. In an open file: the next reference (Shift+Tab: the previous one) |
|
|
23
|
+
| ↑ ↓ `j` `k`, PgUp PgDn, `g` `G` | move |
|
|
24
|
+
| Enter, `l`, → | open: an episode's files, a file, a search hit |
|
|
25
|
+
| Enter on a reference | a chronicle reference opens that episode. A ceremony or circle shows its doors |
|
|
26
|
+
| Esc, `h`, ← | back |
|
|
27
|
+
| `o` | the doors of the reference, file or episode in focus: room (local, tailnet, public), wheel, vessel. Enter opens one |
|
|
28
|
+
| `r` | the phone door as a QR code (`i` inverts it for a light terminal) |
|
|
29
|
+
| `p` | the five-stage proof (git and the wheel, on demand) |
|
|
30
|
+
| `?` | all keys · `q` quits |
|
|
31
|
+
|
|
32
|
+
No Ctrl chord is taken, so tmux (`C-b`) and herdr (`prefix+…`) keep theirs.
|
|
33
|
+
tmux drops OSC 8 links unless `hyperlinks` is in `terminal-features`
|
|
34
|
+
(`set -as terminal-features ',*:hyperlinks'`), so every door also prints its
|
|
35
|
+
full address.
|
|
36
|
+
|
|
37
|
+
## Where each read comes from
|
|
38
|
+
|
|
39
|
+
The browser holds no chronicle rules of its own:
|
|
40
|
+
|
|
41
|
+
| what | from |
|
|
42
|
+
|---|---|
|
|
43
|
+
| the catalog, and each episode's theme, direction and arc | `@miadi/inquiry-weave` (`buildChronicleCatalog`, `readEpisode`) |
|
|
44
|
+
| an episode's summary, file list and file text | `@miadi/episode-vessel` |
|
|
45
|
+
| full-text search, and what `.miadiignore` hides | `@miadi/episode-vessel` (`searchVessels`) |
|
|
46
|
+
| references in a file: `miadi-chronicle:`, `miadi-ceremony:`, `miadi-circle:`, `{{ … }}` | `@miadi/inquiry-weave` (`findTextReferences`) |
|
|
47
|
+
| the doors, as OSC 8 links | `@miadi/inquiry-weave` (`resolveForTerminal`, `resolveWheelRefForTerminal`) |
|
|
48
|
+
| the five-stage proof | `@miadi/inquiry-weave` (`episodeDoorStatus`) |
|
|
49
|
+
|
|
50
|
+
A ceremony or circle shows its addresses only. Ceremonies are private until
|
|
51
|
+
their page sees the reader's seat, so nothing the wheel holds about one is
|
|
52
|
+
read here (jgwill/Miadi#680).
|
|
53
|
+
|
|
54
|
+
Readings are guesses from keywords in an episode's name and title, and an
|
|
55
|
+
episode with no keyword reads by its number's turn of the wheel. The detail
|
|
56
|
+
pane labels them "reading" for that reason.
|
|
57
|
+
|
|
58
|
+
## Actions
|
|
59
|
+
|
|
60
|
+
Every operation is an entry in one registry (`DEFAULT_ACTIONS`): a key, a
|
|
61
|
+
label, when it applies, and a function that calls the door that owns the
|
|
62
|
+
operation. The key bar is drawn from it. A host adds its own:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { render } from "ink"
|
|
66
|
+
import { App, type ChronicleAction } from "@miadi/chronicle-tui"
|
|
67
|
+
|
|
68
|
+
const mine: ChronicleAction = {
|
|
69
|
+
id: "say-hello",
|
|
70
|
+
key: "H",
|
|
71
|
+
label: "hello",
|
|
72
|
+
effect: "read",
|
|
73
|
+
matches: (input) => input === "H",
|
|
74
|
+
available: (context) => Boolean(context.episode),
|
|
75
|
+
run: (context) => context.status(`hello from ${context.episode!.name}`),
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
render(<App root={process.env.MIADI_CHRONICLE_ROOT!} actions={[mine]} />)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
An action that changes anything declares `effect: "write"` and calls the
|
|
82
|
+
existing door for it (the episode API, inquiry-weave, the ceremony routes),
|
|
83
|
+
never the files directly. Version 0.1 registers reading actions only.
|
|
84
|
+
|
|
85
|
+
Ref: jgwill/Miadi#706
|
package/dist/App.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The terminal browser's screen. It draws the panes and routes keys; every
|
|
3
|
+
* read goes through `data.ts`, every operation through the action registry.
|
|
4
|
+
*
|
|
5
|
+
* Keys are plain letters, arrows, Tab, Enter and Esc. No Ctrl chord is taken,
|
|
6
|
+
* so tmux (C-b) and herdr (prefix+…) keep all of theirs.
|
|
7
|
+
*/
|
|
8
|
+
import React from "react";
|
|
9
|
+
import { type ChronicleAction } from "./actions.js";
|
|
10
|
+
export interface AppProps {
|
|
11
|
+
root: string;
|
|
12
|
+
/** Start with this title filter. */
|
|
13
|
+
query?: string;
|
|
14
|
+
/** Start in full-text mode with this query. */
|
|
15
|
+
search?: string;
|
|
16
|
+
/** Start on this episode (number, epNNN or folder name). */
|
|
17
|
+
episode?: string;
|
|
18
|
+
/** Operations beyond the built-in reading ones (phase 2 and on). */
|
|
19
|
+
actions?: readonly ChronicleAction[];
|
|
20
|
+
}
|
|
21
|
+
export declare function App({ root, query: initialQuery, search: initialSearch, episode, actions: extra }: AppProps): React.JSX.Element;
|
|
22
|
+
//# sourceMappingURL=App.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAA;AAInE,OAAO,EAAkD,KAAK,eAAe,EAA2B,MAAM,cAAc,CAAA;AAa5H,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CACrC;AA+CD,wBAAgB,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,KAAU,EAAE,EAAE,QAAQ,qBAmcpH"}
|
package/dist/App.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The terminal browser's screen. It draws the panes and routes keys; every
|
|
4
|
+
* read goes through `data.ts`, every operation through the action registry.
|
|
5
|
+
*
|
|
6
|
+
* Keys are plain letters, arrows, Tab, Enter and Esc. No Ctrl chord is taken,
|
|
7
|
+
* so tmux (C-b) and herdr (prefix+…) keep all of theirs.
|
|
8
|
+
*/
|
|
9
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
10
|
+
import { Box, Text, useApp, useInput, useStdout } from "ink";
|
|
11
|
+
import { osc8 } from "@miadi/inquiry-weave";
|
|
12
|
+
import { DEFAULT_ACTIONS, actionFor } from "./actions.js";
|
|
13
|
+
import { loadChronicle, loadDetail, loadText, openUrl, qrLines, search } from "./data.js";
|
|
14
|
+
import { clamp, fileView, filterRows, screenLineOf, windowOf, } from "./model.js";
|
|
15
|
+
const DIRECTION_MARK = { east: "E", south: "S", west: "W", north: "N" };
|
|
16
|
+
const DIRECTION_COLOR = { east: "yellow", south: "red", west: "blue", north: "white" };
|
|
17
|
+
function Segments({ segments, selectedRef }) {
|
|
18
|
+
return (_jsx(Text, { wrap: "truncate-end", children: segments.map((segment, index) => {
|
|
19
|
+
if (segment.style === "ref") {
|
|
20
|
+
const selected = segment.ref === selectedRef;
|
|
21
|
+
return (_jsx(Text, { color: "cyan", inverse: selected, bold: selected, children: segment.text }, index));
|
|
22
|
+
}
|
|
23
|
+
if (segment.style === "heading")
|
|
24
|
+
return _jsx(Text, { bold: true, color: "yellow", children: segment.text }, index);
|
|
25
|
+
if (segment.style === "code")
|
|
26
|
+
return _jsx(Text, { color: "gray", children: segment.text }, index);
|
|
27
|
+
if (segment.style === "quote")
|
|
28
|
+
return _jsx(Text, { italic: true, children: segment.text }, index);
|
|
29
|
+
return _jsx(Text, { children: segment.text }, index);
|
|
30
|
+
}) }));
|
|
31
|
+
}
|
|
32
|
+
function matchRow(rows, ref) {
|
|
33
|
+
const text = ref.trim().toLowerCase().replace(/^ep/, "");
|
|
34
|
+
const exact = rows.findIndex((row) => row.name.toLowerCase() === ref.trim().toLowerCase());
|
|
35
|
+
if (exact !== -1)
|
|
36
|
+
return exact;
|
|
37
|
+
const number = Number(text);
|
|
38
|
+
if (Number.isInteger(number)) {
|
|
39
|
+
const byNumber = rows.findIndex((row) => row.number === number);
|
|
40
|
+
if (byNumber !== -1)
|
|
41
|
+
return byNumber;
|
|
42
|
+
}
|
|
43
|
+
return rows.findIndex((row) => row.name.toLowerCase().includes(text));
|
|
44
|
+
}
|
|
45
|
+
export function App({ root, query: initialQuery = "", search: initialSearch, episode, actions: extra = [] }) {
|
|
46
|
+
const { exit } = useApp();
|
|
47
|
+
const { stdout } = useStdout();
|
|
48
|
+
const columns = stdout?.columns ?? 100;
|
|
49
|
+
const rows = stdout?.rows ?? 30;
|
|
50
|
+
const [chronicle, setChronicle] = useState(null);
|
|
51
|
+
const [loadError, setLoadError] = useState(null);
|
|
52
|
+
const [query, setQuery] = useState(initialSearch ?? initialQuery);
|
|
53
|
+
const [inputMode, setInputMode] = useState(false);
|
|
54
|
+
const [searchMode, setSearchMode] = useState(initialSearch ? "full" : "title");
|
|
55
|
+
const [view, setView] = useState(initialSearch ? "hits" : "list");
|
|
56
|
+
const [listSel, setListSel] = useState(0);
|
|
57
|
+
const [fileSel, setFileSel] = useState(0);
|
|
58
|
+
const [hits, setHits] = useState(null);
|
|
59
|
+
const [hitSel, setHitSel] = useState(0);
|
|
60
|
+
const [searching, setSearching] = useState(false);
|
|
61
|
+
const [open, setOpen] = useState(null);
|
|
62
|
+
const [overlay, setOverlay] = useState(null);
|
|
63
|
+
const [status, setStatus] = useState("");
|
|
64
|
+
const details = useRef(new Map());
|
|
65
|
+
const searchTurn = useRef(0);
|
|
66
|
+
const actions = useMemo(() => [...DEFAULT_ACTIONS, ...extra], [extra]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
loadChronicle(root).then((loaded) => {
|
|
69
|
+
setChronicle(loaded);
|
|
70
|
+
if (episode) {
|
|
71
|
+
const index = matchRow(loaded.rows, episode);
|
|
72
|
+
if (index === -1)
|
|
73
|
+
setStatus(`No episode matches ${episode}.`);
|
|
74
|
+
else {
|
|
75
|
+
setListSel(index);
|
|
76
|
+
setView("files");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}, (error) => setLoadError(error.message));
|
|
80
|
+
}, [root, episode]);
|
|
81
|
+
const filtered = useMemo(() => (chronicle ? (searchMode === "title" ? filterRows(chronicle.rows, query) : chronicle.rows) : []), [chronicle, query, searchMode]);
|
|
82
|
+
// Full-text search runs a moment after typing stops, and only the latest answer is kept.
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (!chronicle || searchMode !== "full")
|
|
85
|
+
return;
|
|
86
|
+
const text = query.trim();
|
|
87
|
+
if (text.length < 2)
|
|
88
|
+
return;
|
|
89
|
+
const turn = ++searchTurn.current;
|
|
90
|
+
const timer = setTimeout(() => {
|
|
91
|
+
setSearching(true);
|
|
92
|
+
search(chronicle.root, text, chronicle.rows).then((result) => {
|
|
93
|
+
if (turn !== searchTurn.current)
|
|
94
|
+
return;
|
|
95
|
+
setHits(result);
|
|
96
|
+
setHitSel(0);
|
|
97
|
+
setSearching(false);
|
|
98
|
+
setView((current) => (current === "file" ? current : "hits"));
|
|
99
|
+
}, (error) => {
|
|
100
|
+
if (turn !== searchTurn.current)
|
|
101
|
+
return;
|
|
102
|
+
setSearching(false);
|
|
103
|
+
setStatus(error.message);
|
|
104
|
+
});
|
|
105
|
+
}, 250);
|
|
106
|
+
return () => clearTimeout(timer);
|
|
107
|
+
}, [chronicle, query, searchMode]);
|
|
108
|
+
const rowByName = (name) => chronicle?.rows.find((row) => row.name === name);
|
|
109
|
+
const hit = view === "hits" || open?.from === "hits" ? hits?.hits[hitSel] : undefined;
|
|
110
|
+
const currentRow = view === "file" && open
|
|
111
|
+
? rowByName(open.name)
|
|
112
|
+
: view === "hits"
|
|
113
|
+
? hit && rowByName(hit.episodePath)
|
|
114
|
+
: filtered[clamp(listSel, filtered.length)];
|
|
115
|
+
const detailOf = (name) => {
|
|
116
|
+
const cached = details.current.get(name);
|
|
117
|
+
if (cached)
|
|
118
|
+
return cached;
|
|
119
|
+
const loaded = loadDetail(chronicle.root, name);
|
|
120
|
+
details.current.set(name, loaded);
|
|
121
|
+
return loaded;
|
|
122
|
+
};
|
|
123
|
+
const detail = chronicle && currentRow ? detailOf(currentRow.name) : null;
|
|
124
|
+
const files = detail?.files ?? [];
|
|
125
|
+
const openFile = (name, path, from, line) => {
|
|
126
|
+
const text = loadText(chronicle.root, name, path);
|
|
127
|
+
if ("error" in text)
|
|
128
|
+
return setStatus(text.error);
|
|
129
|
+
const shaped = fileView(text.content, columns - 2);
|
|
130
|
+
setOpen({ name, path, view: shaped, scroll: line ? Math.max(0, screenLineOf(shaped, line) - 2) : 0, refSel: -1, from });
|
|
131
|
+
setView("file");
|
|
132
|
+
setStatus(shaped.refs.length ? `${shaped.refs.length} reference(s): Tab moves between them, Enter follows.` : "");
|
|
133
|
+
};
|
|
134
|
+
const context = chronicle
|
|
135
|
+
? {
|
|
136
|
+
view,
|
|
137
|
+
chronicle,
|
|
138
|
+
episode: currentRow,
|
|
139
|
+
file: view === "file" ? open?.path : view === "files" ? files[clamp(fileSel, files.length)]?.relativePath : hit?.file,
|
|
140
|
+
reference: view === "file" && open && open.refSel >= 0 ? open.view.refs[open.refSel] : undefined,
|
|
141
|
+
hit,
|
|
142
|
+
show: setOverlay,
|
|
143
|
+
status: setStatus,
|
|
144
|
+
jumpTo: (name) => {
|
|
145
|
+
let index = filtered.findIndex((row) => row.name === name);
|
|
146
|
+
if (index === -1) {
|
|
147
|
+
setQuery("");
|
|
148
|
+
setSearchMode("title");
|
|
149
|
+
index = chronicle.rows.findIndex((row) => row.name === name);
|
|
150
|
+
}
|
|
151
|
+
setListSel(Math.max(0, index));
|
|
152
|
+
setFileSel(0);
|
|
153
|
+
setOpen(null);
|
|
154
|
+
setView("files");
|
|
155
|
+
},
|
|
156
|
+
}
|
|
157
|
+
: null;
|
|
158
|
+
const bodyHeight = Math.max(5, rows - 4);
|
|
159
|
+
const move = (delta, key) => {
|
|
160
|
+
const step = key.pageDown || key.pageUp ? bodyHeight - 1 : 1;
|
|
161
|
+
const by = delta * step;
|
|
162
|
+
if (view === "list")
|
|
163
|
+
setListSel((i) => clamp(i + by, filtered.length));
|
|
164
|
+
else if (view === "files")
|
|
165
|
+
setFileSel((i) => clamp(i + by, files.length));
|
|
166
|
+
else if (view === "hits")
|
|
167
|
+
setHitSel((i) => clamp(i + by, hits?.hits.length ?? 0));
|
|
168
|
+
else if (view === "file")
|
|
169
|
+
setOpen((file) => file ? { ...file, scroll: clamp(file.scroll + by, Math.max(1, file.view.lines.length - bodyHeight + 1)) } : file);
|
|
170
|
+
};
|
|
171
|
+
const back = () => {
|
|
172
|
+
if (view === "file" && open) {
|
|
173
|
+
setView(open.from);
|
|
174
|
+
setOpen(null);
|
|
175
|
+
}
|
|
176
|
+
else if (view === "files" || view === "hits")
|
|
177
|
+
setView("list");
|
|
178
|
+
};
|
|
179
|
+
const forward = () => {
|
|
180
|
+
if (view === "list" && currentRow) {
|
|
181
|
+
setFileSel(0);
|
|
182
|
+
setView("files");
|
|
183
|
+
}
|
|
184
|
+
else if (view === "files" && currentRow && files[fileSel]) {
|
|
185
|
+
const file = files[fileSel];
|
|
186
|
+
if (file.kind !== "text")
|
|
187
|
+
return setStatus(`${file.relativePath} is ${file.kind}: press o for its doors.`);
|
|
188
|
+
openFile(currentRow.name, file.relativePath, "files");
|
|
189
|
+
}
|
|
190
|
+
else if (view === "hits" && hit)
|
|
191
|
+
openFile(hit.episodePath, hit.file, "hits", hit.line);
|
|
192
|
+
};
|
|
193
|
+
useInput((input, key) => {
|
|
194
|
+
// A held or fast-typed key arrives as one chunk ("jjj"): outside the
|
|
195
|
+
// filter, each character is its own key press.
|
|
196
|
+
if (!inputMode && !key.ctrl && !key.meta && input.length > 1 && /^([jkgG])\1+$/.test(input)) {
|
|
197
|
+
for (const char of input)
|
|
198
|
+
handleKey(char, key);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
handleKey(input, key);
|
|
202
|
+
});
|
|
203
|
+
function handleKey(input, key) {
|
|
204
|
+
if (!chronicle || !context) {
|
|
205
|
+
if (input === "q" || key.escape)
|
|
206
|
+
exit();
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (overlay) {
|
|
210
|
+
if (key.escape || input === "q" || input === "h" || key.backspace)
|
|
211
|
+
return setOverlay(null);
|
|
212
|
+
if (overlay.type === "doors") {
|
|
213
|
+
const count = overlay.doors.doors.length;
|
|
214
|
+
if (key.downArrow || input === "j")
|
|
215
|
+
return setOverlay({ ...overlay, selected: clamp(overlay.selected + 1, count) });
|
|
216
|
+
if (key.upArrow || input === "k")
|
|
217
|
+
return setOverlay({ ...overlay, selected: clamp(overlay.selected - 1, count) });
|
|
218
|
+
const door = overlay.doors.doors[overlay.selected];
|
|
219
|
+
if (door && key.return) {
|
|
220
|
+
const used = openUrl(door.url);
|
|
221
|
+
return setStatus(used ? `Opened ${door.label} with ${used}.` : `No opener here. The address is ${door.url}`);
|
|
222
|
+
}
|
|
223
|
+
if (door && input === "r")
|
|
224
|
+
return setOverlay({ type: "qr", title: overlay.doors.title, door, invert: false });
|
|
225
|
+
}
|
|
226
|
+
if (overlay.type === "qr" && input === "i")
|
|
227
|
+
return setOverlay({ ...overlay, invert: !overlay.invert });
|
|
228
|
+
if (overlay.type === "help")
|
|
229
|
+
return setOverlay(null);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (inputMode) {
|
|
233
|
+
if (key.escape || key.return)
|
|
234
|
+
return setInputMode(false);
|
|
235
|
+
// A Tab typed fast or pasted can arrive inside the text chunk.
|
|
236
|
+
if (key.tab || input.includes("\t"))
|
|
237
|
+
setSearchMode((mode) => (mode === "title" ? "full" : "title"));
|
|
238
|
+
input = input.replace(/[\u0000-\u001f\u007f]/g, "");
|
|
239
|
+
if (key.tab && !input)
|
|
240
|
+
return;
|
|
241
|
+
if (key.upArrow || key.downArrow)
|
|
242
|
+
return move(key.downArrow ? 1 : -1, key);
|
|
243
|
+
if (key.backspace || key.delete) {
|
|
244
|
+
setListSel(0);
|
|
245
|
+
return setQuery((text) => text.slice(0, -1));
|
|
246
|
+
}
|
|
247
|
+
if (input && !key.ctrl && !key.meta) {
|
|
248
|
+
setListSel(0);
|
|
249
|
+
setQuery((text) => text + input);
|
|
250
|
+
}
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
if (input === "/" && view !== "file") {
|
|
254
|
+
if (view === "files")
|
|
255
|
+
setView("list");
|
|
256
|
+
return setInputMode(true);
|
|
257
|
+
}
|
|
258
|
+
if (key.tab && view === "file" && open) {
|
|
259
|
+
const count = open.view.refs.length;
|
|
260
|
+
if (count === 0)
|
|
261
|
+
return;
|
|
262
|
+
const refSel = key.shift ? (open.refSel <= 0 ? count - 1 : open.refSel - 1) : (open.refSel + 1) % count;
|
|
263
|
+
const ref = open.view.refs[refSel];
|
|
264
|
+
const line = open.view.lines.findIndex((screen) => screen.segments.some((s) => s.ref === refSel));
|
|
265
|
+
const scroll = line < open.scroll || line >= open.scroll + bodyHeight ? Math.max(0, line - 2) : open.scroll;
|
|
266
|
+
setStatus(`${ref.kind} · ${ref.uri}`);
|
|
267
|
+
return setOpen({ ...open, refSel, scroll });
|
|
268
|
+
}
|
|
269
|
+
if (key.tab && (view === "list" || view === "hits")) {
|
|
270
|
+
const next = searchMode === "title" ? "full" : "title";
|
|
271
|
+
setSearchMode(next);
|
|
272
|
+
if (next === "title")
|
|
273
|
+
setView("list");
|
|
274
|
+
else if (hits && query.trim().length >= 2)
|
|
275
|
+
setView("hits");
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const action = actionFor(actions, input, key, context);
|
|
279
|
+
if (action) {
|
|
280
|
+
Promise.resolve(action.run(context)).catch((error) => setStatus(error.message));
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (key.downArrow || input === "j" || key.pageDown)
|
|
284
|
+
return move(1, key);
|
|
285
|
+
if (key.upArrow || input === "k" || key.pageUp)
|
|
286
|
+
return move(-1, key);
|
|
287
|
+
if (key.home || input === "g")
|
|
288
|
+
return move(-100000, { ...key, pageUp: false });
|
|
289
|
+
if (key.end || input === "G")
|
|
290
|
+
return move(100000, { ...key, pageDown: false });
|
|
291
|
+
if (key.return || key.rightArrow || input === "l")
|
|
292
|
+
return forward();
|
|
293
|
+
if (key.escape || key.leftArrow || input === "h" || key.backspace)
|
|
294
|
+
return back();
|
|
295
|
+
if (input === "?")
|
|
296
|
+
return setOverlay({ type: "help" });
|
|
297
|
+
if (input === "q")
|
|
298
|
+
exit();
|
|
299
|
+
}
|
|
300
|
+
if (loadError)
|
|
301
|
+
return _jsxs(Text, { color: "red", children: ["miadi-chronicle: ", loadError] });
|
|
302
|
+
if (!chronicle)
|
|
303
|
+
return _jsxs(Text, { children: ["Reading the chronicle at ", root, "\u2026"] });
|
|
304
|
+
const withManifest = chronicle.rows.filter((row) => row.structured).length;
|
|
305
|
+
const leftWidth = Math.max(30, Math.floor(columns * 0.45));
|
|
306
|
+
const rightWidth = Math.max(20, columns - leftWidth - 2);
|
|
307
|
+
const available = actions.filter((action) => action.available(context));
|
|
308
|
+
const selectedRow = clamp(listSel, filtered.length);
|
|
309
|
+
const listWindow = windowOf(filtered, selectedRow, bodyHeight);
|
|
310
|
+
const listPane = (_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [listWindow.items.map((row, index) => {
|
|
311
|
+
const selected = listWindow.start + index === selectedRow;
|
|
312
|
+
return (_jsxs(Text, { wrap: "truncate-end", inverse: selected && view === "list", bold: selected && view === "files", children: [_jsxs(Text, { color: "yellow", children: [selected && view === "files" ? "›" : " ", String(row.number ?? "—").padStart(4)] }), " ", _jsx(Text, { color: "gray", children: row.date ?? " " }), " ", _jsx(Text, { color: DIRECTION_COLOR[row.readings.direction], children: DIRECTION_MARK[row.readings.direction] }), " ", row.structured ? row.title : _jsxs(Text, { italic: true, color: "gray", children: [row.name, " \u00B7 no manifest"] })] }, row.name));
|
|
313
|
+
}), filtered.length === 0 ? _jsxs(Text, { color: "gray", children: ["No episode matches \u201C", query, "\u201D."] }) : null] }));
|
|
314
|
+
const hitWindow = hits ? windowOf(hits.hits, hitSel, bodyHeight - 1) : null;
|
|
315
|
+
const hitsPane = (_jsxs(Box, { flexDirection: "column", width: leftWidth, children: [searching ? _jsx(Text, { color: "gray", children: "Searching\u2026" }) : null, hits ? (_jsxs(Text, { color: "gray", wrap: "truncate-end", children: ["\u201C", hits.query, "\u201D: ", hits.hits.length, hits.truncated ? "+" : "", " hits in ", new Set(hits.hits.map((h) => h.episodePath)).size, " episodes \u00B7 ", hits.engine] })) : null, hitWindow?.items.map((item, index) => {
|
|
316
|
+
const number = rowByName(item.episodePath)?.number;
|
|
317
|
+
return (_jsxs(Text, { wrap: "truncate-end", inverse: hitWindow.start + index === hitSel, children: [_jsx(Text, { color: "yellow", children: String(number ?? "—").padStart(4) }), " ", _jsxs(Text, { color: "blue", children: [item.file, ":", item.line] }), " ", item.text.trim()] }, `${item.episodePath}/${item.file}:${item.line}`));
|
|
318
|
+
})] }));
|
|
319
|
+
const fileWindow = windowOf(files, clamp(fileSel, files.length), Math.max(3, bodyHeight - 7));
|
|
320
|
+
const detailPane = (_jsx(Box, { flexDirection: "column", width: rightWidth, paddingLeft: 1, children: currentRow ? (_jsxs(_Fragment, { children: [_jsx(Text, { bold: true, wrap: "wrap", children: currentRow.title }), _jsx(Text, { color: "gray", wrap: "truncate-end", children: [currentRow.number, currentRow.date, currentRow.status, currentRow.type].filter(Boolean).join(" · ") }), _jsxs(Text, { color: "green", wrap: "truncate-end", children: ["reading: ", currentRow.readings.direction, " \u00B7 ", currentRow.readings.theme, " \u00B7 ", currentRow.readings.arc] }), detail?.summary?.goal ? _jsx(Text, { wrap: "wrap", children: detail.summary.goal.replace(/^\s*(["'])([\s\S]*)\1\s*$/, "$2") }) : null, detail?.error ? _jsx(Text, { color: "red", children: detail.error }) : null, _jsxs(Text, { color: "gray", children: [files.length, " file", files.length === 1 ? "" : "s", view === "files" ? "" : " · Enter to browse"] }), fileWindow.items.map((file, index) => {
|
|
321
|
+
const selected = view === "files" && fileWindow.start + index === clamp(fileSel, files.length);
|
|
322
|
+
return (_jsxs(Text, { wrap: "truncate-end", inverse: selected, color: file.kind === "text" ? "blue" : "gray", children: [file.relativePath, file.kind === "text" ? "" : ` (${file.kind})`] }, file.relativePath));
|
|
323
|
+
})] })) : (_jsx(Text, { color: "gray", children: "Nothing selected." })) }));
|
|
324
|
+
const fileBody = open ? (_jsx(Box, { flexDirection: "column", children: open.view.lines.slice(open.scroll, open.scroll + bodyHeight).map((line, index) => (_jsx(Segments, { segments: line.segments, selectedRef: open.refSel }, open.scroll + index))) })) : null;
|
|
325
|
+
const overlayBody = (() => {
|
|
326
|
+
if (!overlay)
|
|
327
|
+
return null;
|
|
328
|
+
if (overlay.type === "doors") {
|
|
329
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsxs(Text, { bold: true, wrap: "truncate-end", children: ["Doors \u00B7 ", overlay.doors.title] }), overlay.doors.note ? _jsx(Text, { color: "gray", wrap: "wrap", children: overlay.doors.note }) : null, overlay.doors.doors.map((door, index) => (_jsxs(Text, { wrap: "truncate-end", inverse: index === overlay.selected, children: [_jsx(Text, { color: "yellow", children: door.label.padEnd(16) }), " ", osc8(door.url, door.url)] }, `${door.label}-${index}`))), _jsx(Text, { color: "gray", children: "\u2191\u2193 choose \u00B7 Enter opens \u00B7 r QR \u00B7 Esc back" })] }));
|
|
330
|
+
}
|
|
331
|
+
if (overlay.type === "qr") {
|
|
332
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsxs(Text, { bold: true, wrap: "truncate-end", children: ["QR \u00B7 ", overlay.door.label, " \u00B7 ", overlay.title] }), qrLines(overlay.door.url, overlay.invert).map((line, index) => (_jsx(Text, { children: line }, index))), _jsx(Text, { wrap: "truncate-end", children: osc8(overlay.door.url, overlay.door.url) }), /^https?:\/\/(127\.0\.0\.1|localhost)[:/]/.test(overlay.door.url) || overlay.door.url.startsWith("file:") ? (_jsx(Text, { color: "yellow", wrap: "wrap", children: "This address opens only on this machine. Set MIADI_URL_BASE_INTERNAL (tailnet) or MIADI_URL_BASE (public) for a room a phone can open." })) : null, _jsx(Text, { color: "gray", children: "i inverts for a light terminal \u00B7 Esc back" })] }));
|
|
333
|
+
}
|
|
334
|
+
if (overlay.type === "proof") {
|
|
335
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsxs(Text, { bold: true, children: ["Five-stage proof \u00B7 ", overlay.episode] }), !overlay.status && !overlay.error ? _jsx(Text, { color: "gray", children: "Asking git and the wheel\u2026" }) : null, overlay.error ? _jsx(Text, { color: "red", wrap: "wrap", children: overlay.error }) : null, overlay.status?.closing.map((stage) => (_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: stage.state === "proven" ? "green" : stage.state === "owed" ? "yellow" : "red", children: stage.state.padEnd(7) }), " ", stage.stage.padEnd(17), " ", _jsx(Text, { color: "gray", children: stage.observed })] }, stage.stage))), overlay.status?.drift.map((line) => (_jsxs(Text, { color: "yellow", wrap: "wrap", children: ["drift: ", line] }, line))), _jsx(Text, { color: "gray", children: "Esc back" })] }));
|
|
336
|
+
}
|
|
337
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [_jsx(Text, { bold: true, children: "Keys" }), _jsx(Text, { children: "/ filter \u00B7 Tab title | full text (in a file: next reference) \u00B7 \u2191\u2193 j k move \u00B7 PgUp PgDn \u00B7 g G ends" }), _jsx(Text, { children: "Enter or l open \u00B7 Esc h or \u2190 back \u00B7 ? this help \u00B7 q quit" }), actions.map((action) => (_jsxs(Text, { children: [_jsx(Text, { color: "yellow", children: action.key.padEnd(6) }), " ", action.label, action.effect === "write" ? _jsx(Text, { color: "red", children: " (writes)" }) : null] }, action.id))), _jsx(Text, { color: "gray", children: "Any key closes." })] }));
|
|
338
|
+
})();
|
|
339
|
+
const where = view === "file" && open
|
|
340
|
+
? `${rowByName(open.name)?.number ?? ""} · ${open.path} · line ${open.view.lines[open.scroll]?.source ?? 1}`
|
|
341
|
+
: `${chronicle.rows.length} episodes · ${withManifest} with episode.yaml`;
|
|
342
|
+
return (_jsxs(Box, { flexDirection: "column", height: rows, children: [_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { bold: true, color: "yellow", children: "miadi-chronicle" }), " ", _jsxs(Text, { color: "gray", children: [chronicle.root, " \u00B7 ", where] })] }), _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: inputMode ? "yellow" : "gray", children: "/ " }), query, inputMode ? _jsx(Text, { inverse: true, children: " " }) : null, " ", _jsx(Text, { color: "gray", children: "[" }), _jsx(Text, { color: searchMode === "title" ? "yellow" : "gray", children: "title" }), _jsx(Text, { color: "gray", children: " | " }), _jsx(Text, { color: searchMode === "full" ? "yellow" : "gray", children: "full text" }), _jsx(Text, { color: "gray", children: "]" }), view === "list" ? _jsxs(Text, { color: "gray", children: [" ", filtered.length, " shown"] }) : null] }), _jsx(Box, { flexGrow: 1, flexDirection: "row", height: bodyHeight, children: overlayBody ?? (view === "file" ? fileBody : (_jsxs(_Fragment, { children: [view === "hits" ? hitsPane : listPane, detailPane] }))) }), _jsx(Text, { color: "gray", wrap: "truncate-end", children: status }), _jsxs(Text, { wrap: "truncate-end", children: [available.map((action) => (_jsxs(Text, { children: [_jsx(Text, { color: "yellow", children: action.key }), " ", action.label, " "] }, action.id))), _jsx(Text, { color: "gray", children: "/ filter Tab mode Enter open Esc back ? keys q quit" })] })] }));
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=App.js.map
|
package/dist/App.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.js","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The action registry (D6 of the proposal on jgwill/Miadi#706).
|
|
3
|
+
*
|
|
4
|
+
* Every operation the browser offers is one entry: a key, a label, when it
|
|
5
|
+
* applies, and a function that calls the door that already owns the
|
|
6
|
+
* operation. The key bar is drawn from this list, so an action added here
|
|
7
|
+
* appears on screen with no other change.
|
|
8
|
+
*
|
|
9
|
+
* Version 1 registers reading actions. Writes (answering an attention item,
|
|
10
|
+
* adding a review, relating an inquiry, lineage, taking a turn in a talking
|
|
11
|
+
* circle, steering a tide pane) join the same list, each through its own
|
|
12
|
+
* existing door, and declare `effect: "write"` so a host can gate them.
|
|
13
|
+
*/
|
|
14
|
+
import type { Key } from "ink";
|
|
15
|
+
import type { Destination, EpisodeStatus, TextReference } from "@miadi/inquiry-weave";
|
|
16
|
+
import type { VesselHit } from "@miadi/episode-vessel";
|
|
17
|
+
import { type Chronicle, type Doors } from "./data.js";
|
|
18
|
+
import type { EpisodeRow } from "./model.js";
|
|
19
|
+
export type View = "list" | "files" | "file" | "hits";
|
|
20
|
+
export type Overlay = {
|
|
21
|
+
type: "doors";
|
|
22
|
+
doors: Doors;
|
|
23
|
+
selected: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: "qr";
|
|
26
|
+
title: string;
|
|
27
|
+
door: Destination;
|
|
28
|
+
invert: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
type: "proof";
|
|
31
|
+
episode: string;
|
|
32
|
+
status?: EpisodeStatus;
|
|
33
|
+
error?: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: "help";
|
|
36
|
+
};
|
|
37
|
+
export interface ActionContext {
|
|
38
|
+
view: View;
|
|
39
|
+
chronicle: Chronicle;
|
|
40
|
+
/** The episode in focus, in any view. */
|
|
41
|
+
episode?: EpisodeRow;
|
|
42
|
+
/** A file inside that episode: the one selected in the file list, or the one open. */
|
|
43
|
+
file?: string;
|
|
44
|
+
/** The reference selected in an open file. */
|
|
45
|
+
reference?: TextReference;
|
|
46
|
+
/** The search hit selected. */
|
|
47
|
+
hit?: VesselHit;
|
|
48
|
+
show: (overlay: Overlay | null) => void;
|
|
49
|
+
status: (message: string) => void;
|
|
50
|
+
/** Select an episode in the list and open its files. */
|
|
51
|
+
jumpTo: (name: string) => void;
|
|
52
|
+
}
|
|
53
|
+
export interface ChronicleAction {
|
|
54
|
+
id: string;
|
|
55
|
+
/** The key as the key bar shows it. */
|
|
56
|
+
key: string;
|
|
57
|
+
label: string;
|
|
58
|
+
matches: (input: string, key: Key) => boolean;
|
|
59
|
+
available: (context: ActionContext) => boolean;
|
|
60
|
+
effect: "read" | "write";
|
|
61
|
+
run: (context: ActionContext) => void | Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
export declare const doorsAction: ChronicleAction;
|
|
64
|
+
export declare const qrAction: ChronicleAction;
|
|
65
|
+
export declare const proofAction: ChronicleAction;
|
|
66
|
+
export declare const followAction: ChronicleAction;
|
|
67
|
+
export declare const DEFAULT_ACTIONS: readonly ChronicleAction[];
|
|
68
|
+
/** The first action this key press triggers here, if any. */
|
|
69
|
+
export declare function actionFor(actions: readonly ChronicleAction[], input: string, key: Key, context: ActionContext): ChronicleAction | undefined;
|
|
70
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAsE,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,WAAW,CAAA;AAC1H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;AAErD,MAAM,MAAM,OAAO,GACf;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpB,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAA;IACV,SAAS,EAAE,SAAS,CAAA;IACpB,yCAAyC;IACzC,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,sFAAsF;IACtF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8CAA8C;IAC9C,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,+BAA+B;IAC/B,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAA;IACvC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,wDAAwD;IACxD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAA;IAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAA;IAC9C,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB,GAAG,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACtD;AASD,eAAO,MAAM,WAAW,EAAE,eAYzB,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,eAatB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,eAgBzB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,eAiB1B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,eAAe,EAAuD,CAAA;AAE7G,6DAA6D;AAC7D,wBAAgB,SAAS,CACvB,OAAO,EAAE,SAAS,eAAe,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,aAAa,GACrB,eAAe,GAAG,SAAS,CAE7B"}
|