@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.
Files changed (69) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/{CodeViewer-CDVbMiN9.js → CodeViewer-D91Sp61M.js} +1 -1
  3. package/dist/client/assets/{TerminalPanel-CTS1CgqF.js → TerminalPanel-fYrKc3jh.js} +1 -1
  4. package/dist/client/assets/{UnifiedDiffViewer-Cqke12ZX.js → UnifiedDiffViewer-BafLWGtF.js} +1 -1
  5. package/dist/client/assets/{index-LME0LfPb.js → index-CA8q9_o7.js} +310 -353
  6. package/dist/client/index.html +1 -1
  7. package/dist/pi-web-plugins/relays/relayDiscovery.js +159 -27
  8. package/dist/pi-web-plugins/relays/relaysPanelElement.js +173 -16
  9. package/dist/server/app.js +0 -22
  10. package/dist/server/app.js.map +1 -1
  11. package/dist/server/browserMessageProjection.js +0 -2
  12. package/dist/server/browserMessageProjection.js.map +1 -1
  13. package/dist/server/configRoutes.js +4 -13
  14. package/dist/server/configRoutes.js.map +1 -1
  15. package/dist/server/machines/machineProxyRoutes.js +2 -13
  16. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  17. package/dist/server/piWebStatus.js +12 -38
  18. package/dist/server/piWebStatus.js.map +1 -1
  19. package/dist/server/sessiond/agentHttpDispatcher.js +108 -0
  20. package/dist/server/sessiond/agentHttpDispatcher.js.map +1 -0
  21. package/dist/server/sessiond/agentProcessEnvironment.js +62 -0
  22. package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
  23. package/dist/server/sessiond/sessionServiceDependencies.js +1 -0
  24. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  25. package/dist/server/sessiond.js +26 -5
  26. package/dist/server/sessiond.js.map +1 -1
  27. package/dist/server/sessions/askUserTool.js +0 -3
  28. package/dist/server/sessions/askUserTool.js.map +1 -1
  29. package/dist/server/sessions/authRoutes.js +0 -10
  30. package/dist/server/sessions/authRoutes.js.map +1 -1
  31. package/dist/server/sessions/authService.js +0 -24
  32. package/dist/server/sessions/authService.js.map +1 -1
  33. package/dist/server/sessions/messagePaging.js +2 -2
  34. package/dist/server/sessions/messagePaging.js.map +1 -1
  35. package/dist/server/sessions/oauthLoginFlowService.js +2 -5
  36. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -1
  37. package/dist/server/sessions/pendingAskStore.js +0 -3
  38. package/dist/server/sessions/pendingAskStore.js.map +1 -1
  39. package/dist/server/sessions/piSessionManagerGateway.js +182 -2
  40. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  41. package/dist/server/sessions/piSessionService.js +244 -186
  42. package/dist/server/sessions/piSessionService.js.map +1 -1
  43. package/dist/server/sessions/sessionFileHeader.js +92 -20
  44. package/dist/server/sessions/sessionFileHeader.js.map +1 -1
  45. package/dist/server/sessions/sessionRoutes.js +74 -56
  46. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  47. package/dist/server/sessions/sessionSummaryScanner.js +619 -0
  48. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
  49. package/dist/server/sessions/spawnSessionTool.js +8 -1
  50. package/dist/server/sessions/spawnSessionTool.js.map +1 -1
  51. package/dist/server/sessions/spawnSubsessionTool.js +7 -1
  52. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  53. package/dist/server/workspaces/effectivePathAccess.js +0 -19
  54. package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
  55. package/dist/server/workspaces/workspaceDeletionRoutes.js +30 -4
  56. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  57. package/dist/server/workspaces/workspaceService.js.map +1 -1
  58. package/dist/sessiond/config.js +2 -2
  59. package/dist/sessiond/config.js.map +1 -1
  60. package/dist/shared/apiTypes.d.ts +12 -29
  61. package/dist/shared/apiTypes.js +7 -16
  62. package/dist/shared/apiTypes.js.map +1 -1
  63. package/dist/shared/capabilities.js +10 -44
  64. package/dist/shared/capabilities.js.map +1 -1
  65. package/dist/shared/federatedRoutes.js +0 -3
  66. package/dist/shared/federatedRoutes.js.map +1 -1
  67. package/docs/config.md +59 -4
  68. package/docs/plugins.md +5 -3
  69. package/package.json +10 -9
@@ -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-LME0LfPb.js"></script>
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
- /** List one relay's documents: status.md, charter.md, log.md first, then alphabetical. Never rejects. */
23
- export async function listRelayDocuments(files, relayPath) {
24
- let listing;
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
- listing = await files.listFiles(relayPath);
41
+ rootListing = await files.listFiles(relayPath);
27
42
  }
28
43
  catch (error) {
29
44
  return fileAccessFailure(error);
30
45
  }
31
- const documents = orderRelayDocuments(listing.entries
32
- .filter((entry) => entry.type === "file")
33
- .map((entry) => toRelayDocumentEntry(entry)));
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
- /** Anchor documents first in fixed order, then everything else alphabetically. */
51
- export function orderRelayDocuments(documents) {
52
- return [...documents].sort(compareRelayDocuments);
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
- /** The document a relay opens on: status.md when present, otherwise the first ordered document. */
55
- export function defaultRelayDocument(documents) {
56
- // Anchor ordering guarantees status.md is first whenever it exists.
57
- return orderRelayDocuments(documents)[0];
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 toRelayDocumentEntry(entry) {
63
- return { name: entry.name, path: entry.path, modifiedAt: entry.modifiedAt };
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, listRelayDocuments, listWorkspaceRelays, readRelayDocument, RELAYS_ROOT, } from "./relayDiscovery.js";
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. All async loads
13
- * flow through scanToken so stale responses for a previous workspace or
14
- * selection never overwrite newer state.
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 tab = event.target instanceof Element ? event.target.closest("button[data-document-path]") : null;
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 listRelayDocuments(context.files, relayPath);
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 document = documents.kind === "loaded"
134
- ? documents.documents.find((candidate) => candidate.path === preferredDocumentPath) ?? defaultRelayDocument(documents.documents)
135
- : undefined;
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.documents.length === 0) {
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 = documents.documents.map((document) => {
217
- const active = document.path === this.selectedDocumentPath;
218
- return `<button class="document-tab${active ? " active" : ""}" data-document-path="${escapeAttr(document.path)}"${active ? ' aria-current="true"' : ""}>${escapeHtml(document.name)}</button>`;
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
- if (documents.documents.length === 0) {
259
- return `
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; }
@@ -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"));
@@ -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,QAAiC;IAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChF,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"}
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"}