@chainingintention/pi-web-cn 1.202608.9 → 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-B9BLGnQ2.js → CodeViewer-DCl56K0Z.js} +2 -2
- package/dist/client/assets/{TerminalPanel-C1BWg5W2.js → TerminalPanel-DCvoEjUF.js} +6 -6
- package/dist/client/assets/{index-x7EWN9ro.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/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/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/piSessionManagerGateway.js +129 -2
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -1
- package/dist/server/sessions/piSessionService.js +131 -97
- 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/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 +26 -8
- package/server-plugin-api.d.ts +1 -0
- package/dist/client/assets/UnifiedDiffViewer-ClTQ6Ok0.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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION = 1;
|
|
2
|
+
export function asWorkspaceCatalog(projects, workspaces) {
|
|
3
|
+
if (isWorkspaceCatalog(workspaces))
|
|
4
|
+
return workspaces;
|
|
5
|
+
return {
|
|
6
|
+
resolveProject: async (projectId) => {
|
|
7
|
+
const project = await projects.requireProject(projectId);
|
|
8
|
+
const listed = await workspaces.list(project);
|
|
9
|
+
return { status: "folder", projectId, workspaces: listed, diagnostics: [] };
|
|
10
|
+
},
|
|
11
|
+
list: async (projectId) => {
|
|
12
|
+
const project = await projects.requireProject(projectId);
|
|
13
|
+
return await workspaces.list(project);
|
|
14
|
+
},
|
|
15
|
+
resolve: async (projectId, workspaceId) => {
|
|
16
|
+
const project = await projects.requireProject(projectId);
|
|
17
|
+
const workspace = (await workspaces.list(project)).find((candidate) => candidate.id === workspaceId);
|
|
18
|
+
if (workspace === undefined)
|
|
19
|
+
throw new Error("Workspace not found");
|
|
20
|
+
return workspace;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function isWorkspaceCatalog(value) {
|
|
25
|
+
return "resolveProject" in value && "resolve" in value;
|
|
26
|
+
}
|
|
27
|
+
export function createWorkspaceProviderRuntimeSnapshot(records, health, safeStart, diagnostics = []) {
|
|
28
|
+
return Object.freeze({
|
|
29
|
+
protocolVersion: WORKSPACE_PROVIDER_RUNTIME_PROTOCOL_VERSION,
|
|
30
|
+
...(safeStart === undefined ? {} : { safeStart }),
|
|
31
|
+
records: Object.freeze(records.map((record) => Object.freeze({ ...record }))),
|
|
32
|
+
health: Object.freeze(health.map((inspection) => Object.freeze({
|
|
33
|
+
...inspection,
|
|
34
|
+
health: Object.freeze({ ...inspection.health }),
|
|
35
|
+
}))),
|
|
36
|
+
diagnostics: Object.freeze(diagnostics.map((diagnostic) => Object.freeze({ ...diagnostic }))),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export class WorkspaceCatalogUnavailableError extends Error {
|
|
40
|
+
constructor() {
|
|
41
|
+
super(...arguments);
|
|
42
|
+
this.name = "WorkspaceCatalogUnavailableError";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export class WorkspaceCatalogProtocolError extends Error {
|
|
46
|
+
constructor() {
|
|
47
|
+
super(...arguments);
|
|
48
|
+
this.name = "WorkspaceCatalogProtocolError";
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class WorkspaceCatalogRequestError extends Error {
|
|
52
|
+
constructor(message, statusCode) {
|
|
53
|
+
super(message);
|
|
54
|
+
this.statusCode = statusCode;
|
|
55
|
+
this.name = "WorkspaceCatalogRequestError";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** Preserve route-specific legacy status codes while making authority failures explicit. */
|
|
59
|
+
export function workspaceCatalogHttpStatus(error, fallbackStatus) {
|
|
60
|
+
if (error instanceof WorkspaceCatalogUnavailableError)
|
|
61
|
+
return 503;
|
|
62
|
+
if (error instanceof WorkspaceCatalogProtocolError)
|
|
63
|
+
return 502;
|
|
64
|
+
if (error instanceof WorkspaceCatalogRequestError) {
|
|
65
|
+
if (error.statusCode === 503)
|
|
66
|
+
return 503;
|
|
67
|
+
if (error.statusCode >= 500)
|
|
68
|
+
return 502;
|
|
69
|
+
}
|
|
70
|
+
return fallbackStatus;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Browser plugin v1 expects a top-level branch label. During the migration, an
|
|
74
|
+
* owner may publish that deprecated value as public metadata; core does not
|
|
75
|
+
* branch on provider identity and replacements are not required to publish it.
|
|
76
|
+
*/
|
|
77
|
+
export function withBrowserV1WorkspaceCompatibility(workspace) {
|
|
78
|
+
const metadata = workspace.provider?.metadata;
|
|
79
|
+
if (metadata === undefined)
|
|
80
|
+
return workspace;
|
|
81
|
+
const branch = metadata["branch"];
|
|
82
|
+
return {
|
|
83
|
+
...workspace,
|
|
84
|
+
...(typeof branch === "string" ? { branch } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=workspaceCatalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceCatalog.js","sourceRoot":"","sources":["../../../src/server/workspaces/workspaceCatalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { asWorkspaceCatalog } from "./workspaceCatalog.js";
|
|
1
2
|
export async function resolveWorkspaceContext(projects, workspaces, projectId, workspaceId) {
|
|
2
3
|
const project = await projects.requireProject(projectId);
|
|
3
|
-
return resolveProjectWorkspaceContext(workspaces, project, workspaceId);
|
|
4
|
+
return resolveProjectWorkspaceContext(asWorkspaceCatalog(projects, workspaces), project, workspaceId);
|
|
4
5
|
}
|
|
5
|
-
export async function resolveProjectWorkspaceContext(workspaces, project, workspaceId) {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
throw new Error("Workspace not found");
|
|
6
|
+
export async function resolveProjectWorkspaceContext(workspaces, project, workspaceId, options = {}) {
|
|
7
|
+
const catalog = asWorkspaceCatalog({ requireProject: () => Promise.resolve(project) }, workspaces);
|
|
8
|
+
const workspace = await catalog.resolve(project.id, workspaceId, options);
|
|
9
9
|
return { project, workspace, root: workspace.path };
|
|
10
10
|
}
|
|
11
11
|
//# sourceMappingURL=workspaceContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/server/workspaces/workspaceContext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspaceContext.js","sourceRoot":"","sources":["../../../src/server/workspaces/workspaceContext.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAmE,MAAM,uBAAuB,CAAC;AAQ5H,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,QAAwB,EAAE,UAAiC,EAAE,SAAiB,EAAE,WAAmB;IAC/I,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACzD,OAAO,8BAA8B,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,UAAiC,EAAE,OAAgB,EAAE,WAAmB,EAAE,UAA0C,EAAE;IACzK,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -1,117 +1,132 @@
|
|
|
1
|
+
import { parseWorkspaceRemovalRequest, WORKSPACE_REMOVAL_REQUEST_BODY_MAX_BYTES, } from "../../shared/workspaceRemovalProtocol.js";
|
|
1
2
|
import { workspaceDeletionMetadata } from "../../shared/workspaceDeletion.js";
|
|
2
3
|
import { SessionDaemonClient } from "../../sessiond/sessionDaemonClient.js";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import { requestCancellation } from "../requestCancellation.js";
|
|
5
|
+
import { encodeManagementContext, managementContextForRequest, managementToolAllowed, MANAGEMENT_EMBED_CONTEXT_HEADER, WORKBENCH_ACCESS_HANDLE_HEADER } from "../managementEmbed.js";
|
|
6
|
+
export function registerWorkspaceDeletionRoutes(app, daemon = new SessionDaemonClient(), prefixOrWorkspaces = "/api", managementEmbedOrDaemon, legacyPrefix = "/api", legacyManagementEmbed) {
|
|
7
|
+
const legacy = typeof prefixOrWorkspaces !== "string";
|
|
8
|
+
const sessionDaemon = legacy
|
|
9
|
+
? (managementEmbedOrDaemon !== undefined && "request" in managementEmbedOrDaemon ? managementEmbedOrDaemon : new SessionDaemonClient())
|
|
10
|
+
: ("request" in daemon ? daemon : new SessionDaemonClient());
|
|
11
|
+
const prefix = legacy ? legacyPrefix : prefixOrWorkspaces;
|
|
12
|
+
const managementEmbed = legacy ? legacyManagementEmbed : isSessionDaemon(managementEmbedOrDaemon) ? undefined : managementEmbedOrDaemon;
|
|
13
|
+
if (legacy) {
|
|
14
|
+
if (!isProjectService(daemon) || !isWorkspaceService(prefixOrWorkspaces))
|
|
15
|
+
throw new Error("Invalid legacy workspace deletion dependencies");
|
|
16
|
+
registerLegacyWorkspaceDeletionRoutes(app, daemon, prefixOrWorkspaces, sessionDaemon, prefix, managementEmbed);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
app.delete(`${prefix}/projects/:projectId/workspaces/:workspaceId`, { bodyLimit: WORKSPACE_REMOVAL_REQUEST_BODY_MAX_BYTES }, async (request, reply) => {
|
|
20
|
+
const managementContext = await managementContextForRequest(request, managementEmbed, reply);
|
|
21
|
+
if (managementContext !== undefined && !managementToolAllowed(managementContext, "terminal-command-runs")) {
|
|
22
|
+
return reply.code(403).send({ error: "Terminal command runs are disabled in management embed mode" });
|
|
23
|
+
}
|
|
24
|
+
let body;
|
|
6
25
|
try {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return
|
|
26
|
+
body = parseWorkspaceRemovalRequest(request.body);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
return reply.code(400).send({ error: errorMessage(error) });
|
|
30
|
+
}
|
|
31
|
+
const cancellation = requestCancellation(request, reply);
|
|
32
|
+
try {
|
|
33
|
+
const upstream = await sessionDaemon.request("DELETE", `/workspace-removals/projects/${encodeURIComponent(request.params.projectId)}/workspaces/${encodeURIComponent(request.params.workspaceId)}`, body, managementHeaders(managementContext, managementEmbed), cancellation.signal);
|
|
34
|
+
return await proxyJsonResponse(reply, upstream);
|
|
11
35
|
}
|
|
12
36
|
catch (error) {
|
|
13
|
-
return reply.code(
|
|
37
|
+
return await reply.code(502).send({
|
|
38
|
+
error: `Session daemon unavailable: ${errorMessage(error)}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
cancellation.dispose();
|
|
14
43
|
}
|
|
15
44
|
});
|
|
16
45
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const projectWorkspaces = await workspaces.list(project);
|
|
22
|
-
const targetWorkspace = projectWorkspaces.find((workspace) => workspace.id === workspaceId);
|
|
23
|
-
if (targetWorkspace === undefined)
|
|
24
|
-
throw new Error("Workspace not found");
|
|
25
|
-
if (!canDeleteWorkspace(targetWorkspace))
|
|
26
|
-
throw new Error("Only secondary Git worktrees can be deleted");
|
|
27
|
-
const commandWorkspace = projectWorkspaces.find((workspace) => workspace.isMain) ?? projectWorkspaces.find((workspace) => workspace.id !== targetWorkspace.id);
|
|
28
|
-
if (commandWorkspace === undefined)
|
|
29
|
-
throw new Error("Project main workspace not found");
|
|
30
|
-
const closeResponse = await requestJson(daemon, "DELETE", `/terminals?cwd=${encodeURIComponent(targetWorkspace.path)}`, undefined, managementHeaders(managementContext));
|
|
31
|
-
if (closeResponse.statusCode < 200 || closeResponse.statusCode >= 300)
|
|
32
|
-
throw new Error(`Failed to close workspace terminals: ${responseError(closeResponse.body, closeResponse.statusCode)}`);
|
|
33
|
-
const deleteResponse = await requestJson(daemon, "POST", "/terminal-command-runs", {
|
|
34
|
-
origin: "core",
|
|
35
|
-
projectId: project.id,
|
|
36
|
-
workspaceId: commandWorkspace.id,
|
|
37
|
-
cwd: commandWorkspace.path,
|
|
38
|
-
title: `Delete workspace: ${workspaceLabel(targetWorkspace)}`,
|
|
39
|
-
command: `git worktree remove ${shellQuote(targetWorkspace.path)}`,
|
|
40
|
-
metadata: workspaceDeletionMetadata(targetWorkspace),
|
|
41
|
-
}, managementHeaders(managementContext));
|
|
42
|
-
if (deleteResponse.statusCode < 200 || deleteResponse.statusCode >= 300)
|
|
43
|
-
throw new Error(`Failed to start workspace deletion: ${responseError(deleteResponse.body, deleteResponse.statusCode)}`);
|
|
44
|
-
return parseTerminalCommandRun(deleteResponse.body);
|
|
45
|
-
}
|
|
46
|
-
function canDeleteWorkspace(workspace) {
|
|
47
|
-
return workspace.isGitWorktree && !workspace.isMain;
|
|
48
|
-
}
|
|
49
|
-
function workspaceLabel(workspace) {
|
|
50
|
-
return workspace.branch ?? workspace.label;
|
|
51
|
-
}
|
|
52
|
-
async function requestJson(daemon, method, path, body, headers) {
|
|
53
|
-
const response = await daemon.request(method, path, body, headers);
|
|
54
|
-
return { statusCode: response.statusCode, body: response.body === "" ? undefined : JSON.parse(response.body) };
|
|
55
|
-
}
|
|
56
|
-
function managementHeaders(context) {
|
|
57
|
-
return context === undefined ? undefined : { [MANAGEMENT_EMBED_CONTEXT_HEADER]: encodeManagementContext(context) };
|
|
58
|
-
}
|
|
59
|
-
function responseError(body, statusCode) {
|
|
60
|
-
if (isRecord(body) && typeof body["error"] === "string")
|
|
61
|
-
return body["error"];
|
|
62
|
-
return `HTTP ${String(statusCode)}`;
|
|
63
|
-
}
|
|
64
|
-
function parseTerminalCommandRun(value) {
|
|
65
|
-
if (!isRecord(value))
|
|
66
|
-
throw new Error("Invalid terminal command run response");
|
|
67
|
-
const metadata = value["metadata"];
|
|
68
|
-
if (!isRecord(metadata))
|
|
69
|
-
throw new Error("Invalid terminal command run response");
|
|
70
|
-
const startedAt = optionalString(value, "startedAt");
|
|
71
|
-
const exitCode = optionalNumber(value, "exitCode");
|
|
72
|
-
const completedAt = optionalString(value, "completedAt");
|
|
46
|
+
function managementHeaders(context, runtime) {
|
|
47
|
+
if (context === undefined)
|
|
48
|
+
return undefined;
|
|
49
|
+
const handle = runtime?.resourceHandle?.(context);
|
|
73
50
|
return {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
projectId: requireString(value, "projectId"),
|
|
77
|
-
workspaceId: requireString(value, "workspaceId"),
|
|
78
|
-
terminalId: requireString(value, "terminalId"),
|
|
79
|
-
title: requireString(value, "title"),
|
|
80
|
-
command: requireString(value, "command"),
|
|
81
|
-
status: parseStatus(value["status"]),
|
|
82
|
-
createdAt: requireString(value, "createdAt"),
|
|
83
|
-
metadata: Object.fromEntries(Object.entries(metadata).filter((entry) => typeof entry[1] === "string")),
|
|
84
|
-
...(startedAt === undefined ? {} : { startedAt }),
|
|
85
|
-
...(exitCode === undefined ? {} : { exitCode }),
|
|
86
|
-
...(completedAt === undefined ? {} : { completedAt }),
|
|
51
|
+
[MANAGEMENT_EMBED_CONTEXT_HEADER]: encodeManagementContext(context),
|
|
52
|
+
...(handle === undefined ? {} : { [WORKBENCH_ACCESS_HANDLE_HEADER]: handle }),
|
|
87
53
|
};
|
|
88
54
|
}
|
|
89
|
-
function
|
|
90
|
-
|
|
55
|
+
function proxyJsonResponse(reply, upstream) {
|
|
56
|
+
reply.code(upstream.statusCode);
|
|
57
|
+
const contentType = upstream.headers["content-type"];
|
|
58
|
+
if (contentType !== undefined && contentType !== "")
|
|
59
|
+
reply.header("content-type", contentType);
|
|
60
|
+
if (upstream.body === "")
|
|
61
|
+
return undefined;
|
|
62
|
+
try {
|
|
63
|
+
const value = JSON.parse(upstream.body);
|
|
91
64
|
return value;
|
|
92
|
-
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return reply.code(502).send({
|
|
68
|
+
error: `Invalid session daemon workspace removal response: ${errorMessage(error)}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
93
71
|
}
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
if (typeof value !== "string")
|
|
97
|
-
throw new Error("Invalid terminal command run response");
|
|
98
|
-
return value;
|
|
72
|
+
function errorMessage(error) {
|
|
73
|
+
return error instanceof Error ? error.message : String(error);
|
|
99
74
|
}
|
|
100
|
-
function
|
|
101
|
-
|
|
102
|
-
if (value === undefined)
|
|
103
|
-
return undefined;
|
|
104
|
-
if (typeof value !== "string")
|
|
105
|
-
throw new Error("Invalid terminal command run response");
|
|
106
|
-
return value;
|
|
75
|
+
function isSessionDaemon(value) {
|
|
76
|
+
return value !== undefined && "request" in value;
|
|
107
77
|
}
|
|
108
|
-
function
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
78
|
+
function isProjectService(value) {
|
|
79
|
+
return "requireProject" in value;
|
|
80
|
+
}
|
|
81
|
+
function isWorkspaceService(value) {
|
|
82
|
+
return typeof value !== "string" && "list" in value;
|
|
83
|
+
}
|
|
84
|
+
function registerLegacyWorkspaceDeletionRoutes(app, projects, workspaces, daemon, prefix, managementEmbed) {
|
|
85
|
+
app.delete(`${prefix}/projects/:projectId/workspaces/:workspaceId`, async (request, reply) => {
|
|
86
|
+
try {
|
|
87
|
+
const context = await managementContextForRequest(request, managementEmbed, reply);
|
|
88
|
+
if (context !== undefined && !managementToolAllowed(context, "terminal-command-runs")) {
|
|
89
|
+
return await reply.code(403).send({ error: "Terminal command runs are disabled in management embed mode" });
|
|
90
|
+
}
|
|
91
|
+
const project = context === undefined ? await projects.requireProject(request.params.projectId) : await projects.requireProject(request.params.projectId);
|
|
92
|
+
const listed = await workspaces.list(project);
|
|
93
|
+
const target = listed.find((workspace) => workspace.id === request.params.workspaceId);
|
|
94
|
+
if (target === undefined)
|
|
95
|
+
throw new Error("Workspace not found");
|
|
96
|
+
if (!target.isGitWorktree || target.isMain)
|
|
97
|
+
throw new Error("Only secondary Git worktrees can be deleted");
|
|
98
|
+
const commandWorkspace = listed.find((workspace) => workspace.isMain) ?? listed.find((workspace) => workspace.id !== target.id);
|
|
99
|
+
if (commandWorkspace === undefined)
|
|
100
|
+
throw new Error("Project main workspace not found");
|
|
101
|
+
const closed = await daemon.request("DELETE", `/terminals?cwd=${encodeURIComponent(target.path)}`, undefined, managementHeaders(context, managementEmbed));
|
|
102
|
+
if (closed.statusCode < 200 || closed.statusCode >= 300)
|
|
103
|
+
throw new Error(`Failed to close workspace terminals: ${responseError(closed.body, closed.statusCode)}`);
|
|
104
|
+
const started = await daemon.request("POST", "/terminal-command-runs", {
|
|
105
|
+
origin: "core",
|
|
106
|
+
projectId: project.id,
|
|
107
|
+
workspaceId: commandWorkspace.id,
|
|
108
|
+
cwd: commandWorkspace.path,
|
|
109
|
+
title: `Delete workspace: ${target.branch ?? target.label}`,
|
|
110
|
+
command: `git worktree remove ${shellQuote(target.path)}`,
|
|
111
|
+
metadata: workspaceDeletionMetadata(target),
|
|
112
|
+
}, managementHeaders(context, managementEmbed));
|
|
113
|
+
if (started.statusCode < 200 || started.statusCode >= 300)
|
|
114
|
+
throw new Error(`Failed to start workspace deletion: ${responseError(started.body, started.statusCode)}`);
|
|
115
|
+
return await reply.code(started.statusCode).send(JSON.parse(started.body));
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return reply.code(400).send({ error: errorMessage(error) });
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
function responseError(body, statusCode) {
|
|
123
|
+
try {
|
|
124
|
+
const value = JSON.parse(body);
|
|
125
|
+
if (isRecord(value) && typeof value["error"] === "string")
|
|
126
|
+
return value["error"];
|
|
127
|
+
}
|
|
128
|
+
catch { /* fall through */ }
|
|
129
|
+
return `HTTP ${String(statusCode)}`;
|
|
115
130
|
}
|
|
116
131
|
function shellQuote(value) {
|
|
117
132
|
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaceDeletionRoutes.js","sourceRoot":"","sources":["../../../src/server/workspaces/workspaceDeletionRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspaceDeletionRoutes.js","sourceRoot":"","sources":["../../../src/server/workspaces/workspaceDeletionRoutes.ts"],"names":[],"mappings":"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"}
|