Spaces:
Paused
Paused
| import crypto from "node:crypto"; | |
| import path from "node:path"; | |
| import { normalizeAgentId } from "../../routing/session-key.js"; | |
| import { resolveUserPath } from "../../utils.js"; | |
| import { resolveAgentIdFromSessionKey } from "../agent-scope.js"; | |
| export function slugifySessionKey(value: string) { | |
| const trimmed = value.trim() || "session"; | |
| const hash = crypto.createHash("sha1").update(trimmed).digest("hex").slice(0, 8); | |
| const safe = trimmed | |
| .toLowerCase() | |
| .replace(/[^a-z0-9._-]+/g, "-") | |
| .replace(/^-+|-+$/g, ""); | |
| const base = safe.slice(0, 32) || "session"; | |
| return `${base}-${hash}`; | |
| } | |
| export function resolveSandboxWorkspaceDir(root: string, sessionKey: string) { | |
| const resolvedRoot = resolveUserPath(root); | |
| const slug = slugifySessionKey(sessionKey); | |
| return path.join(resolvedRoot, slug); | |
| } | |
| export function resolveSandboxScopeKey(scope: "session" | "agent" | "shared", sessionKey: string) { | |
| const trimmed = sessionKey.trim() || "main"; | |
| if (scope === "shared") { | |
| return "shared"; | |
| } | |
| if (scope === "session") { | |
| return trimmed; | |
| } | |
| const agentId = resolveAgentIdFromSessionKey(trimmed); | |
| return `agent:${agentId}`; | |
| } | |
| export function resolveSandboxAgentId(scopeKey: string): string | undefined { | |
| const trimmed = scopeKey.trim(); | |
| if (!trimmed || trimmed === "shared") { | |
| return undefined; | |
| } | |
| const parts = trimmed.split(":").filter(Boolean); | |
| if (parts[0] === "agent" && parts[1]) { | |
| return normalizeAgentId(parts[1]); | |
| } | |
| return resolveAgentIdFromSessionKey(trimmed); | |
| } | |