@chainingintention/pi-web-cn 1.202608.8 → 1.202608.10

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 (199) hide show
  1. package/README.md +2 -0
  2. package/dist/cli.js +123 -72
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/assets/{CodeViewer-CWKEeX0r.js → CodeViewer-DCl56K0Z.js} +2 -2
  5. package/dist/client/assets/{TerminalPanel-BmA7Ayzk.js → TerminalPanel-DCvoEjUF.js} +6 -6
  6. package/dist/client/assets/{index-D6j67Izj.js → index-CMvms5cF.js} +534 -512
  7. package/dist/client/index.html +1 -1
  8. package/dist/config.js +39 -18
  9. package/dist/config.js.map +1 -1
  10. package/dist/nativeServices/serviceAction.js +128 -0
  11. package/dist/nativeServices/serviceAction.js.map +1 -0
  12. package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
  13. package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
  14. package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
  15. package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
  16. package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
  17. package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
  18. package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
  19. package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
  20. package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
  21. package/dist/pi-web-plugins/git/git-backend.js +433 -0
  22. package/dist/pi-web-plugins/git/package.json +15 -0
  23. package/dist/pi-web-plugins/git/server-plugin.js +176 -0
  24. package/dist/pi-web-plugins/info/infoInternals.js +1 -1
  25. package/dist/pi-web-plugins/info/pi-web-plugin.js +2 -2
  26. package/dist/pi-web-plugins/relays/pi-web-plugin.js +1 -1
  27. package/dist/pi-web-plugins/relays/relayDiscovery.js +128 -23
  28. package/dist/pi-web-plugins/relays/relaysPanelElement.js +138 -16
  29. package/dist/pi-web-plugins/updates/pi-web-plugin.js +1 -1
  30. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +1 -1
  31. package/dist/piWebVersionReport.js +63 -4
  32. package/dist/piWebVersionReport.js.map +1 -1
  33. package/dist/plugin-api.d.ts +40 -18
  34. package/dist/pluginRecoveryCli.js +172 -0
  35. package/dist/pluginRecoveryCli.js.map +1 -0
  36. package/dist/server/activity/workspaceActivityService.js +7 -1
  37. package/dist/server/activity/workspaceActivityService.js.map +1 -1
  38. package/dist/server/app.js +49 -23
  39. package/dist/server/app.js.map +1 -1
  40. package/dist/server/audit/managementAuditStore.js +4 -2
  41. package/dist/server/audit/managementAuditStore.js.map +1 -1
  42. package/dist/server/configRoutes.js +4 -5
  43. package/dist/server/configRoutes.js.map +1 -1
  44. package/dist/server/machines/machineClient.js +23 -4
  45. package/dist/server/machines/machineClient.js.map +1 -1
  46. package/dist/server/machines/machineProxyRoutes.js +162 -8
  47. package/dist/server/machines/machineProxyRoutes.js.map +1 -1
  48. package/dist/server/managementEmbed.js +6 -0
  49. package/dist/server/managementEmbed.js.map +1 -1
  50. package/dist/server/piWebPluginCatalog.js +441 -0
  51. package/dist/server/piWebPluginCatalog.js.map +1 -0
  52. package/dist/server/piWebPluginLifecycle.js +162 -0
  53. package/dist/server/piWebPluginLifecycle.js.map +1 -0
  54. package/dist/server/piWebPluginService.js +55 -7
  55. package/dist/server/piWebPluginService.js.map +1 -1
  56. package/dist/server/plugins/pluginBackendProxyRoutes.js +80 -0
  57. package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
  58. package/dist/server/plugins/serverPluginExec.js +184 -0
  59. package/dist/server/plugins/serverPluginExec.js.map +1 -0
  60. package/dist/server/plugins/serverPluginRuntime.js +480 -0
  61. package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
  62. package/dist/server/realtime/sessionEventHub.js +13 -0
  63. package/dist/server/realtime/sessionEventHub.js.map +1 -1
  64. package/dist/server/realtime/sessionEventScope.js +8 -1
  65. package/dist/server/realtime/sessionEventScope.js.map +1 -1
  66. package/dist/server/requestCancellation.js +28 -0
  67. package/dist/server/requestCancellation.js.map +1 -0
  68. package/dist/server/sessiond/agentProcessEnvironment.js +61 -0
  69. package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
  70. package/dist/server/sessiond/managementProjectResolver.js +16 -0
  71. package/dist/server/sessiond/managementProjectResolver.js.map +1 -0
  72. package/dist/server/sessiond/pluginBackendRoutes.js +78 -0
  73. package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
  74. package/dist/server/sessiond/sessionProxyRoutes.js +1 -0
  75. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
  76. package/dist/server/sessiond/sessionServiceDependencies.js +0 -1
  77. package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
  78. package/dist/server/sessiond/sessiondStateOwnership.js +139 -0
  79. package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
  80. package/dist/server/sessiond/workspaceCatalogRoutes.js +38 -0
  81. package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
  82. package/dist/server/sessiond/workspaceRemovalRoutes.js +56 -0
  83. package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
  84. package/dist/server/sessiond.js +98 -11
  85. package/dist/server/sessiond.js.map +1 -1
  86. package/dist/server/sessions/authService.js +15 -51
  87. package/dist/server/sessions/authService.js.map +1 -1
  88. package/dist/server/sessions/dockerEnvironmentFacts.js +181 -0
  89. package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
  90. package/dist/server/sessions/managementAgentTools.js +12 -4
  91. package/dist/server/sessions/managementAgentTools.js.map +1 -1
  92. package/dist/server/sessions/managementSandbox.js +5 -5
  93. package/dist/server/sessions/managementSandbox.js.map +1 -1
  94. package/dist/server/sessions/piSessionManagerGateway.js +129 -2
  95. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
  96. package/dist/server/sessions/piSessionService.js +268 -119
  97. package/dist/server/sessions/piSessionService.js.map +1 -1
  98. package/dist/server/sessions/sessionCommandService.js +15 -1
  99. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  100. package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
  101. package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
  102. package/dist/server/sessions/sessionFileFormat.js +27 -0
  103. package/dist/server/sessions/sessionFileFormat.js.map +1 -0
  104. package/dist/server/sessions/sessionFileHeader.js +82 -23
  105. package/dist/server/sessions/sessionFileHeader.js.map +1 -1
  106. package/dist/server/sessions/sessionRoutes.js +16 -2
  107. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  108. package/dist/server/sessions/sessionSummaryScanner.js +491 -0
  109. package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
  110. package/dist/server/sessions/spawnSubsessionTool.js +4 -8
  111. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
  112. package/dist/server/sessions/spawnTargetResolver.js +2 -2
  113. package/dist/server/sessions/spawnTargetResolver.js.map +1 -1
  114. package/dist/server/status/machineStatusRoutes.js +10 -0
  115. package/dist/server/status/machineStatusRoutes.js.map +1 -0
  116. package/dist/server/status/machineStatusService.js +115 -0
  117. package/dist/server/status/machineStatusService.js.map +1 -0
  118. package/dist/server/status/workspaceAttribution.js +71 -0
  119. package/dist/server/status/workspaceAttribution.js.map +1 -0
  120. package/dist/server/terminalProxyRoutes.js.map +1 -1
  121. package/dist/server/workbench/skillSync.js +9 -1
  122. package/dist/server/workbench/skillSync.js.map +1 -1
  123. package/dist/server/workspaceExplorerRoutes.js +12 -25
  124. package/dist/server/workspaceExplorerRoutes.js.map +1 -1
  125. package/dist/server/workspaces/effectivePathAccess.js +3 -2
  126. package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
  127. package/dist/server/workspaces/fileContentService.js +17 -9
  128. package/dist/server/workspaces/fileContentService.js.map +1 -1
  129. package/dist/server/workspaces/fileOperationService.js +4 -17
  130. package/dist/server/workspaces/fileOperationService.js.map +1 -1
  131. package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
  132. package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
  133. package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
  134. package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
  135. package/dist/server/workspaces/filePreviewService.js +81 -0
  136. package/dist/server/workspaces/filePreviewService.js.map +1 -0
  137. package/dist/server/workspaces/projectWorkspaceCwds.js +2 -2
  138. package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
  139. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +416 -0
  140. package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
  141. package/dist/server/workspaces/workspaceCatalog.js +87 -0
  142. package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
  143. package/dist/server/workspaces/workspaceContext.js +5 -5
  144. package/dist/server/workspaces/workspaceContext.js.map +1 -1
  145. package/dist/server/workspaces/workspaceDeletionRoutes.js +114 -99
  146. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
  147. package/dist/server/workspaces/workspaceProviderRegistry.js +650 -0
  148. package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
  149. package/dist/server/workspaces/workspaceRemovalService.js +258 -0
  150. package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
  151. package/dist/server/workspaces/workspaceRouteContext.js +2 -1
  152. package/dist/server/workspaces/workspaceRouteContext.js.map +1 -1
  153. package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
  154. package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
  155. package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
  156. package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
  157. package/dist/server-plugin-api.d.ts +115 -0
  158. package/dist/server-plugin-api.js +2 -0
  159. package/dist/server-plugin-api.js.map +1 -0
  160. package/dist/serverPluginRecovery.js +138 -0
  161. package/dist/serverPluginRecovery.js.map +1 -0
  162. package/dist/sessiond/config.js +6 -0
  163. package/dist/sessiond/config.js.map +1 -1
  164. package/dist/sessiond/sessionDaemonClient.js +7 -6
  165. package/dist/sessiond/sessionDaemonClient.js.map +1 -1
  166. package/dist/shared/apiTypes.js +2 -0
  167. package/dist/shared/apiTypes.js.map +1 -1
  168. package/dist/shared/capabilities.js +2 -0
  169. package/dist/shared/capabilities.js.map +1 -1
  170. package/dist/shared/federatedRoutes.js +28 -2
  171. package/dist/shared/federatedRoutes.js.map +1 -1
  172. package/dist/shared/machineStatus.js +60 -0
  173. package/dist/shared/machineStatus.js.map +1 -0
  174. package/dist/shared/pluginApiTypes.d.ts +155 -0
  175. package/dist/shared/pluginBackendProtocol.js +110 -0
  176. package/dist/shared/pluginBackendProtocol.js.map +1 -0
  177. package/dist/shared/pluginIds.js +3 -0
  178. package/dist/shared/pluginIds.js.map +1 -1
  179. package/dist/shared/pluginRecoveryCommands.js +14 -0
  180. package/dist/shared/pluginRecoveryCommands.js.map +1 -0
  181. package/dist/shared/workspaceFiles.js +41 -2
  182. package/dist/shared/workspaceFiles.js.map +1 -1
  183. package/dist/shared/workspaceRemovalProtocol.js +24 -0
  184. package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
  185. package/docs/config.md +12 -5
  186. package/docs/plugins.md +15 -21
  187. package/package.json +27 -8
  188. package/server-plugin-api.d.ts +1 -0
  189. package/skills/README.md +12 -0
  190. package/skills/relay/SKILL.md +115 -0
  191. package/dist/client/assets/UnifiedDiffViewer-2DACwxFY.js +0 -39
  192. package/dist/plugin-api/unstable.d.ts +0 -22
  193. package/dist/server/sessions/parentSessionLocator.js +0 -75
  194. package/dist/server/sessions/parentSessionLocator.js.map +0 -1
  195. package/dist/server/workspaces/imagePreviewService.js +0 -40
  196. package/dist/server/workspaces/imagePreviewService.js.map +0 -1
  197. package/dist/shared/apiTypes.d.ts +0 -1323
  198. package/dist/shared/thinkingLevels.d.ts +0 -29
  199. package/plugin-api/unstable.d.ts +0 -1
