@senpiper/sp-agent 0.1.7 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/INSTALL.md +3 -4
  2. package/README.md +10 -10
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +1 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/distribution.d.ts +2 -2
  7. package/dist/distribution.d.ts.map +1 -1
  8. package/dist/distribution.js +2 -2
  9. package/dist/distribution.js.map +1 -1
  10. package/dist/extension-identity.generated.d.ts +3 -3
  11. package/dist/extension-identity.generated.d.ts.map +1 -1
  12. package/dist/extension-identity.generated.js +3 -3
  13. package/dist/extension-identity.generated.js.map +1 -1
  14. package/dist/runtime-cli.d.ts.map +1 -1
  15. package/dist/runtime-cli.js +1 -1
  16. package/dist/runtime-cli.js.map +1 -1
  17. package/dist/version.d.ts +1 -1
  18. package/dist/version.d.ts.map +1 -1
  19. package/dist/version.js +1 -1
  20. package/dist/version.js.map +1 -1
  21. package/node_modules/@senpiper/pi-coding-agent/dist/bundle/chunks/{chunk-BFHDVWYY.js → chunk-LUSUF4ZH.js} +1 -1
  22. package/node_modules/@senpiper/pi-coding-agent/dist/bundle/chunks/github-copilot.js +1 -1
  23. package/node_modules/@senpiper/pi-coding-agent/dist/bundle/cli.js +1 -1
  24. package/node_modules/@senpiper/pi-coding-agent/dist/bundle/index.js +1 -1
  25. package/node_modules/@senpiper/pi-coding-agent/dist/bundle/rpc-entry.js +1 -1
  26. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  27. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  28. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  29. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  30. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -1
  31. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  32. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  33. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  34. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  35. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai-cn.json +1 -1
  36. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai.json +1 -1
  37. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  38. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  39. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  40. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  41. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  42. package/node_modules/@senpiper/pi-coding-agent/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  43. package/node_modules/@senpiper/sp-agent-extensions/TERMINAL_WEB_BRIDGE.md +4 -4
  44. package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.d.ts +0 -6
  45. package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.d.ts.map +1 -1
  46. package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.js +2 -81
  47. package/node_modules/@senpiper/sp-agent-extensions/dist/cli-commands.js.map +1 -1
  48. package/node_modules/@senpiper/sp-agent-extensions/dist/commands.d.ts +2 -2
  49. package/node_modules/@senpiper/sp-agent-extensions/dist/commands.d.ts.map +1 -1
  50. package/node_modules/@senpiper/sp-agent-extensions/dist/commands.js +2 -2
  51. package/node_modules/@senpiper/sp-agent-extensions/dist/commands.js.map +1 -1
  52. package/node_modules/@senpiper/sp-agent-extensions/dist/extension.d.ts.map +1 -1
  53. package/node_modules/@senpiper/sp-agent-extensions/dist/extension.js +2 -0
  54. package/node_modules/@senpiper/sp-agent-extensions/dist/extension.js.map +1 -1
  55. package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.d.ts.map +1 -1
  56. package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.js +14 -3
  57. package/node_modules/@senpiper/sp-agent-extensions/dist/gateway.js.map +1 -1
  58. package/node_modules/@senpiper/sp-agent-extensions/dist/index.d.ts +0 -2
  59. package/node_modules/@senpiper/sp-agent-extensions/dist/index.d.ts.map +1 -1
  60. package/node_modules/@senpiper/sp-agent-extensions/dist/index.js +0 -2
  61. package/node_modules/@senpiper/sp-agent-extensions/dist/index.js.map +1 -1
  62. package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.d.ts +0 -2
  63. package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.d.ts.map +1 -1
  64. package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.js +0 -3
  65. package/node_modules/@senpiper/sp-agent-extensions/dist/interactions.js.map +1 -1
  66. package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.d.ts.map +1 -1
  67. package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.js +1 -11
  68. package/node_modules/@senpiper/sp-agent-extensions/dist/login-command.js.map +1 -1
  69. package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.d.ts +1 -1
  70. package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.d.ts.map +1 -1
  71. package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.js +13 -2
  72. package/node_modules/@senpiper/sp-agent-extensions/dist/startup-header.js.map +1 -1
  73. package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.d.ts.map +1 -1
  74. package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.js +7 -1
  75. package/node_modules/@senpiper/sp-agent-extensions/dist/terminal-web-bridge.js.map +1 -1
  76. package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.d.ts +5 -0
  77. package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.d.ts.map +1 -0
  78. package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.js +95 -0
  79. package/node_modules/@senpiper/sp-agent-extensions/dist/web-command.js.map +1 -0
  80. package/node_modules/@senpiper/sp-agent-extensions/package.json +1 -4
  81. package/package.json +3 -3
  82. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.d.ts +0 -4
  83. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.d.ts.map +0 -1
  84. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.js +0 -67
  85. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-command.js.map +0 -1
  86. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.d.ts +0 -14
  87. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.d.ts.map +0 -1
  88. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.js +0 -32
  89. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding-installation.js.map +0 -1
  90. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.d.ts +0 -39
  91. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.d.ts.map +0 -1
  92. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.js +0 -311
  93. package/node_modules/@senpiper/sp-agent-extensions/dist/onboarding.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-web-bridge.js","sourceRoot":"","sources":["../src/terminal-web-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomBytes, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { join } from \"node:path\";\nimport type { ExtensionAPI, ExtensionContext } from \"@senpiper/pi-coding-agent\";\nimport { completeSimple } from \"@senpiper/pi-coding-agent/runtime-deps\";\nimport { getSpAgentDir } from \"./gateway.ts\";\nimport { getQuestionInteraction, type QuestionInteraction, QuestionResponseError } from \"./question-interaction.ts\";\nimport { ensureSpWebSidecar, type SpWebLauncherOptions, type SpWebLaunchResult } from \"./sp-web-launcher.ts\";\n\nexport const TERMINAL_BRIDGE_PROTOCOL = \"sp-terminal-bridge-v1\";\nexport const TERMINAL_BRIDGE_VERSION = 1;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_FRAME_BYTES = 10 * 1024 * 1024;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_BUFFERED_BYTES = 10 * 1024 * 1024;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_CLIENTS = 8;\nexport const TERMINAL_BRIDGE_IMAGE_LIMITS = {\n\tmimeTypes: [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"],\n\tmaxImages: 8,\n\tmaxBase64BytesPerImage: 4 * 1024 * 1024,\n\tmaxBase64BytesTotal: 8 * 1024 * 1024,\n} as const;\n\nconst MAX_REQUEST_ID_LENGTH = 128;\nconst MAX_PENDING_REQUESTS = 32;\nconst MAX_SEEN_REQUEST_IDS = 1024;\nconst MAX_EVENT_HISTORY = 256;\nconst MAX_EVENT_HISTORY_BYTES = 32 * 1024 * 1024;\nconst MAX_TRANSCRIPT_PAGE_SIZE = 100;\nconst MAX_TITLE_CONTEXT_BYTES = 32 * 1024;\nconst MAX_TITLE_LENGTH = 80;\nconst THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\ntype ThinkingLevel = (typeof THINKING_LEVELS)[number];\ntype JsonRecord = Record<string, unknown>;\n\nexport interface TerminalBridgeDescriptor {\n\tversion: 1;\n\tprotocol: typeof TERMINAL_BRIDGE_PROTOCOL;\n\tinstanceId: string;\n\tpid: number;\n\tsessionId: string;\n\tsessionFile?: string;\n\tcwd: string;\n\tsocketPath: string;\n\tauthToken: string;\n\tgeneration: number;\n\tstartedAt: string;\n\twriterLeaseVersion?: 1;\n\tframe: {\n\t\tencoding: \"newline-delimited-json\";\n\t\tmaxBytes: number;\n\t};\n}\n\nexport interface TerminalWebBridgeOptions {\n\t/** Set only by a distribution that installed the lifetime writer provider before file opening. */\n\twriterLeaseVersion?: 1;\n\t/** Supplied by the verified SP distribution, shared across terminal replacements. */\n\tsessions?: {\n\t\tcreate(cwd: string): Promise<{ sessionId: string }>;\n\t\tresume(sessionFile: string): Promise<{ sessionId: string }>;\n\t\tdeleteSession?(\n\t\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\t\trequester?: TerminalWebBridge,\n\t\t): Promise<{ sessionId: string; deleted: true }>;\n\t\tterminalStarted(context: ExtensionContext): void;\n\t\tbridgeStopped?(bridge: TerminalWebBridge): void;\n\t\tdispose(): Promise<void>;\n\t};\n\twebOwned?: boolean;\n\tonReady?: (bridge: TerminalWebBridge) => void;\n\tagentDir?: string;\n\tmaxFrameBytes?: number;\n\tmaxBufferedBytes?: number;\n\tmaxClients?: number;\n\tlaunchSpWeb?: boolean;\n\tlauncherOptions?: SpWebLauncherOptions;\n\ttitleGenerator?: (context: ExtensionContext, pi: ExtensionAPI, signal: AbortSignal) => Promise<unknown>;\n}\n\ninterface BridgePaths {\n\trootDir: string;\n\tdiscoveryDir: string;\n\tsocketDir: string;\n\tdescriptorPath: string;\n\tsocketPath: string;\n}\n\ninterface ClientState {\n\tsocket: Socket;\n\tbuffer: Buffer;\n\tauthenticated: boolean;\n\tsubscribed: boolean;\n\tpendingRequests: number;\n\tseenRequestIds: Set<string>;\n}\n\ninterface RequestFrame {\n\tv: 1;\n\ttype: \"request\";\n\tid: string;\n\tgeneration: number;\n\tcommand: string;\n\tparams?: JsonRecord;\n}\n\ninterface EventFrame {\n\tv: 1;\n\ttype: \"event\";\n\tgeneration: number;\n\tsequence: number;\n\tevent: string;\n\tcategory: \"message\" | \"agent\" | \"tool\" | \"model\" | \"thinking\" | \"session\" | \"interaction\";\n\tpayload: unknown;\n}\n\nclass RequestError extends Error {\n\treadonly code: string;\n\n\tconstructor(code: string, message: string) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMissingFileError(error: unknown) {\n\treturn isRecord(error) && error.code === \"ENOENT\";\n}\n\nfunction requireString(value: unknown, name: string, maximumLength = 100_000) {\n\tif (typeof value !== \"string\" || !value.trim()) throw new RequestError(\"invalid_params\", `${name} is required.`);\n\tif (Buffer.byteLength(value, \"utf8\") > maximumLength) {\n\t\tthrow new RequestError(\"invalid_params\", `${name} is too long.`);\n\t}\n\treturn value;\n}\n\nfunction userMessageContent(params: JsonRecord): Parameters<ExtensionAPI[\"sendUserMessage\"]>[0] {\n\tconst images = params.images;\n\tif (images === undefined || (Array.isArray(images) && images.length === 0)) {\n\t\treturn requireString(params.text, \"text\");\n\t}\n\tif (!Array.isArray(images) || images.length > TERMINAL_BRIDGE_IMAGE_LIMITS.maxImages) {\n\t\tthrow new RequestError(\"invalid_params\", \"images must be an array of at most 8 images.\");\n\t}\n\tconst content: Exclude<Parameters<ExtensionAPI[\"sendUserMessage\"]>[0], string> = [];\n\tif (params.text !== undefined) {\n\t\tif (typeof params.text !== \"string\" || Buffer.byteLength(params.text, \"utf8\") > 100_000) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"text must be a string of at most 100000 UTF-8 bytes.\");\n\t\t}\n\t\tif (params.text.length > 0) content.push({ type: \"text\", text: params.text });\n\t}\n\tlet total = 0;\n\tfor (const image of images) {\n\t\tif (\n\t\t\t!isRecord(image) ||\n\t\t\tObject.keys(image).some((key) => key !== \"mimeType\" && key !== \"data\") ||\n\t\t\ttypeof image.mimeType !== \"string\" ||\n\t\t\t!TERMINAL_BRIDGE_IMAGE_LIMITS.mimeTypes.some((mimeType) => mimeType === image.mimeType) ||\n\t\t\ttypeof image.data !== \"string\" ||\n\t\t\timage.data.length === 0\n\t\t) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Each image requires a supported mimeType and base64 data only.\");\n\t\t}\n\t\ttotal += image.data.length;\n\t\tif (\n\t\t\timage.data.length > TERMINAL_BRIDGE_IMAGE_LIMITS.maxBase64BytesPerImage ||\n\t\t\ttotal > TERMINAL_BRIDGE_IMAGE_LIMITS.maxBase64BytesTotal\n\t\t) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Image base64 exceeds the per-image or aggregate byte limit.\");\n\t\t}\n\t\t// Buffer's decoder alone accepts paths, whitespace, URL-safe and malformed base64.\n\t\tif (/[^A-Za-z0-9+/=]/u.test(image.data) || Buffer.from(image.data, \"base64\").toString(\"base64\") !== image.data) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Image data must be canonical padded base64, not a path or URL.\");\n\t\t}\n\t\tcontent.push({ type: \"image\", mimeType: image.mimeType, data: image.data });\n\t}\n\treturn content;\n}\n\nfunction optionalInteger(value: unknown, name: string, fallback: number) {\n\tif (value === undefined) return fallback;\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new RequestError(\"invalid_params\", `${name} must be a non-negative integer.`);\n\t}\n\treturn value as number;\n}\n\nfunction normalizeForJson(value: unknown, omitImageData = false): unknown {\n\treturn JSON.parse(\n\t\tJSON.stringify(value, (_key, entry: unknown) => {\n\t\t\tif (omitImageData && isRecord(entry) && entry.type === \"image\") {\n\t\t\t\treturn { type: \"image\", mimeType: entry.mimeType };\n\t\t\t}\n\t\t\tif (typeof entry === \"bigint\") return entry.toString();\n\t\t\tif (entry instanceof Error) return { name: entry.name, message: entry.message };\n\t\t\treturn entry;\n\t\t}),\n\t) as unknown;\n}\n\nfunction availableModels(context: ExtensionContext) {\n\tconst scoped = context.scopedModels.map((entry) => entry.model);\n\tconst models = scoped.length > 0 ? scoped : context.modelRegistry.getAvailable();\n\treturn models\n\t\t.filter((model) => model.provider === \"sp-gateway\")\n\t\t.map((model) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name,\n\t\t\tinput: model.input,\n\t\t\treasoning: model.reasoning,\n\t\t\tcontextWindow: model.contextWindow,\n\t\t\tmaxTokens: model.maxTokens,\n\t\t\t...(model.thinkingLevelMap ? { thinkingLevelMap: model.thinkingLevelMap } : {}),\n\t\t}));\n}\n\nfunction parseGeneratedTitle(raw: string) {\n\tlet title = raw.trim().split(/\\r?\\n/u, 1)[0] ?? \"\";\n\ttitle = title.replace(/^(?:session\\s+title|title)\\s*[:-]\\s*/iu, \"\");\n\ttitle = title\n\t\t.replace(/^[\"'`]|[\"'`]$/gu, \"\")\n\t\t.replace(/\\s+/gu, \" \")\n\t\t.replace(/[.!]+$/u, \"\")\n\t\t.trim();\n\tif (!/[\\p{L}\\p{N}]/u.test(title))\n\t\tthrow new RequestError(\"title_generation_failed\", \"The model returned no usable title.\");\n\treturn Array.from(title).slice(0, MAX_TITLE_LENGTH).join(\"\").trim();\n}\n\nasync function generateTitle(context: ExtensionContext, pi: ExtensionAPI, signal: AbortSignal) {\n\tif (!context.isIdle()) throw new RequestError(\"busy\", \"A title can only be generated while the agent is idle.\");\n\tconst activeModel = context.model;\n\tif (!activeModel || activeModel.provider !== \"sp-gateway\") {\n\t\tthrow new RequestError(\"model_unavailable\", \"Title generation requires an active sp-gateway model.\");\n\t}\n\tconst model = context.modelRegistry.find(activeModel.provider, activeModel.id);\n\tif (!model) throw new RequestError(\"model_unavailable\", \"The active sp-gateway model is unavailable.\");\n\tconst auth = await context.modelRegistry.getApiKeyAndHeaders(model);\n\tsignal.throwIfAborted();\n\tif (!auth.ok || !auth.apiKey) {\n\t\tthrow new RequestError(\"model_auth_unavailable\", auth.ok ? \"sp-gateway has no API key available.\" : auth.error);\n\t}\n\tconst serialized = Buffer.from(JSON.stringify(normalizeForJson(context.sessionManager.getEntries(), true)), \"utf8\");\n\tconst transcript =\n\t\tserialized.length <= MAX_TITLE_CONTEXT_BYTES\n\t\t\t? serialized.toString(\"utf8\")\n\t\t\t: serialized.subarray(-MAX_TITLE_CONTEXT_BYTES).toString(\"utf8\");\n\tconst response = await completeSimple(\n\t\tmodel,\n\t\t{\n\t\t\tsystemPrompt: [\n\t\t\t\t\"Create a concise English title for this coding session.\",\n\t\t\t\t\"Use 4-12 words. Describe the concrete task or result.\",\n\t\t\t\t\"Return only the title as plain text. Do not use tools, quotes, labels, or punctuation at the end.\",\n\t\t\t].join(\"\\n\"),\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: `Session transcript entries:\\n${transcript}`,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t],\n\t\t\ttools: [],\n\t\t},\n\t\t{ apiKey: auth.apiKey, headers: auth.headers, env: auth.env, signal },\n\t);\n\tsignal.throwIfAborted();\n\tif (response.stopReason === \"error\") {\n\t\tthrow new RequestError(\"title_generation_failed\", response.errorMessage ?? \"The title model request failed.\");\n\t}\n\tconst rawTitle = response.content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n\tconst title = parseGeneratedTitle(rawTitle);\n\tpi.setSessionName(title);\n\treturn {\n\t\ttitle,\n\t\tusage: {\n\t\t\tinput: response.usage.input,\n\t\t\toutput: response.usage.output,\n\t\t\tcacheRead: response.usage.cacheRead,\n\t\t\tcacheWrite: response.usage.cacheWrite,\n\t\t\ttotal: response.usage.totalTokens,\n\t\t},\n\t};\n}\n\nfunction makePaths(agentDir: string, instanceId: string): BridgePaths {\n\tconst rootDir = join(agentDir, \"web-bridge\");\n\tconst discoveryDir = join(rootDir, \"discovery\");\n\tconst socketDir = join(rootDir, \"sockets\");\n\treturn {\n\t\trootDir,\n\t\tdiscoveryDir,\n\t\tsocketDir,\n\t\tdescriptorPath: join(discoveryDir, `${instanceId}.json`),\n\t\tsocketPath: join(socketDir, `${instanceId}.sock`),\n\t};\n}\n\nfunction ensurePrivateDirectory(path: string) {\n\tmkdirSync(path, { recursive: true, mode: 0o700 });\n\tif (process.platform !== \"win32\") chmodSync(path, 0o700);\n}\n\nfunction removeFile(path: string) {\n\ttry {\n\t\tunlinkSync(path);\n\t} catch (error) {\n\t\tif (!isMissingFileError(error)) throw error;\n\t}\n}\n\nfunction tokenMatches(expected: string, received: unknown) {\n\tif (typeof received !== \"string\") return false;\n\tconst expectedBytes = Buffer.from(expected, \"utf8\");\n\tconst receivedBytes = Buffer.from(received, \"utf8\");\n\treturn expectedBytes.length === receivedBytes.length && timingSafeEqual(expectedBytes, receivedBytes);\n}\n\nfunction parseRequest(value: JsonRecord): RequestFrame {\n\tif (\n\t\tvalue.v !== TERMINAL_BRIDGE_VERSION ||\n\t\tvalue.type !== \"request\" ||\n\t\ttypeof value.id !== \"string\" ||\n\t\t!value.id ||\n\t\tvalue.id.length > MAX_REQUEST_ID_LENGTH ||\n\t\t!Number.isSafeInteger(value.generation) ||\n\t\ttypeof value.command !== \"string\" ||\n\t\t!value.command\n\t) {\n\t\tthrow new RequestError(\"invalid_request\", \"Invalid request envelope.\");\n\t}\n\tif (value.params !== undefined && !isRecord(value.params)) {\n\t\tthrow new RequestError(\"invalid_request\", \"params must be an object.\");\n\t}\n\treturn {\n\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\ttype: \"request\",\n\t\tid: value.id,\n\t\tgeneration: value.generation as number,\n\t\tcommand: value.command,\n\t\tparams: value.params,\n\t};\n}\n\nexport class TerminalWebBridge {\n\tprivate pendingCommands = 0;\n\tprivate deleting = false;\n\tprivate readonly requestContext = new AsyncLocalStorage<{ request: RequestFrame; client: ClientState }>();\n\tprivate deletionOwner: { request: RequestFrame; client: ClientState } | undefined;\n\n\t/** Gate new commands synchronously before the owner checks/disposes its idle writer. */\n\treserveDeletion(preserveConnection: boolean): () => void {\n\t\tconst owner = preserveConnection ? this.requestContext.getStore() : undefined;\n\t\tif (preserveConnection && owner?.request.command !== \"delete_session\") {\n\t\t\tthrow new RequestError(\"invalid_request\", \"Connection preservation requires its deletion request.\");\n\t\t}\n\t\tif (this.deleting || this.pendingCommands > (preserveConnection ? 1 : 0) || this.questions.getPending()) {\n\t\t\tthrow new RequestError(\"busy\", \"Session has pending bridge commands or a question.\");\n\t\t}\n\t\tthis.deleting = true;\n\t\tthis.deletionOwner = owner;\n\t\treturn () => {\n\t\t\tthis.deleting = false;\n\t\t\tthis.deletionOwner = undefined;\n\t\t};\n\t}\n\n\tasync finishDeletion(): Promise<void> {\n\t\tthis.deletionOwner = undefined;\n\t\tawait this.stop();\n\t}\n\tprivate readonly pi: ExtensionAPI;\n\tprivate readonly options: TerminalWebBridgeOptions;\n\tprivate readonly instanceId = randomUUID().replaceAll(\"-\", \"\").slice(0, 24);\n\tprivate readonly authToken = randomBytes(32).toString(\"base64url\");\n\tprivate readonly startedAt = new Date().toISOString();\n\tprivate readonly clients = new Set<ClientState>();\n\tprivate readonly eventHistory: { sequence: number; encoded: Buffer }[] = [];\n\tprivate eventHistoryBytes = 0;\n\tprivate lastUnreplayableSequence = 0;\n\tprivate readonly maxFrameBytes: number;\n\tprivate readonly maxBufferedBytes: number;\n\tprivate readonly maxClients: number;\n\tprivate server: Server | undefined;\n\tprivate context: ExtensionContext | undefined;\n\tprivate paths: BridgePaths | undefined;\n\tprivate descriptor: TerminalBridgeDescriptor | undefined;\n\tprivate generation = 0;\n\tprivate sequence = 0;\n\tprivate commandQueue: Promise<void> = Promise.resolve();\n\tprivate lifecycleQueue: Promise<void> = Promise.resolve();\n\tprivate binding = new AbortController();\n\tprivate sidecarResult: SpWebLaunchResult | undefined;\n\tprivate readonly questions: QuestionInteraction;\n\tprivate unsubscribeQuestions: (() => void) | undefined;\n\n\tconstructor(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\t\tthis.pi = pi;\n\t\tthis.questions = getQuestionInteraction(pi);\n\t\tthis.questions.webOnly = options.webOwned === true;\n\t\tthis.options = options;\n\t\tthis.maxFrameBytes = options.maxFrameBytes ?? DEFAULT_TERMINAL_BRIDGE_MAX_FRAME_BYTES;\n\t\tthis.maxBufferedBytes = options.maxBufferedBytes ?? DEFAULT_TERMINAL_BRIDGE_MAX_BUFFERED_BYTES;\n\t\tthis.maxClients = options.maxClients ?? DEFAULT_TERMINAL_BRIDGE_MAX_CLIENTS;\n\t}\n\n\tgetDescriptor() {\n\t\treturn this.descriptor;\n\t}\n\n\tgetSidecarResult() {\n\t\treturn this.sidecarResult;\n\t}\n\n\tstart(context: ExtensionContext) {\n\t\tconst task = this.lifecycleQueue.then(() => this.startServer(context));\n\t\tthis.lifecycleQueue = task.catch(() => {});\n\t\treturn task;\n\t}\n\n\tprivate async startServer(context: ExtensionContext) {\n\t\tif (context.mode !== \"tui\" && !this.options.webOwned) {\n\t\t\tawait this.stopServer();\n\t\t\treturn;\n\t\t}\n\t\tthis.context = context;\n\t\tif (process.platform === \"win32\") throw new Error(\"The SP terminal bridge requires Unix sockets.\");\n\t\tif (this.server) {\n\t\t\tthis.advanceGeneration(context);\n\t\t\tthis.options.onReady?.(this);\n\t\t\treturn;\n\t\t}\n\n\t\tconst agentDir = this.options.agentDir ?? getSpAgentDir();\n\t\tthis.paths = makePaths(agentDir, this.instanceId);\n\t\tensurePrivateDirectory(this.paths.rootDir);\n\t\tensurePrivateDirectory(this.paths.discoveryDir);\n\t\tensurePrivateDirectory(this.paths.socketDir);\n\t\tif (Buffer.byteLength(this.paths.socketPath, \"utf8\") > 103) {\n\t\t\tthrow new Error(`SP terminal bridge socket path is too long: ${this.paths.socketPath}`);\n\t\t}\n\t\tremoveFile(this.paths.socketPath);\n\n\t\tconst server = createServer((socket) => this.acceptClient(socket));\n\t\tserver.on(\"error\", () => {});\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tserver.off(\"listening\", onListening);\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tconst onListening = () => {\n\t\t\t\tserver.off(\"error\", onError);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tserver.once(\"error\", onError);\n\t\t\tserver.once(\"listening\", onListening);\n\t\t\tserver.listen(this.paths?.socketPath);\n\t\t});\n\t\tthis.server = server;\n\t\ttry {\n\t\t\tchmodSync(this.paths.socketPath, 0o600);\n\t\t\tthis.advanceGeneration(context);\n\t\t\tthis.unsubscribeQuestions = this.questions.subscribe((event, ctx) => this.publish(\"interaction\", event, ctx));\n\t\t\tthis.options.onReady?.(this);\n\t\t\tif (this.options.launchSpWeb !== false) {\n\t\t\t\tthis.sidecarResult = ensureSpWebSidecar(this.paths.discoveryDir, this.options.launcherOptions);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.stopServer();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tupdateContext(context: ExtensionContext) {\n\t\tthis.context = context;\n\t}\n\n\tadvanceGeneration(context: ExtensionContext) {\n\t\tthis.binding.abort();\n\t\tthis.binding = new AbortController();\n\t\tthis.questions.cancel();\n\t\tthis.context = context;\n\t\tif (!this.paths) return;\n\t\tthis.generation += 1;\n\t\tthis.commandQueue = Promise.resolve();\n\t\tthis.sequence = 0;\n\t\tthis.eventHistory.splice(0);\n\t\tthis.eventHistoryBytes = 0;\n\t\tthis.lastUnreplayableSequence = 0;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tthis.descriptor = {\n\t\t\tversion: TERMINAL_BRIDGE_VERSION,\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tinstanceId: this.instanceId,\n\t\t\tpid: process.pid,\n\t\t\tsessionId: context.sessionManager.getSessionId(),\n\t\t\tsessionFile: context.sessionManager.getSessionFile(),\n\t\t\tcwd: context.cwd,\n\t\t\tsocketPath: this.paths.socketPath,\n\t\t\tauthToken: this.authToken,\n\t\t\tgeneration: this.generation,\n\t\t\tstartedAt: this.startedAt,\n\t\t\t...(this.options.writerLeaseVersion ? { writerLeaseVersion: this.options.writerLeaseVersion } : {}),\n\t\t\tframe: { encoding: \"newline-delimited-json\", maxBytes: this.maxFrameBytes },\n\t\t};\n\t\tconst temporaryPath = `${this.paths.descriptorPath}.${process.pid}.tmp`;\n\t\twriteFileSync(temporaryPath, `${JSON.stringify(this.descriptor, null, \"\\t\")}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tchmodSync(temporaryPath, 0o600);\n\t\trenameSync(temporaryPath, this.paths.descriptorPath);\n\t\tchmodSync(this.paths.descriptorPath, 0o600);\n\t}\n\n\tpublish(category: EventFrame[\"category\"], event: { type: string }, context: ExtensionContext) {\n\t\tthis.context = context;\n\t\tif (!this.server) return;\n\t\tconst frame: EventFrame = {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"event\",\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: ++this.sequence,\n\t\t\tevent: event.type,\n\t\t\tcategory,\n\t\t\tpayload: normalizeForJson(event),\n\t\t};\n\t\tlet encoded: Buffer;\n\t\ttry {\n\t\t\tencoded = this.encode(frame);\n\t\t} catch {\n\t\t\t// Never claim that replay can cross an event we could not forward.\n\t\t\tthis.lastUnreplayableSequence = frame.sequence;\n\t\t\tframe.event = \"event_gap\";\n\t\t\tframe.category = \"session\";\n\t\t\tframe.payload = { type: \"event_gap\", code: \"event_gap\", resyncRequired: true };\n\t\t\ttry {\n\t\t\t\tencoded = this.encode(frame);\n\t\t\t} catch {\n\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\tif (client.subscribed) client.socket.destroy();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.eventHistory.push({ sequence: frame.sequence, encoded });\n\t\tthis.eventHistoryBytes += encoded.length;\n\t\twhile (this.eventHistory.length > MAX_EVENT_HISTORY || this.eventHistoryBytes > MAX_EVENT_HISTORY_BYTES) {\n\t\t\tthis.eventHistoryBytes -= this.eventHistory.shift()!.encoded.length;\n\t\t}\n\t\tfor (const client of this.clients) {\n\t\t\tif (client.authenticated && client.subscribed) {\n\t\t\t\tthis.writeEncoded(client, encoded);\n\t\t\t\tif (frame.event === \"event_gap\") {\n\t\t\t\t\tclient.subscribed = false;\n\t\t\t\t\t// Older clients also recover through their connection-close snapshot path.\n\t\t\t\t\tclient.socket.end();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstop() {\n\t\t// The native delete response must drain before session_shutdown closes its socket.\n\t\tif (this.deletionOwner) return Promise.resolve();\n\t\t// Invalidate commands immediately, even if socket startup has not settled.\n\t\tthis.questions.cancel();\n\t\tthis.binding.abort();\n\t\tthis.context = undefined;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tconst task = this.lifecycleQueue.then(() => this.stopServer());\n\t\tthis.lifecycleQueue = task.catch(() => {});\n\t\treturn task;\n\t}\n\n\t/** Synchronous fallback for process.exit, which cannot await socket shutdown. */\n\tcleanupOnExit() {\n\t\tthis.binding.abort();\n\t\tthis.questions.cancel();\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tif (this.paths) {\n\t\t\ttry {\n\t\t\t\tconst value = JSON.parse(readFileSync(this.paths.descriptorPath, \"utf8\")) as unknown;\n\t\t\t\tif (isRecord(value) && value.instanceId === this.instanceId) removeFile(this.paths.descriptorPath);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error) && !(error instanceof SyntaxError)) throw error;\n\t\t\t}\n\t\t\tremoveFile(this.paths.socketPath);\n\t\t}\n\t}\n\n\tprivate async stopServer() {\n\t\tthis.binding.abort();\n\t\tthis.questions.cancel();\n\t\tthis.context = undefined;\n\t\tthis.commandQueue = Promise.resolve();\n\t\tthis.unsubscribeQuestions?.();\n\t\tthis.unsubscribeQuestions = undefined;\n\t\tconst server = this.server;\n\t\tthis.server = undefined;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tthis.clients.clear();\n\t\tthis.eventHistory.splice(0);\n\t\tthis.eventHistoryBytes = 0;\n\t\tif (server) {\n\t\t\tawait new Promise<void>((resolve) => server.close(() => resolve()));\n\t\t}\n\t\tconst paths = this.paths;\n\t\tif (paths) {\n\t\t\ttry {\n\t\t\t\tconst value = JSON.parse(readFileSync(paths.descriptorPath, \"utf8\")) as unknown;\n\t\t\t\tif (isRecord(value) && value.instanceId === this.instanceId) removeFile(paths.descriptorPath);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error) && !(error instanceof SyntaxError)) throw error;\n\t\t\t}\n\t\t\tremoveFile(paths.socketPath);\n\t\t}\n\t\tthis.descriptor = undefined;\n\t\tthis.options.sessions?.bridgeStopped?.(this);\n\t}\n\n\tprivate acceptClient(socket: Socket) {\n\t\tif (this.clients.size >= this.maxClients) {\n\t\t\tsocket.on(\"error\", () => {});\n\t\t\tsocket.end(`${JSON.stringify({ v: 1, type: \"error\", code: \"too_many_clients\" })}\\n`, () => socket.destroy());\n\t\t\treturn;\n\t\t}\n\t\tsocket.setNoDelay(true);\n\t\tconst client: ClientState = {\n\t\t\tsocket,\n\t\t\tbuffer: Buffer.alloc(0),\n\t\t\tauthenticated: false,\n\t\t\tsubscribed: false,\n\t\t\tpendingRequests: 0,\n\t\t\tseenRequestIds: new Set(),\n\t\t};\n\t\tthis.clients.add(client);\n\t\tsocket.on(\"data\", (chunk: Buffer) => this.receive(client, chunk));\n\t\tsocket.on(\"error\", () => {});\n\t\tsocket.on(\"close\", () => this.clients.delete(client));\n\t}\n\n\tprivate receive(client: ClientState, chunk: Buffer) {\n\t\tif (client.socket.destroyed || client.socket.writableEnded) return;\n\t\tclient.buffer = Buffer.concat([client.buffer, chunk]);\n\t\tif (client.buffer.length > this.maxFrameBytes && client.buffer.indexOf(0x0a) === -1) {\n\t\t\tclient.socket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tlet newline = client.buffer.indexOf(0x0a);\n\t\twhile (newline !== -1) {\n\t\t\tconst frame = client.buffer.subarray(0, newline);\n\t\t\tclient.buffer = client.buffer.subarray(newline + 1);\n\t\t\tif (frame.length + 1 > this.maxFrameBytes || frame.length === 0) {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet value: unknown;\n\t\t\ttry {\n\t\t\t\tvalue = JSON.parse(frame.toString(\"utf8\")) as unknown;\n\t\t\t} catch {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!isRecord(value)) {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!client.authenticated) {\n\t\t\t\tthis.authenticate(client, value);\n\t\t\t\tif (!client.authenticated) return;\n\t\t\t} else {\n\t\t\t\tthis.acceptRequest(client, value);\n\t\t\t}\n\t\t\tnewline = client.buffer.indexOf(0x0a);\n\t\t}\n\t\tif (client.buffer.length >= this.maxFrameBytes) client.socket.destroy();\n\t}\n\n\tprivate authenticate(client: ClientState, value: JsonRecord) {\n\t\tif (value.v !== TERMINAL_BRIDGE_VERSION || value.type !== \"hello\" || !tokenMatches(this.authToken, value.token)) {\n\t\t\tthis.send(client, { v: 1, type: \"hello\", ok: false, error: \"authentication_failed\" });\n\t\t\tclient.socket.end();\n\t\t\treturn;\n\t\t}\n\t\tclient.authenticated = true;\n\t\tthis.send(client, {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"hello\",\n\t\t\tok: true,\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: this.sequence,\n\t\t\tinstanceId: this.instanceId,\n\t\t});\n\t}\n\n\tprivate acceptRequest(client: ClientState, value: JsonRecord) {\n\t\tlet request: RequestFrame;\n\t\ttry {\n\t\t\trequest = parseRequest(value);\n\t\t} catch (error) {\n\t\t\tthis.sendRequestError(client, typeof value.id === \"string\" ? value.id : null, error);\n\t\t\treturn;\n\t\t}\n\t\tif (client.seenRequestIds.has(request.id)) {\n\t\t\tthis.sendRequestError(\n\t\t\t\tclient,\n\t\t\t\trequest.id,\n\t\t\t\tnew RequestError(\"duplicate_request\", \"Request ID was already used.\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tclient.seenRequestIds.add(request.id);\n\t\tif (client.seenRequestIds.size > MAX_SEEN_REQUEST_IDS) {\n\t\t\tconst oldest = client.seenRequestIds.values().next().value as string | undefined;\n\t\t\tif (oldest) client.seenRequestIds.delete(oldest);\n\t\t}\n\t\tif (client.pendingRequests >= MAX_PENDING_REQUESTS) {\n\t\t\tthis.sendRequestError(client, request.id, new RequestError(\"too_many_requests\", \"Too many pending requests.\"));\n\t\t\treturn;\n\t\t}\n\t\tclient.pendingRequests += 1;\n\t\tthis.pendingCommands++;\n\t\t// Reads and turn cancellation/answers must not wait for model auth or title inference.\n\t\tconst independent = [\n\t\t\t\"state\",\n\t\t\t\"snapshot\",\n\t\t\t\"transcript\",\n\t\t\t\"models\",\n\t\t\t\"subscribe\",\n\t\t\t\"respond_to_question\",\n\t\t\t\"abort\",\n\t\t\t\"create_session\",\n\t\t\t\"resume_session\",\n\t\t\t\"delete_session\",\n\t\t].includes(request.command);\n\t\tconst task = (independent ? Promise.resolve() : this.commandQueue)\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.requestContext.run({ request, client }, () => this.execute(request, client));\n\t\t\t\tif (request.command === \"delete_session\") {\n\t\t\t\t\tawait this.writeReplay(client, this.encode(this.successFrame(request.id, result)));\n\t\t\t\t} else {\n\t\t\t\t\tthis.sendSuccess(client, request.id, result);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(async (error: unknown) => {\n\t\t\t\tthis.sendRequestError(client, request.id, error);\n\t\t\t\tif (request.command === \"delete_session\") {\n\t\t\t\t\t// Drain error acknowledgements as well when disposal succeeded but unlink failed.\n\t\t\t\t\tawait this.writeReplay(client, Buffer.alloc(0)).catch(() => {});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tclient.pendingRequests -= 1;\n\t\t\t\tthis.pendingCommands--;\n\t\t\t\tif (this.deletionOwner?.request === request && this.deletionOwner.client === client) {\n\t\t\t\t\tvoid this.finishDeletion().catch(() => {});\n\t\t\t\t}\n\t\t\t});\n\t\tif (!independent) this.commandQueue = task;\n\t}\n\n\tprivate async execute(request: RequestFrame, client: ClientState): Promise<unknown> {\n\t\tif (!this.server || client.socket.destroyed || client.socket.writableEnded) {\n\t\t\tthrow new RequestError(\"not_ready\", \"Connection is closed.\");\n\t\t}\n\t\tif (request.generation !== this.generation) {\n\t\t\tthrow new RequestError(\"stale_generation\", `Current generation is ${this.generation}.`);\n\t\t}\n\t\tconst context = this.context;\n\t\tif (!context) throw new RequestError(\"not_ready\", \"Session context is not ready.\");\n\t\tif (this.deleting) throw new RequestError(\"busy\", \"Session deletion is reserved.\");\n\t\tconst params = request.params ?? {};\n\t\tswitch (request.command) {\n\t\t\tcase \"delete_session\":\n\t\t\t\tif (!this.options.sessions?.deleteSession) {\n\t\t\t\t\tthrow new RequestError(\"unsupported_command\", \"No deletion provider available.\");\n\t\t\t\t}\n\t\t\t\tif (params.confirmed !== true) throw new RequestError(\"invalid_params\", \"confirmed must be true.\");\n\t\t\t\treturn this.options.sessions.deleteSession(\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: requireString(params.sessionId, \"sessionId\", 256),\n\t\t\t\t\t\t...(params.sessionFile !== undefined\n\t\t\t\t\t\t\t? { sessionFile: requireString(params.sessionFile, \"sessionFile\", 4096) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tconfirmed: true,\n\t\t\t\t\t},\n\t\t\t\t\tthis,\n\t\t\t\t);\n\t\t\tcase \"create_session\":\n\t\t\t\tif (!this.options.sessions) throw new RequestError(\"unsupported_command\", \"No session factory available.\");\n\t\t\t\treturn this.options.sessions.create(requireString(params.cwd, \"cwd\", 4096));\n\t\t\tcase \"resume_session\":\n\t\t\t\tif (!this.options.sessions) throw new RequestError(\"unsupported_command\", \"No session factory available.\");\n\t\t\t\treturn this.options.sessions.resume(requireString(params.sessionFile, \"sessionFile\", 4096));\n\t\t\tcase \"respond_to_question\":\n\t\t\t\tthis.questions.respond(requireString(params.interactionId, \"interactionId\", 128), params.response);\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"snapshot\": {\n\t\t\t\tconst entries = context.sessionManager.getEntries();\n\t\t\t\tconst state = this.stateSnapshot(context);\n\t\t\t\treturn this.transcriptPage(request.id, entries, 0, MAX_TRANSCRIPT_PAGE_SIZE, state);\n\t\t\t}\n\t\t\tcase \"state\":\n\t\t\t\treturn this.stateSnapshot(context);\n\t\t\tcase \"transcript\": {\n\t\t\t\tconst entries = context.sessionManager.getEntries();\n\t\t\t\tconst cursor = optionalInteger(params.cursor, \"cursor\", 0);\n\t\t\t\tconst limit = Math.min(optionalInteger(params.limit, \"limit\", 50), MAX_TRANSCRIPT_PAGE_SIZE);\n\t\t\t\treturn this.transcriptPage(request.id, entries, cursor, limit);\n\t\t\t}\n\t\t\tcase \"models\":\n\t\t\t\treturn {\n\t\t\t\t\tmodels: availableModels(context),\n\t\t\t\t\tcurrent: context.model ? { provider: context.model.provider, modelId: context.model.id } : null,\n\t\t\t\t};\n\t\t\tcase \"generate_title\":\n\t\t\t\treturn (this.options.titleGenerator ?? generateTitle)(context, this.pi, this.binding.signal);\n\t\t\tcase \"subscribe\": {\n\t\t\t\tlet afterSequence = optionalInteger(params.afterSequence, \"afterSequence\", this.sequence);\n\t\t\t\tclient.subscribed = false;\n\t\t\t\tfor (;;) {\n\t\t\t\t\t// Recheck after each drained write: publishing can evict history while replay waits.\n\t\t\t\t\tconst earliestSequence = this.eventHistory[0]?.sequence ?? this.sequence + 1;\n\t\t\t\t\tif (\n\t\t\t\t\t\tafterSequence < earliestSequence - 1 ||\n\t\t\t\t\t\tafterSequence < this.lastUnreplayableSequence ||\n\t\t\t\t\t\tafterSequence > this.sequence\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new RequestError(\"event_gap\", `Earliest retained sequence is ${earliestSequence}.`);\n\t\t\t\t\t}\n\t\t\t\t\tconst event = this.eventHistory.find((entry) => entry.sequence > afterSequence);\n\t\t\t\t\tif (!event) break;\n\t\t\t\t\tawait this.writeReplay(client, event.encoded);\n\t\t\t\t\tafterSequence = event.sequence;\n\t\t\t\t}\n\t\t\t\tclient.subscribed = true;\n\t\t\t\treturn { subscribed: true, sequence: this.sequence };\n\t\t\t}\n\t\t\tcase \"prompt\":\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Use steer or follow_up while the agent is running.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), {\n\t\t\t\t\texpandPromptTemplates: params.expandPromptTemplates === true,\n\t\t\t\t});\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"steer\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to steer.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), { deliverAs: \"steer\" });\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"follow_up\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to queue a follow-up for.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), { deliverAs: \"followUp\" });\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"abort\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to abort.\");\n\t\t\t\tthis.questions.cancel();\n\t\t\t\tcontext.abort();\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"set_thinking\": {\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Thinking level can only change while idle.\");\n\t\t\t\tconst level = requireString(params.level, \"level\", 16);\n\t\t\t\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\t\t\t\tthrow new RequestError(\"invalid_params\", `Unsupported thinking level: ${level}`);\n\t\t\t\t}\n\t\t\t\tthis.pi.setThinkingLevel(level as ThinkingLevel);\n\t\t\t\treturn { accepted: true, level: this.pi.getThinkingLevel() };\n\t\t\t}\n\t\t\tcase \"set_model\": {\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Model can only change while idle.\");\n\t\t\t\tconst provider = requireString(params.provider, \"provider\", 256);\n\t\t\t\tconst modelId = requireString(params.modelId, \"modelId\", 512);\n\t\t\t\tif (provider !== \"sp-gateway\") {\n\t\t\t\t\tthrow new RequestError(\"model_out_of_scope\", \"Only sp-gateway models are available in SP.\");\n\t\t\t\t}\n\t\t\t\tconst model = context.modelRegistry.find(provider, modelId);\n\t\t\t\tif (!model) throw new RequestError(\"model_unavailable\", `Model is not available: ${provider}/${modelId}`);\n\t\t\t\tif (\n\t\t\t\t\tcontext.scopedModels.length > 0 &&\n\t\t\t\t\t!context.scopedModels.some((entry) => entry.model.provider === provider && entry.model.id === modelId)\n\t\t\t\t) {\n\t\t\t\t\tthrow new RequestError(\n\t\t\t\t\t\t\"model_out_of_scope\",\n\t\t\t\t\t\t`Model is outside this session's model scope: ${provider}/${modelId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!(await this.pi.setModel(model))) {\n\t\t\t\t\tthrow new RequestError(\"model_auth_unavailable\", `No usable credentials for ${provider}/${modelId}.`);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\tmodel: { provider: model.provider, id: model.id, name: model.name, input: model.input },\n\t\t\t\t};\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new RequestError(\"unsupported_command\", `Unsupported command: ${request.command}`);\n\t\t}\n\t}\n\n\tprivate stateSnapshot(context: ExtensionContext) {\n\t\tconst model = context.model;\n\t\treturn {\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: this.sequence,\n\t\t\tsession: {\n\t\t\t\tid: context.sessionManager.getSessionId(),\n\t\t\t\tfile: context.sessionManager.getSessionFile(),\n\t\t\t\tname: context.sessionManager.getSessionName(),\n\t\t\t\tcwd: context.cwd,\n\t\t\t\tentryCount: context.sessionManager.getEntries().length,\n\t\t\t\tactiveLeafId: context.sessionManager.getLeafId(),\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\tidle: context.isIdle(),\n\t\t\t\thasPendingMessages: context.hasPendingMessages(),\n\t\t\t\tcontextUsage: context.getContextUsage(),\n\t\t\t},\n\t\t\tmodel: model ? { provider: model.provider, id: model.id, name: model.name, input: model.input } : null,\n\t\t\tthinkingLevel: this.pi.getThinkingLevel(),\n\t\t\tpendingQuestion: this.questions.getPending(),\n\t\t\tcapabilities: {\n\t\t\t\tsnapshot: true,\n\t\t\t\tstate: true,\n\t\t\t\ttranscript: { paginated: true, maximumPageSize: MAX_TRANSCRIPT_PAGE_SIZE },\n\t\t\t\teventStream: { replayLimit: MAX_EVENT_HISTORY, replayByteLimit: MAX_EVENT_HISTORY_BYTES },\n\t\t\t\tprompt: true,\n\t\t\t\timages: true,\n\t\t\t\timageLimits: TERMINAL_BRIDGE_IMAGE_LIMITS,\n\t\t\t\tsteer: true,\n\t\t\t\tfollowUp: true,\n\t\t\t\tabort: true,\n\t\t\t\tsetThinking: true,\n\t\t\t\tsetModel: \"available-and-session-scoped-models-only\",\n\t\t\t\tmodels: true,\n\t\t\t\tgenerateTitle: true,\n\t\t\t\trespondToQuestion: true,\n\t\t\t\tnewSession: !!this.options.sessions,\n\t\t\t\tresumeSession: !!this.options.sessions,\n\t\t\t\tforkSession: false,\n\t\t\t\tdeleteSession: !!this.options.sessions?.deleteSession,\n\t\t\t\tdirectJsonlAccess: false,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate transcriptPage(id: string, entries: unknown[], cursor: number, limit: number, state?: unknown) {\n\t\tconst page = {\n\t\t\tcursor,\n\t\t\tnextCursor: (cursor < entries.length ? cursor : null) as number | null,\n\t\t\ttotal: entries.length,\n\t\t\tentries: [] as unknown[],\n\t\t};\n\t\tconst result = state === undefined ? page : { state, transcript: page };\n\t\t// Count the exact envelope, including escaped request ID, state and newline.\n\t\tlet bytes = this.encode(this.successFrame(id, result)).length;\n\t\tfor (const entry of entries.slice(cursor, cursor + limit)) {\n\t\t\tconst normalized = normalizeForJson(entry);\n\t\t\tconst nextCursor = cursor + page.entries.length + 1 < entries.length ? cursor + page.entries.length + 1 : null;\n\t\t\tconst addedBytes =\n\t\t\t\tBuffer.byteLength(JSON.stringify(normalized), \"utf8\") +\n\t\t\t\t(page.entries.length > 0 ? 1 : 0) +\n\t\t\t\tJSON.stringify(nextCursor).length -\n\t\t\t\tJSON.stringify(page.nextCursor).length;\n\t\t\tif (bytes + addedBytes > this.maxFrameBytes) {\n\t\t\t\tif (page.entries.length === 0) {\n\t\t\t\t\tthrow new RequestError(\n\t\t\t\t\t\t\"frame_too_large\",\n\t\t\t\t\t\t`Transcript entry at cursor ${cursor} cannot fit in the response.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpage.entries.push(normalized);\n\t\t\tpage.nextCursor = nextCursor;\n\t\t\tbytes += addedBytes;\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate sendRequestError(client: ClientState, id: string | null, error: unknown) {\n\t\tconst code =\n\t\t\terror instanceof RequestError || error instanceof QuestionResponseError\n\t\t\t\t? error.code\n\t\t\t\t: error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n\t\t\t\t\t? error.code\n\t\t\t\t\t: \"internal_error\";\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis.send(client, {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"response\",\n\t\t\tid,\n\t\t\tgeneration: this.generation,\n\t\t\tok: false,\n\t\t\terror: { code, message },\n\t\t});\n\t}\n\n\tprivate successFrame(id: string, result: unknown) {\n\t\treturn {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"response\",\n\t\t\tid,\n\t\t\tgeneration: this.generation,\n\t\t\tok: true,\n\t\t\tresult,\n\t\t};\n\t}\n\n\tprivate sendSuccess(client: ClientState, id: string, result: unknown) {\n\t\ttry {\n\t\t\tthis.writeEncoded(client, this.encode(this.successFrame(id, result)));\n\t\t} catch (error) {\n\t\t\tthis.sendRequestError(client, id, error);\n\t\t}\n\t}\n\n\tprivate encode(value: unknown) {\n\t\tconst encoded = Buffer.from(`${JSON.stringify(value)}\\n`, \"utf8\");\n\t\tif (encoded.length > this.maxFrameBytes) throw new RequestError(\"frame_too_large\", \"Frame exceeds the limit.\");\n\t\treturn encoded;\n\t}\n\n\tprivate send(client: ClientState, value: unknown) {\n\t\tif (client.socket.destroyed) return;\n\t\ttry {\n\t\t\tthis.writeEncoded(client, this.encode(value));\n\t\t} catch {\n\t\t\tclient.socket.destroy();\n\t\t}\n\t}\n\n\tprivate writeEncoded(client: ClientState, encoded: Buffer) {\n\t\tif (client.socket.destroyed) return;\n\t\tif (client.socket.writableLength + encoded.length > this.maxBufferedBytes) {\n\t\t\tclient.socket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tclient.socket.write(encoded);\n\t}\n\n\tprivate writeReplay(client: ClientState, encoded: Buffer) {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst socket = client.socket;\n\t\t\tif (\n\t\t\t\tsocket.destroyed ||\n\t\t\t\tsocket.writableEnded ||\n\t\t\t\tsocket.writableLength + encoded.length > this.maxBufferedBytes\n\t\t\t) {\n\t\t\t\tsocket.destroy();\n\t\t\t\treject(new RequestError(\"not_ready\", \"Replay connection is closed or exceeds the output limit.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst onClose = () => reject(new RequestError(\"not_ready\", \"Replay connection is closed.\"));\n\t\t\tsocket.once(\"close\", onClose);\n\t\t\t// Drain one frame before enqueueing the next, rather than overflowing the client\n\t\t\t// buffer with an otherwise valid multi-image replay.\n\t\t\tsocket.write(encoded, (error) => {\n\t\t\t\tsocket.off(\"close\", onClose);\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function registerTerminalWebBridge(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\tconst bridge = new TerminalWebBridge(pi, options);\n\tpi.on(\"session_start\", async (event, context) => {\n\t\ttry {\n\t\t\tif (context.mode === \"tui\" && !options.webOwned) options.sessions?.terminalStarted(context);\n\t\t\tawait bridge.start(context);\n\t\t\tbridge.publish(\"session\", event, context);\n\t\t\tconst sidecar = bridge.getSidecarResult();\n\t\t\tif (sidecar?.status === \"failed\") context.ui.notify(`SP Web sidecar failed: ${sidecar.error}`, \"warning\");\n\t\t} catch (error) {\n\t\t\tcontext.ui.notify(\n\t\t\t\t`SP terminal bridge failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t});\n\tpi.on(\"session_info_changed\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_compact\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_compact_failed\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_tree\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"agent_start\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"agent_end\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"agent_settled\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"message_start\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"message_update\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"message_end\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"tool_execution_start\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"tool_execution_update\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"tool_execution_end\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"model_select\", (event, context) => bridge.publish(\"model\", event, context));\n\tpi.on(\"thinking_level_select\", (event, context) => bridge.publish(\"thinking\", event, context));\n\tpi.on(\"session_shutdown\", async (event, context) => {\n\t\tbridge.publish(\"session\", event, context);\n\t\ttry {\n\t\t\tawait bridge.stop();\n\t\t\tif (event.reason === \"quit\" && !options.webOwned) await options.sessions?.dispose();\n\t\t} catch {\n\t\t\t// Cleanup failures must not stop SP shutdown.\n\t\t}\n\t});\n\treturn bridge;\n}\n\nexport function readTerminalBridgeDescriptor(path: string): TerminalBridgeDescriptor {\n\tconst value = JSON.parse(readFileSync(path, \"utf8\")) as TerminalBridgeDescriptor;\n\treturn value;\n}\n\nexport function terminalBridgeDescriptorExists(path: string) {\n\treturn existsSync(path);\n}\n"]}
