@chainingintention/pi-web-cn 1.202606.3

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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +364 -0
  3. package/dist/cli.js +960 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/apple-touch-icon.png +0 -0
  6. package/dist/client/assets/CodeViewer-B4nxYc0g.js +4 -0
  7. package/dist/client/assets/TerminalPanel-htr2dU1I.js +122 -0
  8. package/dist/client/assets/index-BjUH4a8R.js +1994 -0
  9. package/dist/client/assets/vendor-editor-core-B4Sq6exx.js +12 -0
  10. package/dist/client/assets/vendor-editor-languages-DznYbTkJ.js +26 -0
  11. package/dist/client/assets/vendor-editor-legacy-B4QLsWF8.js +1 -0
  12. package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
  13. package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
  14. package/dist/client/favicon.svg +11 -0
  15. package/dist/client/index.html +60 -0
  16. package/dist/client/manifest.webmanifest +24 -0
  17. package/dist/client/pwa-icon-192.png +0 -0
  18. package/dist/client/pwa-icon-512.png +0 -0
  19. package/dist/config.js +154 -0
  20. package/dist/config.js.map +1 -0
  21. package/dist/pi-web-plugins/info/package.json +9 -0
  22. package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
  23. package/dist/pi-web-plugins/updates/package.json +9 -0
  24. package/dist/pi-web-plugins/updates/pi-web-plugin.js +181 -0
  25. package/dist/pi-web-plugins/workspace-tasks/config.js +91 -0
  26. package/dist/pi-web-plugins/workspace-tasks/package.json +9 -0
  27. package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +48 -0
  28. package/dist/pi-web-plugins/workspace-tasks/taskRunner.js +12 -0
  29. package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +292 -0
  30. package/dist/pi-web-plugins/workspace-tasks/workspaceTasksClient.js +47 -0
  31. package/dist/piWebVersionReport.js +221 -0
  32. package/dist/piWebVersionReport.js.map +1 -0
  33. package/dist/plugin-api/unstable.d.ts +22 -0
  34. package/dist/plugin-api.d.ts +163 -0
  35. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  36. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  37. package/dist/server/activity/workspaceActivityService.js +98 -0
  38. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  39. package/dist/server/app.js +115 -0
  40. package/dist/server/app.js.map +1 -0
  41. package/dist/server/configRoutes.js +123 -0
  42. package/dist/server/configRoutes.js.map +1 -0
  43. package/dist/server/diagnostics/nodePtySpawnHelper.js +135 -0
  44. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  45. package/dist/server/git/gitEnv.js +15 -0
  46. package/dist/server/git/gitEnv.js.map +1 -0
  47. package/dist/server/git/gitService.js +119 -0
  48. package/dist/server/git/gitService.js.map +1 -0
  49. package/dist/server/gitRoutes.js +23 -0
  50. package/dist/server/gitRoutes.js.map +1 -0
  51. package/dist/server/index.js +7 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/machines/machineClient.js +134 -0
  54. package/dist/server/machines/machineClient.js.map +1 -0
  55. package/dist/server/machines/machineProxyRoutes.js +92 -0
  56. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  57. package/dist/server/machines/machineRoutes.js +50 -0
  58. package/dist/server/machines/machineRoutes.js.map +1 -0
  59. package/dist/server/machines/machineService.js +168 -0
  60. package/dist/server/machines/machineService.js.map +1 -0
  61. package/dist/server/machines/machineStore.js +128 -0
  62. package/dist/server/machines/machineStore.js.map +1 -0
  63. package/dist/server/piWebPluginService.js +235 -0
  64. package/dist/server/piWebPluginService.js.map +1 -0
  65. package/dist/server/piWebStatus.js +462 -0
  66. package/dist/server/piWebStatus.js.map +1 -0
  67. package/dist/server/projects/directorySuggestions.js +37 -0
  68. package/dist/server/projects/directorySuggestions.js.map +1 -0
  69. package/dist/server/projects/projectService.js +31 -0
  70. package/dist/server/projects/projectService.js.map +1 -0
  71. package/dist/server/realtime/sessionEventHub.js +39 -0
  72. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  73. package/dist/server/sessiond/sessionProxyRoutes.js +60 -0
  74. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  75. package/dist/server/sessiond.js +61 -0
  76. package/dist/server/sessiond.js.map +1 -0
  77. package/dist/server/sessions/authProviderOptions.js +56 -0
  78. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  79. package/dist/server/sessions/authRoutes.js +59 -0
  80. package/dist/server/sessions/authRoutes.js.map +1 -0
  81. package/dist/server/sessions/authService.js +74 -0
  82. package/dist/server/sessions/authService.js.map +1 -0
  83. package/dist/server/sessions/builtinCommands.js +27 -0
  84. package/dist/server/sessions/builtinCommands.js.map +1 -0
  85. package/dist/server/sessions/editPreview.js +196 -0
  86. package/dist/server/sessions/editPreview.js.map +1 -0
  87. package/dist/server/sessions/messagePaging.js +43 -0
  88. package/dist/server/sessions/messagePaging.js.map +1 -0
  89. package/dist/server/sessions/oauthLoginFlowService.js +219 -0
  90. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  91. package/dist/server/sessions/piSessionService.js +1054 -0
  92. package/dist/server/sessions/piSessionService.js.map +1 -0
  93. package/dist/server/sessions/sessionArchiveStore.js +216 -0
  94. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  95. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  96. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  97. package/dist/server/sessions/sessionCommandService.js +234 -0
  98. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  99. package/dist/server/sessions/sessionNameGenerator.js +68 -0
  100. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  101. package/dist/server/sessions/sessionRoutes.js +184 -0
  102. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  103. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  104. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  105. package/dist/server/storage/projectStore.js +88 -0
  106. package/dist/server/storage/projectStore.js.map +1 -0
  107. package/dist/server/terminalProxyRoutes.js +130 -0
  108. package/dist/server/terminalProxyRoutes.js.map +1 -0
  109. package/dist/server/terminals/terminalRoutes.js +138 -0
  110. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  111. package/dist/server/terminals/terminalService.js +293 -0
  112. package/dist/server/terminals/terminalService.js.map +1 -0
  113. package/dist/server/terminals/terminalSize.js +17 -0
  114. package/dist/server/terminals/terminalSize.js.map +1 -0
  115. package/dist/server/types.js +2 -0
  116. package/dist/server/types.js.map +1 -0
  117. package/dist/server/webSocketBridge.js +32 -0
  118. package/dist/server/webSocketBridge.js.map +1 -0
  119. package/dist/server/workspaceExplorerRoutes.js +42 -0
  120. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  121. package/dist/server/workspaces/fileContentService.js +70 -0
  122. package/dist/server/workspaces/fileContentService.js.map +1 -0
  123. package/dist/server/workspaces/fileSuggestions.js +148 -0
  124. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  125. package/dist/server/workspaces/fileTreeService.js +26 -0
  126. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  127. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  128. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  129. package/dist/server/workspaces/imagePreviewService.js +40 -0
  130. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  131. package/dist/server/workspaces/pathSafety.js +45 -0
  132. package/dist/server/workspaces/pathSafety.js.map +1 -0
  133. package/dist/server/workspaces/workspaceContext.js +8 -0
  134. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  135. package/dist/server/workspaces/workspaceService.js +39 -0
  136. package/dist/server/workspaces/workspaceService.js.map +1 -0
  137. package/dist/sessiond/config.js +9 -0
  138. package/dist/sessiond/config.js.map +1 -0
  139. package/dist/sessiond/sessionDaemonClient.js +65 -0
  140. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  141. package/dist/shared/activity.js +26 -0
  142. package/dist/shared/activity.js.map +1 -0
  143. package/dist/shared/apiTypes.d.ts +464 -0
  144. package/dist/shared/apiTypes.js +2 -0
  145. package/dist/shared/apiTypes.js.map +1 -0
  146. package/dist/shared/federatedRoutes.js +57 -0
  147. package/dist/shared/federatedRoutes.js.map +1 -0
  148. package/dist/shared/piWebStatusParsing.js +62 -0
  149. package/dist/shared/piWebStatusParsing.js.map +1 -0
  150. package/dist/shared/pluginIds.js +5 -0
  151. package/dist/shared/pluginIds.js.map +1 -0
  152. package/dist/shared/workspaceFiles.js +3 -0
  153. package/dist/shared/workspaceFiles.js.map +1 -0
  154. package/docs/assets/favicon.svg +11 -0
  155. package/docs/assets/pi-web-banner.png +0 -0
  156. package/docs/assets/pi-web-demo.gif +0 -0
  157. package/docs/assets/pi-web-demo.webm +0 -0
  158. package/docs/plugins.md +762 -0
  159. package/extensions/pi-web.ts +133 -0
  160. package/install.sh +5 -0
  161. package/package.json +127 -0
  162. package/plugin-api/unstable.d.ts +1 -0
  163. package/plugin-api.d.ts +1 -0