@@ -2,6 +2,12 @@
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
+ /** Deepest node depth listed below the relay root; direct children are depth 0. */
6
+ export const MAX_RELAY_TREE_DEPTH = 5;
7
+ /** Most documents listed across one relay. */
8
+ export const MAX_RELAY_DOCUMENTS = 200;
9
+ /** Most directories walked across one relay. */
10
+ export const MAX_RELAY_DIRECTORIES = 50;
5
11
  // The workspace file API rejects with these messages when a path is absent or
6
12
  // is not a directory. For the relays root both mean "zero relays", not a failure.
7
13
  const missingListingErrorMessages = new Set(["Path does not exist", "Path is not a directory"]);
@@ -19,19 +25,18 @@ export async function listWorkspaceRelays(files) {
19
25
  .map((entry) => toRelaySummary(entry)));
20
26
  return { kind: "loaded", relays };
21
27
  }
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;
28
+ /** List one relay's bounded document tree without following symlinks. Never rejects. */
29
+ export async function listRelayDocumentTree(files, relayPath) {
30
+ let rootListing;
25
31
  try {
26
- listing = await files.listFiles(relayPath);
32
+ rootListing = await files.listFiles(relayPath);
27
33
  }
28
34
  catch (error) {
29
35
  return fileAccessFailure(error);
30
36
  }
31
- const documents = orderRelayDocuments(listing.entries
32
- .filter((entry) => entry.type === "file")
33
- .map((entry) => toRelayDocumentEntry(entry)));
34
- return { kind: "loaded", documents };
37
+ const state = { documentCount: 0, directoryCount: 0, partial: rootListing.truncated };
38
+ const tree = await walkListing(files, rootListing, relayPath, 0, state);
39
+ return { kind: "loaded", tree, documentCount: state.documentCount, partial: state.partial };
35
40
  }
