@jmfederico/pi-web 1.202607.3 → 1.202608.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/README.md +1 -1
- package/dist/client/assets/{CodeViewer-CDVbMiN9.js → CodeViewer-D91Sp61M.js} +1 -1
- package/dist/client/assets/{TerminalPanel-CTS1CgqF.js → TerminalPanel-fYrKc3jh.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-Cqke12ZX.js → UnifiedDiffViewer-BafLWGtF.js} +1 -1
- package/dist/client/assets/{index-LME0LfPb.js → index-CA8q9_o7.js} +310 -353
- package/dist/client/index.html +1 -1
- package/dist/pi-web-plugins/relays/relayDiscovery.js +159 -27
- package/dist/pi-web-plugins/relays/relaysPanelElement.js +173 -16
- package/dist/server/app.js +0 -22
- package/dist/server/app.js.map +1 -1
- package/dist/server/browserMessageProjection.js +0 -2
- package/dist/server/browserMessageProjection.js.map +1 -1
- package/dist/server/configRoutes.js +4 -13
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +2 -13
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/piWebStatus.js +12 -38
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
- package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
- package/dist/server/sessiond/agentProcessEnvironment.js +62 -0
- package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond.js +26 -5
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/askUserTool.js +0 -3
- package/dist/server/sessions/askUserTool.js.map +1 -1
- package/dist/server/sessions/authRoutes.js +0 -10
- package/dist/server/sessions/authRoutes.js.map +1 -1
- package/dist/server/sessions/authService.js +0 -24
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/messagePaging.js +2 -2
- package/dist/server/sessions/messagePaging.js.map +1 -1
- package/dist/server/sessions/oauthLoginFlowService.js +2 -5
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
- package/dist/server/sessions/pendingAskStore.js +0 -3
- package/dist/server/sessions/pendingAskStore.js.map +1 -1
- package/dist/server/sessions/piSessionManagerGateway.js +182 -2
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +244 -186
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionFileHeader.js +92 -20
- package/dist/server/sessions/sessionFileHeader.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +74 -56
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionSummaryScanner.js +619 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +8 -1
- package/dist/server/sessions/spawnSessionTool.js.map +1 -1
- package/dist/server/sessions/spawnSubsessionTool.js +7 -1
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/workspaces/effectivePathAccess.js +0 -19
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
- package/dist/server/workspaces/workspaceDeletionRoutes.js +30 -4
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
- package/dist/server/workspaces/workspaceService.js.map +1 -1
- package/dist/sessiond/config.js +2 -2
- package/dist/sessiond/config.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +12 -29
- package/dist/shared/apiTypes.js +7 -16
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +10 -44
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +0 -3
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/docs/config.md +59 -4
- package/docs/plugins.md +5 -3
- package/package.json +10 -9
package/dist/client/index.html
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
|
|
54
54
|
body { min-height: 100dvh; }
|
|
55
55
|
</style>
|
|
56
|
-
<script type="module" crossorigin src="./assets/index-
|
|
56
|
+
<script type="module" crossorigin src="./assets/index-CA8q9_o7.js"></script>
|
|
57
57
|
<link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
|
|
58
58
|
<link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
|
|
59
59
|
</head>
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
export const RELAYS_ROOT = ".pi-web/relays";
|
|
3
3
|
/** Documents that anchor a relay packet, in display order. Any other files follow alphabetically. */
|
|
4
4
|
export const RELAY_ANCHOR_DOCUMENTS = ["status.md", "charter.md", "log.md"];
|
|
5
|
+
/**
|
|
6
|
+
* Deepest node depth listed below the relay root; direct children of the relay
|
|
7
|
+
* root are depth 0. Children of a directory at this depth are skipped and the
|
|
8
|
+
* listing is flagged partial instead of walking arbitrarily deep trees.
|
|
9
|
+
*/
|
|
10
|
+
export const MAX_RELAY_TREE_DEPTH = 5;
|
|
11
|
+
/** Most documents listed across one relay; extras are skipped and the listing is flagged partial. */
|
|
12
|
+
export const MAX_RELAY_DOCUMENTS = 200;
|
|
13
|
+
/** Most directories walked in one relay; extras stay listed but unexplored and the listing is flagged partial. */
|
|
14
|
+
export const MAX_RELAY_DIRECTORIES = 50;
|
|
5
15
|
// The workspace file API rejects with these messages when a path is absent or
|
|
6
16
|
// is not a directory. For the relays root both mean "zero relays", not a failure.
|
|
7
17
|
const missingListingErrorMessages = new Set(["Path does not exist", "Path is not a directory"]);
|
|
@@ -19,19 +29,23 @@ export async function listWorkspaceRelays(files) {
|
|
|
19
29
|
.map((entry) => toRelaySummary(entry)));
|
|
20
30
|
return { kind: "loaded", relays };
|
|
21
31
|
}
|
|
22
|
-
/**
|
|
23
|
-
|
|
24
|
-
|
|
32
|
+
/**
|
|
33
|
+
* List one relay's document tree. At the relay root the anchor documents come
|
|
34
|
+
* first (status.md, charter.md, log.md); at every level files sort
|
|
35
|
+
* alphabetically before directories. Symlinks are never followed. Never
|
|
36
|
+
* rejects.
|
|
37
|
+
*/
|
|
38
|
+
export async function listRelayDocumentTree(files, relayPath) {
|
|
39
|
+
let rootListing;
|
|
25
40
|
try {
|
|
26
|
-
|
|
41
|
+
rootListing = await files.listFiles(relayPath);
|
|
27
42
|
}
|
|
28
43
|
catch (error) {
|
|
29
44
|
return fileAccessFailure(error);
|
|
30
45
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return { kind: "loaded", documents };
|
|
46
|
+
const state = { documentCount: 0, directoryCount: 0, partial: rootListing.truncated };
|
|
47
|
+
const tree = await walkListing(files, rootListing, relayPath, 0, state);
|
|
48
|
+
return { kind: "loaded", tree, documentCount: state.documentCount, partial: state.partial };
|
|
35
49
|
}
|
|
36
50
|
/** Read one relay document. Never rejects. */
|
|
37
51
|
export async function readRelayDocument(files, documentPath) {
|
|
@@ -47,20 +61,148 @@ export async function readRelayDocument(files, documentPath) {
|
|
|
47
61
|
export function sortRelaysByRecency(relays) {
|
|
48
62
|
return [...relays].sort(compareRelaysByRecency);
|
|
49
63
|
}
|
|
50
|
-
/**
|
|
51
|
-
export function
|
|
52
|
-
|
|
64
|
+
/** The document a relay opens on: the depth-first first file (root anchors sort first, so status.md wins when present). */
|
|
65
|
+
export function defaultRelayDocument(tree) {
|
|
66
|
+
for (const node of tree) {
|
|
67
|
+
if (node.kind === "file")
|
|
68
|
+
return node;
|
|
69
|
+
const nested = defaultRelayDocument(node.children);
|
|
70
|
+
if (nested !== undefined)
|
|
71
|
+
return nested;
|
|
72
|
+
}
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
/** All file nodes in tree order, depth-first. */
|
|
76
|
+
export function flattenRelayTree(tree) {
|
|
77
|
+
const files = [];
|
|
78
|
+
const visit = (nodes) => {
|
|
79
|
+
for (const node of nodes) {
|
|
80
|
+
if (node.kind === "file")
|
|
81
|
+
files.push(node);
|
|
82
|
+
else
|
|
83
|
+
visit(node.children);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
visit(tree);
|
|
87
|
+
return files;
|
|
88
|
+
}
|
|
89
|
+
/** Directory paths of every directory in the tree; used to prune stale expansion state. */
|
|
90
|
+
export function collectDirectoryPaths(tree) {
|
|
91
|
+
const paths = new Set();
|
|
92
|
+
const visit = (nodes) => {
|
|
93
|
+
for (const node of nodes) {
|
|
94
|
+
if (node.kind !== "directory")
|
|
95
|
+
continue;
|
|
96
|
+
paths.add(node.path);
|
|
97
|
+
visit(node.children);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
visit(tree);
|
|
101
|
+
return paths;
|
|
53
102
|
}
|
|
54
|
-
/**
|
|
55
|
-
export function
|
|
56
|
-
|
|
57
|
-
|
|
103
|
+
/** Directory paths containing the given file, from the relay root down; empty when the file is not in the tree. */
|
|
104
|
+
export function ancestorDirectoryPaths(tree, filePath) {
|
|
105
|
+
const chain = [];
|
|
106
|
+
const visit = (nodes) => {
|
|
107
|
+
for (const node of nodes) {
|
|
108
|
+
if (node.kind === "file") {
|
|
109
|
+
if (node.path === filePath)
|
|
110
|
+
return true;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
chain.push(node.path);
|
|
114
|
+
if (visit(node.children))
|
|
115
|
+
return true;
|
|
116
|
+
chain.pop();
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
};
|
|
120
|
+
return visit(tree) ? chain : [];
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Build the ordered children of one already-fetched directory listing.
|
|
124
|
+
* Subdirectories are walked in parallel; a subdirectory whose own listing
|
|
125
|
+
* fails contributes an empty node and flags the tree partial rather than
|
|
126
|
+
* failing the whole relay.
|
|
127
|
+
*/
|
|
128
|
+
async function walkListing(files, listing, relayPath, depth, state) {
|
|
129
|
+
// Symlink entries are intentionally never followed.
|
|
130
|
+
const fileEntries = listing.entries.filter((entry) => entry.type === "file");
|
|
131
|
+
const directoryEntries = listing.entries.filter((entry) => entry.type === "directory");
|
|
132
|
+
let fileNodes = orderFileEntries(fileEntries, depth === 0).map((entry) => toFileNode(entry, relayPath, depth));
|
|
133
|
+
const remaining = MAX_RELAY_DOCUMENTS - state.documentCount;
|
|
134
|
+
if (fileNodes.length > remaining) {
|
|
135
|
+
fileNodes = fileNodes.slice(0, Math.max(0, remaining));
|
|
136
|
+
state.partial = true;
|
|
137
|
+
}
|
|
138
|
+
state.documentCount += fileNodes.length;
|
|
139
|
+
const directories = await Promise.all([...directoryEntries].sort(compareByName).map(async (entry) => {
|
|
140
|
+
const node = {
|
|
141
|
+
kind: "directory",
|
|
142
|
+
name: entry.name,
|
|
143
|
+
path: entry.path,
|
|
144
|
+
relativePath: relativePathOf(entry.path, relayPath),
|
|
145
|
+
depth,
|
|
146
|
+
children: [],
|
|
147
|
+
};
|
|
148
|
+
if (depth >= MAX_RELAY_TREE_DEPTH) {
|
|
149
|
+
state.partial = true;
|
|
150
|
+
return node;
|
|
151
|
+
}
|
|
152
|
+
// The count is bumped synchronously before any await, so the parallel
|
|
153
|
+
// walk below stays deterministic in sorted order.
|
|
154
|
+
if (state.directoryCount >= MAX_RELAY_DIRECTORIES) {
|
|
155
|
+
state.partial = true;
|
|
156
|
+
return node;
|
|
157
|
+
}
|
|
158
|
+
state.directoryCount += 1;
|
|
159
|
+
try {
|
|
160
|
+
const subListing = await files.listFiles(entry.path);
|
|
161
|
+
if (subListing.truncated)
|
|
162
|
+
state.partial = true;
|
|
163
|
+
node.children = await walkListing(files, subListing, relayPath, depth + 1, state);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
state.partial = true;
|
|
167
|
+
}
|
|
168
|
+
return node;
|
|
169
|
+
}));
|
|
170
|
+
return [...fileNodes, ...directories];
|
|
171
|
+
}
|
|
172
|
+
/** At the relay root the anchor documents lead; deeper levels are simply alphabetical. */
|
|
173
|
+
function orderFileEntries(entries, isRelayRoot) {
|
|
174
|
+
return [...entries].sort(isRelayRoot ? compareRootFiles : compareByName);
|
|
175
|
+
}
|
|
176
|
+
function compareRootFiles(left, right) {
|
|
177
|
+
const anchorOrder = anchorIndexOf(left.name) - anchorIndexOf(right.name);
|
|
178
|
+
if (anchorOrder !== 0)
|
|
179
|
+
return anchorOrder;
|
|
180
|
+
return left.name.localeCompare(right.name);
|
|
181
|
+
}
|
|
182
|
+
function anchorIndexOf(name) {
|
|
183
|
+
const index = RELAY_ANCHOR_DOCUMENTS.indexOf(name);
|
|
184
|
+
return index === -1 ? RELAY_ANCHOR_DOCUMENTS.length : index;
|
|
185
|
+
}
|
|
186
|
+
function compareByName(left, right) {
|
|
187
|
+
return left.name.localeCompare(right.name);
|
|
58
188
|
}
|
|
59
189
|
function toRelaySummary(entry) {
|
|
60
190
|
return { name: entry.name, path: entry.path, modifiedAt: entry.modifiedAt };
|
|
61
191
|
}
|
|
62
|
-
function
|
|
63
|
-
return {
|
|
192
|
+
function toFileNode(entry, relayPath, depth) {
|
|
193
|
+
return {
|
|
194
|
+
kind: "file",
|
|
195
|
+
name: entry.name,
|
|
196
|
+
path: entry.path,
|
|
197
|
+
relativePath: relativePathOf(entry.path, relayPath),
|
|
198
|
+
depth,
|
|
199
|
+
modifiedAt: entry.modifiedAt,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** Entry paths from the file API should sit under the relay root; fall back to the file name if not. */
|
|
203
|
+
function relativePathOf(path, relayPath) {
|
|
204
|
+
const prefix = `${relayPath}/`;
|
|
205
|
+
return path.startsWith(prefix) ? path.slice(prefix.length) : path.slice(path.lastIndexOf("/") + 1);
|
|
64
206
|
}
|
|
65
207
|
function compareRelaysByRecency(left, right) {
|
|
66
208
|
const leftTime = timestampOf(left.modifiedAt);
|
|
@@ -79,16 +221,6 @@ function timestampOf(modifiedAt) {
|
|
|
79
221
|
const time = Date.parse(modifiedAt);
|
|
80
222
|
return Number.isNaN(time) ? undefined : time;
|
|
81
223
|
}
|
|
82
|
-
function compareRelayDocuments(left, right) {
|
|
83
|
-
const anchorOrder = anchorIndexOf(left.name) - anchorIndexOf(right.name);
|
|
84
|
-
if (anchorOrder !== 0)
|
|
85
|
-
return anchorOrder;
|
|
86
|
-
return left.name.localeCompare(right.name);
|
|
87
|
-
}
|
|
88
|
-
function anchorIndexOf(name) {
|
|
89
|
-
const index = RELAY_ANCHOR_DOCUMENTS.indexOf(name);
|
|
90
|
-
return index === -1 ? RELAY_ANCHOR_DOCUMENTS.length : index;
|
|
91
|
-
}
|
|
92
224
|
function fileAccessFailure(error) {
|
|
93
225
|
if (error instanceof Error && missingListingErrorMessages.has(error.message))
|
|
94
226
|
return { kind: "missing" };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Generated from pi-web-plugins/relays/relaysPanelElement.ts. Do not edit directly.
|
|
2
2
|
import { isMarkdownDocumentPath, renderRelayDocumentHtml } from "./markdownDocument.js";
|
|
3
|
-
import { defaultRelayDocument,
|
|
3
|
+
import { ancestorDirectoryPaths, collectDirectoryPaths, defaultRelayDocument, flattenRelayTree, listRelayDocumentTree, listWorkspaceRelays, readRelayDocument, RELAYS_ROOT, } from "./relayDiscovery.js";
|
|
4
4
|
export const relaysPanelTagName = "pi-web-relays-panel";
|
|
5
5
|
export function defineRelaysPanelElement() {
|
|
6
6
|
if (!customElements.get(relaysPanelTagName))
|
|
@@ -9,9 +9,14 @@ export function defineRelaysPanelElement() {
|
|
|
9
9
|
/**
|
|
10
10
|
* Read-only relay browser: relay picker (auto-opens a single relay), one tab
|
|
11
11
|
* per relay document, and a document viewer rendering markdown documents as
|
|
12
|
-
* sanitized HTML and everything else as preformatted text.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* sanitized HTML and everything else as preformatted text. Documents in
|
|
13
|
+
* subfolders appear as folder chips that expand inline into the tab strip
|
|
14
|
+
* (accordion: expanding one folder collapses its siblings at the same level);
|
|
15
|
+
* an expanded folder wraps its chip and children in a group so nested tabs
|
|
16
|
+
* stay visually contained. Collapsing a folder keeps the selected document
|
|
17
|
+
* open and highlights the folder instead. All async loads flow through
|
|
18
|
+
* scanToken so stale responses for a previous workspace or selection never
|
|
19
|
+
* overwrite newer state.
|
|
15
20
|
*
|
|
16
21
|
* Rendering is region-scoped: the toolbar, tab strip, and viewer are
|
|
17
22
|
* persistent elements built once, and each async stage re-renders only its
|
|
@@ -26,6 +31,8 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
26
31
|
documents;
|
|
27
32
|
selectedDocumentPath;
|
|
28
33
|
documentContent;
|
|
34
|
+
/** Directory paths currently expanded in the tab strip; an accordion spine, cleared on relay/workspace switch. */
|
|
35
|
+
expandedDirs = new Set();
|
|
29
36
|
scanToken = 0;
|
|
30
37
|
root;
|
|
31
38
|
toolbar;
|
|
@@ -59,7 +66,15 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
59
66
|
void this.openRelay(context, picker.value);
|
|
60
67
|
});
|
|
61
68
|
this.tabStrip.addEventListener("click", (event) => {
|
|
62
|
-
const
|
|
69
|
+
const element = event.target instanceof Element ? event.target : null;
|
|
70
|
+
const chip = element?.closest("button[data-directory-path]") ?? null;
|
|
71
|
+
if (chip !== null) {
|
|
72
|
+
const directoryPath = chip.getAttribute("data-directory-path");
|
|
73
|
+
if (directoryPath !== null)
|
|
74
|
+
this.toggleDirectory(directoryPath);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const tab = element?.closest("button[data-document-path]") ?? null;
|
|
63
78
|
if (tab === null)
|
|
64
79
|
return;
|
|
65
80
|
const documentPath = tab.getAttribute("data-document-path");
|
|
@@ -76,6 +91,8 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
76
91
|
// same workspace (mirrors the workspace-tasks panel).
|
|
77
92
|
if (previousKey === nextKey)
|
|
78
93
|
return;
|
|
94
|
+
// A different workspace starts with every folder collapsed.
|
|
95
|
+
this.expandedDirs = new Set();
|
|
79
96
|
if (value === undefined) {
|
|
80
97
|
this.resetScanState();
|
|
81
98
|
this.renderAll();
|
|
@@ -108,8 +125,69 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
108
125
|
async openRelay(context, relayPath) {
|
|
109
126
|
const token = ++this.scanToken;
|
|
110
127
|
this.selectedRelayPath = relayPath;
|
|
128
|
+
this.expandedDirs = new Set();
|
|
111
129
|
await this.loadDocuments(context, token, relayPath, undefined);
|
|
112
130
|
}
|
|
131
|
+
/** Expand or collapse a folder chip; the accordion rule keeps at most one expanded folder per level. */
|
|
132
|
+
toggleDirectory(directoryPath) {
|
|
133
|
+
if (this.documents?.kind !== "loaded")
|
|
134
|
+
return;
|
|
135
|
+
if (this.expandedDirs.has(directoryPath)) {
|
|
136
|
+
for (const path of [...this.expandedDirs]) {
|
|
137
|
+
if (path === directoryPath || path.startsWith(`${directoryPath}/`))
|
|
138
|
+
this.expandedDirs.delete(path);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
this.collapseSiblingDirectories(directoryPath);
|
|
143
|
+
this.expandedDirs.add(directoryPath);
|
|
144
|
+
}
|
|
145
|
+
this.renderTabs();
|
|
146
|
+
const chip = this.findDirectoryChip(directoryPath);
|
|
147
|
+
// The innerHTML rebuild destroyed the clicked button; give focus back so
|
|
148
|
+
// keyboard users stay on the control they just toggled.
|
|
149
|
+
chip?.focus();
|
|
150
|
+
if (this.expandedDirs.has(directoryPath))
|
|
151
|
+
this.scrollExpandedChildrenIntoView(chip);
|
|
152
|
+
}
|
|
153
|
+
/** Expanding a folder collapses its siblings (same parent) and everything expanded under them. */
|
|
154
|
+
collapseSiblingDirectories(directoryPath) {
|
|
155
|
+
const parentPath = directoryPath.slice(0, directoryPath.lastIndexOf("/"));
|
|
156
|
+
for (const expanded of [...this.expandedDirs]) {
|
|
157
|
+
if (expanded.slice(0, expanded.lastIndexOf("/")) !== parentPath)
|
|
158
|
+
continue;
|
|
159
|
+
this.expandedDirs.delete(expanded);
|
|
160
|
+
for (const path of [...this.expandedDirs]) {
|
|
161
|
+
if (path.startsWith(`${expanded}/`))
|
|
162
|
+
this.expandedDirs.delete(path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Expand every ancestor of a freshly chosen default document so it is visible. */
|
|
167
|
+
revealDocument(documentPath) {
|
|
168
|
+
const documents = this.documents;
|
|
169
|
+
if (documents?.kind !== "loaded")
|
|
170
|
+
return;
|
|
171
|
+
for (const path of ancestorDirectoryPaths(documents.tree, documentPath))
|
|
172
|
+
this.expandedDirs.add(path);
|
|
173
|
+
}
|
|
174
|
+
/** Drop expansion state for directories that vanished since the last scan. */
|
|
175
|
+
pruneExpandedDirs(tree) {
|
|
176
|
+
const existing = collectDirectoryPaths(tree);
|
|
177
|
+
for (const path of [...this.expandedDirs]) {
|
|
178
|
+
if (!existing.has(path))
|
|
179
|
+
this.expandedDirs.delete(path);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
findDirectoryChip(directoryPath) {
|
|
183
|
+
return [...this.tabStrip.querySelectorAll("button[data-directory-path]")]
|
|
184
|
+
.find((candidate) => candidate instanceof HTMLElement && candidate.getAttribute("data-directory-path") === directoryPath);
|
|
185
|
+
}
|
|
186
|
+
scrollExpandedChildrenIntoView(chip) {
|
|
187
|
+
const firstChild = chip?.nextElementSibling;
|
|
188
|
+
if (firstChild instanceof HTMLElement)
|
|
189
|
+
firstChild.scrollIntoView({ inline: "nearest", block: "nearest" });
|
|
190
|
+
}
|
|
113
191
|
async openDocument(context, documentPath) {
|
|
114
192
|
const token = ++this.scanToken;
|
|
115
193
|
this.selectedDocumentPath = documentPath;
|
|
@@ -126,14 +204,20 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
126
204
|
this.documentContent = undefined;
|
|
127
205
|
this.renderTabs();
|
|
128
206
|
this.renderViewer();
|
|
129
|
-
const documents = await
|
|
207
|
+
const documents = await listRelayDocumentTree(context.files, relayPath);
|
|
130
208
|
if (!this.isCurrentScan(context, token))
|
|
131
209
|
return;
|
|
132
210
|
this.documents = documents;
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
211
|
+
const files = documents.kind === "loaded" ? flattenRelayTree(documents.tree) : [];
|
|
212
|
+
const preferred = files.find((candidate) => candidate.path === preferredDocumentPath);
|
|
213
|
+
const document = preferred ?? defaultRelayDocument(documents.kind === "loaded" ? documents.tree : []);
|
|
136
214
|
this.selectedDocumentPath = document?.path;
|
|
215
|
+
if (documents.kind === "loaded")
|
|
216
|
+
this.pruneExpandedDirs(documents.tree);
|
|
217
|
+
// A freshly chosen default must be visible; a restored preferred pick keeps
|
|
218
|
+
// whatever the user expanded (a hidden pick is surfaced by the folder highlight).
|
|
219
|
+
if (preferred === undefined && document !== undefined)
|
|
220
|
+
this.revealDocument(document.path);
|
|
137
221
|
this.renderTabs();
|
|
138
222
|
if (document === undefined) {
|
|
139
223
|
this.renderViewer();
|
|
@@ -203,7 +287,7 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
203
287
|
}
|
|
204
288
|
renderTabs() {
|
|
205
289
|
const documents = this.documents;
|
|
206
|
-
if (documents?.kind !== "loaded" || documents.
|
|
290
|
+
if (documents?.kind !== "loaded" || documents.documentCount === 0) {
|
|
207
291
|
this.tabStrip.hidden = true;
|
|
208
292
|
// A new tab set starts at the left edge, not at the previous set's offset.
|
|
209
293
|
this.tabStrip.replaceChildren();
|
|
@@ -211,13 +295,38 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
211
295
|
return;
|
|
212
296
|
}
|
|
213
297
|
this.tabStrip.hidden = false;
|
|
298
|
+
const containsActivePath = this.selectedDocumentPath === undefined
|
|
299
|
+
? undefined
|
|
300
|
+
: collapsedAncestorOfSelectedFile(documents.tree, this.selectedDocumentPath, this.expandedDirs);
|
|
214
301
|
// The strip element itself persists across re-renders, so replacing its
|
|
215
302
|
// buttons keeps the container's horizontal scroll position.
|
|
216
|
-
this.tabStrip.innerHTML =
|
|
217
|
-
|
|
218
|
-
|
|
303
|
+
this.tabStrip.innerHTML = this.renderStripNodes(documents.tree, containsActivePath);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Depth-first strip markup: an expanded folder wraps its chip and children
|
|
307
|
+
* in one group element so nested tabs read as contained by their folder.
|
|
308
|
+
* Collapsed folders (and folders without listed children) render as a bare chip.
|
|
309
|
+
*/
|
|
310
|
+
renderStripNodes(nodes, containsActivePath) {
|
|
311
|
+
return nodes.map((node) => {
|
|
312
|
+
if (node.kind === "file")
|
|
313
|
+
return this.renderFileTab(node);
|
|
314
|
+
const chip = this.renderDirectoryChip(node, containsActivePath);
|
|
315
|
+
if (!this.expandedDirs.has(node.path) || node.children.length === 0)
|
|
316
|
+
return chip;
|
|
317
|
+
return `<span class="directory-group">${chip}${this.renderStripNodes(node.children, containsActivePath)}</span>`;
|
|
219
318
|
}).join("");
|
|
220
319
|
}
|
|
320
|
+
renderFileTab(file) {
|
|
321
|
+
const active = file.path === this.selectedDocumentPath;
|
|
322
|
+
return `<button class="document-tab${active ? " active" : ""}" data-document-path="${escapeAttr(file.path)}" title="${escapeAttr(file.relativePath)}"${active ? ' aria-current="true"' : ""}>${escapeHtml(file.name)}</button>`;
|
|
323
|
+
}
|
|
324
|
+
renderDirectoryChip(directory, containsActivePath) {
|
|
325
|
+
const expanded = this.expandedDirs.has(directory.path);
|
|
326
|
+
const containsActive = directory.path === containsActivePath;
|
|
327
|
+
const title = containsActive ? "Contains the open document" : directory.relativePath;
|
|
328
|
+
return `<button class="document-tab directory-tab${containsActive ? " contains-active" : ""}" data-directory-path="${escapeAttr(directory.path)}" title="${escapeAttr(title)}" aria-expanded="${expanded ? "true" : "false"}">${chevronSvg()}${escapeHtml(directory.name)}</button>`;
|
|
329
|
+
}
|
|
221
330
|
/** Move the active marker between the mounted tab buttons without rebuilding them. */
|
|
222
331
|
updateActiveTab() {
|
|
223
332
|
for (const tab of this.tabStrip.querySelectorAll("button[data-document-path]")) {
|
|
@@ -228,6 +337,9 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
228
337
|
else
|
|
229
338
|
tab.removeAttribute("aria-current");
|
|
230
339
|
}
|
|
340
|
+
// The clicked tab is visible by definition, so no folder highlight remains.
|
|
341
|
+
for (const chip of this.tabStrip.querySelectorAll("button[data-directory-path]"))
|
|
342
|
+
chip.classList.remove("contains-active");
|
|
231
343
|
}
|
|
232
344
|
renderViewer() {
|
|
233
345
|
if (this.contextValue === undefined) {
|
|
@@ -255,15 +367,18 @@ class PiWebRelaysPanel extends HTMLElement {
|
|
|
255
367
|
if (documents.kind === "missing") {
|
|
256
368
|
return `<div class="empty-state"><strong>This relay no longer exists.</strong><p>Click Refresh to rescan ${escapeHtml(RELAYS_ROOT)}.</p></div>`;
|
|
257
369
|
}
|
|
258
|
-
|
|
259
|
-
|
|
370
|
+
const partialNotice = documents.partial
|
|
371
|
+
? `<div class="status info">Some nested content is not listed — this relay tree is deeper or larger than the panel lists.</div>`
|
|
372
|
+
: "";
|
|
373
|
+
if (documents.documentCount === 0) {
|
|
374
|
+
return `${partialNotice}
|
|
260
375
|
<div class="empty-state">
|
|
261
376
|
<strong>This relay has no documents yet.</strong>
|
|
262
377
|
<p>Relay packets usually contain <code>status.md</code>, <code>charter.md</code>, and <code>log.md</code>.</p>
|
|
263
378
|
</div>
|
|
264
379
|
`;
|
|
265
380
|
}
|
|
266
|
-
return this.renderSelectedDocument()
|
|
381
|
+
return `${partialNotice}${this.renderSelectedDocument()}`;
|
|
267
382
|
}
|
|
268
383
|
renderSelectedDocument() {
|
|
269
384
|
const documentPath = this.selectedDocumentPath;
|
|
@@ -307,6 +422,34 @@ function refreshIconSvg() {
|
|
|
307
422
|
</svg>
|
|
308
423
|
`;
|
|
309
424
|
}
|
|
425
|
+
/**
|
|
426
|
+
* The folder chip to highlight when the selected document is hidden: the first
|
|
427
|
+
* collapsed ancestor walking from the relay root. Undefined when every
|
|
428
|
+
* ancestor is expanded (the tab is visible) or the file is not in the tree.
|
|
429
|
+
*/
|
|
430
|
+
export function collapsedAncestorOfSelectedFile(tree, filePath, expandedPaths) {
|
|
431
|
+
let hiddenAncestor;
|
|
432
|
+
const visit = (entries) => {
|
|
433
|
+
for (const entry of entries) {
|
|
434
|
+
if (entry.kind === "file") {
|
|
435
|
+
if (entry.path === filePath)
|
|
436
|
+
return true;
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
if (hiddenAncestor === undefined && !expandedPaths.has(entry.path))
|
|
440
|
+
hiddenAncestor = entry.path;
|
|
441
|
+
if (visit(entry.children))
|
|
442
|
+
return true;
|
|
443
|
+
if (hiddenAncestor === entry.path)
|
|
444
|
+
hiddenAncestor = undefined;
|
|
445
|
+
}
|
|
446
|
+
return false;
|
|
447
|
+
};
|
|
448
|
+
return visit(tree) ? hiddenAncestor : undefined;
|
|
449
|
+
}
|
|
450
|
+
function chevronSvg() {
|
|
451
|
+
return `<svg class="chevron" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="M6 4l4 4-4 4"></path></svg>`;
|
|
452
|
+
}
|
|
310
453
|
function contextKey(context) {
|
|
311
454
|
return `${context.machine.id}:${context.workspace.projectId}:${context.workspace.id}`;
|
|
312
455
|
}
|
|
@@ -350,6 +493,20 @@ function relaysStyles() {
|
|
|
350
493
|
select { min-width: 0; max-width: 240px; padding: 5px 6px; }
|
|
351
494
|
.document-tab { flex: 0 0 auto; white-space: nowrap; font-size: 12px; padding: 4px 10px; }
|
|
352
495
|
.document-tab.active { border-color: var(--pi-accent-border); background: var(--pi-accent); color: var(--pi-bg); }
|
|
496
|
+
/* An expanded folder wraps its chip and children in one rounded group so
|
|
497
|
+
nested tabs read as contained by their folder; nested groups stack.
|
|
498
|
+
No inner padding: the wrapper's border lines sit flush on the button
|
|
499
|
+
row (a continuous edge), and the -1px vertical margins cancel the
|
|
500
|
+
border's height so expanding never grows the strip or its neighbors. */
|
|
501
|
+
.directory-group { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; min-width: 0; border: 1px solid var(--pi-border-muted); border-radius: 10px; background: var(--pi-bg-overlay-soft); padding: 0; margin: -1px 0; }
|
|
502
|
+
/* Folder chips interleave with file tabs; the chevron rotates while expanded. */
|
|
503
|
+
.directory-tab { display: inline-flex; align-items: center; gap: 5px; }
|
|
504
|
+
.directory-tab .chevron { flex: 0 0 auto; width: 9px; height: 9px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: transform 0.12s ease; }
|
|
505
|
+
.directory-tab[aria-expanded="true"] .chevron { transform: rotate(90deg); }
|
|
506
|
+
/* The selection survives a folder collapse: the nearest collapsed ancestor
|
|
507
|
+
highlights instead, without taking the fill reserved for the open document. */
|
|
508
|
+
.directory-tab.contains-active { border-color: var(--pi-accent-border); color: var(--pi-accent); }
|
|
509
|
+
.directory-tab.contains-active::after { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--pi-accent); }
|
|
353
510
|
code, pre { border: 1px solid var(--pi-border-muted); border-radius: 6px; background: var(--pi-bg); color: var(--pi-text-secondary); font: 12px ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
|
|
354
511
|
code { padding: 2px 5px; }
|
|
355
512
|
pre { margin: 0; overflow: auto; padding: 8px; white-space: pre-wrap; overflow-wrap: anywhere; }
|
package/dist/server/app.js
CHANGED
|
@@ -8,10 +8,7 @@ import fastifyWebsocket from "@fastify/websocket";
|
|
|
8
8
|
import { ProjectStore } from "./storage/projectStore.js";
|
|
9
9
|
import { ProjectService } from "./projects/projectService.js";
|
|
10
10
|
import { WorkspaceService } from "./workspaces/workspaceService.js";
|
|
11
|
-
import { isAbsoluteishFileSuggestionQuery, listFileSuggestions, listPathSuggestions } from "./workspaces/fileSuggestions.js";
|
|
12
|
-
import { pathAccessForCwd } from "./workspaces/effectivePathAccess.js";
|
|
13
11
|
import { loadEffectiveProjectUploadsConfig } from "./workspaces/projectPiWebConfig.js";
|
|
14
|
-
import { normalizeRequestCwd } from "./workingDirectory.js";
|
|
15
12
|
import { listDirectorySuggestions } from "./projects/directorySuggestions.js";
|
|
16
13
|
import { SessionDaemonClient } from "../sessiond/sessionDaemonClient.js";
|
|
17
14
|
import { registerSessionProxyRoutes } from "./sessiond/sessionProxyRoutes.js";
|
|
@@ -78,23 +75,6 @@ async function workspaceEffectiveConfig(projectPath, config) {
|
|
|
78
75
|
const globalConfig = config === undefined ? {} : (await config.read()).effectiveConfig;
|
|
79
76
|
return { uploads: await loadEffectiveProjectUploadsConfig(projectPath, globalConfig) };
|
|
80
77
|
}
|
|
81
|
-
function registerLocalFileSuggestionRoutes(app, projects, workspaces, prefix, options = {}) {
|
|
82
|
-
app.get(`${prefix}/files`, async (request, reply) => {
|
|
83
|
-
if (request.query.cwd === undefined || request.query.cwd === "")
|
|
84
|
-
return reply.code(400).send({ error: "cwd query parameter is required" });
|
|
85
|
-
try {
|
|
86
|
-
const cwd = normalizeRequestCwd(request.query.cwd);
|
|
87
|
-
const query = request.query.q ?? "";
|
|
88
|
-
const pathAccess = isAbsoluteishFileSuggestionQuery(query) ? await pathAccessForCwd(cwd, projects, workspaces, options.config) : undefined;
|
|
89
|
-
if (request.query.mode === "path")
|
|
90
|
-
return await listPathSuggestions(cwd, query, pathAccess);
|
|
91
|
-
return await listFileSuggestions(cwd, query, { kind: request.query.kind, scope: request.query.scope, pathAccess });
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
return reply.code(400).send({ error: error instanceof Error ? error.message : String(error) });
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
78
|
async function readEffectiveConfig(config) {
|
|
99
79
|
return (await config.read()).effectiveConfig;
|
|
100
80
|
}
|
|
@@ -189,8 +169,6 @@ export async function buildApp(deps = {}) {
|
|
|
189
169
|
registerTerminalProxyRoutes(app, projects, workspaces, sessionDaemon, "/api/machines/local");
|
|
190
170
|
registerWorkspaceDeletionRoutes(app, projects, workspaces, sessionDaemon);
|
|
191
171
|
registerWorkspaceDeletionRoutes(app, projects, workspaces, sessionDaemon, "/api/machines/local");
|
|
192
|
-
registerLocalFileSuggestionRoutes(app, projects, workspaces, "/api", { config: configService });
|
|
193
|
-
registerLocalFileSuggestionRoutes(app, projects, workspaces, "/api/machines/local", { config: configService });
|
|
194
172
|
registerMachineProxyRoutes(app, machines);
|
|
195
173
|
const packagedClientDist = join(dirname(fileURLToPath(import.meta.url)), "..", "client");
|
|
196
174
|
const clientDist = deps.clientDist ?? (existsSync(packagedClientDist) ? packagedClientDist : join(process.cwd(), "dist", "client"));
|
package/dist/server/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,6 @@ export function projectBrowserMessage(message) {
|
|
|
19
19
|
return content === originalContent ? message : { ...message, content };
|
|
20
20
|
}
|
|
21
21
|
export function projectBrowserMessageResponse(response) {
|
|
22
|
-
if (Array.isArray(response))
|
|
23
|
-
return mapChanged(response, projectBrowserMessage);
|
|
24
22
|
const messages = mapChanged(response.messages, projectBrowserMessage);
|
|
25
23
|
return messages === response.messages ? response : { ...response, messages };
|
|
26
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserMessageProjection.js","sourceRoot":"","sources":["../../src/server/browserMessageProjection.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;QAAE,OAAO,OAAO,CAAC;IAErD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7G,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,
|
|
1
|
+
{"version":3,"file":"browserMessageProjection.js","sourceRoot":"","sources":["../../src/server/browserMessageProjection.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC;QAAE,OAAO,OAAO,CAAC;IAErD,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;QACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,mBAAmB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7G,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,QAAqB;IACjE,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACtE,OAAO,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAqB;IAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC9E,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC;AACnE,CAAC;AAED,SAAS,UAAU,CAAI,MAAW,EAAE,OAAwB;IAC1D,IAAI,eAAgC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,eAAe,IAAI,MAAM,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|