@theruansilva/omp-web 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +181 -0
- package/dist/cli/doctor.js +118 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/serviceTemplates.js +55 -0
- package/dist/cli/serviceTemplates.js.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli.js +872 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/assets/CodeViewer-CJNBz-Ox.js +4 -0
- package/dist/client/assets/TerminalPanel-B9-LUv7E.js +126 -0
- package/dist/client/assets/UnifiedDiffViewer-BUqme4se.js +34 -0
- package/dist/client/assets/index-DGBYb2j9.css +1 -0
- package/dist/client/assets/index-uWm_YNRB.js +4427 -0
- package/dist/client/assets/vendor-editor-core-D9EJm1dE.js +10 -0
- package/dist/client/assets/vendor-editor-languages-N6dcxgRO.js +26 -0
- package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
- package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
- package/dist/client/favicon-16x16.png +0 -0
- package/dist/client/favicon-180x180.png +0 -0
- package/dist/client/favicon-192x192.png +0 -0
- package/dist/client/favicon-32x32.png +0 -0
- package/dist/client/favicon-512x512.png +0 -0
- package/dist/client/favicon.ico +0 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/favicon.svg +11 -0
- package/dist/client/index.html +68 -0
- package/dist/client/manifest.webmanifest +36 -0
- package/dist/client-react/assets/index-BQ6zLLfz.js +51 -0
- package/dist/client-react/assets/index-Befs78HG.css +1 -0
- package/dist/client-react/index.html +16 -0
- package/dist/config.js +272 -0
- package/dist/config.js.map +1 -0
- package/dist/docker/ompWebDockerCommandPlan.js +211 -0
- package/dist/docker/ompWebDockerCommandPlan.js.map +1 -0
- package/dist/docker/piWebDockerCommandPlan.js +211 -0
- package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
- package/dist/omp-web-plugins/info/omp-web-plugin.js +51 -0
- package/dist/omp-web-plugins/info/package.json +9 -0
- package/dist/omp-web-plugins/schedule-prompts/omp-web-plugin.js +43 -0
- package/dist/omp-web-plugins/schedule-prompts/package.json +9 -0
- package/dist/omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +242 -0
- package/dist/omp-web-plugins/schedule-prompts/types.js +2 -0
- package/dist/omp-web-plugins/updates/omp-web-plugin.js +173 -0
- package/dist/omp-web-plugins/updates/package.json +9 -0
- package/dist/omp-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/ompWebVersionReport.js +217 -0
- package/dist/ompWebVersionReport.js.map +1 -0
- package/dist/pi-web-plugins/info/package.json +9 -0
- package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
- package/dist/pi-web-plugins/schedule-prompts/package.json +9 -0
- package/dist/pi-web-plugins/schedule-prompts/pi-web-plugin.js +43 -0
- package/dist/pi-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +226 -0
- package/dist/pi-web-plugins/schedule-prompts/types.js +2 -0
- package/dist/pi-web-plugins/updates/package.json +9 -0
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +173 -0
- package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
- package/dist/piWebVersionReport.js +225 -0
- package/dist/piWebVersionReport.js.map +1 -0
- package/dist/plugin-api/unstable.d.ts +22 -0
- package/dist/plugin-api.d.ts +197 -0
- package/dist/server/activity/workspaceActivityRoutes.js +4 -0
- package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
- package/dist/server/activity/workspaceActivityService.js +98 -0
- package/dist/server/activity/workspaceActivityService.js.map +1 -0
- package/dist/server/app.js +217 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/configRoutes.js +278 -0
- package/dist/server/configRoutes.js.map +1 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js +130 -0
- package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
- package/dist/server/git/gitEnv.js +15 -0
- package/dist/server/git/gitEnv.js.map +1 -0
- package/dist/server/git/gitService.js +119 -0
- package/dist/server/git/gitService.js.map +1 -0
- package/dist/server/gitRoutes.js +29 -0
- package/dist/server/gitRoutes.js.map +1 -0
- package/dist/server/index.js +16 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/machines/machineClient.js +162 -0
- package/dist/server/machines/machineClient.js.map +1 -0
- package/dist/server/machines/machinePluginProxyRoutes.js +151 -0
- package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineProxyRoutes.js +152 -0
- package/dist/server/machines/machineProxyRoutes.js.map +1 -0
- package/dist/server/machines/machineRoutes.js +61 -0
- package/dist/server/machines/machineRoutes.js.map +1 -0
- package/dist/server/machines/machineService.js +230 -0
- package/dist/server/machines/machineService.js.map +1 -0
- package/dist/server/machines/machineStore.js +123 -0
- package/dist/server/machines/machineStore.js.map +1 -0
- package/dist/server/machines/proxyUtils.js +39 -0
- package/dist/server/machines/proxyUtils.js.map +1 -0
- package/dist/server/ompWebPluginService.js +298 -0
- package/dist/server/ompWebPluginService.js.map +1 -0
- package/dist/server/ompWebStatus.js +604 -0
- package/dist/server/ompWebStatus.js.map +1 -0
- package/dist/server/ompWebStatusCache.js +31 -0
- package/dist/server/ompWebStatusCache.js.map +1 -0
- package/dist/server/piPackageRoutes.js +85 -0
- package/dist/server/piPackageRoutes.js.map +1 -0
- package/dist/server/piPackageService.js +65 -0
- package/dist/server/piPackageService.js.map +1 -0
- package/dist/server/piWebPluginService.js +283 -0
- package/dist/server/piWebPluginService.js.map +1 -0
- package/dist/server/piWebStatus.js +602 -0
- package/dist/server/piWebStatus.js.map +1 -0
- package/dist/server/piWebStatusCache.js +32 -0
- package/dist/server/piWebStatusCache.js.map +1 -0
- package/dist/server/projects/directorySuggestions.js +37 -0
- package/dist/server/projects/directorySuggestions.js.map +1 -0
- package/dist/server/projects/projectService.js +31 -0
- package/dist/server/projects/projectService.js.map +1 -0
- package/dist/server/push/PushNotificationService.js +137 -0
- package/dist/server/push/PushNotificationService.js.map +1 -0
- package/dist/server/push/pushRoutes.js +50 -0
- package/dist/server/push/pushRoutes.js.map +1 -0
- package/dist/server/realtime/honoRealtimeSocket.js +32 -0
- package/dist/server/realtime/honoRealtimeSocket.js.map +1 -0
- package/dist/server/realtime/sessionEventHub.js +39 -0
- package/dist/server/realtime/sessionEventHub.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +85 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
- package/dist/server/sessiond.js +104 -0
- package/dist/server/sessiond.js.map +1 -0
- package/dist/server/sessions/attachmentService.js +112 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/authProviderOptions.js +52 -0
- package/dist/server/sessions/authProviderOptions.js.map +1 -0
- package/dist/server/sessions/authRoutes.js +75 -0
- package/dist/server/sessions/authRoutes.js.map +1 -0
- package/dist/server/sessions/authService.js +105 -0
- package/dist/server/sessions/authService.js.map +1 -0
- package/dist/server/sessions/builtinCommands.js +31 -0
- package/dist/server/sessions/builtinCommands.js.map +1 -0
- package/dist/server/sessions/editPreview.js +196 -0
- package/dist/server/sessions/editPreview.js.map +1 -0
- package/dist/server/sessions/editTool.js +46 -0
- package/dist/server/sessions/editTool.js.map +1 -0
- package/dist/server/sessions/messagePaging.js +41 -0
- package/dist/server/sessions/messagePaging.js.map +1 -0
- package/dist/server/sessions/oauthLoginFlowService.js +136 -0
- package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
- package/dist/server/sessions/piAgentSession.js +472 -0
- package/dist/server/sessions/piAgentSession.js.map +1 -0
- package/dist/server/sessions/piSessionManagerGateway.js +133 -0
- package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +1737 -0
- package/dist/server/sessions/piSessionService.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/schedulePromptService.js +46 -0
- package/dist/server/sessions/schedulePrompt/schedulePromptService.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/scheduler.js +317 -0
- package/dist/server/sessions/schedulePrompt/scheduler.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/storage.js +118 -0
- package/dist/server/sessions/schedulePrompt/storage.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/tool.js +251 -0
- package/dist/server/sessions/schedulePrompt/tool.js.map +1 -0
- package/dist/server/sessions/schedulePrompt/types.js +2 -0
- package/dist/server/sessions/schedulePrompt/types.js.map +1 -0
- package/dist/server/sessions/sessionArchiveHelpers.js +186 -0
- package/dist/server/sessions/sessionArchiveHelpers.js.map +1 -0
- package/dist/server/sessions/sessionArchiveStore.js +254 -0
- package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
- package/dist/server/sessions/sessionArchiveTree.js +35 -0
- package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
- package/dist/server/sessions/sessionCleanup.js +157 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -0
- package/dist/server/sessions/sessionCommandService.js +349 -0
- package/dist/server/sessions/sessionCommandService.js.map +1 -0
- package/dist/server/sessions/sessionEventMapper.js +115 -0
- package/dist/server/sessions/sessionEventMapper.js.map +1 -0
- package/dist/server/sessions/sessionNameGenerator.js +61 -0
- package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +419 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -0
- package/dist/server/sessions/sessionRuntimeStore.js +2 -0
- package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
- package/dist/server/sessions/spawnSessionTool.js +41 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnSubsessionTool.js +203 -0
- package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +36 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/server/sessions/subsessionLinks.js +171 -0
- package/dist/server/sessions/subsessionLinks.js.map +1 -0
- package/dist/server/sessions/subsessionTranscript.js +233 -0
- package/dist/server/sessions/subsessionTranscript.js.map +1 -0
- package/dist/server/storage/projectStore.js +83 -0
- package/dist/server/storage/projectStore.js.map +1 -0
- package/dist/server/terminalProxyRoutes.js +168 -0
- package/dist/server/terminalProxyRoutes.js.map +1 -0
- package/dist/server/terminals/terminalRoutes.js +177 -0
- package/dist/server/terminals/terminalRoutes.js.map +1 -0
- package/dist/server/terminals/terminalService.js +309 -0
- package/dist/server/terminals/terminalService.js.map +1 -0
- package/dist/server/terminals/terminalSize.js +17 -0
- package/dist/server/terminals/terminalSize.js.map +1 -0
- package/dist/server/testUtils.js +43 -0
- package/dist/server/testUtils.js.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/utils.js +2 -0
- package/dist/server/utils.js.map +1 -0
- package/dist/server/webSocketBridge.js +55 -0
- package/dist/server/webSocketBridge.js.map +1 -0
- package/dist/server/workingDirectory.js +44 -0
- package/dist/server/workingDirectory.js.map +1 -0
- package/dist/server/workspaceExplorerRoutes.js +148 -0
- package/dist/server/workspaceExplorerRoutes.js.map +1 -0
- package/dist/server/workspaces/effectivePathAccess.js +27 -0
- package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
- package/dist/server/workspaces/fileContentService.js +200 -0
- package/dist/server/workspaces/fileContentService.js.map +1 -0
- package/dist/server/workspaces/fileSuggestions.js +512 -0
- package/dist/server/workspaces/fileSuggestions.js.map +1 -0
- package/dist/server/workspaces/fileTreeService.js +27 -0
- package/dist/server/workspaces/fileTreeService.js.map +1 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
- package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
- package/dist/server/workspaces/imagePreviewService.js +40 -0
- package/dist/server/workspaces/imagePreviewService.js.map +1 -0
- package/dist/server/workspaces/pathAccessPolicy.js +87 -0
- package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
- package/dist/server/workspaces/pathSafety.js +54 -0
- package/dist/server/workspaces/pathSafety.js.map +1 -0
- package/dist/server/workspaces/projectOmpWebConfig.js +56 -0
- package/dist/server/workspaces/projectOmpWebConfig.js.map +1 -0
- package/dist/server/workspaces/projectPiWebConfig.js +61 -0
- package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
- package/dist/server/workspaces/workspaceContext.js +8 -0
- package/dist/server/workspaces/workspaceContext.js.map +1 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
- package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
- package/dist/server/workspaces/workspaceService.js +39 -0
- package/dist/server/workspaces/workspaceService.js.map +1 -0
- package/dist/sessiond/config.js +9 -0
- package/dist/sessiond/config.js.map +1 -0
- package/dist/sessiond/sessionDaemonClient.js +34 -0
- package/dist/sessiond/sessionDaemonClient.js.map +1 -0
- package/dist/shared/activity.js +26 -0
- package/dist/shared/activity.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +769 -0
- package/dist/shared/apiTypes.js +11 -0
- package/dist/shared/apiTypes.js.map +1 -0
- package/dist/shared/capabilities.js +52 -0
- package/dist/shared/capabilities.js.map +1 -0
- package/dist/shared/federatedRoutes.js +81 -0
- package/dist/shared/federatedRoutes.js.map +1 -0
- package/dist/shared/machinePluginIds.js +41 -0
- package/dist/shared/machinePluginIds.js.map +1 -0
- package/dist/shared/ompWebStatusParsing.js +100 -0
- package/dist/shared/ompWebStatusParsing.js.map +1 -0
- package/dist/shared/piWebStatusParsing.js +102 -0
- package/dist/shared/piWebStatusParsing.js.map +1 -0
- package/dist/shared/pluginIds.js +5 -0
- package/dist/shared/pluginIds.js.map +1 -0
- package/dist/shared/promptAttachments.js +90 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/thinkingLevels.d.ts +19 -0
- package/dist/shared/thinkingLevels.js +24 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/utils.js +10 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +12 -0
- package/dist/shared/workspaceDeletion.js.map +1 -0
- package/dist/shared/workspaceFiles.js +3 -0
- package/dist/shared/workspaceFiles.js.map +1 -0
- package/docs/assets/favicon.svg +11 -0
- package/docs/assets/omp-web-banner.png +0 -0
- package/docs/assets/omp-web-desktop.png +0 -0
- package/docs/assets/omp-web-mobile.png +0 -0
- package/docs/assets/omp-web-tablet.png +0 -0
- package/docs/config.md +208 -0
- package/docs/plugins.md +916 -0
- package/extensions/omp-web.ts +133 -0
- package/install.sh +5 -0
- package/package.json +134 -0
- package/plugin-api/unstable.d.ts +1 -0
- package/plugin-api.d.ts +1 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { isRecord } from "../utils.js";
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
const SpawnSubsessionParams = Type.Object({
|
|
4
|
+
prompt: Type.String({
|
|
5
|
+
description: "The first instruction to send to the new tracked subsession.",
|
|
6
|
+
}),
|
|
7
|
+
cwd: Type.Optional(Type.String({
|
|
8
|
+
description: "Working directory for the subsession. Must be a workspace (worktree, or root) of the same project as this session. Defaults to this session's working directory.",
|
|
9
|
+
})),
|
|
10
|
+
});
|
|
11
|
+
const ListSubsessionsParams = Type.Object({});
|
|
12
|
+
const CheckSubsessionParams = Type.Object({
|
|
13
|
+
sessionId: Type.String({
|
|
14
|
+
description: "Id of a subsession you spawned (as returned by spawn_subsession or list_subsessions).",
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
17
|
+
const ReadSubsessionParams = Type.Object({
|
|
18
|
+
sessionId: Type.String({
|
|
19
|
+
description: "Id of a subsession you spawned (as returned by spawn_subsession or list_subsessions).",
|
|
20
|
+
}),
|
|
21
|
+
roles: Type.Optional(Type.Array(Type.Union([Type.Literal("assistant"), Type.Literal("user"), Type.Literal("tool"), Type.Literal("system"), Type.Literal("custom")]), { description: "Message roles to include. Omit for all roles." })),
|
|
22
|
+
include: Type.Optional(Type.Array(Type.Union([Type.Literal("text"), Type.Literal("thinking"), Type.Literal("tool_call"), Type.Literal("tool_result"), Type.Literal("image")]), { description: "Content kinds to keep within messages. Omit for all kinds." })),
|
|
23
|
+
search: Type.Optional(Type.String({
|
|
24
|
+
description: "Case-insensitive substring; keep only messages whose text or tool name matches. Always searches full message content, even when maxChars is set.",
|
|
25
|
+
})),
|
|
26
|
+
maxChars: Type.Optional(Type.Integer({
|
|
27
|
+
minimum: 0,
|
|
28
|
+
description: "Truncate each text/thinking/tool-result value to this many characters; clipped parts are marked '[+N chars truncated]'. Omit for full, untruncated text (there is no default, so truncation only happens when you ask for it).",
|
|
29
|
+
})),
|
|
30
|
+
includeToolArgs: Type.Optional(Type.Boolean({
|
|
31
|
+
description: "Include raw tool-call arguments (can be large). A compact one-line summary of each call is always shown regardless.",
|
|
32
|
+
})),
|
|
33
|
+
before: Type.Optional(Type.Integer({
|
|
34
|
+
minimum: 0,
|
|
35
|
+
description: "Return only messages before this transcript index; page backward by passing the previous response's 'start'.",
|
|
36
|
+
})),
|
|
37
|
+
limit: Type.Optional(Type.Integer({
|
|
38
|
+
minimum: 1,
|
|
39
|
+
description: "Maximum number of most-recent matching messages to return within the window (returned in chronological order). Defaults to 50.",
|
|
40
|
+
})),
|
|
41
|
+
});
|
|
42
|
+
function statusLine(summary) {
|
|
43
|
+
return `- ${summary.sessionId} [${summary.status}] in ${summary.cwd}`;
|
|
44
|
+
}
|
|
45
|
+
function renderEntry(entry) {
|
|
46
|
+
const header = `#${String(entry.index)} ${entry.role}`;
|
|
47
|
+
const body = entry.parts.map(renderPart).filter((line) => line !== "").join("\n");
|
|
48
|
+
return body === "" ? header : `${header}\n${body}`;
|
|
49
|
+
}
|
|
50
|
+
function clipNotice(part) {
|
|
51
|
+
if ((part.kind === "text" || part.kind === "thinking" || part.kind === "tool_result") && part.truncated !== undefined) {
|
|
52
|
+
return ` [+${String(part.truncated.full - part.truncated.shown)} chars truncated; re-read with a larger maxChars]`;
|
|
53
|
+
}
|
|
54
|
+
return "";
|
|
55
|
+
}
|
|
56
|
+
function renderPart(part) {
|
|
57
|
+
if (part.kind === "text")
|
|
58
|
+
return `${part.text}${clipNotice(part)}`;
|
|
59
|
+
if (part.kind === "thinking")
|
|
60
|
+
return `[thinking] ${part.text}${clipNotice(part)}`;
|
|
61
|
+
if (part.kind === "tool_call") {
|
|
62
|
+
// Raw args are only present when the caller asked (includeToolArgs); when
|
|
63
|
+
// present, surface them in the model-facing text, not just `details`.
|
|
64
|
+
const args = "args" in part && part.args !== undefined ? `\n args: ${JSON.stringify(part.args)}` : "";
|
|
65
|
+
return `[tool ${part.toolName}] ${part.summary}${args}`;
|
|
66
|
+
}
|
|
67
|
+
if (part.kind === "tool_result")
|
|
68
|
+
return `[result${part.isError ? " error" : ""}${part.toolName === undefined ? "" : ` ${part.toolName}`}] ${part.text}${clipNotice(part)}`;
|
|
69
|
+
return "[image]";
|
|
70
|
+
}
|
|
71
|
+
function renderTranscript(result) {
|
|
72
|
+
const last = result.entries[result.entries.length - 1];
|
|
73
|
+
// Distinguish "nothing matched at all" (widen filters) from "matches exist but
|
|
74
|
+
// this page/window is empty" (page differently) so the agent isn't misled.
|
|
75
|
+
const range = last === undefined
|
|
76
|
+
? (result.matched === 0
|
|
77
|
+
? "no messages matched your filters"
|
|
78
|
+
: `no messages in this window (${String(result.matched)} matched outside it)`)
|
|
79
|
+
: `messages ${String(result.start)}–${String(last.index)} of ${String(result.total)} (${String(result.matched)} matched)`;
|
|
80
|
+
const more = result.hasMore ? `\n\nMore matching messages exist earlier; page back with before: ${String(result.start)}.` : "";
|
|
81
|
+
// Empty entries with matches means the `before` cursor excluded every match
|
|
82
|
+
// (they all sit at index >= before): the agent paged too far back and should
|
|
83
|
+
// raise `before` or omit it, not page back further.
|
|
84
|
+
const body = result.entries.length > 0
|
|
85
|
+
? result.entries.map(renderEntry).join("\n\n")
|
|
86
|
+
: (result.matched === 0
|
|
87
|
+
? "(nothing matched; try widening roles/include, dropping search, or raising limit)"
|
|
88
|
+
: `(no messages before index ${String(result.start)}; all ${String(result.matched)} matches are later — raise 'before' or omit it)`);
|
|
89
|
+
return `Subsession ${result.sessionId} [${result.status}] — ${range}:\n\n${body}${more}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tools that let an agent spawn *tracked* child sessions and inspect them.
|
|
93
|
+
*
|
|
94
|
+
* Unlike `spawn_session` (fire-and-forget peers), a subsession records its
|
|
95
|
+
* parent in its session header, the parent is notified when it stops working,
|
|
96
|
+
* and the parent may read its transcript/result. The tools are constructed
|
|
97
|
+
* per-session, carrying the spawning cwd for project-scope validation; the
|
|
98
|
+
* parent's identity is taken from the live extension context at call time.
|
|
99
|
+
*/
|
|
100
|
+
export function createSubsessionToolDefinitions(spawningCwd, deps) {
|
|
101
|
+
const spawnTool = {
|
|
102
|
+
name: "spawn_subsession",
|
|
103
|
+
label: "Spawn subsession",
|
|
104
|
+
description: "Start a tracked child session and send it an initial prompt. The subsession runs independently and a human can interact with it, but unlike spawn_session it is linked to you: you are notified when it stops working (finished, idle, or errored), and you can inspect it with list_subsessions, check_subsession (a quick glance at its latest output), and read_subsession (read through its transcript). Use this to delegate work you intend to follow up on.",
|
|
105
|
+
parameters: SpawnSubsessionParams,
|
|
106
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
107
|
+
const p = isRecord(params) ? params : {};
|
|
108
|
+
const prompt = typeof p["prompt"] === "string" ? p["prompt"] : "";
|
|
109
|
+
const cwd = typeof p["cwd"] === "string" ? p["cwd"] : undefined;
|
|
110
|
+
const parentSessionId = ctx.sessionManager.getSessionId();
|
|
111
|
+
const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
|
|
112
|
+
const result = await deps.spawn({
|
|
113
|
+
spawningCwd,
|
|
114
|
+
parentSessionId,
|
|
115
|
+
parentSessionFile,
|
|
116
|
+
prompt,
|
|
117
|
+
cwd,
|
|
118
|
+
...(ctx.model === undefined ? {} : { model: ctx.model }),
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: `Started subsession ${result.sessionId} in ${result.cwd}. You will be notified when it stops working.` }],
|
|
122
|
+
details: result,
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
const listTool = {
|
|
127
|
+
name: "list_subsessions",
|
|
128
|
+
label: "List subsessions",
|
|
129
|
+
description: "List the tracked subsessions you spawned, with their current status (working, idle, error, or unknown).",
|
|
130
|
+
parameters: ListSubsessionsParams,
|
|
131
|
+
async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {
|
|
132
|
+
const parentSessionId = ctx.sessionManager.getSessionId();
|
|
133
|
+
const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
|
|
134
|
+
const subsessions = await deps.list(parentSessionId, parentSessionFile);
|
|
135
|
+
const text = subsessions.length === 0
|
|
136
|
+
? "You have not spawned any subsessions."
|
|
137
|
+
: `Your subsessions:\n${subsessions.map(statusLine).join("\n")}`;
|
|
138
|
+
return { content: [{ type: "text", text }], details: { subsessions } };
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
const checkTool = {
|
|
142
|
+
name: "check_subsession",
|
|
143
|
+
label: "Check subsession",
|
|
144
|
+
description: "Quick glance at a subsession you spawned: its current status and most recent assistant output. Use this to react to what a subsession produced. When the summary is not enough, use read_subsession to look through its full transcript.",
|
|
145
|
+
parameters: CheckSubsessionParams,
|
|
146
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
147
|
+
const p = isRecord(params) ? params : {};
|
|
148
|
+
const sessionId = typeof p["sessionId"] === "string" ? p["sessionId"] : "";
|
|
149
|
+
const parentSessionId = ctx.sessionManager.getSessionId();
|
|
150
|
+
const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
|
|
151
|
+
const result = await deps.check(parentSessionId, sessionId, parentSessionFile);
|
|
152
|
+
const body = result.finalText === "" ? "(no output yet)" : result.finalText;
|
|
153
|
+
return {
|
|
154
|
+
content: [{ type: "text", text: `Subsession ${result.sessionId} [${result.status}]:\n\n${body}` }],
|
|
155
|
+
details: result,
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
const readTool = {
|
|
160
|
+
name: "read_subsession",
|
|
161
|
+
label: "Read subsession",
|
|
162
|
+
description: "Read through the transcript of a subsession you spawned.",
|
|
163
|
+
parameters: ReadSubsessionParams,
|
|
164
|
+
async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
|
|
165
|
+
const p = isRecord(params) ? params : {};
|
|
166
|
+
const sessionId = typeof p["sessionId"] === "string" ? p["sessionId"] : "";
|
|
167
|
+
const query = parseReadQuery(p);
|
|
168
|
+
const parentSessionId = ctx.sessionManager.getSessionId();
|
|
169
|
+
const parentSessionFile = ctx.sessionManager.getSessionFile() ?? undefined;
|
|
170
|
+
const result = await deps.read(parentSessionId, sessionId, query, parentSessionFile);
|
|
171
|
+
return {
|
|
172
|
+
content: [{ type: "text", text: renderTranscript(result) }],
|
|
173
|
+
details: result,
|
|
174
|
+
};
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
return [spawnTool, listTool, checkTool, readTool];
|
|
178
|
+
}
|
|
179
|
+
function parseReadQuery(p) {
|
|
180
|
+
const query = {};
|
|
181
|
+
if (Array.isArray(p["roles"]))
|
|
182
|
+
query.roles = p["roles"].filter(isRole);
|
|
183
|
+
if (Array.isArray(p["include"]))
|
|
184
|
+
query.include = p["include"].filter(isContentKind);
|
|
185
|
+
if (typeof p["search"] === "string")
|
|
186
|
+
query.search = p["search"];
|
|
187
|
+
if (typeof p["maxChars"] === "number")
|
|
188
|
+
query.maxChars = p["maxChars"];
|
|
189
|
+
if (typeof p["includeToolArgs"] === "boolean")
|
|
190
|
+
query.includeToolArgs = p["includeToolArgs"];
|
|
191
|
+
if (typeof p["before"] === "number")
|
|
192
|
+
query.before = p["before"];
|
|
193
|
+
if (typeof p["limit"] === "number")
|
|
194
|
+
query.limit = p["limit"];
|
|
195
|
+
return query;
|
|
196
|
+
}
|
|
197
|
+
function isRole(value) {
|
|
198
|
+
return typeof value === "string" && (value === "assistant" || value === "user" || value === "tool" || value === "system" || value === "custom");
|
|
199
|
+
}
|
|
200
|
+
function isContentKind(value) {
|
|
201
|
+
return typeof value === "string" && (value === "text" || value === "thinking" || value === "tool_call" || value === "tool_result" || value === "image");
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=spawnSubsessionTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawnSubsessionTool.js","sourceRoot":"","sources":["../../../src/server/sessions/spawnSubsessionTool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { cwdPathsEqual } from "../workingDirectory.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default resolver composing the project registry and live worktree discovery.
|
|
4
|
+
* It finds the registered project whose current workspace set contains the
|
|
5
|
+
* spawning session's cwd, then validates the requested target against that set.
|
|
6
|
+
*/
|
|
7
|
+
export class ProjectScopedSpawnTargetResolver {
|
|
8
|
+
constructor(deps) {
|
|
9
|
+
this.deps = deps;
|
|
10
|
+
}
|
|
11
|
+
async resolveSpawnTarget(spawningCwd, requestedCwd) {
|
|
12
|
+
const allowedCwds = await this.allowedSpawnTargets(spawningCwd);
|
|
13
|
+
if (allowedCwds === undefined)
|
|
14
|
+
return { allowed: false, reason: "not-registered" };
|
|
15
|
+
const target = requestedCwd === undefined || requestedCwd === "" ? spawningCwd : requestedCwd;
|
|
16
|
+
const match = allowedCwds.find((path) => cwdPathsEqual(path, target));
|
|
17
|
+
if (match === undefined)
|
|
18
|
+
return { allowed: false, reason: "out-of-project", allowedCwds };
|
|
19
|
+
return { allowed: true, cwd: match };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Workspace paths of the registered project that owns `spawningCwd`, or
|
|
23
|
+
* `undefined` when no registered project contains it.
|
|
24
|
+
*/
|
|
25
|
+
async allowedSpawnTargets(spawningCwd) {
|
|
26
|
+
const projects = await this.deps.projects.list();
|
|
27
|
+
for (const project of projects) {
|
|
28
|
+
const workspaces = await this.deps.workspaces.list(project);
|
|
29
|
+
const paths = workspaces.map((workspace) => workspace.path);
|
|
30
|
+
if (paths.some((path) => cwdPathsEqual(path, spawningCwd)))
|
|
31
|
+
return paths;
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=spawnTargetResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawnTargetResolver.js","sourceRoot":"","sources":["../../../src/server/sessions/spawnTargetResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA+CvD;;;;GAIG;AACH,MAAM,OAAO,gCAAgC;IAC3C,YAA6B,IAA0C;QAA1C,SAAI,GAAJ,IAAI,CAAsC;IAAG,CAAC;IAE3E,KAAK,CAAC,kBAAkB,CAAC,WAAmB,EAAE,YAAgC;QAC5E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,WAAW,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACnF,MAAM,MAAM,GAAG,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;QAC9F,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;QAC1F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { statSync } from "node:fs";
|
|
2
|
+
import { open, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { cwdPathsEqual } from "../workingDirectory.js";
|
|
4
|
+
import { isRecord } from "../utils.js";
|
|
5
|
+
export const SUBSESSION_LINK_CUSTOM_TYPE = "omp-web.subsession.link";
|
|
6
|
+
export const SUBSESSION_CHILD_LINK_CUSTOM_TYPE = "omp-web.subsession.spawned";
|
|
7
|
+
export const SUBSESSION_NOTIFICATION_CUSTOM_TYPE = "subsession.completion";
|
|
8
|
+
export const SUBSESSION_NOTIFICATION_PREVIEW_CHARS = 2000;
|
|
9
|
+
function getString(record, key) {
|
|
10
|
+
const value = record[key];
|
|
11
|
+
return typeof value === "string" ? value : undefined;
|
|
12
|
+
}
|
|
13
|
+
export function trackedSubsessionLinkFromParentLink(parentSessionId, link, parentSessionFile) {
|
|
14
|
+
return {
|
|
15
|
+
parentSessionId,
|
|
16
|
+
childSessionId: link.spawnedSessionId,
|
|
17
|
+
...(link.spawnedSessionFile === undefined ? {} : { childSessionFile: link.spawnedSessionFile }),
|
|
18
|
+
parentSessionFile,
|
|
19
|
+
...(link.cwd === undefined ? {} : { cwd: link.cwd }),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function persistedParentSubsessionLinkData(link) {
|
|
23
|
+
return {
|
|
24
|
+
version: 1,
|
|
25
|
+
spawnedBySessionId: link.parentSessionId,
|
|
26
|
+
spawnedSessionId: link.childSessionId,
|
|
27
|
+
...(link.childSessionFile === undefined ? {} : { spawnedSessionFile: link.childSessionFile }),
|
|
28
|
+
...(link.cwd === undefined ? {} : { cwd: link.cwd }),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function persistedChildSubsessionLinkData(parentSessionId, childSessionId) {
|
|
32
|
+
return {
|
|
33
|
+
version: 1,
|
|
34
|
+
spawnedBySessionId: parentSessionId,
|
|
35
|
+
spawnedSessionId: childSessionId,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function parsePersistedParentSubsessionLink(entry) {
|
|
39
|
+
if (!isRecord(entry) || entry["type"] !== "custom" || entry["customType"] !== SUBSESSION_LINK_CUSTOM_TYPE)
|
|
40
|
+
return undefined;
|
|
41
|
+
const data = entry["data"];
|
|
42
|
+
if (!isRecord(data))
|
|
43
|
+
return undefined;
|
|
44
|
+
const spawnedBySessionId = getString(data, "spawnedBySessionId");
|
|
45
|
+
const spawnedSessionId = getString(data, "spawnedSessionId");
|
|
46
|
+
if (spawnedBySessionId === undefined || spawnedBySessionId === "" || spawnedSessionId === undefined || spawnedSessionId === "")
|
|
47
|
+
return undefined;
|
|
48
|
+
const spawnedSessionFile = getString(data, "spawnedSessionFile");
|
|
49
|
+
const cwd = getString(data, "cwd");
|
|
50
|
+
return {
|
|
51
|
+
spawnedBySessionId,
|
|
52
|
+
spawnedSessionId,
|
|
53
|
+
...(spawnedSessionFile === undefined || spawnedSessionFile === "" ? {} : { spawnedSessionFile }),
|
|
54
|
+
...(cwd === undefined || cwd === "" ? {} : { cwd }),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function parsePersistedChildSubsessionLink(entry) {
|
|
58
|
+
if (!isRecord(entry) || entry["type"] !== "custom" || entry["customType"] !== SUBSESSION_CHILD_LINK_CUSTOM_TYPE)
|
|
59
|
+
return undefined;
|
|
60
|
+
const data = entry["data"];
|
|
61
|
+
if (!isRecord(data))
|
|
62
|
+
return undefined;
|
|
63
|
+
const spawnedBySessionId = getString(data, "spawnedBySessionId");
|
|
64
|
+
const spawnedSessionId = getString(data, "spawnedSessionId");
|
|
65
|
+
if (spawnedBySessionId === undefined || spawnedBySessionId === "" || spawnedSessionId === undefined || spawnedSessionId === "")
|
|
66
|
+
return undefined;
|
|
67
|
+
return { spawnedBySessionId, spawnedSessionId };
|
|
68
|
+
}
|
|
69
|
+
export function nonEmptyString(value) {
|
|
70
|
+
return value === undefined || value === "" ? undefined : value;
|
|
71
|
+
}
|
|
72
|
+
export function subsessionHydratedParentKey(parentSessionId, parentSessionFile) {
|
|
73
|
+
return `${parentSessionId}\0${parentSessionFile ?? ""}`;
|
|
74
|
+
}
|
|
75
|
+
export function sessionPathsEqual(a, b) {
|
|
76
|
+
return cwdPathsEqual(a, b);
|
|
77
|
+
}
|
|
78
|
+
export function sessionFileExists(sessionFile) {
|
|
79
|
+
if (sessionFile === undefined || sessionFile === "")
|
|
80
|
+
return false;
|
|
81
|
+
try {
|
|
82
|
+
return statSync(sessionFile).isFile();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function sessionFileMatches(session, expectedSessionFile) {
|
|
89
|
+
const sessionFile = nonEmptyString(session.sessionFile);
|
|
90
|
+
return sessionFile !== undefined && expectedSessionFile !== undefined && sessionPathsEqual(sessionFile, expectedSessionFile);
|
|
91
|
+
}
|
|
92
|
+
export function activeSessionFileMatches(active, expectedSessionFile) {
|
|
93
|
+
return sessionFileMatches(active.runtime.session, expectedSessionFile);
|
|
94
|
+
}
|
|
95
|
+
export function trackedLinkParentFileMatches(link, parentSessionFile) {
|
|
96
|
+
return link.parentSessionFile !== undefined && sessionPathsEqual(link.parentSessionFile, parentSessionFile);
|
|
97
|
+
}
|
|
98
|
+
export async function readSessionHeaderSummary(sessionFile) {
|
|
99
|
+
let file;
|
|
100
|
+
try {
|
|
101
|
+
file = await open(sessionFile, "r");
|
|
102
|
+
const buffer = Buffer.alloc(4096);
|
|
103
|
+
const { bytesRead } = await file.read(buffer, 0, buffer.length, 0);
|
|
104
|
+
const firstLine = buffer.toString("utf8", 0, bytesRead).split("\n", 1)[0];
|
|
105
|
+
if (firstLine === undefined || firstLine === "")
|
|
106
|
+
return undefined;
|
|
107
|
+
const header = JSON.parse(firstLine);
|
|
108
|
+
if (!isRecord(header) || header["type"] !== "session" || typeof header["id"] !== "string")
|
|
109
|
+
return undefined;
|
|
110
|
+
const parentSession = getString(header, "parentSession");
|
|
111
|
+
return { id: header["id"], ...(parentSession === undefined ? {} : { parentSession }) };
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
await file?.close().catch(() => undefined);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export async function sessionFileHeaderMatches(sessionFile, expected) {
|
|
121
|
+
const header = await readSessionHeaderSummary(sessionFile);
|
|
122
|
+
if (header?.id !== expected.sessionId)
|
|
123
|
+
return false;
|
|
124
|
+
if (expected.parentSessionFile === undefined)
|
|
125
|
+
return true;
|
|
126
|
+
return header.parentSession !== undefined && sessionPathsEqual(header.parentSession, expected.parentSessionFile);
|
|
127
|
+
}
|
|
128
|
+
export async function clearParentSession(sessionFile) {
|
|
129
|
+
const content = await readFile(sessionFile, "utf8");
|
|
130
|
+
const newlineIndex = content.indexOf("\n");
|
|
131
|
+
const firstLine = newlineIndex === -1 ? content : content.slice(0, newlineIndex);
|
|
132
|
+
const rest = newlineIndex === -1 ? "" : content.slice(newlineIndex);
|
|
133
|
+
const header = JSON.parse(firstLine);
|
|
134
|
+
if (!isRecord(header) || header["type"] !== "session")
|
|
135
|
+
throw new Error("Invalid session file header");
|
|
136
|
+
if (header["parentSession"] === undefined)
|
|
137
|
+
return;
|
|
138
|
+
delete header["parentSession"];
|
|
139
|
+
await writeFile(sessionFile, `${JSON.stringify(header)}${rest}`, "utf8");
|
|
140
|
+
}
|
|
141
|
+
export function clearParentSessionHeader(sessionManager) {
|
|
142
|
+
const header = sessionManager.getHeader?.();
|
|
143
|
+
if (header !== undefined && header !== null)
|
|
144
|
+
delete header.parentSession;
|
|
145
|
+
}
|
|
146
|
+
export function truncateForNotification(text) {
|
|
147
|
+
if (text.length <= SUBSESSION_NOTIFICATION_PREVIEW_CHARS)
|
|
148
|
+
return text;
|
|
149
|
+
return `${text.slice(0, SUBSESSION_NOTIFICATION_PREVIEW_CHARS)}…`;
|
|
150
|
+
}
|
|
151
|
+
export function finalAssistantText(messages) {
|
|
152
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
153
|
+
const message = messages[i];
|
|
154
|
+
if (!isRecord(message) || message["role"] !== "assistant")
|
|
155
|
+
continue;
|
|
156
|
+
const content = message["content"];
|
|
157
|
+
if (typeof content === "string")
|
|
158
|
+
return content;
|
|
159
|
+
if (!Array.isArray(content))
|
|
160
|
+
continue;
|
|
161
|
+
const texts = [];
|
|
162
|
+
for (const part of content) {
|
|
163
|
+
if (isRecord(part) && part["type"] === "text" && typeof part["text"] === "string")
|
|
164
|
+
texts.push(part["text"]);
|
|
165
|
+
}
|
|
166
|
+
if (texts.length > 0)
|
|
167
|
+
return texts.join("\n").trim();
|
|
168
|
+
}
|
|
169
|
+
return "";
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=subsessionLinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsessionLinks.js","sourceRoot":"","sources":["../../../src/server/sessions/subsessionLinks.ts"],"names":[],"mappings":"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"}
|