36
41
  /** Read one relay document. Never rejects. */
37
42
  export async function readRelayDocument(files, documentPath) {
@@ -47,20 +52,126 @@ export async function readRelayDocument(files, documentPath) {
47
52
  export function sortRelaysByRecency(relays) {
48
53
  return [...relays].sort(compareRelaysByRecency);
49
54
  }
50
- /** Anchor documents first in fixed order, then everything else alphabetically. */
51
- export function orderRelayDocuments(documents) {
52
- return [...documents].sort(compareRelayDocuments);
55
+ /** The depth-first first file; root anchor ordering makes status.md win when present. */
56
+ export function defaultRelayDocument(tree) {
57
+ for (const node of tree) {
58
+ if (node.kind === "file")
59
+ return node;
60
+ const nested = defaultRelayDocument(node.children);
61
+ if (nested !== undefined)
62
+ return nested;
63
+ }
64
+ return undefined;
65
+ }
66
+ export function flattenRelayTree(tree) {
67
+ const files = [];
68
+ const visit = (nodes) => {
69
+ for (const node of nodes) {
70
+ if (node.kind === "file")
71
+ files.push(node);
72
+ else
73
+ visit(node.children);
74
+ }
75
+ };
76
+ visit(tree);
77
+ return files;
53
78
  }
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];
79
+ export function collectDirectoryPaths(tree) {
80
+ const paths = new Set();
81
+ const visit = (nodes) => {
82
+ for (const node of nodes) {
83
+ if (node.kind !== "directory")
84
+ continue;
85
+ paths.add(node.path);
86
+ visit(node.children);
87
+ }
88
+ };
89
+ visit(tree);
90
+ return paths;
91
+ }
92
+ export function ancestorDirectoryPaths(tree, filePath) {
93
+ const chain = [];
94
+ const visit = (nodes) => {
95
+ for (const node of nodes) {
96
+ if (node.kind === "file") {
97
+ if (node.path === filePath)
98
+ return true;
99
+ continue;
100
+ }
101
+ chain.push(node.path);
102
+ if (visit(node.children))
103
+ return true;
104
+ chain.pop();
105
+ }
106
+ return false;
107
+ };
108
+ return visit(tree) ? chain : [];
109
+ }
110
+ async function walkListing(files, listing, relayPath, depth, state) {
111
+ const fileEntries = listing.entries.filter((entry) => entry.type === "file");
112
+ const directoryEntries = listing.entries.filter((entry) => entry.type === "directory");
113
+ let fileNodes = orderFileEntries(fileEntries, depth === 0).map((entry) => toFileNode(entry, relayPath, depth));
114
+ const remaining = MAX_RELAY_DOCUMENTS - state.documentCount;
115
+ if (fileNodes.length > remaining) {
116
+ fileNodes = fileNodes.slice(0, Math.max(0, remaining));
117
+ state.partial = true;
118
+ }
119
+ state.documentCount += fileNodes.length;
120
+ const directories = await Promise.all([...directoryEntries].sort(compareByName).map(async (entry) => {
121
+ const node = {
122
+ kind: "directory",
123
+ name: entry.name,
124
+ path: entry.path,
125
+ relativePath: relativePathOf(entry.path, relayPath),
126
+ depth,
127
+ children: [],
128
+ };
129
+ if (depth >= MAX_RELAY_TREE_DEPTH || state.directoryCount >= MAX_RELAY_DIRECTORIES) {
130
+ state.partial = true;
131
+ return node;
132
+ }
133
+ state.directoryCount += 1;
134
+ try {
135
+ const subListing = await files.listFiles(entry.path);
136
+ if (subListing.truncated)
137
+ state.partial = true;
138
+ node.children = await walkListing(files, subListing, relayPath, depth + 1, state);
139
+ }
140
+ catch {
141
+ state.partial = true;
142
+ }
143
+ return node;
144
+ }));
145
+ return [...fileNodes, ...directories];
146
+ }
147
+ function orderFileEntries(entries, isRelayRoot) {
148
+ return [...entries].sort(isRelayRoot ? compareRootFiles : compareByName);
149
+ }
150
+ function compareRootFiles(left, right) {
151
+ const anchorOrder = anchorIndexOf(left.name) - anchorIndexOf(right.name);
152
+ if (anchorOrder !== 0)
153
+ return anchorOrder;
154
+ return left.name.localeCompare(right.name);
155
+ }
156
+ function compareByName(left, right) {
157
+ return left.name.localeCompare(right.name);
58
158
  }
59
159
  function toRelaySummary(entry) {
60
160
  return { name: entry.name, path: entry.path, modifiedAt: entry.modifiedAt };
61
161
  }
62
- function toRelayDocumentEntry(entry) {
63
- return { name: entry.name, path: entry.path, modifiedAt: entry.modifiedAt };
162
+ function toFileNode(entry, relayPath, depth) {
163
+ return {
164
+ kind: "file",
165
+ name: entry.name,
166
+ path: entry.path,
167
+ relativePath: relativePathOf(entry.path, relayPath),
168
+ depth,
169
+ modifiedAt: entry.modifiedAt,
170
+ };
171
+ }
172
+ function relativePathOf(path, relayPath) {
173
+ const prefix = `${relayPath}/`;
174
+ return path.startsWith(prefix) ? path.slice(prefix.length) : path.slice(path.lastIndexOf("/") + 1);
64
175
  }
65
176
  function compareRelaysByRecency(left, right) {
66
177
  const leftTime = timestampOf(left.modifiedAt);
@@ -79,12 +190,6 @@ function timestampOf(modifiedAt) {
79
190
  const time = Date.parse(modifiedAt);
80
191
  return Number.isNaN(time) ? undefined : time;
81
192
  }
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
193
  function anchorIndexOf(name) {
89
194
  const index = RELAY_ANCHOR_DOCUMENTS.indexOf(name);
90
195
  return index === -1 ? RELAY_ANCHOR_DOCUMENTS.length : index;
@@ -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))
@@ -26,6 +26,7 @@ class PiWebRelaysPanel extends HTMLElement {
26
26
  documents;
27
27
  selectedDocumentPath;
28
28
  documentContent;
29
+ expandedDirs = new Set();
29
30
  scanToken = 0;
30
31
  root;
31
32
  toolbar;
@@ -59,7 +60,15 @@ class PiWebRelaysPanel extends HTMLElement {
59
60
  void this.openRelay(context, picker.value);
60
61
  });
61
62
  this.tabStrip.addEventListener("click", (event) => {
62
- const tab = event.target instanceof Element ? event.target.closest("button[data-document-path]") : null;
63
+ const element = event.target instanceof Element ? event.target : null;
64
+ const chip = element?.closest("button[data-directory-path]") ?? null;
65
+ if (chip !== null) {
66
+ const directoryPath = chip.getAttribute("data-directory-path");
67
+ if (directoryPath !== null)
68
+ this.toggleDirectory(directoryPath);
69
+ return;
70
+ }
71
+ const tab = element?.closest("button[data-document-path]") ?? null;
63
72
  if (tab === null)
64
73
  return;
65
74
  const documentPath = tab.getAttribute("data-document-path");
@@ -76,6 +85,7 @@ class PiWebRelaysPanel extends HTMLElement {
76
85
  // same workspace (mirrors the workspace-tasks panel).
77
86
  if (previousKey === nextKey)
78
87
  return;
88
+ this.expandedDirs = new Set();
79
89
  if (value === undefined) {
80
90
  this.resetScanState();
81
91
  this.renderAll();
@@ -108,8 +118,62 @@ class PiWebRelaysPanel extends HTMLElement {
108
118
  async openRelay(context, relayPath) {
109
119
  const token = ++this.scanToken;
110
120
  this.selectedRelayPath = relayPath;
121
+ this.expandedDirs = new Set();
111
122
  await this.loadDocuments(context, token, relayPath, undefined);
112
123
  }
124
+ toggleDirectory(directoryPath) {
125
+ if (this.documents?.kind !== "loaded")
126
+ return;
127
+ if (this.expandedDirs.has(directoryPath)) {
128
+ for (const path of [...this.expandedDirs]) {
129
+ if (path === directoryPath || path.startsWith(`${directoryPath}/`))
130
+ this.expandedDirs.delete(path);
131
+ }
132
+ }
133
+ else {
134
+ this.collapseSiblingDirectories(directoryPath);
135
+ this.expandedDirs.add(directoryPath);
136
+ }
137
+ this.renderTabs();
138
+ const chip = this.findDirectoryChip(directoryPath);
139
+ chip?.focus();
140
+ if (this.expandedDirs.has(directoryPath))
141
+ this.scrollExpandedChildrenIntoView(chip);
142
+ }
143
+ collapseSiblingDirectories(directoryPath) {
144
+ const parentPath = directoryPath.slice(0, directoryPath.lastIndexOf("/"));
145
+ for (const expanded of [...this.expandedDirs]) {
146
+ if (expanded.slice(0, expanded.lastIndexOf("/")) !== parentPath)
147
+ continue;
148
+ this.expandedDirs.delete(expanded);
149
+ for (const path of [...this.expandedDirs]) {
150
+ if (path.startsWith(`${expanded}/`))
151
+ this.expandedDirs.delete(path);
152
+ }
153
+ }
154
+ }
155
+ revealDocument(documentPath) {
156
+ if (this.documents?.kind !== "loaded")
157
+ return;
158
+ for (const path of ancestorDirectoryPaths(this.documents.tree, documentPath))
159
+ this.expandedDirs.add(path);
160
+ }
161
+ pruneExpandedDirs(tree) {
162
+ const existing = collectDirectoryPaths(tree);
163
+ for (const path of [...this.expandedDirs]) {
164
+ if (!existing.has(path))
165
+ this.expandedDirs.delete(path);
166
+ }
167
+ }
168
+ findDirectoryChip(directoryPath) {
169
+ return [...this.tabStrip.querySelectorAll("button[data-directory-path]")]
170
+ .find((candidate) => candidate instanceof HTMLElement && candidate.getAttribute("data-directory-path") === directoryPath);
171
+ }
172
+ scrollExpandedChildrenIntoView(chip) {
173
+ const firstChild = chip?.nextElementSibling;
174
+ if (firstChild instanceof HTMLElement)
175
+ firstChild.scrollIntoView({ inline: "nearest", block: "nearest" });
176
+ }
113
177
  async openDocument(context, documentPath) {
114
178
  const token = ++this.scanToken;
115
179
  this.selectedDocumentPath = documentPath;
@@ -126,14 +190,18 @@ class PiWebRelaysPanel extends HTMLElement {
126
190
  this.documentContent = undefined;
127
191
  this.renderTabs();
128
192
  this.renderViewer();
129
- const documents = await listRelayDocuments(context.files, relayPath);
193
+ const documents = await listRelayDocumentTree(context.files, relayPath);
130
194
  if (!this.isCurrentScan(context, token))
131
195
  return;
132
196
  this.documents = documents;
133
- const document = documents.kind === "loaded"
134
- ? documents.documents.find((candidate) => candidate.path === preferredDocumentPath) ?? defaultRelayDocument(documents.documents)
135
- : undefined;
197
+ const files = documents.kind === "loaded" ? flattenRelayTree(documents.tree) : [];
198
+ const preferred = files.find((candidate) => candidate.path === preferredDocumentPath);
199
+ const document = preferred ?? defaultRelayDocument(documents.kind === "loaded" ? documents.tree : []);
136
200
  this.selectedDocumentPath = document?.path;
201
+ if (documents.kind === "loaded")
202
+ this.pruneExpandedDirs(documents.tree);
203
+ if (preferred === undefined && document !== undefined)
204
+ this.revealDocument(document.path);
137
205
  this.renderTabs();
138
206
  if (document === undefined) {
139
207
  this.renderViewer();
@@ -203,7 +271,7 @@ class PiWebRelaysPanel extends HTMLElement {
203
271
  }
204
272
  renderTabs() {
205
273
  const documents = this.documents;
206
- if (documents?.kind !== "loaded" || documents.documents.length === 0) {
274
+ if (documents?.kind !== "loaded" || documents.documentCount === 0) {
207
275
  this.tabStrip.hidden = true;
208
276
  // A new tab set starts at the left edge, not at the previous set's offset.
209
277
  this.tabStrip.replaceChildren();
@@ -211,13 +279,33 @@ class PiWebRelaysPanel extends HTMLElement {
211
279
  return;
212
280
  }
213
281
  this.tabStrip.hidden = false;
282
+ const containsActivePath = this.selectedDocumentPath === undefined
283
+ ? undefined
284
+ : collapsedAncestorOfSelectedFile(documents.tree, this.selectedDocumentPath, this.expandedDirs);
214
285
  // The strip element itself persists across re-renders, so replacing its
215
286
  // 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>`;
287
+ this.tabStrip.innerHTML = this.renderStripNodes(documents.tree, containsActivePath);
288
+ }
289
+ renderStripNodes(nodes, containsActivePath) {
290
+ return nodes.map((node) => {
291
+ if (node.kind === "file")
292
+ return this.renderFileTab(node);
293
+ const chip = this.renderDirectoryChip(node, containsActivePath);
294
+ if (!this.expandedDirs.has(node.path) || node.children.length === 0)
295
+ return chip;
296
+ return `<span class="directory-group">${chip}${this.renderStripNodes(node.children, containsActivePath)}</span>`;
219
297
  }).join("");
220
298
  }
299
+ renderFileTab(file) {
300
+ const active = file.path === this.selectedDocumentPath;
301
+ 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>`;
302
+ }
303
+ renderDirectoryChip(directory, containsActivePath) {
304
+ const expanded = this.expandedDirs.has(directory.path);
305
+ const containsActive = directory.path === containsActivePath;
306
+ const title = containsActive ? "包含当前打开的文档" : directory.relativePath;
307
+ 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>`;
308
+ }
221
309
  /** Move the active marker between the mounted tab buttons without rebuilding them. */
222
310
  updateActiveTab() {
223
311
  for (const tab of this.tabStrip.querySelectorAll("button[data-document-path]")) {
@@ -228,6 +316,8 @@ class PiWebRelaysPanel extends HTMLElement {
228
316
  else
229
317
  tab.removeAttribute("aria-current");
230
318
  }
319
+ for (const chip of this.tabStrip.querySelectorAll("button[data-directory-path]"))
320
+ chip.classList.remove("contains-active");
231
321
  }
232
322
  renderViewer() {
233
323
  if (this.contextValue === undefined) {
@@ -255,15 +345,18 @@ class PiWebRelaysPanel extends HTMLElement {
255
345
  if (documents.kind === "missing") {
256
346
  return `<div class="empty-state"><strong>此中继已不存在。</strong><p>点击“刷新”重新扫描 ${escapeHtml(RELAYS_ROOT)}。</p></div>`;
257
347
  }
258
- if (documents.documents.length === 0) {
259
- return `
260
- <div class="empty-state">
348
+ const partialNotice = documents.partial
349
+ ? `<div class="status info">部分嵌套内容未列出:此中继目录树超过了面板的深度或数量限制。</div>`
350
+ : "";
351
+ if (documents.documentCount === 0) {
352
+ return `${partialNotice}
353
+ <div class="empty-state">
261
354
  <strong>此中继还没有文档。</strong>
262
355
  <p>中继包通常包含 <code>status.md</code>、<code>charter.md</code> 和 <code>log.md</code>。</p>
263
356
  </div>
264
357
  `;
265
358
  }
266
- return this.renderSelectedDocument();
359
+ return `${partialNotice}${this.renderSelectedDocument()}`;
267
360
  }
268
361
  renderSelectedDocument() {
269
362
  const documentPath = this.selectedDocumentPath;
@@ -307,6 +400,29 @@ function refreshIconSvg() {
307
400
  </svg>
308
401
  `;
309
402
  }
403
+ export function collapsedAncestorOfSelectedFile(tree, filePath, expandedPaths) {
404
+ let hiddenAncestor;
405
+ const visit = (entries) => {
406
+ for (const entry of entries) {
407
+ if (entry.kind === "file") {
408
+ if (entry.path === filePath)
409
+ return true;
410
+ continue;
411
+ }
412
+ if (hiddenAncestor === undefined && !expandedPaths.has(entry.path))
413
+ hiddenAncestor = entry.path;
414
+ if (visit(entry.children))
415
+ return true;
416
+ if (hiddenAncestor === entry.path)
417
+ hiddenAncestor = undefined;
418
+ }
419
+ return false;
420
+ };
421
+ return visit(tree) ? hiddenAncestor : undefined;
422
+ }
423
+ function chevronSvg() {
424
+ return `<svg class="chevron" viewBox="0 0 16 16" aria-hidden="true" focusable="false"><path d="M6 4l4 4-4 4"></path></svg>`;
425
+ }
310
426
  function contextKey(context) {
311
427
  return `${context.machine.id}:${context.workspace.projectId}:${context.workspace.id}`;
312
428
  }
@@ -348,8 +464,14 @@ function relaysStyles() {
348
464
  button.icon-button { flex: 0 0 auto; display: inline-grid; place-items: center; width: 30px; height: 30px; padding: 0; }
349
465
  button.icon-button svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
350
466
  select { min-width: 0; max-width: 240px; padding: 5px 6px; }
351
- .document-tab { flex: 0 0 auto; white-space: nowrap; font-size: 12px; padding: 4px 10px; }
352
- .document-tab.active { border-color: var(--pi-accent-border); background: var(--pi-accent); color: var(--pi-bg); }
467
+ .document-tab { flex: 0 0 auto; white-space: nowrap; font-size: 12px; padding: 4px 10px; }
468
+ .document-tab.active { border-color: var(--pi-accent-border); background: var(--pi-accent); color: var(--pi-bg); }
469
+ .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; }
470
+ .directory-tab { display: inline-flex; align-items: center; gap: 5px; }
471
+ .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; }
472
+ .directory-tab[aria-expanded="true"] .chevron { transform: rotate(90deg); }
473
+ .directory-tab.contains-active { border-color: var(--pi-accent-border); color: var(--pi-accent); }
474
+ .directory-tab.contains-active::after { content: ""; width: 5px; height: 5px; border-radius: 50%; background: var(--pi-accent); }
353
475
  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
476
  code { padding: 2px 5px; }
355
477
  pre { margin: 0; overflow: auto; padding: 8px; white-space: pre-wrap; overflow-wrap: anywhere; }
@@ -207,7 +207,7 @@ function severityLabel(severity) {
207
207
  return severity;
208
208
  }
209
209
  const plugin = {
210
- apiVersion: 1,
210
+ apiVersion: 2,
211
211
  name: "更新",
212
212
  activate: ({ html, svg }) => ({
213
213
  contributions: {
@@ -2,7 +2,7 @@
2
2
  import { TASKS_CONFIG_PATH } from "./config.js";
3
3
  import { defineTasksPanelElement, tasksPanelBadge } from "./tasksPanelElement.js";
4
4
  const plugin = {
5
- apiVersion: 1,
5
+ apiVersion: 2,
6
6
  name: "工作区任务",
7
7
  activate: ({ pluginId, html, svg }) => {
8
8
  defineTasksPanelElement();
@@ -9,13 +9,49 @@ const PI_WEB_VERSION_TIMEOUT_MS = 2000;
9
9
  const PI_WEB_VERSION_ENDPOINT_PATH = "/api/pi-web/version";
10
10
  const PI_WEB_STATUS_ENDPOINT_PATH = "/api/pi-web/status";
11
11
  const DEFAULT_PACKAGE_VERSION = "0.0.0-dev";
12
+ export function runningComponentsReady(info, expected) {
13
+ return expected.every((id) => {
14
+ const status = info[id];
15
+ if (status !== undefined)
16
+ return status.available && !status.stale;
17
+ return id === "web" && info.webAuthenticationRequired === true;
18
+ });
19
+ }
20
+ /** Authentication-required means the web service is reachable, but its version cannot be verified. */
21
+ export async function probeRunningComponentReady(component) {
22
+ if (component === "sessiond")
23
+ return (await collectRunningSessiondInfo()).component !== undefined;
24
+ const endpoint = webVersionEndpoint();
25
+ if (endpoint.endpoint === undefined)
26
+ return false;
27
+ try {
28
+ await fetchPiWebVersionResponse(endpoint.endpoint);
29
+ return true;
30
+ }
31
+ catch (error) {
32
+ if (isAuthenticationRequired(error))
33
+ return true;
34
+ const statusEndpoint = statusEndpointFor(endpoint.endpoint);
35
+ if (!isHttpNotFound(error) || statusEndpoint === endpoint.endpoint)
36
+ return false;
37
+ try {
38
+ await fetchPiWebVersionResponse(statusEndpoint);
39
+ return true;
40
+ }
41
+ catch (statusError) {
42
+ return isAuthenticationRequired(statusError);
43
+ }
44
+ }
45
+ }
12
46
  export function packageVersion() {
13
47
  return readPackageInfo()?.version ?? DEFAULT_PACKAGE_VERSION;
14
48
  }
15
49
  export async function printPiWebVersionReport() {
16
50
  console.log("PI WEB version");
17
51
  printInstalledPackageVersions();
18
- printRunningVersionInfo(await collectRunningVersionInfo());
52
+ const runningInfo = await collectRunningVersionInfo();
53
+ printRunningVersionInfo(runningInfo);
54
+ return runningInfo;
19
55
  }
20
56
  function packageRootPath() {
21
57
  return dirname(dirname(fileURLToPath(import.meta.url)));
@@ -74,7 +110,7 @@ async function fetchPiWebVersionResponse(endpoint) {
74
110
  signal: AbortSignal.timeout(PI_WEB_VERSION_TIMEOUT_MS),
75
111
  });
76
112
  if (!response.ok)
77
- throw new Error(`HTTP ${String(response.status)}`);
113
+ throw new HttpResponseError(response.status);
78
114
  const parsed = await response.json();
79
115
  const status = parsePiWebVersionResponse(parsed);
80
116
  if (status === undefined)
@@ -90,6 +126,9 @@ async function collectRunningVersionInfo() {
90
126
  }
91
127
  catch (error) {
92
128
  let webError = `${endpoint.endpoint}: ${errorMessage(error)}`;
129
+ if (isAuthenticationRequired(error)) {
130
+ return runningVersionInfoWithSessiondFallback({ webError, webAuthenticationRequired: true });
131
+ }
93
132
  const statusEndpoint = statusEndpointFor(endpoint.endpoint);
94
133
  if (statusEndpoint !== endpoint.endpoint && isHttpNotFound(error)) {
95
134
  try {
@@ -97,6 +136,12 @@ async function collectRunningVersionInfo() {
97
136
  return { generatedAt: status.generatedAt, web: status.components.web, sessiond: status.components.sessiond };
98
137
  }
99
138
  catch (statusError) {
139
+ if (isAuthenticationRequired(statusError)) {
140
+ return runningVersionInfoWithSessiondFallback({
141
+ webError: `${webError}; ${statusEndpoint}: ${errorMessage(statusError)}`,
142
+ webAuthenticationRequired: true,
143
+ });
144
+ }
100
145
  webError = `${webError}; ${statusEndpoint}: ${errorMessage(statusError)}`;
101
146
  }
102
147
  }
@@ -109,6 +154,7 @@ async function runningVersionInfoWithSessiondFallback(base) {
109
154
  const sessiond = await collectRunningSessiondInfo();
110
155
  return {
111
156
  webError: base.webError,
157
+ ...(base.webAuthenticationRequired === true ? { webAuthenticationRequired: true } : {}),
112
158
  ...(sessiond.component === undefined ? {} : { sessiond: sessiond.component }),
113
159
  ...(sessiond.error === undefined ? {} : { sessiondError: sessiond.error }),
114
160
  };
@@ -147,7 +193,10 @@ async function withTimeout(promise, timeoutMs, timeoutMessage) {
147
193
  }
148
194
  }
149
195
  function isHttpNotFound(error) {
150
- return error instanceof Error && error.message === "HTTP 404";
196
+ return error instanceof HttpResponseError && error.status === 404;
197
+ }
198
+ function isAuthenticationRequired(error) {
199
+ return error instanceof HttpResponseError && (error.status === 401 || error.status === 403);
151
200
  }
152
201
  function printInstalledPackageVersions() {
153
202
  const info = readPackageInfo();
@@ -162,7 +211,10 @@ function printInstalledPackageVersions() {
162
211
  }
163
212
  function printRunningVersionInfo(info) {
164
213
  console.log("Running services:");
165
- if (info.web === undefined)
214
+ if (info.web === undefined && info.webAuthenticationRequired === true) {
215
+ console.log("? Web/UI: reachable; authentication required, version unverified");
216
+ }
217
+ else if (info.web === undefined)
166
218
  printUnavailableComponent("Web/UI", info.webError);
167
219
  else
168
220
  printComponentVersion(info.web);
@@ -219,6 +271,13 @@ function formatVersion(version) {
219
271
  function errorMessage(error) {
220
272
  return error instanceof Error ? error.message : String(error);
221
273
  }
274
+ class HttpResponseError extends Error {
275
+ constructor(status) {
276
+ super(`HTTP ${String(status)}`);
277
+ this.status = status;
278
+ this.name = "HttpResponseError";
279
+ }
280
+ }
222
281
  function isRecord(value) {
223
282
  return typeof value === "object" && value !== null && !Array.isArray(value);
224
283
  }
@@ -1 +1 @@
1
- {"version":3,"file":"piWebVersionReport.js","sourceRoot":"","sources":["../src/piWebVersionReport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"piWebVersionReport.js","sourceRoot":"","sources":["../src/piWebVersionReport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAEtG,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAC3D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,4BAA4B,GAAG,qBAAqB,CAAC;AAC3D,MAAM,2BAA2B,GAAG,oBAAoB,CAAC;AACzD,MAAM,uBAAuB,GAAG,WAAW,CAAC;AAmB5C,MAAM,UAAU,sBAAsB,CAAC,IAAwB,EAAE,QAAuC;IACtG,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QACnE,OAAO,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,yBAAyB,KAAK,IAAI,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,SAA6B;IAC5E,IAAI,SAAS,KAAK,UAAU;QAAE,OAAO,CAAC,MAAM,0BAA0B,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC;IAClG,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,wBAAwB,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,cAAc,KAAK,QAAQ,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACjF,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC,cAAc,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,WAAW,EAAE,CAAC;YACrB,OAAO,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,eAAe,EAAE,EAAE,OAAO,IAAI,uBAAuB,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,6BAA6B,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,yBAAyB,EAAE,CAAC;IACtD,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACrC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAY;IACpD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC/G,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;QACjC,OAAO,EAAE,QAAQ,EAAE,UAAU,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,4BAA4B,EAAE,EAAE,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,iCAAiC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,cAAkC;IACxD,MAAM,IAAI,GAAG,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;IAClG,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,WAAW,CAAC;IAC/E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,eAAuB;IAChD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAAE,OAAO,eAAe,CAAC;IACpF,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,4BAA4B,CAAC,MAAM,CAAC,GAAG,2BAA2B,EAAE,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,QAAgB;IACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACrC,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;QACvC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,yBAAyB,CAAC;KACvD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,yBAAyB;IACtC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAClE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QAC/G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,QAAQ,GAAG,GAAG,QAAQ,CAAC,QAAQ,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9D,IAAI,wBAAwB,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,OAAO,sCAAsC,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5D,IAAI,cAAc,KAAK,QAAQ,CAAC,QAAQ,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,cAAc,CAAC,CAAC;oBAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC/G,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,IAAI,wBAAwB,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC1C,OAAO,sCAAsC,CAAC;4BAC5C,QAAQ,EAAE,GAAG,QAAQ,KAAK,cAAc,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE;4BACxE,yBAAyB,EAAE,IAAI;yBAChC,CAAC,CAAC;oBACL,CAAC;oBACD,QAAQ,GAAG,GAAG,QAAQ,KAAK,cAAc,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5E,CAAC;YACH,CAAC;YACD,OAAO,sCAAsC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,sCAAsC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,IAAI,qCAAqC,EAAE,CAAC,CAAC;AACvH,CAAC;AAED,KAAK,UAAU,sCAAsC,CAAC,IAA+D;IACnH,MAAM,QAAQ,GAAG,MAAM,0BAA0B,EAAE,CAAC;IACpD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,CAAC,yBAAyB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC7E,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,IAAI,mBAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EACnD,yBAAyB,EACzB,uCAAuC,CACxC,CAAC;QACF,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpH,MAAM,MAAM,GAAY,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACpG,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IACxC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAmB,EAAE,SAAiB,EAAE,cAAsB;IAC1F,IAAI,OAAkD,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;gBACpC,CAAC,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,KAAK,SAAS;YAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,iBAAiB,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;AACpE,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAc;IAC9C,OAAO,KAAK,YAAY,iBAAiB,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,6BAA6B;IACpC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,mBAAmB,WAAW,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,+BAA+B,eAAe,EAAE,EAAE,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAwB;IACvD,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,yBAAyB,KAAK,IAAI,EAAE,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC;SAAM,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;QAAE,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;;QACjF,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,yBAAyB,CAAC,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;QAC5F,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,qBAAqB,CAAC,SAA+B;IAC5D,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC,CAAC;IACrD,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,cAAc,KAAK,SAAS,IAAI,SAAS,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC9G,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,CAAC,SAAS,CAAC,cAAc,CAAC,gBAAgB,aAAa,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAChI,CAAC;IACD,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC/D,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAC/E,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAa,EAAE,KAAyB;IACzE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,eAAe,CAAC,CAAC;IACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,iBAAiB,CAAC,YAA+C;IACxE,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC;QACnD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9E,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QACvF,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9E,OAAO,qBAAqB,OAAO,GAAG,IAAI,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,YAAY,CAAC,IAAI,EAAE,CAAC;IACvI,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACjG,OAAO,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,0BAA0B,YAAY,CAAC,IAAI,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,aAAa,CAAC,OAA2B;IAChD,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,iBAAkB,SAAQ,KAAK;IACnC,YAAqB,MAAc;QACjC,KAAK,CAAC,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QADb,WAAM,GAAN,MAAM,CAAQ;QAEjC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;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"}