@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.
- package/README.md +2 -0
- package/dist/cli.js +123 -72
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/{CodeViewer-CWKEeX0r.js → CodeViewer-DCl56K0Z.js} +2 -2
- package/dist/client/assets/{TerminalPanel-BmA7Ayzk.js → TerminalPanel-DCvoEjUF.js} +6 -6
- package/dist/client/assets/{index-D6j67Izj.js → index-CMvms5cF.js} +534 -512
- package/dist/client/index.html +1 -1
- package/dist/config.js +39 -18
- package/dist/config.js.map +1 -1
- package/dist/nativeServices/serviceAction.js +128 -0
- package/dist/nativeServices/serviceAction.js.map +1 -0
- package/dist/pi-web-plugins/git/browser/git-contract.js +108 -0
- package/dist/pi-web-plugins/git/browser/git-panel.js +609 -0
- package/dist/pi-web-plugins/git/browser/gitFileList.js +43 -0
- package/dist/pi-web-plugins/git/browser/gitFileShared.js +16 -0
- package/dist/pi-web-plugins/git/browser/gitFileTree.js +81 -0
- package/dist/pi-web-plugins/git/browser/gitFileViewPreference.js +35 -0
- package/dist/pi-web-plugins/git/browser/gitRoute.js +42 -0
- package/dist/pi-web-plugins/git/browser/pi-web-plugin.js +10 -0
- package/dist/pi-web-plugins/git/browser/unifiedDiff.js +301 -0
- package/dist/pi-web-plugins/git/git-backend.js +433 -0
- package/dist/pi-web-plugins/git/package.json +15 -0
- package/dist/pi-web-plugins/git/server-plugin.js +176 -0
- package/dist/pi-web-plugins/info/infoInternals.js +1 -1
- package/dist/pi-web-plugins/info/pi-web-plugin.js +2 -2
- package/dist/pi-web-plugins/relays/pi-web-plugin.js +1 -1
- package/dist/pi-web-plugins/relays/relayDiscovery.js +128 -23
- package/dist/pi-web-plugins/relays/relaysPanelElement.js +138 -16
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +1 -1
- package/dist/pi-web-plugins/workspace-tasks/pi-web-plugin.js +1 -1
- package/dist/piWebVersionReport.js +63 -4
- package/dist/piWebVersionReport.js.map +1 -1
- package/dist/plugin-api.d.ts +40 -18
- package/dist/pluginRecoveryCli.js +172 -0
- package/dist/pluginRecoveryCli.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +7 -1
- package/dist/server/activity/workspaceActivityService.js.map +1 -1
- package/dist/server/app.js +49 -23
- package/dist/server/app.js.map +1 -1
- package/dist/server/audit/managementAuditStore.js +4 -2
- package/dist/server/audit/managementAuditStore.js.map +1 -1
- package/dist/server/configRoutes.js +4 -5
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/machines/machineClient.js +23 -4
- package/dist/server/machines/machineClient.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +162 -8
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/managementEmbed.js +6 -0
- package/dist/server/managementEmbed.js.map +1 -1
- package/dist/server/piWebPluginCatalog.js +441 -0
- package/dist/server/piWebPluginCatalog.js.map +1 -0
- package/dist/server/piWebPluginLifecycle.js +162 -0
- package/dist/server/piWebPluginLifecycle.js.map +1 -0
- package/dist/server/piWebPluginService.js +55 -7
- package/dist/server/piWebPluginService.js.map +1 -1
- package/dist/server/plugins/pluginBackendProxyRoutes.js +80 -0
- package/dist/server/plugins/pluginBackendProxyRoutes.js.map +1 -0
- package/dist/server/plugins/serverPluginExec.js +184 -0
- package/dist/server/plugins/serverPluginExec.js.map +1 -0
- package/dist/server/plugins/serverPluginRuntime.js +480 -0
- package/dist/server/plugins/serverPluginRuntime.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +13 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -1
- package/dist/server/realtime/sessionEventScope.js +8 -1
- package/dist/server/realtime/sessionEventScope.js.map +1 -1
- package/dist/server/requestCancellation.js +28 -0
- package/dist/server/requestCancellation.js.map +1 -0
- package/dist/server/sessiond/agentProcessEnvironment.js +61 -0
- package/dist/server/sessiond/agentProcessEnvironment.js.map +1 -0
- package/dist/server/sessiond/managementProjectResolver.js +16 -0
- package/dist/server/sessiond/managementProjectResolver.js.map +1 -0
- package/dist/server/sessiond/pluginBackendRoutes.js +78 -0
- package/dist/server/sessiond/pluginBackendRoutes.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/sessionServiceDependencies.js +0 -1
- package/dist/server/sessiond/sessionServiceDependencies.js.map +1 -1
- package/dist/server/sessiond/sessiondStateOwnership.js +139 -0
- package/dist/server/sessiond/sessiondStateOwnership.js.map +1 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js +38 -0
- package/dist/server/sessiond/workspaceCatalogRoutes.js.map +1 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js +56 -0
- package/dist/server/sessiond/workspaceRemovalRoutes.js.map +1 -0
- package/dist/server/sessiond.js +98 -11
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/authService.js +15 -51
- package/dist/server/sessions/authService.js.map +1 -1
- package/dist/server/sessions/dockerEnvironmentFacts.js +181 -0
- package/dist/server/sessions/dockerEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/managementAgentTools.js +12 -4
- package/dist/server/sessions/managementAgentTools.js.map +1 -1
- package/dist/server/sessions/managementSandbox.js +5 -5
- package/dist/server/sessions/managementSandbox.js.map +1 -1
- package/dist/server/sessions/piSessionManagerGateway.js +129 -2
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +268 -119
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +15 -1
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionEnvironmentFacts.js +48 -0
- package/dist/server/sessions/sessionEnvironmentFacts.js.map +1 -0
- package/dist/server/sessions/sessionFileFormat.js +27 -0
- package/dist/server/sessions/sessionFileFormat.js.map +1 -0
- package/dist/server/sessions/sessionFileHeader.js +82 -23
- package/dist/server/sessions/sessionFileHeader.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +16 -2
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/sessionSummaryScanner.js +491 -0
- package/dist/server/sessions/sessionSummaryScanner.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +4 -8
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -1
- package/dist/server/sessions/spawnTargetResolver.js +2 -2
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -1
- package/dist/server/status/machineStatusRoutes.js +10 -0
- package/dist/server/status/machineStatusRoutes.js.map +1 -0
- package/dist/server/status/machineStatusService.js +115 -0
- package/dist/server/status/machineStatusService.js.map +1 -0
- package/dist/server/status/workspaceAttribution.js +71 -0
- package/dist/server/status/workspaceAttribution.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -1
- package/dist/server/workbench/skillSync.js +9 -1
- package/dist/server/workbench/skillSync.js.map +1 -1
- package/dist/server/workspaceExplorerRoutes.js +12 -25
- package/dist/server/workspaceExplorerRoutes.js.map +1 -1
- package/dist/server/workspaces/effectivePathAccess.js +3 -2
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -1
- package/dist/server/workspaces/fileContentService.js +17 -9
- package/dist/server/workspaces/fileContentService.js.map +1 -1
- package/dist/server/workspaces/fileOperationService.js +4 -17
- package/dist/server/workspaces/fileOperationService.js.map +1 -1
- package/dist/server/workspaces/filePreviewResponseHeaders.js +18 -0
- package/dist/server/workspaces/filePreviewResponseHeaders.js.map +1 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js +55 -0
- package/dist/server/workspaces/filePreviewResponsePolicy.js.map +1 -0
- package/dist/server/workspaces/filePreviewService.js +81 -0
- package/dist/server/workspaces/filePreviewService.js.map +1 -0
- package/dist/server/workspaces/projectWorkspaceCwds.js +2 -2
- package/dist/server/workspaces/projectWorkspaceCwds.js.map +1 -1
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js +416 -0
- package/dist/server/workspaces/sessionDaemonWorkspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceCatalog.js +87 -0
- package/dist/server/workspaces/workspaceCatalog.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +5 -5
- package/dist/server/workspaces/workspaceContext.js.map +1 -1
- package/dist/server/workspaces/workspaceDeletionRoutes.js +114 -99
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -1
- package/dist/server/workspaces/workspaceProviderRegistry.js +650 -0
- package/dist/server/workspaces/workspaceProviderRegistry.js.map +1 -0
- package/dist/server/workspaces/workspaceRemovalService.js +258 -0
- package/dist/server/workspaces/workspaceRemovalService.js.map +1 -0
- package/dist/server/workspaces/workspaceRouteContext.js +2 -1
- package/dist/server/workspaces/workspaceRouteContext.js.map +1 -1
- package/dist/server/workspaces/workspaceRouteErrors.js +7 -0
- package/dist/server/workspaces/workspaceRouteErrors.js.map +1 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js +39 -0
- package/dist/server/workspaces/worktreePreRemoveHook.js.map +1 -0
- package/dist/server-plugin-api.d.ts +115 -0
- package/dist/server-plugin-api.js +2 -0
- package/dist/server-plugin-api.js.map +1 -0
- package/dist/serverPluginRecovery.js +138 -0
- package/dist/serverPluginRecovery.js.map +1 -0
- package/dist/sessiond/config.js +6 -0
- package/dist/sessiond/config.js.map +1 -1
- package/dist/sessiond/sessionDaemonClient.js +7 -6
- package/dist/sessiond/sessionDaemonClient.js.map +1 -1
- package/dist/shared/apiTypes.js +2 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +2 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +28 -2
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/machineStatus.js +60 -0
- package/dist/shared/machineStatus.js.map +1 -0
- package/dist/shared/pluginApiTypes.d.ts +155 -0
- package/dist/shared/pluginBackendProtocol.js +110 -0
- package/dist/shared/pluginBackendProtocol.js.map +1 -0
- package/dist/shared/pluginIds.js +3 -0
- package/dist/shared/pluginIds.js.map +1 -1
- package/dist/shared/pluginRecoveryCommands.js +14 -0
- package/dist/shared/pluginRecoveryCommands.js.map +1 -0
- package/dist/shared/workspaceFiles.js +41 -2
- package/dist/shared/workspaceFiles.js.map +1 -1
- package/dist/shared/workspaceRemovalProtocol.js +24 -0
- package/dist/shared/workspaceRemovalProtocol.js.map +1 -0
- package/docs/config.md +12 -5
- package/docs/plugins.md +15 -21
- package/package.json +27 -8
- package/server-plugin-api.d.ts +1 -0
- package/skills/README.md +12 -0
- package/skills/relay/SKILL.md +115 -0
- package/dist/client/assets/UnifiedDiffViewer-2DACwxFY.js +0 -39
- package/dist/plugin-api/unstable.d.ts +0 -22
- package/dist/server/sessions/parentSessionLocator.js +0 -75
- package/dist/server/sessions/parentSessionLocator.js.map +0 -1
- package/dist/server/workspaces/imagePreviewService.js +0 -40
- package/dist/server/workspaces/imagePreviewService.js.map +0 -1
- package/dist/shared/apiTypes.d.ts +0 -1323
- package/dist/shared/thinkingLevels.d.ts +0 -29
- 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
|
|
23
|
-
export async function
|
|
24
|
-
let
|
|
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
|
-
|
|
32
|
+
rootListing = await files.listFiles(relayPath);
|
|
27
33
|
}
|
|
28
34
|
catch (error) {
|
|
29
35
|
return fileAccessFailure(error);
|
|
30
36
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
/**
|
|
51
|
-
export function
|
|
52
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|
63
|
-
return {
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
134
|
-
|
|
135
|
-
|
|
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.
|
|
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 =
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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; }
|
|
@@ -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:
|
|
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
|
-
|
|
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
|
|
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
|
|
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":"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"}
|