@@ -0,0 +1,462 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { readFile, realpath, stat } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, relative, resolve, sep } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { DefaultPackageManager, getAgentDir, SettingsManager } from "@earendil-works/pi-coding-agent";
8
+ import { parsePiWebComponentStatus } from "../shared/piWebStatusParsing.js";
9
+ import { SessionDaemonClient } from "../sessiond/sessionDaemonClient.js";
10
+ const PI_WEB_PACKAGE_NAME = "@chainingintention/pi-web-cn";
11
+ const PI_WEB_NPM_SOURCE = `npm:${PI_WEB_PACKAGE_NAME}`;
12
+ const DEFAULT_VERSION = "0.0.0-dev";
13
+ const LATEST_RELEASE_CACHE_MS = 6 * 60 * 60 * 1000;
14
+ const VERSION_CHECK_TIMEOUT_MS = 5000;
15
+ const serviceRefs = {
16
+ sessiond: {
17
+ id: "sessiond",
18
+ systemdName: "pi-web-sessiond.service",
19
+ launchdLabel: "com.pi-web.sessiond",
20
+ launchdPlistName: "com.pi-web.sessiond.plist",
21
+ },
22
+ web: {
23
+ id: "web",
24
+ systemdName: "pi-web.service",
25
+ launchdLabel: "com.pi-web.web",
26
+ launchdPlistName: "com.pi-web.web.plist",
27
+ },
28
+ uiDev: {
29
+ id: "uiDev",
30
+ systemdName: "pi-web-ui-dev.service",
31
+ launchdLabel: "com.pi-web.ui-dev",
32
+ launchdPlistName: "com.pi-web.ui-dev.plist",
33
+ },
34
+ };
35
+ const startServiceOrder = ["sessiond", "web", "uiDev"];
36
+ let latestReleaseCache;
37
+ const runtimePackageInfo = readPackageInfoSync();
38
+ export async function getPiWebComponentStatus(component) {
39
+ const [installed, installation] = await Promise.all([
40
+ readInstalledPackageInfo(),
41
+ detectPiWebInstallation(),
42
+ ]);
43
+ const runtimeVersion = runtimePackageInfo?.version ?? DEFAULT_VERSION;
44
+ const installedVersion = installed?.version;
45
+ return {
46
+ component,
47
+ label: component === "web" ? "Web/UI" : "Session daemon",
48
+ runtimeVersion,
49
+ ...(installedVersion === undefined ? {} : { installedVersion }),
50
+ stale: isInstalledVersionNewer(installedVersion, runtimeVersion),
51
+ available: true,
52
+ installation,
53
+ };
54
+ }
55
+ export async function getPiWebVersionStatus(daemon = new SessionDaemonClient()) {
56
+ const [web, sessiond] = await Promise.all([
57
+ getPiWebComponentStatus("web"),
58
+ getSessiondComponentStatus(daemon),
59
+ ]);
60
+ return {
61
+ packageName: PI_WEB_PACKAGE_NAME,
62
+ generatedAt: new Date().toISOString(),
63
+ components: { web, sessiond },
64
+ };
65
+ }
66
+ export async function getPiWebStatus(daemon = new SessionDaemonClient()) {
67
+ const versionStatus = await getPiWebVersionStatus(daemon);
68
+ const { web, sessiond } = versionStatus.components;
69
+ const release = await getLatestReleaseStatus(web.installedVersion ?? web.runtimeVersion ?? DEFAULT_VERSION);
70
+ const components = { web, sessiond };
71
+ const commands = commandsFor(components);
72
+ const messages = buildMessages(components, release, commands);
73
+ return {
74
+ ...versionStatus,
75
+ release,
76
+ commands,
77
+ messages,
78
+ };
79
+ }
80
+ export function comparePackageVersions(leftVersion, rightVersion) {
81
+ const left = parsePackageVersion(leftVersion);
82
+ const right = parsePackageVersion(rightVersion);
83
+ if (left === undefined || right === undefined)
84
+ return undefined;
85
+ if (left.major !== right.major)
86
+ return left.major - right.major;
87
+ if (left.minor !== right.minor)
88
+ return left.minor - right.minor;
89
+ if (left.patch !== right.patch)
90
+ return left.patch - right.patch;
91
+ if (left.prerelease === right.prerelease)
92
+ return 0;
93
+ if (left.prerelease === undefined)
94
+ return 1;
95
+ if (right.prerelease === undefined)
96
+ return -1;
97
+ return left.prerelease.localeCompare(right.prerelease);
98
+ }
99
+ function readPackageInfoSync() {
100
+ const path = packageJsonPath();
101
+ try {
102
+ return parsePackageInfo(JSON.parse(readFileSync(path, "utf8")), path);
103
+ }
104
+ catch {
105
+ return undefined;
106
+ }
107
+ }
108
+ async function readInstalledPackageInfo() {
109
+ const path = packageJsonPath();
110
+ try {
111
+ await stat(path);
112
+ return parsePackageInfo(JSON.parse(await readFile(path, "utf8")), path);
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ }
118
+ function packageJsonPath() {
119
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
120
+ }
121
+ function parsePackageInfo(value, path) {
122
+ if (!isRecord(value))
123
+ return undefined;
124
+ const name = value["name"];
125
+ const version = value["version"];
126
+ if (typeof name !== "string" || name === "" || typeof version !== "string" || version === "")
127
+ return undefined;
128
+ return { name, version, path };
129
+ }
130
+ async function detectPiWebInstallation() {
131
+ const root = packageRootPath();
132
+ const realRoot = await realPathOrSelf(root);
133
+ const piPackage = await detectPiPackageInstallation(realRoot, root);
134
+ if (piPackage !== undefined)
135
+ return piPackage;
136
+ const npmGlobal = await detectNpmGlobalInstallation(realRoot, root);
137
+ if (npmGlobal !== undefined)
138
+ return npmGlobal;
139
+ return { kind: "local", path: root };
140
+ }
141
+ async function detectPiPackageInstallation(realRoot, displayPath) {
142
+ try {
143
+ const agentDir = getAgentDir();
144
+ const packageManager = new DefaultPackageManager({
145
+ cwd: process.cwd(),
146
+ agentDir,
147
+ settingsManager: SettingsManager.create(process.cwd(), agentDir),
148
+ });
149
+ for (const configuredPackage of packageManager.listConfiguredPackages()) {
150
+ const installedPath = configuredPackage.installedPath ?? packageManager.getInstalledPath(configuredPackage.source, configuredPackage.scope);
151
+ if (installedPath === undefined)
152
+ continue;
153
+ const realInstalledPath = await realPathOrSelf(installedPath);
154
+ if (isSameOrWithin(realInstalledPath, realRoot) || isSameOrWithin(realRoot, realInstalledPath)) {
155
+ return { kind: "pi-package", path: displayPath, source: configuredPackage.source, scope: configuredPackage.scope };
156
+ }
157
+ }
158
+ }
159
+ catch {
160
+ return undefined;
161
+ }
162
+ return undefined;
163
+ }
164
+ async function detectNpmGlobalInstallation(realRoot, displayPath) {
165
+ const npmRoot = npmGlobalRoot();
166
+ if (npmRoot === undefined)
167
+ return undefined;
168
+ const realNpmRoot = await realPathOrSelf(npmRoot);
169
+ if (!isSameOrWithin(realNpmRoot, realRoot))
170
+ return undefined;
171
+ return { kind: "npm-global", path: displayPath, npmRoot };
172
+ }
173
+ function npmGlobalRoot() {
174
+ const result = spawnSync("npm", ["root", "-g"], { encoding: "utf8" });
175
+ if (result.status !== 0)
176
+ return undefined;
177
+ const root = result.stdout.trim();
178
+ return root === "" ? undefined : root;
179
+ }
180
+ function packageRootPath() {
181
+ return dirname(packageJsonPath());
182
+ }
183
+ async function realPathOrSelf(path) {
184
+ return realpath(path).catch(() => resolve(path));
185
+ }
186
+ function isSameOrWithin(parent, candidate) {
187
+ const rel = relative(parent, candidate);
188
+ return rel === "" || (!rel.startsWith("..") && !rel.startsWith(sep));
189
+ }
190
+ async function getSessiondComponentStatus(daemon) {
191
+ try {
192
+ const upstream = await daemon.request("GET", "/health");
193
+ if (upstream.statusCode < 200 || upstream.statusCode >= 300) {
194
+ return unavailableSessiond(`health check returned HTTP ${String(upstream.statusCode)}`);
195
+ }
196
+ const parsed = upstream.body === "" ? undefined : JSON.parse(upstream.body);
197
+ const version = isRecord(parsed) ? parsed["version"] : undefined;
198
+ const component = parsePiWebComponentStatus(version);
199
+ return component ?? unavailableSessiond("health response did not include version information");
200
+ }
201
+ catch (error) {
202
+ return unavailableSessiond(error instanceof Error ? error.message : String(error));
203
+ }
204
+ }
205
+ function unavailableSessiond(error) {
206
+ return {
207
+ component: "sessiond",
208
+ label: "Session daemon",
209
+ stale: false,
210
+ available: false,
211
+ error,
212
+ };
213
+ }
214
+ async function getLatestReleaseStatus(currentVersion) {
215
+ const checkedAtMs = Date.now();
216
+ if (skipVersionCheck()) {
217
+ return { packageName: PI_WEB_PACKAGE_NAME, updateAvailable: false, checkedAt: new Date(checkedAtMs).toISOString(), skipped: true };
218
+ }
219
+ if (latestReleaseCache !== undefined && checkedAtMs - latestReleaseCache.checkedAtMs < LATEST_RELEASE_CACHE_MS) {
220
+ return releaseStatusFromCache(latestReleaseCache, currentVersion);
221
+ }
222
+ try {
223
+ latestReleaseCache = { checkedAtMs, latestVersion: await fetchLatestNpmVersion(currentVersion) };
224
+ }
225
+ catch (error) {
226
+ latestReleaseCache = { checkedAtMs, error: error instanceof Error ? error.message : String(error) };
227
+ }
228
+ return releaseStatusFromCache(latestReleaseCache, currentVersion);
229
+ }
230
+ function releaseStatusFromCache(cache, currentVersion) {
231
+ return {
232
+ packageName: PI_WEB_PACKAGE_NAME,
233
+ ...(cache.latestVersion === undefined ? {} : { latestVersion: cache.latestVersion }),
234
+ updateAvailable: cache.latestVersion === undefined ? false : isNewerPackageVersion(cache.latestVersion, currentVersion),
235
+ checkedAt: new Date(cache.checkedAtMs).toISOString(),
236
+ ...(cache.error === undefined ? {} : { error: cache.error }),
237
+ };
238
+ }
239
+ async function fetchLatestNpmVersion(currentVersion) {
240
+ const response = await fetch(`https://registry.npmjs.org/${encodeURIComponent(PI_WEB_PACKAGE_NAME)}/latest`, {
241
+ headers: {
242
+ accept: "application/json",
243
+ "user-agent": `${PI_WEB_PACKAGE_NAME}/${currentVersion}`,
244
+ },
245
+ signal: AbortSignal.timeout(VERSION_CHECK_TIMEOUT_MS),
246
+ });
247
+ if (!response.ok)
248
+ throw new Error(`npm registry returned HTTP ${String(response.status)}`);
249
+ const data = await response.json();
250
+ const version = isRecord(data) ? data["version"] : undefined;
251
+ if (typeof version !== "string" || version === "")
252
+ throw new Error("npm registry response did not include a version");
253
+ return version;
254
+ }
255
+ function commandsFor(components) {
256
+ const installation = preferredInstallation(components);
257
+ const serviceCommands = nativeServiceCommands();
258
+ const cliCommands = piWebCliCommands(installation);
259
+ const restart = restartCommandFor(installation, serviceCommands, cliCommands);
260
+ const restartWeb = serviceCommands.restartWeb ?? cliCommands.restart;
261
+ const restartSessiond = serviceCommands.restartSessiond ?? cliCommands.restart;
262
+ const status = serviceCommands.status ?? cliCommands.status;
263
+ const update = updateCommandFor(installation, restart);
264
+ return {
265
+ ...(update === undefined ? {} : { update }),
266
+ ...(restart === undefined ? {} : { restart }),
267
+ ...(restartWeb === undefined ? {} : { restartWeb }),
268
+ ...(restartSessiond === undefined ? {} : { restartSessiond }),
269
+ ...(status === undefined ? {} : { status }),
270
+ };
271
+ }
272
+ function preferredInstallation(components) {
273
+ const web = components.web.installation;
274
+ const sessiond = components.sessiond.installation;
275
+ if (web?.kind === "local" || sessiond?.kind === "local")
276
+ return web?.kind === "local" ? web : sessiond;
277
+ return web ?? sessiond;
278
+ }
279
+ function piWebCliCommands(installation) {
280
+ if (installation?.kind !== "npm-global" || !hasCommand("pi-web"))
281
+ return {};
282
+ return { restart: "pi-web restart", status: "pi-web status" };
283
+ }
284
+ function restartCommandFor(installation, serviceCommands, cliCommands) {
285
+ if (installation?.kind === "local" || installation?.kind === "pi-package")
286
+ return serviceCommands.restart ?? cliCommands.restart;
287
+ return cliCommands.restart ?? serviceCommands.restart;
288
+ }
289
+ function updateCommandFor(installation, restartCommand) {
290
+ if (restartCommand === undefined)
291
+ return undefined;
292
+ if (installation?.kind === "pi-package") {
293
+ if (!hasCommand("pi"))
294
+ return undefined;
295
+ return `pi update ${installation.source ?? PI_WEB_NPM_SOURCE} && ${restartCommand}`;
296
+ }
297
+ if (installation?.kind === "local" && installation.path !== undefined) {
298
+ if (!hasCommand("npm") || !isGitCheckoutWithUpstream(installation.path))
299
+ return undefined;
300
+ return `cd ${shellQuote(installation.path)} && git pull --ff-only && npm install && npm run build && ${restartCommand}`;
301
+ }
302
+ if (installation?.kind !== "npm-global" || !hasCommand("npm"))
303
+ return undefined;
304
+ return `npm install -g ${PI_WEB_PACKAGE_NAME} && ${restartCommand}`;
305
+ }
306
+ function nativeServiceCommands() {
307
+ const backend = nativeServiceBackend();
308
+ if (backend === undefined)
309
+ return {};
310
+ const installed = installedServiceIds(backend);
311
+ if (installed.size === 0)
312
+ return {};
313
+ const web = installedServiceRefs(installed, ["web", "uiDev"]);
314
+ const sessiond = installedServiceRefs(installed, ["sessiond"]);
315
+ const restartable = web.length === 0 ? [] : installedServiceRefs(installed);
316
+ const status = installedServiceRefs(installed);
317
+ return {
318
+ ...(restartable.length === 0 ? {} : { restart: restartNativeServicesCommand(backend, restartable) }),
319
+ ...(web.length === 0 ? {} : { restartWeb: restartNativeServicesCommand(backend, web) }),
320
+ ...(sessiond.length === 0 ? {} : { restartSessiond: restartNativeServicesCommand(backend, sessiond) }),
321
+ ...(status.length === 0 ? {} : { status: statusNativeServicesCommand(backend, status) }),
322
+ };
323
+ }
324
+ function nativeServiceBackend() {
325
+ if (process.platform === "linux" && hasCommand("systemctl"))
326
+ return "systemd";
327
+ if (process.platform === "darwin" && hasCommand("launchctl"))
328
+ return "launchd";
329
+ return undefined;
330
+ }
331
+ function installedServiceIds(backend) {
332
+ return new Set(startServiceOrder.filter((id) => existsSync(serviceFilePath(backend, serviceRefs[id]))));
333
+ }
334
+ function installedServiceRefs(installed, candidates = startServiceOrder) {
335
+ return startServiceOrder.filter((id) => candidates.includes(id) && installed.has(id)).map((id) => serviceRefs[id]);
336
+ }
337
+ function serviceFilePath(backend, ref) {
338
+ return backend === "systemd" ? join(systemdServiceDir(), ref.systemdName) : join(launchdServiceDir(), ref.launchdPlistName);
339
+ }
340
+ function systemdServiceDir() {
341
+ return join(homedir(), ".config", "systemd", "user");
342
+ }
343
+ function launchdServiceDir() {
344
+ return join(homedir(), "Library", "LaunchAgents");
345
+ }
346
+ function restartNativeServicesCommand(backend, refs) {
347
+ if (backend === "systemd")
348
+ return `systemctl --user restart ${refs.map((ref) => ref.systemdName).join(" ")}`;
349
+ return refs.map((ref) => `launchctl kickstart -k gui/$(id -u)/${ref.launchdLabel}`).join(" && ");
350
+ }
351
+ function statusNativeServicesCommand(backend, refs) {
352
+ if (backend === "systemd")
353
+ return `systemctl --user status ${refs.map((ref) => ref.systemdName).join(" ")}`;
354
+ return refs.map((ref) => `launchctl print gui/$(id -u)/${ref.launchdLabel}`).join(" && ");
355
+ }
356
+ function isGitCheckoutWithUpstream(path) {
357
+ return hasCommand("git")
358
+ && commandSucceeds("git", ["-C", path, "rev-parse", "--is-inside-work-tree"])
359
+ && commandSucceeds("git", ["-C", path, "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]);
360
+ }
361
+ function hasCommand(command) {
362
+ return commandSucceeds("/usr/bin/env", ["sh", "-c", `command -v ${command}`]);
363
+ }
364
+ function commandSucceeds(command, args) {
365
+ const result = spawnSync(command, args, { encoding: "utf8" });
366
+ return result.status === 0;
367
+ }
368
+ function shellQuote(value) {
369
+ return `'${value.replaceAll("'", "'\\''")}'`;
370
+ }
371
+ function buildMessages(components, release, commands) {
372
+ const messages = [];
373
+ const installedVersion = components.web.installedVersion ?? components.web.runtimeVersion;
374
+ if (release.updateAvailable && release.latestVersion !== undefined) {
375
+ messages.push({
376
+ id: "update-available",
377
+ severity: "info",
378
+ title: "PI WEB 有可用更新",
379
+ body: commands.update === undefined
380
+ ? `PI WEB ${release.latestVersion} 已可用${installedVersion === undefined ? "" : `;当前已安装版本是 ${installedVersion}`}。更新 PI WEB 后,请重启此安装对应的服务或进程。`
381
+ : `PI WEB ${release.latestVersion} 已可用${installedVersion === undefined ? "" : `;当前已安装版本是 ${installedVersion}`}。运行更新命令来更新 PI WEB 并重启服务。`,
382
+ ...optionalMessageCommand(commands.update),
383
+ });
384
+ }
385
+ if (components.web.stale) {
386
+ const command = commands.restartWeb ?? commands.restart;
387
+ messages.push({
388
+ id: "web-stale",
389
+ severity: "warning",
390
+ title: "Web/UI 服务需要重启",
391
+ body: command === undefined
392
+ ? `Web/UI 服务正在运行 ${formatVersion(components.web.runtimeVersion)},但已安装 ${formatVersion(components.web.installedVersion)}。重启 Web/UI 服务或进程即可使用已安装版本。`
393
+ : `Web/UI 服务正在运行 ${formatVersion(components.web.runtimeVersion)},但已安装 ${formatVersion(components.web.installedVersion)}。重启服务即可使用已安装版本。`,
394
+ ...optionalMessageCommand(command),
395
+ });
396
+ }
397
+ if (!components.sessiond.available) {
398
+ messages.push({
399
+ id: "sessiond-unavailable",
400
+ severity: "warning",
401
+ title: "会话守护进程版本不可用",
402
+ body: commands.status === undefined
403
+ ? `PI WEB 无法检查会话守护进程版本${components.sessiond.error === undefined ? "。" : `:${components.sessiond.error}。`}请检查运行此安装的会话守护进程服务或进程。`
404
+ : `PI WEB 无法检查会话守护进程版本${components.sessiond.error === undefined ? "。" : `:${components.sessiond.error}`}`,
405
+ ...optionalMessageCommand(commands.status),
406
+ });
407
+ }
408
+ else if (components.sessiond.stale) {
409
+ const command = commands.restartSessiond ?? commands.restart;
410
+ messages.push({
411
+ id: "sessiond-stale",
412
+ severity: "warning",
413
+ title: "会话守护进程需要重启",
414
+ body: command === undefined
415
+ ? `会话守护进程正在运行 ${formatVersion(components.sessiond.runtimeVersion)},但已安装 ${formatVersion(components.sessiond.installedVersion)}。重启会话守护进程服务或进程即可使用已安装版本。`
416
+ : `会话守护进程正在运行 ${formatVersion(components.sessiond.runtimeVersion)},但已安装 ${formatVersion(components.sessiond.installedVersion)}。重启会话守护进程即可使用已安装版本。`,
417
+ ...optionalMessageCommand(command),
418
+ });
419
+ }
420
+ return messages;
421
+ }
422
+ function optionalMessageCommand(command) {
423
+ return command === undefined ? {} : { command };
424
+ }
425
+ function skipVersionCheck() {
426
+ return ["PI_WEB_SKIP_VERSION_CHECK", "PI_WEB_OFFLINE", "PI_SKIP_VERSION_CHECK", "PI_OFFLINE"].some((key) => {
427
+ const value = process.env[key];
428
+ return value !== undefined && value !== "";
429
+ });
430
+ }
431
+ function isInstalledVersionNewer(installedVersion, runtimeVersion) {
432
+ if (installedVersion === undefined || runtimeVersion === undefined)
433
+ return false;
434
+ return isNewerPackageVersion(installedVersion, runtimeVersion);
435
+ }
436
+ function isNewerPackageVersion(candidateVersion, currentVersion) {
437
+ const comparison = comparePackageVersions(candidateVersion, currentVersion);
438
+ if (comparison !== undefined)
439
+ return comparison > 0;
440
+ return candidateVersion.trim() !== currentVersion.trim();
441
+ }
442
+ function parsePackageVersion(version) {
443
+ const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+.*)?$/u.exec(version.trim());
444
+ if (match === null)
445
+ return undefined;
446
+ const [, major, minor, patch, prerelease] = match;
447
+ if (major === undefined || minor === undefined || patch === undefined)
448
+ return undefined;
449
+ return {
450
+ major: Number.parseInt(major, 10),
451
+ minor: Number.parseInt(minor, 10),
452
+ patch: Number.parseInt(patch, 10),
453
+ ...(prerelease === undefined ? {} : { prerelease }),
454
+ };
455
+ }
456
+ function formatVersion(version) {
457
+ return version ?? "unknown";
458
+ }
459
+ function isRecord(value) {
460
+ return typeof value === "object" && value !== null && !Array.isArray(value);
461
+ }
462
+ //# sourceMappingURL=piWebStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piWebStatus.js","sourceRoot":"","sources":["../../src/server/piWebStatus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { homedir } from "node:os";
2
+ import { basename, dirname, isAbsolute, resolve, sep } from "node:path";
3
+ import { readdir, stat } from "node:fs/promises";
4
+ export function expandUserPath(path) {
5
+ if (path === "" || path === "~")
6
+ return homedir();
7
+ if (path.startsWith(`~${sep}`) || path.startsWith("~/"))
8
+ return resolve(homedir(), path.slice(2));
9
+ return isAbsolute(path) ? resolve(path) : resolve(process.cwd(), path);
10
+ }
11
+ export async function listDirectorySuggestions(query = "") {
12
+ const raw = query.trim();
13
+ const expanded = expandUserPath(raw);
14
+ const endsWithSeparator = raw === "" || raw.endsWith("/") || raw.endsWith("\\") || raw === "~";
15
+ const parent = endsWithSeparator ? expanded : dirname(expanded);
16
+ const search = endsWithSeparator ? "" : basename(expanded).toLowerCase();
17
+ const entries = await readdir(parent, { withFileTypes: true });
18
+ const suggestions = [];
19
+ for (const entry of entries) {
20
+ if (!entry.name.toLowerCase().startsWith(search))
21
+ continue;
22
+ let isDirectory = entry.isDirectory();
23
+ const path = resolve(parent, entry.name);
24
+ if (!isDirectory && entry.isSymbolicLink()) {
25
+ try {
26
+ isDirectory = (await stat(path)).isDirectory();
27
+ }
28
+ catch {
29
+ isDirectory = false;
30
+ }
31
+ }
32
+ if (isDirectory)
33
+ suggestions.push({ path: `${path}/`, kind: "other" });
34
+ }
35
+ return suggestions.sort((a, b) => a.path.localeCompare(b.path)).slice(0, 80);
36
+ }
37
+ //# sourceMappingURL=directorySuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directorySuggestions.js","sourceRoot":"","sources":["../../../src/server/projects/directorySuggestions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,KAAK,GAAG,EAAE;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,iBAAiB,GAAG,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC;IAC/F,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,MAAM,WAAW,GAA2B,EAAE,CAAC;IAE/C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,SAAS;QAC3D,IAAI,WAAW,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,CAAC;YAAC,MAAM,CAAC;gBACP,WAAW,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,WAAW;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { mkdir, realpath, stat } from "node:fs/promises";
2
+ import { expandUserPath } from "./directorySuggestions.js";
3
+ export class ProjectService {
4
+ constructor(store) {
5
+ this.store = store;
6
+ }
7
+ list() {
8
+ return this.store.list();
9
+ }
10
+ async add(input) {
11
+ const requestedPath = expandUserPath(input.path);
12
+ if (input.create === true)
13
+ await mkdir(requestedPath, { recursive: true });
14
+ const resolved = await realpath(requestedPath);
15
+ const s = await stat(resolved);
16
+ if (!s.isDirectory())
17
+ throw new Error("Project path must be a directory");
18
+ return this.store.add(input.name === undefined ? { path: resolved } : { name: input.name, path: resolved });
19
+ }
20
+ async close(id) {
21
+ if (!(await this.store.remove(id)))
22
+ throw new Error("Project not found");
23
+ }
24
+ async requireProject(id) {
25
+ const project = await this.store.get(id);
26
+ if (!project)
27
+ throw new Error("Project not found");
28
+ return project;
29
+ }
30
+ }
31
+ //# sourceMappingURL=projectService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectService.js","sourceRoot":"","sources":["../../../src/server/projects/projectService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,OAAO,cAAc;IACzB,YAA6B,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAG,CAAC;IAEpD,IAAI;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAwD;QAChE,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAU;QACpB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ export class SessionEventHub {
2
+ constructor() {
3
+ this.socketsBySession = new Map();
4
+ this.globalSockets = new Set();
5
+ }
6
+ add(sessionId, socket) {
7
+ let sockets = this.socketsBySession.get(sessionId);
8
+ if (!sockets) {
9
+ sockets = new Set();
10
+ this.socketsBySession.set(sessionId, sockets);
11
+ }
12
+ sockets.add(socket);
13
+ socket.on("close", () => {
14
+ sockets.delete(socket);
15
+ });
16
+ }
17
+ addGlobal(socket) {
18
+ this.globalSockets.add(socket);
19
+ socket.on("close", () => this.globalSockets.delete(socket));
20
+ }
21
+ publish(sessionId, event) {
22
+ const payload = JSON.stringify(event);
23
+ for (const socket of this.socketsBySession.get(sessionId) ?? []) {
24
+ if (socket.readyState === socket.OPEN)
25
+ socket.send(payload);
26
+ }
27
+ }
28
+ publishGlobal(event) {
29
+ this.publishRealtime(event);
30
+ }
31
+ publishRealtime(event) {
32
+ const payload = JSON.stringify(event);
33
+ for (const socket of this.globalSockets) {
34
+ if (socket.readyState === socket.OPEN)
35
+ socket.send(payload);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=sessionEventHub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionEventHub.js","sourceRoot":"","sources":["../../../src/server/realtime/sessionEventHub.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,eAAe;IAA5B;QACmB,qBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAC;QAC1D,kBAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAoC7D,CAAC;IAlCC,GAAG,CAAC,SAAiB,EAAE,MAAsB;QAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAsB;QAC9B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,KAAqB;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,aAAa,CAAC,KAAyB;QACrC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,eAAe,CAAC,KAAoB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF"}