@senpiper/sp-agent 0.1.9 → 0.1.11
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/INSTALL.md +37 -26
- package/README.md +13 -13
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/distribution.d.ts +2 -2
- package/dist/distribution.d.ts.map +1 -1
- package/dist/distribution.js +2 -3
- package/dist/distribution.js.map +1 -1
- package/dist/extension-identity.generated.d.ts +3 -3
- package/dist/extension-identity.generated.d.ts.map +1 -1
- package/dist/extension-identity.generated.js +3 -3
- package/dist/extension-identity.generated.js.map +1 -1
- package/dist/install-sp.sh +9 -9
- package/dist/release-manager.d.ts.map +1 -1
- package/dist/release-manager.js +2 -2
- package/dist/release-manager.js.map +1 -1
- package/dist/runtime-cli.d.ts.map +1 -1
- package/dist/runtime-cli.js +4 -4
- package/dist/runtime-cli.js.map +1 -1
- package/dist/sdk.d.ts +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +5 -5
- package/dist/sdk.js.map +1 -1
- package/dist/session-manager.d.ts +1 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +15 -15
- package/dist/session-manager.js.map +1 -1
- package/dist/sp-web.d.ts.map +1 -1
- package/dist/sp-web.js +2 -2
- package/dist/sp-web.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/node_modules/@senpiper/pi-coding-agent/dist/bundle/chunks/{chunk-IK73Y232.js → chunk-VVKE4QZJ.js} +1 -1
- package/node_modules/@senpiper/pi-coding-agent/dist/bundle/cli.js +1 -1
- package/node_modules/@senpiper/pi-coding-agent/dist/bundle/index.js +1 -1
- package/node_modules/@senpiper/pi-coding-agent/dist/bundle/rpc-entry.js +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@senpiper/pi-coding-agent/package.json +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/CHANGELOG.md +17 -0
- package/node_modules/@senpiper/sp-agent-extensions/CONCURRENT_SESSIONS.md +9 -9
- package/node_modules/@senpiper/sp-agent-extensions/TERMINAL_WEB_BRIDGE.md +29 -10
- package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.d.ts +0 -6
- package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.js +7 -86
- package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/commands.d.ts +2 -2
- package/node_modules/@senpiper/sp-agent-extensions/dist/commands.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/commands.js +2 -2
- package/node_modules/@senpiper/sp-agent-extensions/dist/commands.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.d.ts +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.js +28 -17
- package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/index.d.ts +1 -3
- package/node_modules/@senpiper/sp-agent-extensions/dist/index.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/index.js +1 -3
- package/node_modules/@senpiper/sp-agent-extensions/dist/index.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.d.ts +0 -2
- package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.js +0 -3
- package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.js +10 -20
- package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/sp-web-launcher.d.ts +27 -0
- package/node_modules/@senpiper/sp-agent-extensions/dist/sp-web-launcher.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/sp-web-launcher.js +270 -28
- package/node_modules/@senpiper/sp-agent-extensions/dist/sp-web-launcher.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.js +13 -20
- package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.d.ts +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.js +11 -9
- package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.d.ts.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.js +36 -10
- package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.js.map +1 -1
- package/node_modules/@senpiper/sp-agent-extensions/package.json +3 -5
- package/package.json +7 -6
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.d.ts +0 -4
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.d.ts.map +0 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.js +0 -67
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.js.map +0 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.d.ts +0 -14
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.d.ts.map +0 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.js +0 -32
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.js.map +0 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.d.ts +0 -39
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.d.ts.map +0 -1
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.js +0 -311
- package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tcloseSync,\n\tlstatSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\treadSync,\n\trealpathSync,\n\ttype Stats,\n\tstatSync,\n} from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { AgentSession, AgentSessionRuntime, ExtensionContext } from \"@senpiper/pi-coding-agent\";\nimport { getAgentDir, SessionManager } from \"@senpiper/pi-coding-agent\";\nimport type { TerminalWebBridge, TerminalWebBridgeOptions } from \"@senpiper/sp-agent-extensions\";\nimport { installSpWriterLeases } from \"./session-writer-provider.ts\";\nimport { SessionDeletionError, spWriterLeases } from \"./writer-leases.ts\";\n\ninterface Child {\n\tsession: AgentSession;\n\tbridge: TerminalWebBridge;\n}\n\nexport type SpSessionFactory = (\n\tsessionManager: SessionManager,\n\tbridgeOptions: TerminalWebBridgeOptions,\n) => Promise<{ session: AgentSession }>;\n\nfunction canonicalFile(path: string): string {\n\tconst absolute = resolve(path);\n\ttry {\n\t\treturn realpathSync(absolute);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\tconst parent = dirname(absolute);\n\t\tif (parent === absolute) throw error;\n\t\treturn join(canonicalFile(parent), basename(absolute));\n\t}\n}\n\n/**\n * One SP instance owns these writers until dispose, not until browser selection\n * or terminal replacement. Construction promises reserve files before any await.\n */\nexport class SpSessionManager {\n\tprivate readonly factory: SpSessionFactory;\n\tprivate readonly bridgeOptions: TerminalWebBridgeOptions;\n\tprivate readonly children = new Map<string, Promise<Child>>();\n\tprivate readonly readyChildren = new Map<string, Child>();\n\tprivate readonly deleting = new Set<string>();\n\tprivate readonly deletions = new Set<Promise<{ sessionId: string; deleted: true }>>();\n\tprivate historyRoot: string;\n\tprivate sessionDir: string | undefined;\n\tprivate readonly bridges = new Set<TerminalWebBridge>();\n\tprivate readonly terminalLeases = new Set<string>();\n\tprivate terminal: { file?: string; sessionId: string } | undefined;\n\tprivate closing: Promise<void> | undefined;\n\tprivate stopped = false;\n\tprivate hooksInstalled = false;\n\tprivate readonly signalHandlers = new Map<NodeJS.Signals, () => void>();\n\tprivate readonly onExit = () => {\n\t\tfor (const bridge of this.bridges) {\n\t\t\ttry {\n\t\t\t\tbridge.cleanupOnExit();\n\t\t\t} catch {\n\t\t\t\t// Continue cleaning the remaining descriptors on process exit.\n\t\t\t}\n\t\t}\n\t};\n\n\tconstructor(factory: SpSessionFactory, bridgeOptions: TerminalWebBridgeOptions = {}) {\n\t\tinstallSpWriterLeases();\n\t\tthis.factory = factory;\n\t\tthis.bridgeOptions = bridgeOptions;\n\t\tthis.sessionDir = process.env.SP_CODING_AGENT_SESSION_DIR;\n\t\tthis.historyRoot = resolve(this.sessionDir ?? join(bridgeOptions.agentDir ?? getAgentDir(), \"sessions\"));\n\t}\n\n\tsetHistoryRoot(root: string, customSessionDir = true): void {\n\t\tthis.historyRoot = resolve(root);\n\t\tthis.sessionDir = customSessionDir ? this.historyRoot : undefined;\n\t}\n\n\tdeleteSession(\n\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\trequester?: TerminalWebBridge,\n\t): Promise<{ sessionId: string; deleted: true }> {\n\t\tconst task = this.deleteTarget(request, requester);\n\t\tthis.deletions.add(task);\n\t\tvoid task.finally(() => this.deletions.delete(task)).catch(() => {});\n\t\treturn task;\n\t}\n\n\tprivate validateHistoryFile(file: string, sessionId: string, reservedFile?: string): string {\n\t\tif (!isAbsolute(file) || !file.endsWith(\".jsonl\")) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"sessionFile must be an absolute JSONL path.\");\n\t\t}\n\t\tconst root = realpathSync(this.historyRoot);\n\t\tconst key = canonicalFile(file);\n\t\tconst within = relative(root, key);\n\t\tif (!within || within === \"..\" || within.startsWith(`..${sep}`) || isAbsolute(within) || resolve(file) !== key) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"Session must be a canonical path inside configured history.\");\n\t\t}\n\t\tlet stat: Stats;\n\t\ttry {\n\t\t\tstat = lstatSync(file);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\" && reservedFile === key) return key;\n\t\t\tthrow error;\n\t\t}\n\t\tif (!stat.isFile() || stat.nlink !== 1) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"Session must be a regular file without hard links.\");\n\t\t}\n\t\tconst fd = openSync(file, \"r\");\n\t\ttry {\n\t\t\tconst buffer = Buffer.alloc(1024 * 1024);\n\t\t\tconst length = readSync(fd, buffer, 0, buffer.length, 0);\n\t\t\tconst newline = buffer.subarray(0, length).indexOf(10);\n\t\t\tif (newline < 0 && length === buffer.length) {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header exceeds scan limit.\");\n\t\t\t}\n\t\t\tlet header: unknown;\n\t\t\ttry {\n\t\t\t\theader = JSON.parse(buffer.subarray(0, newline < 0 ? length : newline).toString(\"utf8\"));\n\t\t\t} catch {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header is not valid JSON.\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof header !== \"object\" ||\n\t\t\t\theader === null ||\n\t\t\t\t!(\"type\" in header) ||\n\t\t\t\theader.type !== \"session\" ||\n\t\t\t\t!(\"id\" in header) ||\n\t\t\t\theader.id !== sessionId\n\t\t\t) {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header ID does not match sessionId.\");\n\t\t\t}\n\t\t} finally {\n\t\t\tcloseSync(fd);\n\t\t}\n\t\treturn key;\n\t}\n\n\tprivate rejectLegacyOwners(): void {\n\t\tconst discovery = join(this.bridgeOptions.agentDir ?? getAgentDir(), \"web-bridge\", \"discovery\");\n\t\tlet names: string[];\n\t\ttry {\n\t\t\tnames = readdirSync(discovery);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n\t\t\tthrow error;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\t// The web launcher shares this directory with session discovery.\n\t\t\t// Its process record and lock do not represent session writers.\n\t\t\tif (!name.endsWith(\".json\") || name === \"pi-web-sidecar.json\" || name === \"sp-web-sidecar.json\") continue;\n\t\t\tconst descriptor = JSON.parse(readFileSync(join(discovery, name), \"utf8\")) as {\n\t\t\t\tpid?: number;\n\t\t\t\tsessionFile?: string;\n\t\t\t\twriterLeaseVersion?: number;\n\t\t\t};\n\t\t\tif (!Number.isSafeInteger(descriptor.pid) || descriptor.pid! <= 0) {\n\t\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\t\"legacy_owner\",\n\t\t\t\t\t\"Unverifiable SP discovery owner. Restart all SP instances.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tprocess.kill(descriptor.pid!, 0);\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ESRCH\") continue;\n\t\t\t\tthrow new SessionDeletionError(\"legacy_owner\", \"Cannot check SP discovery owner.\");\n\t\t\t}\n\t\t\tif (descriptor.writerLeaseVersion !== 1) {\n\t\t\t\tthrow new SessionDeletionError(\"legacy_owner\", \"Live legacy SP owner detected. Restart all SP instances.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async deleteTarget(\n\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\trequester?: TerminalWebBridge,\n\t): Promise<{ sessionId: string; deleted: true }> {\n\t\tif (this.stopped) throw new SessionDeletionError(\"not_ready\", \"SP instance is shutting down.\");\n\t\tif (\n\t\t\trequest.confirmed !== true ||\n\t\t\ttypeof request.sessionId !== \"string\" ||\n\t\t\t!/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(request.sessionId)\n\t\t) {\n\t\t\tthrow new SessionDeletionError(\"invalid_params\", \"A sessionId and confirmed:true are required.\");\n\t\t}\n\t\tif (this.terminal?.sessionId === request.sessionId) {\n\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\"terminal_root\",\n\t\t\t\t\"Use /new in the terminal before deleting its current session.\",\n\t\t\t);\n\t\t}\n\t\tconst matches = [...this.readyChildren].filter(([, child]) => child.session.sessionId === request.sessionId);\n\t\tif (matches.length > 1) throw new SessionDeletionError(\"invalid_session\", \"Ambiguous managed session ID.\");\n\t\tconst managed = matches[0];\n\t\tlet file = request.sessionFile ?? managed?.[0];\n\t\tif (!file) {\n\t\t\tconst files: string[] = [];\n\t\t\tconst visit = (directory: string) => {\n\t\t\t\tfor (const entry of readdirSync(directory, { withFileTypes: true })) {\n\t\t\t\t\tif (entry.isDirectory() && !entry.name.startsWith(\".\")) visit(join(directory, entry.name));\n\t\t\t\t\telse if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n\t\t\t\t\t\tconst candidate = join(directory, entry.name);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthis.validateHistoryFile(candidate, request.sessionId);\n\t\t\t\t\t\t\tfiles.push(candidate);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Discovery does not construct writers or repair malformed history.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tvisit(realpathSync(this.historyRoot));\n\t\t\tif (files.length !== 1)\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session not found or ID is ambiguous.\");\n\t\t\tfile = files[0];\n\t\t}\n\t\tconst reservedFile =\n\t\t\tmanaged &&\n\t\t\tmanaged[1].session.sessionManager.getSessionId() === request.sessionId &&\n\t\t\tmanaged[1].session.sessionManager.getSessionFile() === managed[0]\n\t\t\t\t? managed[0]\n\t\t\t\t: undefined;\n\t\tconst key = this.validateHistoryFile(file, request.sessionId, reservedFile);\n\t\tif (this.terminal?.file && canonicalFile(this.terminal.file) === key) {\n\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\"terminal_root\",\n\t\t\t\t\"Use /new in the terminal before deleting its current session.\",\n\t\t\t);\n\t\t}\n\t\tif (managed && managed[0] !== key)\n\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Managed session path mismatch.\");\n\t\tif (this.deleting.has(key) || this.terminalLeases.has(key) || (!managed && this.children.has(key))) {\n\t\t\tthrow new SessionDeletionError(\"busy\", \"Session is being acquired or deleted.\");\n\t\t}\n\t\tthis.rejectLegacyOwners();\n\t\tconst child = managed?.[1];\n\t\tif (child?.session.hasPendingOperations)\n\t\t\tthrow new SessionDeletionError(\"busy\", \"Session has pending operations.\");\n\t\tconst releaseGate = child?.bridge.reserveDeletion(child.bridge === requester);\n\t\tthis.deleting.add(key);\n\t\tlet disposed = false;\n\t\tlet releaseWrites: (() => void) | undefined;\n\t\tlet lease: ReturnType<typeof spWriterLeases.reserveDeletion> | undefined;\n\t\ttry {\n\t\t\tlease = spWriterLeases.reserveDeletion(key, !!child);\n\t\t\tthis.validateHistoryFile(key, request.sessionId, reservedFile);\n\t\t\tthis.rejectLegacyOwners();\n\t\t\tif (child) {\n\t\t\t\treleaseWrites = child.session.sessionManager.reserveWrites();\n\t\t\t\t// No abort: a busy target must be rejected, not cancelled to make it deletable.\n\t\t\t\tawait child.session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t\tchild.session.dispose();\n\t\t\t\tdisposed = true;\n\t\t\t\tthis.children.delete(key);\n\t\t\t\tthis.readyChildren.delete(key);\n\t\t\t}\n\t\t\tlease.assertOwned();\n\t\t\tthis.validateHistoryFile(key, request.sessionId, reservedFile);\n\t\t\tthis.rejectLegacyOwners();\n\t\t\tspWriterLeases.unlinkReserved(key, reservedFile === key);\n\t\t\treturn { sessionId: request.sessionId, deleted: true };\n\t\t} finally {\n\t\t\tlease?.release();\n\t\t\tthis.deleting.delete(key);\n\t\t\tif (!disposed) {\n\t\t\t\treleaseWrites?.();\n\t\t\t\treleaseGate?.();\n\t\t\t} else if (child && child.bridge !== requester) await child.bridge.finishDeletion();\n\t\t}\n\t}\n\n\tattachRuntime(runtime: AgentSessionRuntime) {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tthis.terminal = { file: runtime.session.sessionFile, sessionId: runtime.session.sessionId };\n\t\truntime.setSessionFileAcquirer((file) => this.acquireTerminalFile(file));\n\t\truntime.setSessionInvalidatedHandler(() => {\n\t\t\tthis.terminal = undefined;\n\t\t});\n\t}\n\n\ttrackBridge(bridge: TerminalWebBridge) {\n\t\tthis.bridges.add(bridge);\n\t}\n\n\tbridgeStopped(bridge: TerminalWebBridge) {\n\t\tthis.bridges.delete(bridge);\n\t}\n\n\tterminalStarted(context: ExtensionContext) {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tconst file = context.sessionManager.getSessionFile();\n\t\tif (file && this.children.has(canonicalFile(file))) throw new Error(\"Session file is owned by a web session.\");\n\t\tthis.terminal = { file, sessionId: context.sessionManager.getSessionId() };\n\t\tthis.installShutdownHooks();\n\t}\n\n\t/** Called by the runtime before it opens or overwrites a resume/import target. */\n\tacquireTerminalFile(file: string) {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tconst key = canonicalFile(file);\n\t\ttry {\n\t\t\tif (statSync(key).nlink > 1) throw new Error(\"Cannot acquire a session file with hard links.\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t}\n\t\tif (this.children.has(key)) throw new Error(\"Session file is owned by a web session.\");\n\t\tif (this.deleting.has(key)) throw new Error(\"Session file is being deleted.\");\n\t\tif (this.terminalLeases.has(key)) throw new Error(\"Session file is being acquired by the terminal.\");\n\t\tthis.terminalLeases.add(key);\n\t\treturn () => {\n\t\t\tthis.terminalLeases.delete(key);\n\t\t};\n\t}\n\n\tasync create(cwd: string): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tif (!isAbsolute(cwd) || !statSync(cwd).isDirectory())\n\t\t\tthrow new Error(\"cwd must be an existing absolute directory.\");\n\t\tconst sessionManager = SessionManager.create(realpathSync(cwd), this.sessionDir);\n\t\ttry {\n\t\t\treturn await this.acquire(canonicalFile(sessionManager.getSessionFile()!), () => sessionManager);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync resume(sessionFile: string): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tif (!isAbsolute(sessionFile)) throw new Error(\"sessionFile must be an absolute path.\");\n\t\tconst key = canonicalFile(sessionFile);\n\t\treturn this.acquire(key, () => {\n\t\t\tconst stat = statSync(key);\n\t\t\tif (!stat.isFile() || stat.nlink !== 1 || stat.size === 0)\n\t\t\t\tthrow new Error(\"Session file must be a nonempty regular file without hard links.\");\n\t\t\treturn SessionManager.open(key);\n\t\t});\n\t}\n\n\tprivate async acquire(key: string, open: () => SessionManager): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\tif (this.terminalLeases.has(key)) throw new Error(\"Session file is being acquired by the terminal.\");\n\t\tif (this.deleting.has(key)) throw new Error(\"Session file is being deleted.\");\n\t\tif (this.terminal?.file && canonicalFile(this.terminal.file) === key) {\n\t\t\treturn { sessionId: this.terminal.sessionId };\n\t\t}\n\t\tlet pending = this.children.get(key);\n\t\tif (!pending) {\n\t\t\tthis.installShutdownHooks();\n\t\t\t// Defer open as well as factory work until the reservation is visible.\n\t\t\tpending = Promise.resolve().then(async () => {\n\t\t\t\tconst manager = open();\n\t\t\t\ttry {\n\t\t\t\t\tconst child = await this.startChild(manager);\n\t\t\t\t\tthis.readyChildren.set(key, child);\n\t\t\t\t\treturn child;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tmanager.dispose();\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.children.set(key, pending);\n\t\t\tvoid pending.catch(() => {\n\t\t\t\tif (this.children.get(key) === pending) this.children.delete(key);\n\t\t\t});\n\t\t}\n\t\tconst child = await pending;\n\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\treturn { sessionId: child.session.sessionId };\n\t}\n\n\tprivate async startChild(sessionManager: SessionManager): Promise<Child> {\n\t\tif (!statSync(sessionManager.getCwd()).isDirectory()) throw new Error(\"Session cwd is not a directory.\");\n\t\tlet bridge: TerminalWebBridge | undefined;\n\t\tconst { session } = await this.factory(sessionManager, {\n\t\t\t...this.bridgeOptions,\n\t\t\tsessions: this,\n\t\t\twebOwned: true,\n\t\t\tlaunchSpWeb: false,\n\t\t\tonReady: (value) => {\n\t\t\t\tbridge = value;\n\t\t\t\tthis.trackBridge(value);\n\t\t\t},\n\t\t});\n\t\ttry {\n\t\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\t\tawait session.bindExtensions({\n\t\t\t\tmode: \"rpc\",\n\t\t\t\t// Dialog ownership is in the required extension's QuestionInteraction.\n\t\t\t\t// A distinct UI context advertises web UI without borrowing the terminal UI.\n\t\t\t\tuiContext: { ...session.extensionRunner.getUIContext() },\n\t\t\t});\n\t\t\tif (!bridge?.getDescriptor()) throw new Error(\"Required SP web bridge did not start.\");\n\t\t\tif (this.stopped) throw new Error(\"SP instance is shutting down.\");\n\t\t\tconst child = { session, bridge };\n\t\t\treturn child;\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait Promise.allSettled([bridge?.stop(), session.abort()]);\n\t\t\t\tawait session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t} finally {\n\t\t\t\tsession.dispose();\n\t\t\t\tawait session.settingsManager.flush();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate installShutdownHooks() {\n\t\tif (this.hooksInstalled) return;\n\t\tthis.hooksInstalled = true;\n\t\tprocess.on(\"exit\", this.onExit);\n\t\tfor (const signal of [\"SIGTERM\", \"SIGHUP\", \"SIGINT\"] as const) {\n\t\t\tconst handler = () => {\n\t\t\t\tvoid this.dispose().finally(() => {\n\t\t\t\t\t// Preserve the default signal action for SDK hosts with no other handler.\n\t\t\t\t\tif (process.listenerCount(signal) === 0) process.kill(process.pid, signal);\n\t\t\t\t});\n\t\t\t};\n\t\t\tthis.signalHandlers.set(signal, handler);\n\t\t\tprocess.on(signal, handler);\n\t\t}\n\t}\n\n\tdispose(): Promise<void> {\n\t\tif (this.closing) return this.closing;\n\t\tthis.stopped = true;\n\t\tthis.closing = this.close();\n\t\treturn this.closing;\n\t}\n\n\tprivate async close() {\n\t\ttry {\n\t\t\tawait Promise.allSettled([...this.deletions]);\n\t\t\tawait Promise.allSettled([...this.bridges].map((bridge) => bridge.stop()));\n\t\t\tawait Promise.allSettled(\n\t\t\t\t[...this.children.values()].map(async (pending) => {\n\t\t\t\t\tconst { session, bridge } = await pending;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait Promise.allSettled([bridge.stop(), session.abort()]);\n\t\t\t\t\t\tawait session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tsession.dispose();\n\t\t\t\t\t\tawait session.settingsManager.flush();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.onExit();\n\t\t\tthis.children.clear();\n\t\t\tthis.readyChildren.clear();\n\t\t\tthis.bridges.clear();\n\t\t\tthis.terminalLeases.clear();\n\t\t\tthis.terminal = undefined;\n\t\t\tprocess.off(\"exit\", this.onExit);\n\t\t\tfor (const [signal, handler] of this.signalHandlers) process.off(signal, handler);\n\t\t\tthis.signalHandlers.clear();\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tcloseSync,\n\tlstatSync,\n\topenSync,\n\treaddirSync,\n\treadFileSync,\n\treadSync,\n\trealpathSync,\n\ttype Stats,\n\tstatSync,\n} from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport type { AgentSession, AgentSessionRuntime, ExtensionContext } from \"@senpiper/pi-coding-agent\";\nimport { getAgentDir, SessionManager } from \"@senpiper/pi-coding-agent\";\nimport type { TerminalWebBridge, TerminalWebBridgeOptions } from \"@senpiper/sp-agent-extensions\";\nimport { installSpWriterLeases } from \"./session-writer-provider.ts\";\nimport { SessionDeletionError, spWriterLeases } from \"./writer-leases.ts\";\n\ninterface Child {\n\tsession: AgentSession;\n\tbridge: TerminalWebBridge;\n}\n\nexport type SpSessionFactory = (\n\tsessionManager: SessionManager,\n\tbridgeOptions: TerminalWebBridgeOptions,\n) => Promise<{ session: AgentSession }>;\n\nfunction canonicalFile(path: string): string {\n\tconst absolute = resolve(path);\n\ttry {\n\t\treturn realpathSync(absolute);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\tconst parent = dirname(absolute);\n\t\tif (parent === absolute) throw error;\n\t\treturn join(canonicalFile(parent), basename(absolute));\n\t}\n}\n\n/**\n * One Senpiper Workbench instance owns these writers until dispose, not until browser selection\n * or terminal replacement. Construction promises reserve files before any await.\n */\nexport class SpSessionManager {\n\tprivate readonly factory: SpSessionFactory;\n\tprivate readonly bridgeOptions: TerminalWebBridgeOptions;\n\tprivate readonly children = new Map<string, Promise<Child>>();\n\tprivate readonly readyChildren = new Map<string, Child>();\n\tprivate readonly deleting = new Set<string>();\n\tprivate readonly deletions = new Set<Promise<{ sessionId: string; deleted: true }>>();\n\tprivate historyRoot: string;\n\tprivate sessionDir: string | undefined;\n\tprivate readonly bridges = new Set<TerminalWebBridge>();\n\tprivate readonly terminalLeases = new Set<string>();\n\tprivate terminal: { file?: string; sessionId: string } | undefined;\n\tprivate closing: Promise<void> | undefined;\n\tprivate stopped = false;\n\tprivate hooksInstalled = false;\n\tprivate readonly signalHandlers = new Map<NodeJS.Signals, () => void>();\n\tprivate readonly onExit = () => {\n\t\tfor (const bridge of this.bridges) {\n\t\t\ttry {\n\t\t\t\tbridge.cleanupOnExit();\n\t\t\t} catch {\n\t\t\t\t// Continue cleaning the remaining descriptors on process exit.\n\t\t\t}\n\t\t}\n\t};\n\n\tconstructor(factory: SpSessionFactory, bridgeOptions: TerminalWebBridgeOptions = {}) {\n\t\tinstallSpWriterLeases();\n\t\tthis.factory = factory;\n\t\tthis.bridgeOptions = bridgeOptions;\n\t\tthis.sessionDir = process.env.SP_CODING_AGENT_SESSION_DIR;\n\t\tthis.historyRoot = resolve(this.sessionDir ?? join(bridgeOptions.agentDir ?? getAgentDir(), \"sessions\"));\n\t}\n\n\tsetHistoryRoot(root: string, customSessionDir = true): void {\n\t\tthis.historyRoot = resolve(root);\n\t\tthis.sessionDir = customSessionDir ? this.historyRoot : undefined;\n\t}\n\n\tdeleteSession(\n\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\trequester?: TerminalWebBridge,\n\t): Promise<{ sessionId: string; deleted: true }> {\n\t\tconst task = this.deleteTarget(request, requester);\n\t\tthis.deletions.add(task);\n\t\tvoid task.finally(() => this.deletions.delete(task)).catch(() => {});\n\t\treturn task;\n\t}\n\n\tprivate validateHistoryFile(file: string, sessionId: string, reservedFile?: string): string {\n\t\tif (!isAbsolute(file) || !file.endsWith(\".jsonl\")) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"sessionFile must be an absolute JSONL path.\");\n\t\t}\n\t\tconst root = realpathSync(this.historyRoot);\n\t\tconst key = canonicalFile(file);\n\t\tconst within = relative(root, key);\n\t\tif (!within || within === \"..\" || within.startsWith(`..${sep}`) || isAbsolute(within) || resolve(file) !== key) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"Session must be a canonical path inside configured history.\");\n\t\t}\n\t\tlet stat: Stats;\n\t\ttry {\n\t\t\tstat = lstatSync(file);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\" && reservedFile === key) return key;\n\t\t\tthrow error;\n\t\t}\n\t\tif (!stat.isFile() || stat.nlink !== 1) {\n\t\t\tthrow new SessionDeletionError(\"invalid_path\", \"Session must be a regular file without hard links.\");\n\t\t}\n\t\tconst fd = openSync(file, \"r\");\n\t\ttry {\n\t\t\tconst buffer = Buffer.alloc(1024 * 1024);\n\t\t\tconst length = readSync(fd, buffer, 0, buffer.length, 0);\n\t\t\tconst newline = buffer.subarray(0, length).indexOf(10);\n\t\t\tif (newline < 0 && length === buffer.length) {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header exceeds scan limit.\");\n\t\t\t}\n\t\t\tlet header: unknown;\n\t\t\ttry {\n\t\t\t\theader = JSON.parse(buffer.subarray(0, newline < 0 ? length : newline).toString(\"utf8\"));\n\t\t\t} catch {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header is not valid JSON.\");\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof header !== \"object\" ||\n\t\t\t\theader === null ||\n\t\t\t\t!(\"type\" in header) ||\n\t\t\t\theader.type !== \"session\" ||\n\t\t\t\t!(\"id\" in header) ||\n\t\t\t\theader.id !== sessionId\n\t\t\t) {\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session header ID does not match sessionId.\");\n\t\t\t}\n\t\t} finally {\n\t\t\tcloseSync(fd);\n\t\t}\n\t\treturn key;\n\t}\n\n\tprivate rejectLegacyOwners(): void {\n\t\tconst discovery = join(this.bridgeOptions.agentDir ?? getAgentDir(), \"web-bridge\", \"discovery\");\n\t\tlet names: string[];\n\t\ttry {\n\t\t\tnames = readdirSync(discovery);\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return;\n\t\t\tthrow error;\n\t\t}\n\t\tfor (const name of names) {\n\t\t\t// The web launcher shares this directory with session discovery.\n\t\t\t// Its process record and lock do not represent session writers.\n\t\t\tif (!name.endsWith(\".json\") || name === \"pi-web-sidecar.json\" || name === \"sp-web-sidecar.json\") continue;\n\t\t\tconst descriptor = JSON.parse(readFileSync(join(discovery, name), \"utf8\")) as {\n\t\t\t\tpid?: number;\n\t\t\t\tsessionFile?: string;\n\t\t\t\twriterLeaseVersion?: number;\n\t\t\t};\n\t\t\tif (!Number.isSafeInteger(descriptor.pid) || descriptor.pid! <= 0) {\n\t\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\t\"legacy_owner\",\n\t\t\t\t\t\"Unverifiable Senpiper Workbench discovery owner. Restart all Senpiper Workbench instances.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tprocess.kill(descriptor.pid!, 0);\n\t\t\t} catch (error) {\n\t\t\t\tif ((error as NodeJS.ErrnoException).code === \"ESRCH\") continue;\n\t\t\t\tthrow new SessionDeletionError(\"legacy_owner\", \"Cannot check the Senpiper Workbench discovery owner.\");\n\t\t\t}\n\t\t\tif (descriptor.writerLeaseVersion !== 1) {\n\t\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\t\"legacy_owner\",\n\t\t\t\t\t\"Live legacy Senpiper Workbench owner detected. Restart all Senpiper Workbench instances.\",\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async deleteTarget(\n\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\trequester?: TerminalWebBridge,\n\t): Promise<{ sessionId: string; deleted: true }> {\n\t\tif (this.stopped) throw new SessionDeletionError(\"not_ready\", \"Senpiper Workbench instance is shutting down.\");\n\t\tif (\n\t\t\trequest.confirmed !== true ||\n\t\t\ttypeof request.sessionId !== \"string\" ||\n\t\t\t!/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(request.sessionId)\n\t\t) {\n\t\t\tthrow new SessionDeletionError(\"invalid_params\", \"A sessionId and confirmed:true are required.\");\n\t\t}\n\t\tif (this.terminal?.sessionId === request.sessionId) {\n\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\"terminal_root\",\n\t\t\t\t\"Use /new in the terminal before deleting its current session.\",\n\t\t\t);\n\t\t}\n\t\tconst matches = [...this.readyChildren].filter(([, child]) => child.session.sessionId === request.sessionId);\n\t\tif (matches.length > 1) throw new SessionDeletionError(\"invalid_session\", \"Ambiguous managed session ID.\");\n\t\tconst managed = matches[0];\n\t\tlet file = request.sessionFile ?? managed?.[0];\n\t\tif (!file) {\n\t\t\tconst files: string[] = [];\n\t\t\tconst visit = (directory: string) => {\n\t\t\t\tfor (const entry of readdirSync(directory, { withFileTypes: true })) {\n\t\t\t\t\tif (entry.isDirectory() && !entry.name.startsWith(\".\")) visit(join(directory, entry.name));\n\t\t\t\t\telse if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n\t\t\t\t\t\tconst candidate = join(directory, entry.name);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tthis.validateHistoryFile(candidate, request.sessionId);\n\t\t\t\t\t\t\tfiles.push(candidate);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Discovery does not construct writers or repair malformed history.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tvisit(realpathSync(this.historyRoot));\n\t\t\tif (files.length !== 1)\n\t\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Session not found or ID is ambiguous.\");\n\t\t\tfile = files[0];\n\t\t}\n\t\tconst reservedFile =\n\t\t\tmanaged &&\n\t\t\tmanaged[1].session.sessionManager.getSessionId() === request.sessionId &&\n\t\t\tmanaged[1].session.sessionManager.getSessionFile() === managed[0]\n\t\t\t\t? managed[0]\n\t\t\t\t: undefined;\n\t\tconst key = this.validateHistoryFile(file, request.sessionId, reservedFile);\n\t\tif (this.terminal?.file && canonicalFile(this.terminal.file) === key) {\n\t\t\tthrow new SessionDeletionError(\n\t\t\t\t\"terminal_root\",\n\t\t\t\t\"Use /new in the terminal before deleting its current session.\",\n\t\t\t);\n\t\t}\n\t\tif (managed && managed[0] !== key)\n\t\t\tthrow new SessionDeletionError(\"invalid_session\", \"Managed session path mismatch.\");\n\t\tif (this.deleting.has(key) || this.terminalLeases.has(key) || (!managed && this.children.has(key))) {\n\t\t\tthrow new SessionDeletionError(\"busy\", \"Session is being acquired or deleted.\");\n\t\t}\n\t\tthis.rejectLegacyOwners();\n\t\tconst child = managed?.[1];\n\t\tif (child?.session.hasPendingOperations)\n\t\t\tthrow new SessionDeletionError(\"busy\", \"Session has pending operations.\");\n\t\tconst releaseGate = child?.bridge.reserveDeletion(child.bridge === requester);\n\t\tthis.deleting.add(key);\n\t\tlet disposed = false;\n\t\tlet releaseWrites: (() => void) | undefined;\n\t\tlet lease: ReturnType<typeof spWriterLeases.reserveDeletion> | undefined;\n\t\ttry {\n\t\t\tlease = spWriterLeases.reserveDeletion(key, !!child);\n\t\t\tthis.validateHistoryFile(key, request.sessionId, reservedFile);\n\t\t\tthis.rejectLegacyOwners();\n\t\t\tif (child) {\n\t\t\t\treleaseWrites = child.session.sessionManager.reserveWrites();\n\t\t\t\t// No abort: a busy target must be rejected, not cancelled to make it deletable.\n\t\t\t\tawait child.session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t\tchild.session.dispose();\n\t\t\t\tdisposed = true;\n\t\t\t\tthis.children.delete(key);\n\t\t\t\tthis.readyChildren.delete(key);\n\t\t\t}\n\t\t\tlease.assertOwned();\n\t\t\tthis.validateHistoryFile(key, request.sessionId, reservedFile);\n\t\t\tthis.rejectLegacyOwners();\n\t\t\tspWriterLeases.unlinkReserved(key, reservedFile === key);\n\t\t\treturn { sessionId: request.sessionId, deleted: true };\n\t\t} finally {\n\t\t\tlease?.release();\n\t\t\tthis.deleting.delete(key);\n\t\t\tif (!disposed) {\n\t\t\t\treleaseWrites?.();\n\t\t\t\treleaseGate?.();\n\t\t\t} else if (child && child.bridge !== requester) await child.bridge.finishDeletion();\n\t\t}\n\t}\n\n\tattachRuntime(runtime: AgentSessionRuntime) {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tthis.terminal = { file: runtime.session.sessionFile, sessionId: runtime.session.sessionId };\n\t\truntime.setSessionFileAcquirer((file) => this.acquireTerminalFile(file));\n\t\truntime.setSessionInvalidatedHandler(() => {\n\t\t\tthis.terminal = undefined;\n\t\t});\n\t}\n\n\ttrackBridge(bridge: TerminalWebBridge) {\n\t\tthis.bridges.add(bridge);\n\t}\n\n\tbridgeStopped(bridge: TerminalWebBridge) {\n\t\tthis.bridges.delete(bridge);\n\t}\n\n\tterminalStarted(context: ExtensionContext) {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tconst file = context.sessionManager.getSessionFile();\n\t\tif (file && this.children.has(canonicalFile(file))) throw new Error(\"Session file is owned by a web session.\");\n\t\tthis.terminal = { file, sessionId: context.sessionManager.getSessionId() };\n\t\tthis.installShutdownHooks();\n\t}\n\n\t/** Called by the runtime before it opens or overwrites a resume/import target. */\n\tacquireTerminalFile(file: string) {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tconst key = canonicalFile(file);\n\t\ttry {\n\t\t\tif (statSync(key).nlink > 1) throw new Error(\"Cannot acquire a session file with hard links.\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\t}\n\t\tif (this.children.has(key)) throw new Error(\"Session file is owned by a web session.\");\n\t\tif (this.deleting.has(key)) throw new Error(\"Session file is being deleted.\");\n\t\tif (this.terminalLeases.has(key)) throw new Error(\"Session file is being acquired by the terminal.\");\n\t\tthis.terminalLeases.add(key);\n\t\treturn () => {\n\t\t\tthis.terminalLeases.delete(key);\n\t\t};\n\t}\n\n\tasync create(cwd: string): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tif (!isAbsolute(cwd) || !statSync(cwd).isDirectory())\n\t\t\tthrow new Error(\"cwd must be an existing absolute directory.\");\n\t\tconst sessionManager = SessionManager.create(realpathSync(cwd), this.sessionDir);\n\t\ttry {\n\t\t\treturn await this.acquire(canonicalFile(sessionManager.getSessionFile()!), () => sessionManager);\n\t\t} catch (error) {\n\t\t\tsessionManager.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync resume(sessionFile: string): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tif (!isAbsolute(sessionFile)) throw new Error(\"sessionFile must be an absolute path.\");\n\t\tconst key = canonicalFile(sessionFile);\n\t\treturn this.acquire(key, () => {\n\t\t\tconst stat = statSync(key);\n\t\t\tif (!stat.isFile() || stat.nlink !== 1 || stat.size === 0)\n\t\t\t\tthrow new Error(\"Session file must be a nonempty regular file without hard links.\");\n\t\t\treturn SessionManager.open(key);\n\t\t});\n\t}\n\n\tprivate async acquire(key: string, open: () => SessionManager): Promise<{ sessionId: string }> {\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\tif (this.terminalLeases.has(key)) throw new Error(\"Session file is being acquired by the terminal.\");\n\t\tif (this.deleting.has(key)) throw new Error(\"Session file is being deleted.\");\n\t\tif (this.terminal?.file && canonicalFile(this.terminal.file) === key) {\n\t\t\treturn { sessionId: this.terminal.sessionId };\n\t\t}\n\t\tlet pending = this.children.get(key);\n\t\tif (!pending) {\n\t\t\tthis.installShutdownHooks();\n\t\t\t// Defer open as well as factory work until the reservation is visible.\n\t\t\tpending = Promise.resolve().then(async () => {\n\t\t\t\tconst manager = open();\n\t\t\t\ttry {\n\t\t\t\t\tconst child = await this.startChild(manager);\n\t\t\t\t\tthis.readyChildren.set(key, child);\n\t\t\t\t\treturn child;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tmanager.dispose();\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.children.set(key, pending);\n\t\t\tvoid pending.catch(() => {\n\t\t\t\tif (this.children.get(key) === pending) this.children.delete(key);\n\t\t\t});\n\t\t}\n\t\tconst child = await pending;\n\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\treturn { sessionId: child.session.sessionId };\n\t}\n\n\tprivate async startChild(sessionManager: SessionManager): Promise<Child> {\n\t\tif (!statSync(sessionManager.getCwd()).isDirectory()) throw new Error(\"Session cwd is not a directory.\");\n\t\tlet bridge: TerminalWebBridge | undefined;\n\t\tconst { session } = await this.factory(sessionManager, {\n\t\t\t...this.bridgeOptions,\n\t\t\tsessions: this,\n\t\t\twebOwned: true,\n\t\t\tlaunchSpWeb: false,\n\t\t\tonReady: (value) => {\n\t\t\t\tbridge = value;\n\t\t\t\tthis.trackBridge(value);\n\t\t\t},\n\t\t});\n\t\ttry {\n\t\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\t\tawait session.bindExtensions({\n\t\t\t\tmode: \"rpc\",\n\t\t\t\t// Dialog ownership is in the required extension's QuestionInteraction.\n\t\t\t\t// A distinct UI context advertises web UI without borrowing the terminal UI.\n\t\t\t\tuiContext: { ...session.extensionRunner.getUIContext() },\n\t\t\t});\n\t\t\tif (!bridge?.getDescriptor()) throw new Error(\"Required Senpiper Workbench web bridge did not start.\");\n\t\t\tif (this.stopped) throw new Error(\"Senpiper Workbench instance is shutting down.\");\n\t\t\tconst child = { session, bridge };\n\t\t\treturn child;\n\t\t} catch (error) {\n\t\t\ttry {\n\t\t\t\tawait Promise.allSettled([bridge?.stop(), session.abort()]);\n\t\t\t\tawait session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t} finally {\n\t\t\t\tsession.dispose();\n\t\t\t\tawait session.settingsManager.flush();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate installShutdownHooks() {\n\t\tif (this.hooksInstalled) return;\n\t\tthis.hooksInstalled = true;\n\t\tprocess.on(\"exit\", this.onExit);\n\t\tfor (const signal of [\"SIGTERM\", \"SIGHUP\", \"SIGINT\"] as const) {\n\t\t\tconst handler = () => {\n\t\t\t\tvoid this.dispose().finally(() => {\n\t\t\t\t\t// Preserve the default signal action for SDK hosts with no other handler.\n\t\t\t\t\tif (process.listenerCount(signal) === 0) process.kill(process.pid, signal);\n\t\t\t\t});\n\t\t\t};\n\t\t\tthis.signalHandlers.set(signal, handler);\n\t\t\tprocess.on(signal, handler);\n\t\t}\n\t}\n\n\tdispose(): Promise<void> {\n\t\tif (this.closing) return this.closing;\n\t\tthis.stopped = true;\n\t\tthis.closing = this.close();\n\t\treturn this.closing;\n\t}\n\n\tprivate async close() {\n\t\ttry {\n\t\t\tawait Promise.allSettled([...this.deletions]);\n\t\t\tawait Promise.allSettled([...this.bridges].map((bridge) => bridge.stop()));\n\t\t\tawait Promise.allSettled(\n\t\t\t\t[...this.children.values()].map(async (pending) => {\n\t\t\t\t\tconst { session, bridge } = await pending;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait Promise.allSettled([bridge.stop(), session.abort()]);\n\t\t\t\t\t\tawait session.extensionRunner.emit({ type: \"session_shutdown\", reason: \"quit\" });\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tsession.dispose();\n\t\t\t\t\t\tawait session.settingsManager.flush();\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t} finally {\n\t\t\tthis.onExit();\n\t\t\tthis.children.clear();\n\t\t\tthis.readyChildren.clear();\n\t\t\tthis.bridges.clear();\n\t\t\tthis.terminalLeases.clear();\n\t\t\tthis.terminal = undefined;\n\t\t\tprocess.off(\"exit\", this.onExit);\n\t\t\tfor (const [signal, handler] of this.signalHandlers) process.off(signal, handler);\n\t\t\tthis.signalHandlers.clear();\n\t\t}\n\t}\n}\n"]}
|
package/dist/sp-web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sp-web.d.ts","sourceRoot":"","sources":["../src/sp-web.ts"],"names":[],"mappings":"","sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n// Resolve relative to this installed package, never cwd, PATH, or a global pi-web.\nconst entry = fileURLToPath(new URL(\"../node_modules/@senpiper/sp-web/bin/sp-web.js\", import.meta.url));\nif (!existsSync(entry)) {\n\tconsole.error(\"
|
|
1
|
+
{"version":3,"file":"sp-web.d.ts","sourceRoot":"","sources":["../src/sp-web.ts"],"names":[],"mappings":"","sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n// Resolve relative to this installed package, never cwd, PATH, or a global pi-web.\nconst entry = fileURLToPath(new URL(\"../node_modules/@senpiper/sp-web/bin/sp-web.js\", import.meta.url));\nif (!existsSync(entry)) {\n\tconsole.error(\"The bundled Senpiper Workbench web workspace is missing. Reinstall @senpiper/sp-agent.\");\n\tprocess.exit(1);\n}\n\nconst child = spawn(process.execPath, [entry, ...process.argv.slice(2)], { stdio: \"inherit\" });\nconst signals = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\nconst handlers = signals.map((signal) => {\n\tconst handler = () => child.kill(signal);\n\tprocess.on(signal, handler);\n\treturn handler;\n});\nchild.on(\"error\", (error) => {\n\tconsole.error(`Cannot launch the bundled Senpiper Workbench web workspace: ${error.message}`);\n\tprocess.exitCode = 1;\n});\nchild.on(\"close\", (code, signal) => {\n\tfor (const [index, name] of signals.entries()) process.removeListener(name, handlers[index]);\n\tif (signal) process.kill(process.pid, signal);\n\telse process.exitCode = code ?? 1;\n});\n"]}
|
package/dist/sp-web.js
CHANGED
|
@@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url";
|
|
|
5
5
|
// Resolve relative to this installed package, never cwd, PATH, or a global pi-web.
|
|
6
6
|
const entry = fileURLToPath(new URL("../node_modules/@senpiper/sp-web/bin/sp-web.js", import.meta.url));
|
|
7
7
|
if (!existsSync(entry)) {
|
|
8
|
-
console.error("
|
|
8
|
+
console.error("The bundled Senpiper Workbench web workspace is missing. Reinstall @senpiper/sp-agent.");
|
|
9
9
|
process.exit(1);
|
|
10
10
|
}
|
|
11
11
|
const child = spawn(process.execPath, [entry, ...process.argv.slice(2)], { stdio: "inherit" });
|
|
@@ -16,7 +16,7 @@ const handlers = signals.map((signal) => {
|
|
|
16
16
|
return handler;
|
|
17
17
|
});
|
|
18
18
|
child.on("error", (error) => {
|
|
19
|
-
console.error(`Cannot launch bundled
|
|
19
|
+
console.error(`Cannot launch the bundled Senpiper Workbench web workspace: ${error.message}`);
|
|
20
20
|
process.exitCode = 1;
|
|
21
21
|
});
|
|
22
22
|
child.on("close", (code, signal) => {
|
package/dist/sp-web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sp-web.js","sourceRoot":"","sources":["../src/sp-web.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mFAAmF;AACnF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,gDAAgD,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"sp-web.js","sourceRoot":"","sources":["../src/sp-web.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,mFAAmF;AACnF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,gDAAgD,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACxG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;IACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/F,MAAM,OAAO,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC;AAAA,CACf,CAAC,CAAC;AACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,+DAA+D,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9F,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAAA,CACrB,CAAC,CAAC;AACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7F,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;;QACzC,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;AAAA,CAClC,CAAC,CAAC","sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\n\n// Resolve relative to this installed package, never cwd, PATH, or a global pi-web.\nconst entry = fileURLToPath(new URL(\"../node_modules/@senpiper/sp-web/bin/sp-web.js\", import.meta.url));\nif (!existsSync(entry)) {\n\tconsole.error(\"The bundled Senpiper Workbench web workspace is missing. Reinstall @senpiper/sp-agent.\");\n\tprocess.exit(1);\n}\n\nconst child = spawn(process.execPath, [entry, ...process.argv.slice(2)], { stdio: \"inherit\" });\nconst signals = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const;\nconst handlers = signals.map((signal) => {\n\tconst handler = () => child.kill(signal);\n\tprocess.on(signal, handler);\n\treturn handler;\n});\nchild.on(\"error\", (error) => {\n\tconsole.error(`Cannot launch the bundled Senpiper Workbench web workspace: ${error.message}`);\n\tprocess.exitCode = 1;\n});\nchild.on(\"close\", (code, signal) => {\n\tfor (const [index, name] of signals.entries()) process.removeListener(name, handlers[index]);\n\tif (signal) process.kill(process.pid, signal);\n\telse process.exitCode = code ?? 1;\n});\n"]}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SP_AGENT_VERSION = "0.1.
|
|
1
|
+
export declare const SP_AGENT_VERSION = "0.1.11";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,WAAW,CAAC","sourcesContent":["export const SP_AGENT_VERSION = \"0.1.11\";\n"]}
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SP_AGENT_VERSION = "0.1.
|
|
1
|
+
export const SP_AGENT_VERSION = "0.1.11";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAQ,CAAC","sourcesContent":["export const SP_AGENT_VERSION = \"0.1.11\";\n"]}
|