1
+ {"version":3,"file":"terminal-web-bridge.js","sourceRoot":"","sources":["../src/terminal-web-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomBytes, randomUUID, timingSafeEqual } from \"node:crypto\";\nimport { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { createServer, type Server, type Socket } from \"node:net\";\nimport { join } from \"node:path\";\nimport type { ExtensionAPI, ExtensionContext } from \"@senpiper/pi-coding-agent\";\nimport { completeSimple } from \"@senpiper/pi-coding-agent/runtime-deps\";\nimport { getSpAgentDir } from \"./gateway.ts\";\nimport { getQuestionInteraction, type QuestionInteraction, QuestionResponseError } from \"./question-interaction.ts\";\nimport { ensureSpWebSidecar, type SpWebLauncherOptions, type SpWebLaunchResult } from \"./sp-web-launcher.ts\";\n\nexport const TERMINAL_BRIDGE_PROTOCOL = \"sp-terminal-bridge-v1\";\nexport const TERMINAL_BRIDGE_VERSION = 1;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_FRAME_BYTES = 10 * 1024 * 1024;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_BUFFERED_BYTES = 10 * 1024 * 1024;\nexport const DEFAULT_TERMINAL_BRIDGE_MAX_CLIENTS = 8;\nexport const TERMINAL_BRIDGE_IMAGE_LIMITS = {\n\tmimeTypes: [\"image/png\", \"image/jpeg\", \"image/webp\", \"image/gif\"],\n\tmaxImages: 8,\n\tmaxBase64BytesPerImage: 4 * 1024 * 1024,\n\tmaxBase64BytesTotal: 8 * 1024 * 1024,\n} as const;\n\nconst MAX_REQUEST_ID_LENGTH = 128;\nconst MAX_PENDING_REQUESTS = 32;\nconst MAX_SEEN_REQUEST_IDS = 1024;\nconst MAX_EVENT_HISTORY = 256;\nconst MAX_EVENT_HISTORY_BYTES = 32 * 1024 * 1024;\nconst MAX_TRANSCRIPT_PAGE_SIZE = 100;\nconst MAX_TITLE_CONTEXT_BYTES = 32 * 1024;\nconst MAX_TITLE_LENGTH = 80;\nconst THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\ntype ThinkingLevel = (typeof THINKING_LEVELS)[number];\ntype JsonRecord = Record<string, unknown>;\n\nexport interface TerminalBridgeDescriptor {\n\tversion: 1;\n\tprotocol: typeof TERMINAL_BRIDGE_PROTOCOL;\n\tinstanceId: string;\n\tpid: number;\n\tsessionId: string;\n\tsessionFile?: string;\n\tcwd: string;\n\tsocketPath: string;\n\tauthToken: string;\n\tgeneration: number;\n\tstartedAt: string;\n\twriterLeaseVersion?: 1;\n\tframe: {\n\t\tencoding: \"newline-delimited-json\";\n\t\tmaxBytes: number;\n\t};\n}\n\nexport interface TerminalWebBridgeOptions {\n\t/** Set only by a distribution that installed the lifetime writer provider before file opening. */\n\twriterLeaseVersion?: 1;\n\t/** Supplied by the verified SP distribution, shared across terminal replacements. */\n\tsessions?: {\n\t\tcreate(cwd: string): Promise<{ sessionId: string }>;\n\t\tresume(sessionFile: string): Promise<{ sessionId: string }>;\n\t\tdeleteSession?(\n\t\t\trequest: { sessionId: string; sessionFile?: string; confirmed: true },\n\t\t\trequester?: TerminalWebBridge,\n\t\t): Promise<{ sessionId: string; deleted: true }>;\n\t\tterminalStarted(context: ExtensionContext): void;\n\t\tbridgeStopped?(bridge: TerminalWebBridge): void;\n\t\tdispose(): Promise<void>;\n\t};\n\twebOwned?: boolean;\n\tonReady?: (bridge: TerminalWebBridge) => void;\n\tagentDir?: string;\n\tmaxFrameBytes?: number;\n\tmaxBufferedBytes?: number;\n\tmaxClients?: number;\n\tlaunchSpWeb?: boolean;\n\tlauncherOptions?: SpWebLauncherOptions;\n\ttitleGenerator?: (context: ExtensionContext, pi: ExtensionAPI, signal: AbortSignal) => Promise<unknown>;\n}\n\ninterface BridgePaths {\n\trootDir: string;\n\tdiscoveryDir: string;\n\tsocketDir: string;\n\tdescriptorPath: string;\n\tsocketPath: string;\n}\n\ninterface ClientState {\n\tsocket: Socket;\n\tbuffer: Buffer;\n\tauthenticated: boolean;\n\tsubscribed: boolean;\n\tpendingRequests: number;\n\tseenRequestIds: Set<string>;\n}\n\ninterface RequestFrame {\n\tv: 1;\n\ttype: \"request\";\n\tid: string;\n\tgeneration: number;\n\tcommand: string;\n\tparams?: JsonRecord;\n}\n\ninterface EventFrame {\n\tv: 1;\n\ttype: \"event\";\n\tgeneration: number;\n\tsequence: number;\n\tevent: string;\n\tcategory: \"message\" | \"agent\" | \"tool\" | \"model\" | \"thinking\" | \"session\" | \"interaction\";\n\tpayload: unknown;\n}\n\nclass RequestError extends Error {\n\treadonly code: string;\n\n\tconstructor(code: string, message: string) {\n\t\tsuper(message);\n\t\tthis.code = code;\n\t}\n}\n\nfunction isRecord(value: unknown): value is JsonRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMissingFileError(error: unknown) {\n\treturn isRecord(error) && error.code === \"ENOENT\";\n}\n\nfunction requireString(value: unknown, name: string, maximumLength = 100_000) {\n\tif (typeof value !== \"string\" || !value.trim()) throw new RequestError(\"invalid_params\", `${name} is required.`);\n\tif (Buffer.byteLength(value, \"utf8\") > maximumLength) {\n\t\tthrow new RequestError(\"invalid_params\", `${name} is too long.`);\n\t}\n\treturn value;\n}\n\nfunction userMessageContent(params: JsonRecord): Parameters<ExtensionAPI[\"sendUserMessage\"]>[0] {\n\tconst images = params.images;\n\tif (images === undefined || (Array.isArray(images) && images.length === 0)) {\n\t\treturn requireString(params.text, \"text\");\n\t}\n\tif (!Array.isArray(images) || images.length > TERMINAL_BRIDGE_IMAGE_LIMITS.maxImages) {\n\t\tthrow new RequestError(\"invalid_params\", \"images must be an array of at most 8 images.\");\n\t}\n\tconst content: Exclude<Parameters<ExtensionAPI[\"sendUserMessage\"]>[0], string> = [];\n\tif (params.text !== undefined) {\n\t\tif (typeof params.text !== \"string\" || Buffer.byteLength(params.text, \"utf8\") > 100_000) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"text must be a string of at most 100000 UTF-8 bytes.\");\n\t\t}\n\t\tif (params.text.length > 0) content.push({ type: \"text\", text: params.text });\n\t}\n\tlet total = 0;\n\tfor (const image of images) {\n\t\tif (\n\t\t\t!isRecord(image) ||\n\t\t\tObject.keys(image).some((key) => key !== \"mimeType\" && key !== \"data\") ||\n\t\t\ttypeof image.mimeType !== \"string\" ||\n\t\t\t!TERMINAL_BRIDGE_IMAGE_LIMITS.mimeTypes.some((mimeType) => mimeType === image.mimeType) ||\n\t\t\ttypeof image.data !== \"string\" ||\n\t\t\timage.data.length === 0\n\t\t) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Each image requires a supported mimeType and base64 data only.\");\n\t\t}\n\t\ttotal += image.data.length;\n\t\tif (\n\t\t\timage.data.length > TERMINAL_BRIDGE_IMAGE_LIMITS.maxBase64BytesPerImage ||\n\t\t\ttotal > TERMINAL_BRIDGE_IMAGE_LIMITS.maxBase64BytesTotal\n\t\t) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Image base64 exceeds the per-image or aggregate byte limit.\");\n\t\t}\n\t\t// Buffer's decoder alone accepts paths, whitespace, URL-safe and malformed base64.\n\t\tif (/[^A-Za-z0-9+/=]/u.test(image.data) || Buffer.from(image.data, \"base64\").toString(\"base64\") !== image.data) {\n\t\t\tthrow new RequestError(\"invalid_params\", \"Image data must be canonical padded base64, not a path or URL.\");\n\t\t}\n\t\tcontent.push({ type: \"image\", mimeType: image.mimeType, data: image.data });\n\t}\n\treturn content;\n}\n\nfunction optionalInteger(value: unknown, name: string, fallback: number) {\n\tif (value === undefined) return fallback;\n\tif (!Number.isSafeInteger(value) || (value as number) < 0) {\n\t\tthrow new RequestError(\"invalid_params\", `${name} must be a non-negative integer.`);\n\t}\n\treturn value as number;\n}\n\nfunction normalizeForJson(value: unknown, omitImageData = false): unknown {\n\treturn JSON.parse(\n\t\tJSON.stringify(value, (_key, entry: unknown) => {\n\t\t\tif (omitImageData && isRecord(entry) && entry.type === \"image\") {\n\t\t\t\treturn { type: \"image\", mimeType: entry.mimeType };\n\t\t\t}\n\t\t\tif (typeof entry === \"bigint\") return entry.toString();\n\t\t\tif (entry instanceof Error) return { name: entry.name, message: entry.message };\n\t\t\treturn entry;\n\t\t}),\n\t) as unknown;\n}\n\nfunction availableModels(context: ExtensionContext) {\n\tconst scoped = context.scopedModels.map((entry) => entry.model);\n\tconst models = scoped.length > 0 ? scoped : context.modelRegistry.getAvailable();\n\treturn models\n\t\t.filter((model) => model.provider === \"sp-gateway\")\n\t\t.map((model) => ({\n\t\t\tprovider: model.provider,\n\t\t\tid: model.id,\n\t\t\tname: model.name,\n\t\t\tinput: model.input,\n\t\t\treasoning: model.reasoning,\n\t\t\tcontextWindow: model.contextWindow,\n\t\t\tmaxTokens: model.maxTokens,\n\t\t\t...(model.thinkingLevelMap ? { thinkingLevelMap: model.thinkingLevelMap } : {}),\n\t\t}));\n}\n\nfunction parseGeneratedTitle(raw: string) {\n\tlet title = raw.trim().split(/\\r?\\n/u, 1)[0] ?? \"\";\n\ttitle = title.replace(/^(?:session\\s+title|title)\\s*[:-]\\s*/iu, \"\");\n\ttitle = title\n\t\t.replace(/^[\"'`]|[\"'`]$/gu, \"\")\n\t\t.replace(/\\s+/gu, \" \")\n\t\t.replace(/[.!]+$/u, \"\")\n\t\t.trim();\n\tif (!/[\\p{L}\\p{N}]/u.test(title))\n\t\tthrow new RequestError(\"title_generation_failed\", \"The model returned no usable title.\");\n\treturn Array.from(title).slice(0, MAX_TITLE_LENGTH).join(\"\").trim();\n}\n\nasync function generateTitle(context: ExtensionContext, pi: ExtensionAPI, signal: AbortSignal) {\n\tif (!context.isIdle()) throw new RequestError(\"busy\", \"A title can only be generated while the agent is idle.\");\n\tconst activeModel = context.model;\n\tif (!activeModel || activeModel.provider !== \"sp-gateway\") {\n\t\tthrow new RequestError(\"model_unavailable\", \"Title generation requires an active sp-gateway model.\");\n\t}\n\tconst model = context.modelRegistry.find(activeModel.provider, activeModel.id);\n\tif (!model) throw new RequestError(\"model_unavailable\", \"The active sp-gateway model is unavailable.\");\n\tconst auth = await context.modelRegistry.getApiKeyAndHeaders(model);\n\tsignal.throwIfAborted();\n\tif (!auth.ok || !auth.apiKey) {\n\t\tthrow new RequestError(\"model_auth_unavailable\", auth.ok ? \"sp-gateway has no API key available.\" : auth.error);\n\t}\n\tconst serialized = Buffer.from(JSON.stringify(normalizeForJson(context.sessionManager.getEntries(), true)), \"utf8\");\n\tconst transcript =\n\t\tserialized.length <= MAX_TITLE_CONTEXT_BYTES\n\t\t\t? serialized.toString(\"utf8\")\n\t\t\t: serialized.subarray(-MAX_TITLE_CONTEXT_BYTES).toString(\"utf8\");\n\tconst response = await completeSimple(\n\t\tmodel,\n\t\t{\n\t\t\tsystemPrompt: [\n\t\t\t\t\"Create a concise English title for this coding session.\",\n\t\t\t\t\"Use 4-12 words. Describe the concrete task or result.\",\n\t\t\t\t\"Return only the title as plain text. Do not use tools, quotes, labels, or punctuation at the end.\",\n\t\t\t].join(\"\\n\"),\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\trole: \"user\",\n\t\t\t\t\tcontent: `Session transcript entries:\\n${transcript}`,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t},\n\t\t\t],\n\t\t\ttools: [],\n\t\t},\n\t\t{\n\t\t\tapiKey: auth.apiKey,\n\t\t\theaders: auth.headers,\n\t\t\tenv: auth.env,\n\t\t\tsignal,\n\t\t\tsessionId: context.sessionManager.getSessionId(),\n\t\t},\n\t);\n\tsignal.throwIfAborted();\n\tif (response.stopReason === \"error\") {\n\t\tthrow new RequestError(\"title_generation_failed\", response.errorMessage ?? \"The title model request failed.\");\n\t}\n\tconst rawTitle = response.content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\\n\");\n\tconst title = parseGeneratedTitle(rawTitle);\n\tpi.setSessionName(title);\n\treturn {\n\t\ttitle,\n\t\tusage: {\n\t\t\tinput: response.usage.input,\n\t\t\toutput: response.usage.output,\n\t\t\tcacheRead: response.usage.cacheRead,\n\t\t\tcacheWrite: response.usage.cacheWrite,\n\t\t\ttotal: response.usage.totalTokens,\n\t\t},\n\t};\n}\n\nfunction makePaths(agentDir: string, instanceId: string): BridgePaths {\n\tconst rootDir = join(agentDir, \"web-bridge\");\n\tconst discoveryDir = join(rootDir, \"discovery\");\n\tconst socketDir = join(rootDir, \"sockets\");\n\treturn {\n\t\trootDir,\n\t\tdiscoveryDir,\n\t\tsocketDir,\n\t\tdescriptorPath: join(discoveryDir, `${instanceId}.json`),\n\t\tsocketPath: join(socketDir, `${instanceId}.sock`),\n\t};\n}\n\nfunction ensurePrivateDirectory(path: string) {\n\tmkdirSync(path, { recursive: true, mode: 0o700 });\n\tif (process.platform !== \"win32\") chmodSync(path, 0o700);\n}\n\nfunction removeFile(path: string) {\n\ttry {\n\t\tunlinkSync(path);\n\t} catch (error) {\n\t\tif (!isMissingFileError(error)) throw error;\n\t}\n}\n\nfunction tokenMatches(expected: string, received: unknown) {\n\tif (typeof received !== \"string\") return false;\n\tconst expectedBytes = Buffer.from(expected, \"utf8\");\n\tconst receivedBytes = Buffer.from(received, \"utf8\");\n\treturn expectedBytes.length === receivedBytes.length && timingSafeEqual(expectedBytes, receivedBytes);\n}\n\nfunction parseRequest(value: JsonRecord): RequestFrame {\n\tif (\n\t\tvalue.v !== TERMINAL_BRIDGE_VERSION ||\n\t\tvalue.type !== \"request\" ||\n\t\ttypeof value.id !== \"string\" ||\n\t\t!value.id ||\n\t\tvalue.id.length > MAX_REQUEST_ID_LENGTH ||\n\t\t!Number.isSafeInteger(value.generation) ||\n\t\ttypeof value.command !== \"string\" ||\n\t\t!value.command\n\t) {\n\t\tthrow new RequestError(\"invalid_request\", \"Invalid request envelope.\");\n\t}\n\tif (value.params !== undefined && !isRecord(value.params)) {\n\t\tthrow new RequestError(\"invalid_request\", \"params must be an object.\");\n\t}\n\treturn {\n\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\ttype: \"request\",\n\t\tid: value.id,\n\t\tgeneration: value.generation as number,\n\t\tcommand: value.command,\n\t\tparams: value.params,\n\t};\n}\n\nexport class TerminalWebBridge {\n\tprivate pendingCommands = 0;\n\tprivate deleting = false;\n\tprivate readonly requestContext = new AsyncLocalStorage<{ request: RequestFrame; client: ClientState }>();\n\tprivate deletionOwner: { request: RequestFrame; client: ClientState } | undefined;\n\n\t/** Gate new commands synchronously before the owner checks/disposes its idle writer. */\n\treserveDeletion(preserveConnection: boolean): () => void {\n\t\tconst owner = preserveConnection ? this.requestContext.getStore() : undefined;\n\t\tif (preserveConnection && owner?.request.command !== \"delete_session\") {\n\t\t\tthrow new RequestError(\"invalid_request\", \"Connection preservation requires its deletion request.\");\n\t\t}\n\t\tif (this.deleting || this.pendingCommands > (preserveConnection ? 1 : 0) || this.questions.getPending()) {\n\t\t\tthrow new RequestError(\"busy\", \"Session has pending bridge commands or a question.\");\n\t\t}\n\t\tthis.deleting = true;\n\t\tthis.deletionOwner = owner;\n\t\treturn () => {\n\t\t\tthis.deleting = false;\n\t\t\tthis.deletionOwner = undefined;\n\t\t};\n\t}\n\n\tasync finishDeletion(): Promise<void> {\n\t\tthis.deletionOwner = undefined;\n\t\tawait this.stop();\n\t}\n\tprivate readonly pi: ExtensionAPI;\n\tprivate readonly options: TerminalWebBridgeOptions;\n\tprivate readonly instanceId = randomUUID().replaceAll(\"-\", \"\").slice(0, 24);\n\tprivate readonly authToken = randomBytes(32).toString(\"base64url\");\n\tprivate readonly startedAt = new Date().toISOString();\n\tprivate readonly clients = new Set<ClientState>();\n\tprivate readonly eventHistory: { sequence: number; encoded: Buffer }[] = [];\n\tprivate eventHistoryBytes = 0;\n\tprivate lastUnreplayableSequence = 0;\n\tprivate readonly maxFrameBytes: number;\n\tprivate readonly maxBufferedBytes: number;\n\tprivate readonly maxClients: number;\n\tprivate server: Server | undefined;\n\tprivate context: ExtensionContext | undefined;\n\tprivate paths: BridgePaths | undefined;\n\tprivate descriptor: TerminalBridgeDescriptor | undefined;\n\tprivate generation = 0;\n\tprivate sequence = 0;\n\tprivate commandQueue: Promise<void> = Promise.resolve();\n\tprivate lifecycleQueue: Promise<void> = Promise.resolve();\n\tprivate binding = new AbortController();\n\tprivate sidecarResult: SpWebLaunchResult | undefined;\n\tprivate readonly questions: QuestionInteraction;\n\tprivate unsubscribeQuestions: (() => void) | undefined;\n\n\tconstructor(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\t\tthis.pi = pi;\n\t\tthis.questions = getQuestionInteraction(pi);\n\t\tthis.questions.webOnly = options.webOwned === true;\n\t\tthis.options = options;\n\t\tthis.maxFrameBytes = options.maxFrameBytes ?? DEFAULT_TERMINAL_BRIDGE_MAX_FRAME_BYTES;\n\t\tthis.maxBufferedBytes = options.maxBufferedBytes ?? DEFAULT_TERMINAL_BRIDGE_MAX_BUFFERED_BYTES;\n\t\tthis.maxClients = options.maxClients ?? DEFAULT_TERMINAL_BRIDGE_MAX_CLIENTS;\n\t}\n\n\tgetDescriptor() {\n\t\treturn this.descriptor;\n\t}\n\n\tgetSidecarResult() {\n\t\treturn this.sidecarResult;\n\t}\n\n\tstart(context: ExtensionContext) {\n\t\tconst task = this.lifecycleQueue.then(() => this.startServer(context));\n\t\tthis.lifecycleQueue = task.catch(() => {});\n\t\treturn task;\n\t}\n\n\tprivate async startServer(context: ExtensionContext) {\n\t\tif (context.mode !== \"tui\" && !this.options.webOwned) {\n\t\t\tawait this.stopServer();\n\t\t\treturn;\n\t\t}\n\t\tthis.context = context;\n\t\tif (process.platform === \"win32\") throw new Error(\"The SP terminal bridge requires Unix sockets.\");\n\t\tif (this.server) {\n\t\t\tthis.advanceGeneration(context);\n\t\t\tthis.options.onReady?.(this);\n\t\t\treturn;\n\t\t}\n\n\t\tconst agentDir = this.options.agentDir ?? getSpAgentDir();\n\t\tthis.paths = makePaths(agentDir, this.instanceId);\n\t\tensurePrivateDirectory(this.paths.rootDir);\n\t\tensurePrivateDirectory(this.paths.discoveryDir);\n\t\tensurePrivateDirectory(this.paths.socketDir);\n\t\tif (Buffer.byteLength(this.paths.socketPath, \"utf8\") > 103) {\n\t\t\tthrow new Error(`SP terminal bridge socket path is too long: ${this.paths.socketPath}`);\n\t\t}\n\t\tremoveFile(this.paths.socketPath);\n\n\t\tconst server = createServer((socket) => this.acceptClient(socket));\n\t\tserver.on(\"error\", () => {});\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\tserver.off(\"listening\", onListening);\n\t\t\t\treject(error);\n\t\t\t};\n\t\t\tconst onListening = () => {\n\t\t\t\tserver.off(\"error\", onError);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tserver.once(\"error\", onError);\n\t\t\tserver.once(\"listening\", onListening);\n\t\t\tserver.listen(this.paths?.socketPath);\n\t\t});\n\t\tthis.server = server;\n\t\ttry {\n\t\t\tchmodSync(this.paths.socketPath, 0o600);\n\t\t\tthis.advanceGeneration(context);\n\t\t\tthis.unsubscribeQuestions = this.questions.subscribe((event, ctx) => this.publish(\"interaction\", event, ctx));\n\t\t\tthis.options.onReady?.(this);\n\t\t\tif (this.options.launchSpWeb !== false) {\n\t\t\t\tthis.sidecarResult = ensureSpWebSidecar(this.paths.discoveryDir, this.options.launcherOptions);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tawait this.stopServer();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tupdateContext(context: ExtensionContext) {\n\t\tthis.context = context;\n\t}\n\n\tadvanceGeneration(context: ExtensionContext) {\n\t\tthis.binding.abort();\n\t\tthis.binding = new AbortController();\n\t\tthis.questions.cancel();\n\t\tthis.context = context;\n\t\tif (!this.paths) return;\n\t\tthis.generation += 1;\n\t\tthis.commandQueue = Promise.resolve();\n\t\tthis.sequence = 0;\n\t\tthis.eventHistory.splice(0);\n\t\tthis.eventHistoryBytes = 0;\n\t\tthis.lastUnreplayableSequence = 0;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tthis.descriptor = {\n\t\t\tversion: TERMINAL_BRIDGE_VERSION,\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tinstanceId: this.instanceId,\n\t\t\tpid: process.pid,\n\t\t\tsessionId: context.sessionManager.getSessionId(),\n\t\t\tsessionFile: context.sessionManager.getSessionFile(),\n\t\t\tcwd: context.cwd,\n\t\t\tsocketPath: this.paths.socketPath,\n\t\t\tauthToken: this.authToken,\n\t\t\tgeneration: this.generation,\n\t\t\tstartedAt: this.startedAt,\n\t\t\t...(this.options.writerLeaseVersion ? { writerLeaseVersion: this.options.writerLeaseVersion } : {}),\n\t\t\tframe: { encoding: \"newline-delimited-json\", maxBytes: this.maxFrameBytes },\n\t\t};\n\t\tconst temporaryPath = `${this.paths.descriptorPath}.${process.pid}.tmp`;\n\t\twriteFileSync(temporaryPath, `${JSON.stringify(this.descriptor, null, \"\\t\")}\\n`, {\n\t\t\tencoding: \"utf8\",\n\t\t\tmode: 0o600,\n\t\t});\n\t\tchmodSync(temporaryPath, 0o600);\n\t\trenameSync(temporaryPath, this.paths.descriptorPath);\n\t\tchmodSync(this.paths.descriptorPath, 0o600);\n\t}\n\n\tpublish(category: EventFrame[\"category\"], event: { type: string }, context: ExtensionContext) {\n\t\tthis.context = context;\n\t\tif (!this.server) return;\n\t\tconst frame: EventFrame = {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"event\",\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: ++this.sequence,\n\t\t\tevent: event.type,\n\t\t\tcategory,\n\t\t\tpayload: normalizeForJson(event),\n\t\t};\n\t\tlet encoded: Buffer;\n\t\ttry {\n\t\t\tencoded = this.encode(frame);\n\t\t} catch {\n\t\t\t// Never claim that replay can cross an event we could not forward.\n\t\t\tthis.lastUnreplayableSequence = frame.sequence;\n\t\t\tframe.event = \"event_gap\";\n\t\t\tframe.category = \"session\";\n\t\t\tframe.payload = { type: \"event_gap\", code: \"event_gap\", resyncRequired: true };\n\t\t\ttry {\n\t\t\t\tencoded = this.encode(frame);\n\t\t\t} catch {\n\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\tif (client.subscribed) client.socket.destroy();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.eventHistory.push({ sequence: frame.sequence, encoded });\n\t\tthis.eventHistoryBytes += encoded.length;\n\t\twhile (this.eventHistory.length > MAX_EVENT_HISTORY || this.eventHistoryBytes > MAX_EVENT_HISTORY_BYTES) {\n\t\t\tthis.eventHistoryBytes -= this.eventHistory.shift()!.encoded.length;\n\t\t}\n\t\tfor (const client of this.clients) {\n\t\t\tif (client.authenticated && client.subscribed) {\n\t\t\t\tthis.writeEncoded(client, encoded);\n\t\t\t\tif (frame.event === \"event_gap\") {\n\t\t\t\t\tclient.subscribed = false;\n\t\t\t\t\t// Older clients also recover through their connection-close snapshot path.\n\t\t\t\t\tclient.socket.end();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tstop() {\n\t\t// The native delete response must drain before session_shutdown closes its socket.\n\t\tif (this.deletionOwner) return Promise.resolve();\n\t\t// Invalidate commands immediately, even if socket startup has not settled.\n\t\tthis.questions.cancel();\n\t\tthis.binding.abort();\n\t\tthis.context = undefined;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tconst task = this.lifecycleQueue.then(() => this.stopServer());\n\t\tthis.lifecycleQueue = task.catch(() => {});\n\t\treturn task;\n\t}\n\n\t/** Synchronous fallback for process.exit, which cannot await socket shutdown. */\n\tcleanupOnExit() {\n\t\tthis.binding.abort();\n\t\tthis.questions.cancel();\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tif (this.paths) {\n\t\t\ttry {\n\t\t\t\tconst value = JSON.parse(readFileSync(this.paths.descriptorPath, \"utf8\")) as unknown;\n\t\t\t\tif (isRecord(value) && value.instanceId === this.instanceId) removeFile(this.paths.descriptorPath);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error) && !(error instanceof SyntaxError)) throw error;\n\t\t\t}\n\t\t\tremoveFile(this.paths.socketPath);\n\t\t}\n\t}\n\n\tprivate async stopServer() {\n\t\tthis.binding.abort();\n\t\tthis.questions.cancel();\n\t\tthis.context = undefined;\n\t\tthis.commandQueue = Promise.resolve();\n\t\tthis.unsubscribeQuestions?.();\n\t\tthis.unsubscribeQuestions = undefined;\n\t\tconst server = this.server;\n\t\tthis.server = undefined;\n\t\tfor (const client of this.clients) client.socket.destroy();\n\t\tthis.clients.clear();\n\t\tthis.eventHistory.splice(0);\n\t\tthis.eventHistoryBytes = 0;\n\t\tif (server) {\n\t\t\tawait new Promise<void>((resolve) => server.close(() => resolve()));\n\t\t}\n\t\tconst paths = this.paths;\n\t\tif (paths) {\n\t\t\ttry {\n\t\t\t\tconst value = JSON.parse(readFileSync(paths.descriptorPath, \"utf8\")) as unknown;\n\t\t\t\tif (isRecord(value) && value.instanceId === this.instanceId) removeFile(paths.descriptorPath);\n\t\t\t} catch (error) {\n\t\t\t\tif (!isMissingFileError(error) && !(error instanceof SyntaxError)) throw error;\n\t\t\t}\n\t\t\tremoveFile(paths.socketPath);\n\t\t}\n\t\tthis.descriptor = undefined;\n\t\tthis.options.sessions?.bridgeStopped?.(this);\n\t}\n\n\tprivate acceptClient(socket: Socket) {\n\t\tif (this.clients.size >= this.maxClients) {\n\t\t\tsocket.on(\"error\", () => {});\n\t\t\tsocket.end(`${JSON.stringify({ v: 1, type: \"error\", code: \"too_many_clients\" })}\\n`, () => socket.destroy());\n\t\t\treturn;\n\t\t}\n\t\tsocket.setNoDelay(true);\n\t\tconst client: ClientState = {\n\t\t\tsocket,\n\t\t\tbuffer: Buffer.alloc(0),\n\t\t\tauthenticated: false,\n\t\t\tsubscribed: false,\n\t\t\tpendingRequests: 0,\n\t\t\tseenRequestIds: new Set(),\n\t\t};\n\t\tthis.clients.add(client);\n\t\tsocket.on(\"data\", (chunk: Buffer) => this.receive(client, chunk));\n\t\tsocket.on(\"error\", () => {});\n\t\tsocket.on(\"close\", () => this.clients.delete(client));\n\t}\n\n\tprivate receive(client: ClientState, chunk: Buffer) {\n\t\tif (client.socket.destroyed || client.socket.writableEnded) return;\n\t\tclient.buffer = Buffer.concat([client.buffer, chunk]);\n\t\tif (client.buffer.length > this.maxFrameBytes && client.buffer.indexOf(0x0a) === -1) {\n\t\t\tclient.socket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tlet newline = client.buffer.indexOf(0x0a);\n\t\twhile (newline !== -1) {\n\t\t\tconst frame = client.buffer.subarray(0, newline);\n\t\t\tclient.buffer = client.buffer.subarray(newline + 1);\n\t\t\tif (frame.length + 1 > this.maxFrameBytes || frame.length === 0) {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet value: unknown;\n\t\t\ttry {\n\t\t\t\tvalue = JSON.parse(frame.toString(\"utf8\")) as unknown;\n\t\t\t} catch {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!isRecord(value)) {\n\t\t\t\tclient.socket.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!client.authenticated) {\n\t\t\t\tthis.authenticate(client, value);\n\t\t\t\tif (!client.authenticated) return;\n\t\t\t} else {\n\t\t\t\tthis.acceptRequest(client, value);\n\t\t\t}\n\t\t\tnewline = client.buffer.indexOf(0x0a);\n\t\t}\n\t\tif (client.buffer.length >= this.maxFrameBytes) client.socket.destroy();\n\t}\n\n\tprivate authenticate(client: ClientState, value: JsonRecord) {\n\t\tif (value.v !== TERMINAL_BRIDGE_VERSION || value.type !== \"hello\" || !tokenMatches(this.authToken, value.token)) {\n\t\t\tthis.send(client, { v: 1, type: \"hello\", ok: false, error: \"authentication_failed\" });\n\t\t\tclient.socket.end();\n\t\t\treturn;\n\t\t}\n\t\tclient.authenticated = true;\n\t\tthis.send(client, {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"hello\",\n\t\t\tok: true,\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: this.sequence,\n\t\t\tinstanceId: this.instanceId,\n\t\t});\n\t}\n\n\tprivate acceptRequest(client: ClientState, value: JsonRecord) {\n\t\tlet request: RequestFrame;\n\t\ttry {\n\t\t\trequest = parseRequest(value);\n\t\t} catch (error) {\n\t\t\tthis.sendRequestError(client, typeof value.id === \"string\" ? value.id : null, error);\n\t\t\treturn;\n\t\t}\n\t\tif (client.seenRequestIds.has(request.id)) {\n\t\t\tthis.sendRequestError(\n\t\t\t\tclient,\n\t\t\t\trequest.id,\n\t\t\t\tnew RequestError(\"duplicate_request\", \"Request ID was already used.\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tclient.seenRequestIds.add(request.id);\n\t\tif (client.seenRequestIds.size > MAX_SEEN_REQUEST_IDS) {\n\t\t\tconst oldest = client.seenRequestIds.values().next().value as string | undefined;\n\t\t\tif (oldest) client.seenRequestIds.delete(oldest);\n\t\t}\n\t\tif (client.pendingRequests >= MAX_PENDING_REQUESTS) {\n\t\t\tthis.sendRequestError(client, request.id, new RequestError(\"too_many_requests\", \"Too many pending requests.\"));\n\t\t\treturn;\n\t\t}\n\t\tclient.pendingRequests += 1;\n\t\tthis.pendingCommands++;\n\t\t// Reads and turn cancellation/answers must not wait for model auth or title inference.\n\t\tconst independent = [\n\t\t\t\"state\",\n\t\t\t\"snapshot\",\n\t\t\t\"transcript\",\n\t\t\t\"models\",\n\t\t\t\"subscribe\",\n\t\t\t\"respond_to_question\",\n\t\t\t\"abort\",\n\t\t\t\"create_session\",\n\t\t\t\"resume_session\",\n\t\t\t\"delete_session\",\n\t\t].includes(request.command);\n\t\tconst task = (independent ? Promise.resolve() : this.commandQueue)\n\t\t\t.then(async () => {\n\t\t\t\tconst result = await this.requestContext.run({ request, client }, () => this.execute(request, client));\n\t\t\t\tif (request.command === \"delete_session\") {\n\t\t\t\t\tawait this.writeReplay(client, this.encode(this.successFrame(request.id, result)));\n\t\t\t\t} else {\n\t\t\t\t\tthis.sendSuccess(client, request.id, result);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(async (error: unknown) => {\n\t\t\t\tthis.sendRequestError(client, request.id, error);\n\t\t\t\tif (request.command === \"delete_session\") {\n\t\t\t\t\t// Drain error acknowledgements as well when disposal succeeded but unlink failed.\n\t\t\t\t\tawait this.writeReplay(client, Buffer.alloc(0)).catch(() => {});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tclient.pendingRequests -= 1;\n\t\t\t\tthis.pendingCommands--;\n\t\t\t\tif (this.deletionOwner?.request === request && this.deletionOwner.client === client) {\n\t\t\t\t\tvoid this.finishDeletion().catch(() => {});\n\t\t\t\t}\n\t\t\t});\n\t\tif (!independent) this.commandQueue = task;\n\t}\n\n\tprivate async execute(request: RequestFrame, client: ClientState): Promise<unknown> {\n\t\tif (!this.server || client.socket.destroyed || client.socket.writableEnded) {\n\t\t\tthrow new RequestError(\"not_ready\", \"Connection is closed.\");\n\t\t}\n\t\tif (request.generation !== this.generation) {\n\t\t\tthrow new RequestError(\"stale_generation\", `Current generation is ${this.generation}.`);\n\t\t}\n\t\tconst context = this.context;\n\t\tif (!context) throw new RequestError(\"not_ready\", \"Session context is not ready.\");\n\t\tif (this.deleting) throw new RequestError(\"busy\", \"Session deletion is reserved.\");\n\t\tconst params = request.params ?? {};\n\t\tswitch (request.command) {\n\t\t\tcase \"delete_session\":\n\t\t\t\tif (!this.options.sessions?.deleteSession) {\n\t\t\t\t\tthrow new RequestError(\"unsupported_command\", \"No deletion provider available.\");\n\t\t\t\t}\n\t\t\t\tif (params.confirmed !== true) throw new RequestError(\"invalid_params\", \"confirmed must be true.\");\n\t\t\t\treturn this.options.sessions.deleteSession(\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId: requireString(params.sessionId, \"sessionId\", 256),\n\t\t\t\t\t\t...(params.sessionFile !== undefined\n\t\t\t\t\t\t\t? { sessionFile: requireString(params.sessionFile, \"sessionFile\", 4096) }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tconfirmed: true,\n\t\t\t\t\t},\n\t\t\t\t\tthis,\n\t\t\t\t);\n\t\t\tcase \"create_session\":\n\t\t\t\tif (!this.options.sessions) throw new RequestError(\"unsupported_command\", \"No session factory available.\");\n\t\t\t\treturn this.options.sessions.create(requireString(params.cwd, \"cwd\", 4096));\n\t\t\tcase \"resume_session\":\n\t\t\t\tif (!this.options.sessions) throw new RequestError(\"unsupported_command\", \"No session factory available.\");\n\t\t\t\treturn this.options.sessions.resume(requireString(params.sessionFile, \"sessionFile\", 4096));\n\t\t\tcase \"respond_to_question\":\n\t\t\t\tthis.questions.respond(requireString(params.interactionId, \"interactionId\", 128), params.response);\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"snapshot\": {\n\t\t\t\tconst entries = context.sessionManager.getEntries();\n\t\t\t\tconst state = this.stateSnapshot(context);\n\t\t\t\treturn this.transcriptPage(request.id, entries, 0, MAX_TRANSCRIPT_PAGE_SIZE, state);\n\t\t\t}\n\t\t\tcase \"state\":\n\t\t\t\treturn this.stateSnapshot(context);\n\t\t\tcase \"transcript\": {\n\t\t\t\tconst entries = context.sessionManager.getEntries();\n\t\t\t\tconst cursor = optionalInteger(params.cursor, \"cursor\", 0);\n\t\t\t\tconst limit = Math.min(optionalInteger(params.limit, \"limit\", 50), MAX_TRANSCRIPT_PAGE_SIZE);\n\t\t\t\treturn this.transcriptPage(request.id, entries, cursor, limit);\n\t\t\t}\n\t\t\tcase \"models\":\n\t\t\t\treturn {\n\t\t\t\t\tmodels: availableModels(context),\n\t\t\t\t\tcurrent: context.model ? { provider: context.model.provider, modelId: context.model.id } : null,\n\t\t\t\t};\n\t\t\tcase \"generate_title\":\n\t\t\t\treturn (this.options.titleGenerator ?? generateTitle)(context, this.pi, this.binding.signal);\n\t\t\tcase \"subscribe\": {\n\t\t\t\tlet afterSequence = optionalInteger(params.afterSequence, \"afterSequence\", this.sequence);\n\t\t\t\tclient.subscribed = false;\n\t\t\t\tfor (;;) {\n\t\t\t\t\t// Recheck after each drained write: publishing can evict history while replay waits.\n\t\t\t\t\tconst earliestSequence = this.eventHistory[0]?.sequence ?? this.sequence + 1;\n\t\t\t\t\tif (\n\t\t\t\t\t\tafterSequence < earliestSequence - 1 ||\n\t\t\t\t\t\tafterSequence < this.lastUnreplayableSequence ||\n\t\t\t\t\t\tafterSequence > this.sequence\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new RequestError(\"event_gap\", `Earliest retained sequence is ${earliestSequence}.`);\n\t\t\t\t\t}\n\t\t\t\t\tconst event = this.eventHistory.find((entry) => entry.sequence > afterSequence);\n\t\t\t\t\tif (!event) break;\n\t\t\t\t\tawait this.writeReplay(client, event.encoded);\n\t\t\t\t\tafterSequence = event.sequence;\n\t\t\t\t}\n\t\t\t\tclient.subscribed = true;\n\t\t\t\treturn { subscribed: true, sequence: this.sequence };\n\t\t\t}\n\t\t\tcase \"prompt\":\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Use steer or follow_up while the agent is running.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), {\n\t\t\t\t\texpandPromptTemplates: params.expandPromptTemplates === true,\n\t\t\t\t});\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"steer\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to steer.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), { deliverAs: \"steer\" });\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"follow_up\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to queue a follow-up for.\");\n\t\t\t\tthis.pi.sendUserMessage(userMessageContent(params), { deliverAs: \"followUp\" });\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"abort\":\n\t\t\t\tif (context.isIdle()) throw new RequestError(\"idle\", \"There is no running turn to abort.\");\n\t\t\t\tthis.questions.cancel();\n\t\t\t\tcontext.abort();\n\t\t\t\treturn { accepted: true };\n\t\t\tcase \"set_thinking\": {\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Thinking level can only change while idle.\");\n\t\t\t\tconst level = requireString(params.level, \"level\", 16);\n\t\t\t\tif (!THINKING_LEVELS.includes(level as ThinkingLevel)) {\n\t\t\t\t\tthrow new RequestError(\"invalid_params\", `Unsupported thinking level: ${level}`);\n\t\t\t\t}\n\t\t\t\tthis.pi.setThinkingLevel(level as ThinkingLevel);\n\t\t\t\treturn { accepted: true, level: this.pi.getThinkingLevel() };\n\t\t\t}\n\t\t\tcase \"set_model\": {\n\t\t\t\tif (!context.isIdle()) throw new RequestError(\"busy\", \"Model can only change while idle.\");\n\t\t\t\tconst provider = requireString(params.provider, \"provider\", 256);\n\t\t\t\tconst modelId = requireString(params.modelId, \"modelId\", 512);\n\t\t\t\tif (provider !== \"sp-gateway\") {\n\t\t\t\t\tthrow new RequestError(\"model_out_of_scope\", \"Only sp-gateway models are available in SP.\");\n\t\t\t\t}\n\t\t\t\tconst model = context.modelRegistry.find(provider, modelId);\n\t\t\t\tif (!model) throw new RequestError(\"model_unavailable\", `Model is not available: ${provider}/${modelId}`);\n\t\t\t\tif (\n\t\t\t\t\tcontext.scopedModels.length > 0 &&\n\t\t\t\t\t!context.scopedModels.some((entry) => entry.model.provider === provider && entry.model.id === modelId)\n\t\t\t\t) {\n\t\t\t\t\tthrow new RequestError(\n\t\t\t\t\t\t\"model_out_of_scope\",\n\t\t\t\t\t\t`Model is outside this session's model scope: ${provider}/${modelId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!(await this.pi.setModel(model))) {\n\t\t\t\t\tthrow new RequestError(\"model_auth_unavailable\", `No usable credentials for ${provider}/${modelId}.`);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\taccepted: true,\n\t\t\t\t\tmodel: { provider: model.provider, id: model.id, name: model.name, input: model.input },\n\t\t\t\t};\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tthrow new RequestError(\"unsupported_command\", `Unsupported command: ${request.command}`);\n\t\t}\n\t}\n\n\tprivate stateSnapshot(context: ExtensionContext) {\n\t\tconst model = context.model;\n\t\treturn {\n\t\t\tprotocol: TERMINAL_BRIDGE_PROTOCOL,\n\t\t\tgeneration: this.generation,\n\t\t\tsequence: this.sequence,\n\t\t\tsession: {\n\t\t\t\tid: context.sessionManager.getSessionId(),\n\t\t\t\tfile: context.sessionManager.getSessionFile(),\n\t\t\t\tname: context.sessionManager.getSessionName(),\n\t\t\t\tcwd: context.cwd,\n\t\t\t\tentryCount: context.sessionManager.getEntries().length,\n\t\t\t\tactiveLeafId: context.sessionManager.getLeafId(),\n\t\t\t},\n\t\t\tstatus: {\n\t\t\t\tidle: context.isIdle(),\n\t\t\t\thasPendingMessages: context.hasPendingMessages(),\n\t\t\t\tcontextUsage: context.getContextUsage(),\n\t\t\t},\n\t\t\tmodel: model ? { provider: model.provider, id: model.id, name: model.name, input: model.input } : null,\n\t\t\tthinkingLevel: this.pi.getThinkingLevel(),\n\t\t\tpendingQuestion: this.questions.getPending(),\n\t\t\tcapabilities: {\n\t\t\t\tsnapshot: true,\n\t\t\t\tstate: true,\n\t\t\t\ttranscript: { paginated: true, maximumPageSize: MAX_TRANSCRIPT_PAGE_SIZE },\n\t\t\t\teventStream: { replayLimit: MAX_EVENT_HISTORY, replayByteLimit: MAX_EVENT_HISTORY_BYTES },\n\t\t\t\tprompt: true,\n\t\t\t\timages: true,\n\t\t\t\timageLimits: TERMINAL_BRIDGE_IMAGE_LIMITS,\n\t\t\t\tsteer: true,\n\t\t\t\tfollowUp: true,\n\t\t\t\tabort: true,\n\t\t\t\tsetThinking: true,\n\t\t\t\tsetModel: \"available-and-session-scoped-models-only\",\n\t\t\t\tmodels: true,\n\t\t\t\tgenerateTitle: true,\n\t\t\t\trespondToQuestion: true,\n\t\t\t\tnewSession: !!this.options.sessions,\n\t\t\t\tresumeSession: !!this.options.sessions,\n\t\t\t\tforkSession: false,\n\t\t\t\tdeleteSession: !!this.options.sessions?.deleteSession,\n\t\t\t\tdirectJsonlAccess: false,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate transcriptPage(id: string, entries: unknown[], cursor: number, limit: number, state?: unknown) {\n\t\tconst page = {\n\t\t\tcursor,\n\t\t\tnextCursor: (cursor < entries.length ? cursor : null) as number | null,\n\t\t\ttotal: entries.length,\n\t\t\tentries: [] as unknown[],\n\t\t};\n\t\tconst result = state === undefined ? page : { state, transcript: page };\n\t\t// Count the exact envelope, including escaped request ID, state and newline.\n\t\tlet bytes = this.encode(this.successFrame(id, result)).length;\n\t\tfor (const entry of entries.slice(cursor, cursor + limit)) {\n\t\t\tconst normalized = normalizeForJson(entry);\n\t\t\tconst nextCursor = cursor + page.entries.length + 1 < entries.length ? cursor + page.entries.length + 1 : null;\n\t\t\tconst addedBytes =\n\t\t\t\tBuffer.byteLength(JSON.stringify(normalized), \"utf8\") +\n\t\t\t\t(page.entries.length > 0 ? 1 : 0) +\n\t\t\t\tJSON.stringify(nextCursor).length -\n\t\t\t\tJSON.stringify(page.nextCursor).length;\n\t\t\tif (bytes + addedBytes > this.maxFrameBytes) {\n\t\t\t\tif (page.entries.length === 0) {\n\t\t\t\t\tthrow new RequestError(\n\t\t\t\t\t\t\"frame_too_large\",\n\t\t\t\t\t\t`Transcript entry at cursor ${cursor} cannot fit in the response.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpage.entries.push(normalized);\n\t\t\tpage.nextCursor = nextCursor;\n\t\t\tbytes += addedBytes;\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate sendRequestError(client: ClientState, id: string | null, error: unknown) {\n\t\tconst code =\n\t\t\terror instanceof RequestError || error instanceof QuestionResponseError\n\t\t\t\t? error.code\n\t\t\t\t: error instanceof Error && \"code\" in error && typeof error.code === \"string\"\n\t\t\t\t\t? error.code\n\t\t\t\t\t: \"internal_error\";\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthis.send(client, {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"response\",\n\t\t\tid,\n\t\t\tgeneration: this.generation,\n\t\t\tok: false,\n\t\t\terror: { code, message },\n\t\t});\n\t}\n\n\tprivate successFrame(id: string, result: unknown) {\n\t\treturn {\n\t\t\tv: TERMINAL_BRIDGE_VERSION,\n\t\t\ttype: \"response\",\n\t\t\tid,\n\t\t\tgeneration: this.generation,\n\t\t\tok: true,\n\t\t\tresult,\n\t\t};\n\t}\n\n\tprivate sendSuccess(client: ClientState, id: string, result: unknown) {\n\t\ttry {\n\t\t\tthis.writeEncoded(client, this.encode(this.successFrame(id, result)));\n\t\t} catch (error) {\n\t\t\tthis.sendRequestError(client, id, error);\n\t\t}\n\t}\n\n\tprivate encode(value: unknown) {\n\t\tconst encoded = Buffer.from(`${JSON.stringify(value)}\\n`, \"utf8\");\n\t\tif (encoded.length > this.maxFrameBytes) throw new RequestError(\"frame_too_large\", \"Frame exceeds the limit.\");\n\t\treturn encoded;\n\t}\n\n\tprivate send(client: ClientState, value: unknown) {\n\t\tif (client.socket.destroyed) return;\n\t\ttry {\n\t\t\tthis.writeEncoded(client, this.encode(value));\n\t\t} catch {\n\t\t\tclient.socket.destroy();\n\t\t}\n\t}\n\n\tprivate writeEncoded(client: ClientState, encoded: Buffer) {\n\t\tif (client.socket.destroyed) return;\n\t\tif (client.socket.writableLength + encoded.length > this.maxBufferedBytes) {\n\t\t\tclient.socket.destroy();\n\t\t\treturn;\n\t\t}\n\t\tclient.socket.write(encoded);\n\t}\n\n\tprivate writeReplay(client: ClientState, encoded: Buffer) {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst socket = client.socket;\n\t\t\tif (\n\t\t\t\tsocket.destroyed ||\n\t\t\t\tsocket.writableEnded ||\n\t\t\t\tsocket.writableLength + encoded.length > this.maxBufferedBytes\n\t\t\t) {\n\t\t\t\tsocket.destroy();\n\t\t\t\treject(new RequestError(\"not_ready\", \"Replay connection is closed or exceeds the output limit.\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst onClose = () => reject(new RequestError(\"not_ready\", \"Replay connection is closed.\"));\n\t\t\tsocket.once(\"close\", onClose);\n\t\t\t// Drain one frame before enqueueing the next, rather than overflowing the client\n\t\t\t// buffer with an otherwise valid multi-image replay.\n\t\t\tsocket.write(encoded, (error) => {\n\t\t\t\tsocket.off(\"close\", onClose);\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t});\n\t\t});\n\t}\n}\n\nexport function registerTerminalWebBridge(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\tconst bridge = new TerminalWebBridge(pi, options);\n\tpi.on(\"session_start\", async (event, context) => {\n\t\ttry {\n\t\t\tif (context.mode === \"tui\" && !options.webOwned) options.sessions?.terminalStarted(context);\n\t\t\tawait bridge.start(context);\n\t\t\tbridge.publish(\"session\", event, context);\n\t\t\tconst sidecar = bridge.getSidecarResult();\n\t\t\tif (sidecar?.status === \"failed\") context.ui.notify(`SP Web sidecar failed: ${sidecar.error}`, \"warning\");\n\t\t} catch (error) {\n\t\t\tcontext.ui.notify(\n\t\t\t\t`SP terminal bridge failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t});\n\tpi.on(\"session_info_changed\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_compact\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_compact_failed\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"session_tree\", (event, context) => bridge.publish(\"session\", event, context));\n\tpi.on(\"agent_start\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"agent_end\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"agent_settled\", (event, context) => bridge.publish(\"agent\", event, context));\n\tpi.on(\"message_start\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"message_update\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"message_end\", (event, context) => bridge.publish(\"message\", event, context));\n\tpi.on(\"tool_execution_start\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"tool_execution_update\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"tool_execution_end\", (event, context) => bridge.publish(\"tool\", event, context));\n\tpi.on(\"model_select\", (event, context) => bridge.publish(\"model\", event, context));\n\tpi.on(\"thinking_level_select\", (event, context) => bridge.publish(\"thinking\", event, context));\n\tpi.on(\"session_shutdown\", async (event, context) => {\n\t\tbridge.publish(\"session\", event, context);\n\t\ttry {\n\t\t\tawait bridge.stop();\n\t\t\tif (event.reason === \"quit\" && !options.webOwned) await options.sessions?.dispose();\n\t\t} catch {\n\t\t\t// Cleanup failures must not stop SP shutdown.\n\t\t}\n\t});\n\treturn bridge;\n}\n\nexport function readTerminalBridgeDescriptor(path: string): TerminalBridgeDescriptor {\n\tconst value = JSON.parse(readFileSync(path, \"utf8\")) as TerminalBridgeDescriptor;\n\treturn value;\n}\n\nexport function terminalBridgeDescriptorExists(path: string) {\n\treturn existsSync(path);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { ExtensionAPI } from "@senpiper/pi-coding-agent";
2
+ import type { TerminalWebBridgeOptions } from "./terminal-web-bridge.ts";
3
+ export declare function getSpWebUrl(env?: NodeJS.ProcessEnv): string;
4
+ export declare function registerWebCommand(pi: ExtensionAPI, options?: TerminalWebBridgeOptions): void;
5
+ //# sourceMappingURL=web-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-command.d.ts","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CA2BxE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,wBAA6B,QAoD1F","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { parseArgs } from \"node:util\";\nimport type { ExtensionAPI } from \"@senpiper/pi-coding-agent\";\nimport { getSpAgentDir } from \"./gateway.ts\";\nimport { ensureSpWebSidecar } from \"./sp-web-launcher.ts\";\nimport type { TerminalWebBridgeOptions } from \"./terminal-web-bridge.ts\";\n\nexport function getSpWebUrl(env: NodeJS.ProcessEnv = process.env): string {\n\tconst raw = env.SP_WEB_ARGS_JSON ?? env.SP_PI_WEB_ARGS_JSON;\n\tconst args: unknown = raw ? JSON.parse(raw) : [];\n\tif (!Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")) {\n\t\tthrow new Error(\"SP_WEB_ARGS_JSON must be a JSON array of strings.\");\n\t}\n\tconst { values } = parseArgs({\n\t\targs,\n\t\tstrict: false,\n\t\toptions: {\n\t\t\tport: { type: \"string\", short: \"p\" },\n\t\t\thostname: { type: \"string\", short: \"H\" },\n\t\t},\n\t});\n\tconst port = String(values.port ?? env.SP_WEB_PORT ?? env.PORT ?? \"30141\");\n\tif (!/^\\d+$/.test(port) || Number(port) < 1 || Number(port) > 65535) {\n\t\tthrow new Error(\"Set SP_WEB_PORT to a fixed port between 1 and 65535 to open SP Web.\");\n\t}\n\tlet hostname = String(values.hostname ?? env.SP_WEB_HOSTNAME ?? env.PI_WEB_HOSTNAME ?? \"127.0.0.1\");\n\tif ([\"0.0.0.0\", \"localhost\"].includes(hostname)) hostname = \"127.0.0.1\";\n\tif ([\"::\", \"[::]\"].includes(hostname)) hostname = \"::1\";\n\tif (hostname.includes(\":\") && !hostname.startsWith(\"[\")) hostname = `[${hostname}]`;\n\tconst url = new URL(`http://${hostname}:${port}`);\n\tif (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) {\n\t\tthrow new Error(\"SP_WEB_HOSTNAME must be a hostname or IP address.\");\n\t}\n\treturn url.origin;\n}\n\nexport function registerWebCommand(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\tpi.registerCommand(\"web\", {\n\t\tdescription: \"Open SP Web in your browser\",\n\t\thandler: async (_args, context) => {\n\t\t\ttry {\n\t\t\t\tconst url = getSpWebUrl(options.launcherOptions?.env);\n\t\t\t\tconst discovery = join(options.agentDir ?? getSpAgentDir(), \"web-bridge\", \"discovery\");\n\t\t\t\tmkdirSync(discovery, { recursive: true, mode: 0o700 });\n\t\t\t\tconst result = ensureSpWebSidecar(discovery, options.launcherOptions);\n\t\t\t\tif (result.status === \"disabled\") throw new Error(\"SP Web is disabled by SP_WEB_DISABLE.\");\n\t\t\t\tif (result.status === \"failed\") throw new Error(result.error);\n\t\t\t\tlet ready = false;\n\t\t\t\tfor (let attempt = 0; attempt < 20; attempt++) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fetch(url, { method: \"HEAD\", signal: AbortSignal.timeout(1000) });\n\t\t\t\t\t\tready = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tawait setTimeout(500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!ready) throw new Error(`SP Web is not responding at ${url}. Try /web again after it starts.`);\n\t\t\t\tcontext.ui.notify(`Opening SP Web: ${url}`, \"info\");\n\t\t\t\tconst command =\n\t\t\t\t\tprocess.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"rundll32\" : \"xdg-open\";\n\t\t\t\tconst args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tconst child = spawn(command, args, { stdio: \"ignore\", shell: false });\n\t\t\t\t\t// Some desktop openers remain alive as long as the browser window.\n\t\t\t\t\tconst timer = globalThis.setTimeout(() => {\n\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}, 5000);\n\t\t\t\t\tchild.once(\"error\", (error) => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t\t\tchild.once(\"exit\", (code) => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tif (code === 0) resolve();\n\t\t\t\t\t\telse reject(new Error(`Browser opener exited with code ${code}.`));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tcontext.ui.notify(`SP Web: ${url}`, \"info\");\n\t\t\t} catch (error) {\n\t\t\t\tcontext.ui.notify(\n\t\t\t\t\t`Could not open SP Web: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,95 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { setTimeout } from "node:timers/promises";
5
+ import { parseArgs } from "node:util";
6
+ import { getSpAgentDir } from "./gateway.js";
7
+ import { ensureSpWebSidecar } from "./sp-web-launcher.js";
8
+ export function getSpWebUrl(env = process.env) {
9
+ const raw = env.SP_WEB_ARGS_JSON ?? env.SP_PI_WEB_ARGS_JSON;
10
+ const args = raw ? JSON.parse(raw) : [];
11
+ if (!Array.isArray(args) || !args.every((arg) => typeof arg === "string")) {
12
+ throw new Error("SP_WEB_ARGS_JSON must be a JSON array of strings.");
13
+ }
14
+ const { values } = parseArgs({
15
+ args,
16
+ strict: false,
17
+ options: {
18
+ port: { type: "string", short: "p" },
19
+ hostname: { type: "string", short: "H" },
20
+ },
21
+ });
22
+ const port = String(values.port ?? env.SP_WEB_PORT ?? env.PORT ?? "30141");
23
+ if (!/^\d+$/.test(port) || Number(port) < 1 || Number(port) > 65535) {
24
+ throw new Error("Set SP_WEB_PORT to a fixed port between 1 and 65535 to open SP Web.");
25
+ }
26
+ let hostname = String(values.hostname ?? env.SP_WEB_HOSTNAME ?? env.PI_WEB_HOSTNAME ?? "127.0.0.1");
27
+ if (["0.0.0.0", "localhost"].includes(hostname))
28
+ hostname = "127.0.0.1";
29
+ if (["::", "[::]"].includes(hostname))
30
+ hostname = "::1";
31
+ if (hostname.includes(":") && !hostname.startsWith("["))
32
+ hostname = `[${hostname}]`;
33
+ const url = new URL(`http://${hostname}:${port}`);
34
+ if (url.username || url.password || url.pathname !== "/" || url.search || url.hash) {
35
+ throw new Error("SP_WEB_HOSTNAME must be a hostname or IP address.");
36
+ }
37
+ return url.origin;
38
+ }
39
+ export function registerWebCommand(pi, options = {}) {
40
+ pi.registerCommand("web", {
41
+ description: "Open SP Web in your browser",
42
+ handler: async (_args, context) => {
43
+ try {
44
+ const url = getSpWebUrl(options.launcherOptions?.env);
45
+ const discovery = join(options.agentDir ?? getSpAgentDir(), "web-bridge", "discovery");
46
+ mkdirSync(discovery, { recursive: true, mode: 0o700 });
47
+ const result = ensureSpWebSidecar(discovery, options.launcherOptions);
48
+ if (result.status === "disabled")
49
+ throw new Error("SP Web is disabled by SP_WEB_DISABLE.");
50
+ if (result.status === "failed")
51
+ throw new Error(result.error);
52
+ let ready = false;
53
+ for (let attempt = 0; attempt < 20; attempt++) {
54
+ try {
55
+ await fetch(url, { method: "HEAD", signal: AbortSignal.timeout(1000) });
56
+ ready = true;
57
+ break;
58
+ }
59
+ catch {
60
+ await setTimeout(500);
61
+ }
62
+ }
63
+ if (!ready)
64
+ throw new Error(`SP Web is not responding at ${url}. Try /web again after it starts.`);
65
+ context.ui.notify(`Opening SP Web: ${url}`, "info");
66
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "rundll32" : "xdg-open";
67
+ const args = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
68
+ await new Promise((resolve, reject) => {
69
+ const child = spawn(command, args, { stdio: "ignore", shell: false });
70
+ // Some desktop openers remain alive as long as the browser window.
71
+ const timer = globalThis.setTimeout(() => {
72
+ child.unref();
73
+ resolve();
74
+ }, 5000);
75
+ child.once("error", (error) => {
76
+ clearTimeout(timer);
77
+ reject(error);
78
+ });
79
+ child.once("exit", (code) => {
80
+ clearTimeout(timer);
81
+ if (code === 0)
82
+ resolve();
83
+ else
84
+ reject(new Error(`Browser opener exited with code ${code}.`));
85
+ });
86
+ });
87
+ context.ui.notify(`SP Web: ${url}`, "info");
88
+ }
89
+ catch (error) {
90
+ context.ui.notify(`Could not open SP Web: ${error instanceof Error ? error.message : String(error)}`, "warning");
91
+ }
92
+ },
93
+ });
94
+ }
95
+ //# sourceMappingURL=web-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-command.js","sourceRoot":"","sources":["../src/web-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { parseArgs } from \"node:util\";\nimport type { ExtensionAPI } from \"@senpiper/pi-coding-agent\";\nimport { getSpAgentDir } from \"./gateway.ts\";\nimport { ensureSpWebSidecar } from \"./sp-web-launcher.ts\";\nimport type { TerminalWebBridgeOptions } from \"./terminal-web-bridge.ts\";\n\nexport function getSpWebUrl(env: NodeJS.ProcessEnv = process.env): string {\n\tconst raw = env.SP_WEB_ARGS_JSON ?? env.SP_PI_WEB_ARGS_JSON;\n\tconst args: unknown = raw ? JSON.parse(raw) : [];\n\tif (!Array.isArray(args) || !args.every((arg) => typeof arg === \"string\")) {\n\t\tthrow new Error(\"SP_WEB_ARGS_JSON must be a JSON array of strings.\");\n\t}\n\tconst { values } = parseArgs({\n\t\targs,\n\t\tstrict: false,\n\t\toptions: {\n\t\t\tport: { type: \"string\", short: \"p\" },\n\t\t\thostname: { type: \"string\", short: \"H\" },\n\t\t},\n\t});\n\tconst port = String(values.port ?? env.SP_WEB_PORT ?? env.PORT ?? \"30141\");\n\tif (!/^\\d+$/.test(port) || Number(port) < 1 || Number(port) > 65535) {\n\t\tthrow new Error(\"Set SP_WEB_PORT to a fixed port between 1 and 65535 to open SP Web.\");\n\t}\n\tlet hostname = String(values.hostname ?? env.SP_WEB_HOSTNAME ?? env.PI_WEB_HOSTNAME ?? \"127.0.0.1\");\n\tif ([\"0.0.0.0\", \"localhost\"].includes(hostname)) hostname = \"127.0.0.1\";\n\tif ([\"::\", \"[::]\"].includes(hostname)) hostname = \"::1\";\n\tif (hostname.includes(\":\") && !hostname.startsWith(\"[\")) hostname = `[${hostname}]`;\n\tconst url = new URL(`http://${hostname}:${port}`);\n\tif (url.username || url.password || url.pathname !== \"/\" || url.search || url.hash) {\n\t\tthrow new Error(\"SP_WEB_HOSTNAME must be a hostname or IP address.\");\n\t}\n\treturn url.origin;\n}\n\nexport function registerWebCommand(pi: ExtensionAPI, options: TerminalWebBridgeOptions = {}) {\n\tpi.registerCommand(\"web\", {\n\t\tdescription: \"Open SP Web in your browser\",\n\t\thandler: async (_args, context) => {\n\t\t\ttry {\n\t\t\t\tconst url = getSpWebUrl(options.launcherOptions?.env);\n\t\t\t\tconst discovery = join(options.agentDir ?? getSpAgentDir(), \"web-bridge\", \"discovery\");\n\t\t\t\tmkdirSync(discovery, { recursive: true, mode: 0o700 });\n\t\t\t\tconst result = ensureSpWebSidecar(discovery, options.launcherOptions);\n\t\t\t\tif (result.status === \"disabled\") throw new Error(\"SP Web is disabled by SP_WEB_DISABLE.\");\n\t\t\t\tif (result.status === \"failed\") throw new Error(result.error);\n\t\t\t\tlet ready = false;\n\t\t\t\tfor (let attempt = 0; attempt < 20; attempt++) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait fetch(url, { method: \"HEAD\", signal: AbortSignal.timeout(1000) });\n\t\t\t\t\t\tready = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tawait setTimeout(500);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!ready) throw new Error(`SP Web is not responding at ${url}. Try /web again after it starts.`);\n\t\t\t\tcontext.ui.notify(`Opening SP Web: ${url}`, \"info\");\n\t\t\t\tconst command =\n\t\t\t\t\tprocess.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"rundll32\" : \"xdg-open\";\n\t\t\t\tconst args = process.platform === \"win32\" ? [\"url.dll,FileProtocolHandler\", url] : [url];\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tconst child = spawn(command, args, { stdio: \"ignore\", shell: false });\n\t\t\t\t\t// Some desktop openers remain alive as long as the browser window.\n\t\t\t\t\tconst timer = globalThis.setTimeout(() => {\n\t\t\t\t\t\tchild.unref();\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}, 5000);\n\t\t\t\t\tchild.once(\"error\", (error) => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t});\n\t\t\t\t\tchild.once(\"exit\", (code) => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tif (code === 0) resolve();\n\t\t\t\t\t\telse reject(new Error(`Browser opener exited with code ${code}.`));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tcontext.ui.notify(`SP Web: ${url}`, \"info\");\n\t\t\t} catch (error) {\n\t\t\t\tcontext.ui.notify(\n\t\t\t\t\t`Could not open SP Web: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t});\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@senpiper/sp-agent-extensions",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Private Senpiper runtime extensions for sp-agent",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -49,9 +49,6 @@
49
49
  "typescript": "5.9.3",
50
50
  "vitest": "4.1.9"
51
51
  },
52
- "dependencies": {
53
- "yaml": "2.9.0"
54
- },
55
52
  "pi": {
56
53
  "extensions": [
57
54
  "./dist/extension.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@senpiper/sp-agent",
3
- "version": "0.1.7",
3
+ "version": "0.1.10",
4
4
  "description": "SP coding agent with the bundled SP Web workspace",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -44,8 +44,8 @@
44
44
  },
45
45
  "dependencies": {
46
46
  "@senpiper/pi-coding-agent": "0.84.4",
47
- "@senpiper/sp-agent-extensions": "0.1.2",
48
- "@senpiper/sp-web": "0.1.0"
47
+ "@senpiper/sp-agent-extensions": "0.1.4",
48
+ "@senpiper/sp-web": "0.1.3"
49
49
  },
50
50
  "bundleDependencies": [
51
51
  "@senpiper/pi-coding-agent",
@@ -1,4 +0,0 @@
1
- import type { ExtensionAPI, ExtensionCommandContext } from "@senpiper/pi-coding-agent";
2
- export declare function runInteractiveOnboarding(context: ExtensionCommandContext): Promise<boolean>;
3
- export declare function registerOnboardingCommand(pi: ExtensionAPI): void;
4
- //# sourceMappingURL=onboarding-command.d.ts.map